GPIO-TIMER(通用定时器)⚡️
文章目录
使用TIMER流程(例中使用TIMER2)⚡️
1️⃣:在最上方包含Timer的头文件
- #include “Timer.h”
2️⃣:在TIMER头文件选择需要的定时器初始化函数,拷贝到main.c中,并设置 计数值和分频值。
-
Timer2_init(addr,PSC);
-
设置方法:定时单位时间 = 计数值(addr) *分频值(PSC+1) /时钟(72MHz)
-
定时单位时间1s : Timer2_init(9999,7199); //1s =( 9999+1) x (7199+1)÷72MHz
-
定时单位时间1ms : Timer2_init(999,71); //1ms =( 999+1) x (71+1)÷72MHz
3️⃣:编写中断函数,中断所需要的执行的内容😄
方法一 :
- 中断函数计数,main.c判断计数值然后再main.c中执行
void TIM2_IRQHandler(void)
{
static u8 cnt=0;
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
{
cnt++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
方法二:
- 直接在中断函数中执行
void TIM2_IRQHandler(void)
{
static u8 cnt=0;
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
{
cnt++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
if(cnt==cnt_end)
{
//用户执行代码
...
}
}
1
<font color = "blue"o.>中断标志函数: TIM_GetITStatus(TIM2,TIM_IT_Update);
清除中断标志函数: TIM_ClearITPendingBit(TIM2,TIM_IT_Update);——中断后一定要手动复位中断标志(添加该函数).
编写TIMER流程 ⚡️
框架总览
* 简化框架
void Timer2_init(u16 CNT, u16 PSC)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//打开对应的时钟使能
Timer_init(CNT, PSC); //初始化定时器
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //选择定时器,选择中断方式,使能中断
NVIC_init(); //设置抢占优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择抢占优先组
TIM_Cmd(TIM2,ENABLE); //使能TIMER2
}
* 整体框架
void Timer2_init(u16 CNT, u16 PSC)
{
//-------------定义结构体----------------------
NVIC_InitTypeDef NVIC_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
//-------打开定时器所在时钟树的时钟-------------
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//打开对应的时钟使能
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择抢占优先组
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;//不影响时钟频率,可以不用管
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Down;//向下计数
TIM_TimeBaseStruct.TIM_Period = CNT;//Period-周期 即周期计数值
TIM_TimeBaseStruct.TIM_Prescaler = PSC; //Prescaler-分频器
TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;//没用不用管
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);//初始化定时器2
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;//选择要设计中断请求的通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;//主优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;//子优先级
NVIC_Init(&NVIC_InitStruct);//设置抢占优先级
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//选择定时器,选择中断方式,使能中断
TIM_Cmd(TIM2,ENABLE);//使能TIMER2
}
主要函数解析🙂
❀接下来开始解析框架总览的函数 |
- 初始化TIMER流程
1️⃣ :RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
打开对应定时器的时钟。
2️⃣ :TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);
初始化对应的定时器。
3️⃣ :NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
选择抢占优先级组,为后续优先级选择提供选择空间。
4️⃣ :NVIC_Init(&NVIC_InitStruct);
初始化中断抢占优先级参数
5️⃣ :TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
选择定时器,选择中断方式,选择中断(ENABLE-中断/DISABLE-事件)
6️⃣ :TIM_Cmd(TIM2,ENABLE);
使能中断
- TIMER中断服务函数
1️⃣ :TIM2_IRQHandler();
本质上函数名称不能改,但可以宏定义映射。
2️⃣ :TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
读取中断标志位,以此来判断中断是否发生。
3️⃣ :TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)
将拉高的中断标志位手动拉低(复位)