到周末了,又可以玩玩板子,今天更新定时器部分,其实也比较简单,定时器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。
|