本文介绍了ARM Cortex-M3 LPC1768单片机的定时器编程。这里我们将初始化LPC1768中的定时器外围设备。定时器将改进任何微控制器的使用方式。在本教程中,我们将设置两个计时器,根据计时器的设置将闪烁两个led。建立ARM皮质M3发育环境在本文中进行了很好的讨论。
LPC 1768是基于ARM Cortex- M3的微控制器,具有低功耗和高集成水平的嵌入式应用功能。ARM Cortex M3就是这样设计的,以增强调试功能和更高级别的系统集成。它的CPU频率为100mhz,集成了3级管道,并使用哈佛体系结构,为第三总线外设提供单独的本地指令和数据总线。ARM Cortex- M3 CPU有一个内部预取单元,以支持推测分支。外围组件包括512KB闪存,64kb数据存储器,以太网MAC, USB OTG, 4个UART, 8通道通用DMA控制器,2个SSP控制器,10位DAC,积分编码器接口,SPI接口,3个I2C总线接口,2输入+ 2输出I2S总线接口,4个通用定时器,超低功耗实时时钟(RTC)独立电池供电,多达70个通用I/O引脚,6输出通用PWM。LPC1768/66/65/64与基于arm7的100针LPC236x微控制器系列的引脚兼容。
LPC1768中有4个定时器(0,1,2和3)。每个都有32位定时器/计数器,带有可编程32位预调器。它们都是独立相同的,可以单独使用而不受任何干扰。每个都有它的定时器计数器(TC),这是一个32位寄存器,它将根据连接的时钟增加,还有一个作为时钟分配器的预刻度计数器。
LPC1768中的每个外设可以根据我们的使用打开或关闭,其中大多数外设在重置时关闭。因此,任何外设初始化的第一步都是打开外设。
为定时器:
功率的保存是LPC1768的主要关注点。每个外围设备在使用之前都必须打开。RESET使一些外设启用,而另一些禁用。定时器中定时器/计数器0和1为开启状态,定时器/计数器2和3为关闭状态。
位 |
象征 |
描述 |
重置价值 |
0 |
- - - - - - |
保留。 |
NA |
1 |
PCTIM0 |
定时器/计数器0电源/时钟控制位。 |
1 |
2 |
PCTIM1 |
计时器/计数器1电源/时钟控制位。 |
1 |
' 3 |
PCUART0 |
UART0电源/时钟控制位。 |
1 |
4 |
PCUART1 |
UART1电源/时钟控制位。 |
1 |
5 |
- - - - - - |
保留。 |
NA |
6 |
PCPWM1 |
PWM1电源/时钟控制位。 |
1 |
7 |
PCI2C0 |
I2C0接口电源/时钟控制位。 |
1 |
8 |
PCSPI |
SPI接口电源/时钟控制位。 |
1 |
9 |
PCRTC |
RTC电源/时钟控制位。 |
1 |
10 |
PCSSP1 |
ssp1接口电源/时钟控制位。 |
1 |
11 |
- - - - - - |
保留。 |
NA |
12 |
PCADC |
A/D转换器(ADC)电源/时钟控制位。 |
0 |
13 |
PCCAN1 |
CAN控制器1电源/时钟控制位。 |
0 |
14 |
PCCAN2 |
CAN控制器2电源/时钟控制位。 |
0 |
15 |
PCGPIO |
IOCON、GPIO和GPIO中断的电源/时钟控制位。 |
1 |
16 |
PCRIT |
重复中断定时器电源/时钟控制位。 |
0 |
17 |
PCMCPWM |
电机控制脉宽调制 |
0 |
18 |
PCQEI |
正交编码器接口电源/时钟控制位。 |
0 |
19 |
PCI2C1 |
I2C1接口电源/时钟控制位。 |
1 |
20. |
- - - - - - |
保留。 |
NA |
21 |
PCSSP0 |
SSP0接口电源/时钟控制位。 |
1 |
22 |
PCTIM2 |
定时器2电源/时钟控制位。 |
0 |
23 |
PCTIM3 |
定时器3电源/时钟控制位。 |
0 |
24 |
PCUART2 |
UART 2电源/时钟控制位。 |
0 |
25 |
PCUART3 |
UART 3电源/时钟控制位。 |
0 |
26 |
PCI2C2 |
I2C接口2电源/时钟控制位。 |
1 |
27 |
pci2 |
I2S接口电源/时钟控制位。 |
0 |
28 |
- - - - - - |
保留。 |
NA |
29 |
PCGPDMA |
GPDMA功能电源/时钟控制位。 |
0 |
30. |
PCENET |
以太网块电源/时钟控制位。 |
0 |
31 |
PCUSB |
USB接口电源/时钟控制位。 |
0 |
图1:LPC1768复位时外设的位配置
对于TIMER1和TIMER2,必须设置功率位PCTIM0和PCTIM1。
代码片段:
LPC_SC - > PCONP | = (0 x01 < < 1);//enable POWER to TIMER0
LPC_SC - > PCONP | = (0 x1 < < 2);// enable POWER to TIMER1
定时器外围时钟:
下表指定了外设和PCLKSEL0和PCKSEL1寄存器中的位之间的关系。
位 |
象征 |
描述 |
重置价值 |
1:0 |
PCLK_WDT |
WDT的外围时钟选择。 |
00 |
3:2 |
PCLK_TIMER0 |
TIMER0的外围时钟选择。 |
00 |
5:4 |
PCLK_TIMER1 |
TIMER1的外围时钟选择。 |
00 |
7:6 |
PCLK_UART0 |
UART0的外围时钟选择。 |
00 |
9:8 |
PCLK_UART1 |
UART1的外围时钟选择。 |
00 |
11:10 |
- - - - - - |
保留。 |
NA |
13:12 |
PCLK_PWM1 |
PWM1的外围时钟选择。 |
00 |
15:14 |
PCLK_I2C0 |
I2C0的外围时钟选择。 |
00 |
17:16 |
PCLK_SPI |
SPI的外围时钟选择。 |
00 |
19:18 |
- - - - - - |
保留。 |
NA |
21:20 |
PCLK_SSP1 |
SSP1的外围时钟选择。 |
00 |
23:22 |
PCLK_DAC |
DAC的外围时钟选择。 |
00 |
25:24 |
PCLK_ADC |
ADC的外围时钟选择。 |
00 |
27:26 |
PCLK_CAN1 |
外围时钟选择CAN1.[1] |
00 |
29:28 |
PCLK_CAN2 |
外围时钟选择CAN2.[1] |
00 |
31:30 |
PCLK_ACF |
CAN接收滤波的外围时钟选择 |
00 |
图2:PLC1768中的外围时钟选择寄存器0 (PCLKSEL0)
位 |
象征 |
描述 |
重置价值 |
1:0 |
PCLK_QEI |
正交编码器接口的外围时钟选择。 |
00 |
3:2 |
PCLK_GPIOINT |
GPIO中断的外围时钟选择。 |
00 |
5:4 |
PCLK_PCB |
引脚连接块的外围时钟选择。 |
00 |
7:6 |
PCLK_I2C1 |
I2C1的外围时钟选择。 |
00 |
9:8 |
- - - - - - |
保留。 |
NA |
11:10 |
PCLK_SSP0 |
SSP0的外围时钟选择。 |
00 |
13:12 |
PCLK_TIMER2 |
TIMER2的外围时钟选择。 |
00 |
15:14 |
PCLK_TIMER3 |
TIMER3的外围时钟选择。 |
00 |
17:16 |
PCLK_UART2 |
UART2的外围时钟选择。 |
00 |
19:18 |
PCLK_UART3 |
UART3的外围时钟选择。 |
00 |
21:20 |
PCLK_I2C2 |
I2C2的外围时钟选择。 |
00 |
23:22 |
PCLK_I2S |
I2S的外围时钟选择。 |
00 |
25:24 |
- - - - - - |
保留。 |
NA |
27:26 |
PCLK_RIT |
重复中断定时器的外围时钟选择。 |
00 |
29:28 |
PCLK_SYSCON |
系统控制块的外围时钟选择。 |
00 |
31:30 |
PCLK_MC |
电机控制PWM的外围时钟选择。 |
00 |
图3:LPC1768中的外围时钟选择寄存器1 (PCLKSEL1)
例子.设置定时器0的外围时钟除以系统时钟频率的8。
pclkdiv = (LPC_SC->PCLKSEL0 >> 2) & 0x03;
开关(pclkdiv)
{
例0 x00:
默认值:
pclk = SystemFrequency / 4;
打破;
例0 x01:
pclk = SystemFrequency;
打破;
例0 x02:
pclk = SystemFrequency / 2;
打破;
例0 x03:
pclk = SystemFrequency / 8;
打破;
}
启用定时器:
配置的最后一步是通过定时器控制寄存器(TCR)启用定时器:
位 |
象征 |
描述 |
重置价值 |
0 |
计数器使 |
1:定时器计数器和预刻度计数器开启计数。 |
0 |
1 |
计数器重置 |
1:定时器计数器和预刻度计数器在PCLK的下一个正边缘同步重置。 |
0 |
31:2 |
- - - - - - |
保留,用户软件不应该对保留位写1。 |
NA |
图4:LPC1768定时器控制寄存器启用定时器的比特值
要重置并启用定时器,代码将与所有定时器类似:
代码片段:
LPC_TIM0细胞受体)- > = 0 x02;/*重置定时器*/
LPC_TIM0细胞受体)- > = 0 x01;/*启动定时器*/
在本节中,我们将开始在Keil MDK中创建一个项目,我们已经安装了KeilµVision和Co-MDK插件+ CoLinkEx驱动程序所需的CoLinkEx编程适配器。您可以从下载项目文件开始,并开始您的实际实验。
代码说明:
ARM编程需要在C语言中很好地处理位操作。这里是新手介绍位操作的小注意事项。C语言直接支持可用于位操作的位操作。在以下示例中,n是变量bit_fld中要操作的位的索引,bit_fld是一个用作位字段的无符号字符。位索引从0开始,而不是1。位0是最低有效位。
设置一个位
Bit_fld |= (1 << n)
清楚一点
Bit_fld &= ~(1 << n)
切换有点
Bit_fld ^= (1 << n)
测试有点
Bit_fld & (1 << n)
Timertest.c是用于测试上述给定项目中timer函数的代码,因为函数是用timer.c编写的。
For (I = 0;我< 2;我+ +)
{
init_timer(i, TIME_INTERVAL);
enable_timer(我);
}
上面的函数是初始化定时器0和1。
在while循环函数中,每个计时器都有自己的计时器计数器变量,它与所需的眨眼间隔进行比较,led被打开或关闭。
项目源代码
# # #代码链接在Description ###中
与本文相关的问题?询问和讨论EDAboard.com而且Electro-Tech-Online.com论坛。
告诉我们你的想法!
你必须登录发表评论。