一、 概述 1、 TIM3简介 iCore3使用的STM32F407IGT6芯片的具有10个通用定时器,分别为TIM2-TIM5、TIM9-TIM14,可用于定时、计数、输出PWM等。不同的定时器的计数方式、计数位数及功能有所不同,实验中使用的是TIM3,所以只对TIM3进行介绍。 2、 TIM3简介 TIM3是一个16位递增、递减和递增/递减自动重载计数器,16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 到 65536 之间,可用于:输入捕获、 输出比较、PWM 生成(边沿和中心对齐模式)和单脉冲模式输出。在实际应用中,可以根据需要进行相应的配置,使用相应的功能。 二、硬件电路 图12_0 三色LED 在iCore3双核心开发板中,三色LED与STM32F407相连,限流电阻为1K。 三、 实验原理 实验中,通过TIM3实现500ms定时,每过500ms,LED颜色变化一次,三色LED按定时间隔交替闪烁。 四、 源代码 1.主函数 - /*
- * Name : main
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 11/30/2015
- *
- * create.
- * --------------------
- */
- int main(void)
- {
- //定时500ms,每隔500ms三色LED灯闪烁一次
- led.initialize();
- timer3.initialize();
- while(1){
- }
- }
复制代码2.TIM3初始化代码 - /*
- * Name : initialize
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 11/30/2015
- *
- * create.
- * --------------------
- */
- static int initialize(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能TIM3时钟
- TIM_TimeBaseInitStructure.TIM_Period = 4999; //设置自动重载值
- TIM_TimeBaseInitStructure.TIM_Prescaler = 8399; //设置定时器预分频系数
- TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- //设置时钟分频因子
- TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //使能TIM3更新中断
- TIM_Cmd(TIM3,ENABLE); //使能TIM3
- //中断优先级分组
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- return 0;
- }
- /*
- * Name : TIM3_IRQHandler
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * -------------------
- * Rev : 0.00
- * Date : 30/11/2015
- *
- * create.
- * -------------------
- */
- void TIM3_IRQHandler(void)
- {
- static int counter = 0;
- //定时500ms,每隔500ms三色LED灯闪烁一次
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
- {
- if(counter % 3 == 0){
- LED_RED_ON;
- LED_BLUE_OFF;
- LED_GREEN_OFF;
- }else if(counter % 3 == 1){
- LED_RED_OFF;
- LED_BLUE_ON;
- LED_GREEN_OFF;
- }else if(counter % 3 == 2){
- LED_RED_OFF;
- LED_BLUE_OFF;
- LED_GREEN_ON;
- }
- counter ++;
- }
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
- }
复制代码3.定时器初始化结构体 - typedef struct
- {
- uint16_t TIM_Prescaler;
- uint16_t TIM_CounterMode;
- uint32_t TIM_Period;
- uint16_t TIM_ClockDivision;
- uint8_t TIM_RepetitionCounter;
- } TIM_TimeBaseInitTypeDef;
复制代码 TIM_Prescaler:定时器预分频系数,0x0000- 0xFFFF。 TIM_CounterMode:计数模式,可选择向上计数 、向下计数和中央对其模式。 TIM_Period:定时器自动重载值,0x0000- 0xFFFF TIM_ClockDivision:时钟分频因子,可选择1、2和4分频。 TIM_RepetitionCounter:重复计数值,重复溢出相应的次数,进入中断。 五、 实验现象 iCore3 双核心板三色LED每500ms交替闪烁。 六、 代码包下载
|