图片来源bilibil 江协科技
上图为定时器中断结构,我们使用定时器中断的操作步骤:
- 选择时钟源(如上图左内部时钟、外部时钟、其他定时器、通道捕获)
- 初始化时基单元
- 配置中断输出控制
- 配置NVIC
- 使能时钟运行控制
以下为一个示例 1s触发一次中断
#include "stm32f10x.h" // Device header
void Timer_Init(void)
{
//启动APB1下的TIM2通用定时器
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//选择TIM2通用定时器 系统默认配置使用 可以不配置 但是规范流程 写一下
TIM_InternalClockConfig(TIM2);
//初始化时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSturcture;
//选择时钟分频 这里是1分频就是不分频
TIM_TimeBaseInitSturcture.TIM_ClockDivision = TIM_CKD_DIV1;
//选择计数模式 向上计数
TIM_TimeBaseInitSturcture.TIM_CounterMode = TIM_CounterMode_Up;
//因为从0开始所以需要减一
//stm32103c8单片机频率是72Mhz; 72M分频(除以)7200 = 10000 的意思是单片机进行7200分频得到每秒10000个震动 ,然后计数设置成10000每10000次触发一次更新
TIM_TimeBaseInitSturcture.TIM_Period = 10000 -1;
TIM_TimeBaseInitSturcture.TIM_Prescaler = 7200 -1;
//高级定时器才有 这里填0
TIM_TimeBaseInitSturcture.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitSturcture);
//手动清除一次标志位 系统初始化时手动触发了更新事件 因此手动清除一次标志位 可以理解不清除的话代码单片机上电就会从1开始 但是计数是从0开始
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
//中断输出控制 允许TIM2定时器更新
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
//使能TIM2
TIM_Cmd(TIM2,ENABLE);
}
//配置TIM2的中断函数 这个格式固定可以开始文件中找到
void TIM2_IRQHandler(void)
{
//检查中断标志位 规范步骤
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
{
//需要中断执行的代码块
//代码结束清除标志位 不然退出不了中断函数
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
评论 (0)