在线时间796 小时
UID3067179
注册时间2014-10-23
NXP金币1077
TA的每日心情 | 开心 4 天前 |
---|
签到天数: 1319 天 [LV.10]以坛为家III
版主
- 积分
- 7578
- 最后登录
- 2024-5-5
|
本帖最后由 TLLED 于 2018-11-21 14:28 编辑
16位TIMER的使用,通过定时器中断取反LED指示灯,来学习定时器的使用。
一、硬件部分
驱动红色LED。
二、软件部分
2.1、定时器初始化
- #define TICKRATE_HZ1 (1)/* 1 ticks per second */
- #define TICKRATE_HZ2 (2)/* 2 ticks per second */
- #define PRESCALE_HZ2 (0xFFFF) /* 16-bit prescale count */
- void TIMER16_Init(void)
- {
- uint32_t timerFreq;
-
- Chip_TIMER_Init(LPC_TIMER16_0); //使能16位定时器0时钟
- timerFreq = Chip_Clock_GetSystemClockRate(); //获取系统时钟
- //printf("timerFreq== %d \r\n",timerFreq); //48000000
- Chip_TIMER_Reset(LPC_TIMER16_0); //复位定时器0
- Chip_TIMER_MatchEnableInt(LPC_TIMER16_0, 1); //使能比较中断
- Chip_TIMER_PrescaleSet(LPC_TIMER16_0, PRESCALE_HZ2); //预分频值
- Chip_TIMER_SetMatch(LPC_TIMER16_0, 1, (timerFreq / TICKRATE_HZ2) >> 16); //设置比较值
- //printf("timerFreq / TICKRATE_HZ2== %d \r\n",(timerFreq / TICKRATE_HZ2)>>16); //48000000
- Chip_TIMER_ResetOnMatchEnable(LPC_TIMER16_0, 1);
- Chip_TIMER_Enable(LPC_TIMER16_0);
- NVIC_ClearPendingIRQ(TIMER_16_0_IRQn); //清除中断标志位
- NVIC_EnableIRQ(TIMER_16_0_IRQn); //使能外部中断
- }
复制代码
2.2、定时器中断
- void TIMER16_0_IRQHandler(void)
- {
- if (Chip_TIMER_MatchPending(LPC_TIMER16_0, 1))
- {
- Chip_TIMER_ClearMatch(LPC_TIMER16_0, 1);
- //Board_LED_Toggle(1);
- if(i==0)
- {
- i=1;
- LED_RED(1);
- }
- else
- {
- i=0;
- LED_RED(0);
- }
-
- }
- }
复制代码
2.3、主程序
- int main(void)
- {
- unsigned int cn=0;
- unsigned char ts=0;
- SystemCoreClockUpdate();
- Board_Init();
- LED_Init();
- TIMER16_Init();
- while (1)
- {
- }
- return 0;
- }
复制代码
2.4、代码分析
a、获取时钟频率 48000000
timerFreq = Chip_Clock_GetSystemClockRate(); //获取系统时钟频率
b、设置分频值 65535
Chip_TIMER_PrescaleSet(LPC_TIMER16_0, PRESCALE_HZ2); //预分频值 0xffff==65535
分频以后的时钟=48000000/65535=732.4
c、设置比较值
Chip_TIMER_SetMatch(LPC_TIMER16_0, 1, (timerFreq / TICKRATE_HZ2) >> 16); //设置比较值
比较值=(48000000/2)>>16 == 366.22
d、进中断时间
T=(1/732.4)*366=0.4997s == 499.7ms
三、程序执行结果
3.1、板子上红色LED灯闪烁
3.2、红色LED灯上的波形
|
|