到周末了,又可以玩玩板子,今天更新定时器部分,其实也比较简单,定时器1是高级定时器,定时器2 3 4都是基本定时器,由于之前系统滴答没有搞定,这里将定时器2作为系统滴答定时器开始后面的代码开发,本次实验先测试下定时器2 3 4的基本功能,直接看代码,下面这个地方不太明白,请论坛里面指导的给以讲解,少了这段code运行不起来
- void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
- void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
- void TIM4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
定义定时器中断间隔:
- #define TIM2_PSC 72
- #define TIM2_ARR 1000 //1ms
- #define TIM3_PSC 7200
- #define TIM3_ARR 5000 //500ms
- #define TIM4_PSC 7200
- #define TIM4_ARR 5000 //500ms
每个定时器的配置如下,这里就以定时器2为例:
- /*******************************************************************************
- * Function Name : TIM2_Int_Init
- * Description : TIM2_Int_Init.
- * Input : None
- * Return : None
- *******************************************************************************/
- void TIM2_Int_Init(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM3时钟
- TIM_TimeBaseStructure.TIM_Period = TIM2_ARR-1; //指定下次更新事件时要加载到活动自动重新加载寄存器中的周期值。
- TIM_TimeBaseStructure.TIM_Prescaler =TIM2_PSC-1; //指定用于划分TIM时钟的预分频器值。
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频因子
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM计数模式,向上计数模式
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能TIM2中断,允许更新中断
- //初始化TIM NVIC,设置中断优先级分组
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //设置响应优先级3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道1中断
- NVIC_Init(&NVIC_InitStructure); //初始化NVIC
- TIM_Cmd(TIM2, ENABLE); //TIM2使能
- }
定时器中断函数如下:
- /*******************************************************************************
- * Function Name : TIM2_IRQHandler
- * Description : TIM2_IRQHandler.
- * Input : None
- * Return : None
- *******************************************************************************/
- void TIM2_IRQHandler(void)
- {
- static u8 i=0;
- if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
- {
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除TIM3的中断挂起位。
- // printf("Enter interrupt\n");
- GPIO_WriteBit(GPIOA, GPIO_Pin_1, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
- }
- }
启动时对定时器进行初始化
- TIM2_Int_Init();
- TIM3_Int_Init();
- TIM4_Int_Init();
编译代码,下载到板子上看到LED等以1s周期闪烁,定时器3和4,用同样的方法进行测试,ok。
|