一、微项目实现目标:
实现1s一次的中断模块,并在中断函数中实现必要的操作
二、微项目硬件配置需求:
stm32F103C8T6核心板一块
0.96寸OLED显示,用于显示计数
三、前置知识:
前置知识主要分为两大块:1,基本的时钟模块;2,中断处理模块
1,基本的时钟模块
①如上图,基本时钟模块主要分为:时钟源设定+时间单元配置 (主要是PSC分频和ARR自动重装器)+定时器中断溢出
时基模块的中断溢出逻辑: 时钟源/(PSC+1)产生新的时钟输入,每次收到一次时钟后,则CNT自增加1,在等于ARR自动重装寄存器时,则产生一次中断输出。并且CNT自动清0处理;
2,中断模块
①在接收到时钟模块产生的中断信号后,保存当前程序运行节点的环境,进行中断服务函数处理,完成中断服务函数后,返回到主程序的断点位置;
②中断需要配置优先级分组,由两部分组成:抢占优先级、次优先级
四、代码逻辑分析:
①开始TIM2时钟RCC
②配置时钟源为内部72MHZ,再配置时基单元
③清空定时器中断溢出标志位
④开启TIM2中断模块
⑤配置TIM2中断优先级分组
⑥初始化NVIC中断模块
⑦开始时钟
⑧配置中断服务函数
五、代码示例:
①开始TIM2时钟RCC
//开启TIM2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
②时钟源为内部72MHZ
//配置时钟源,内置72mhz
TIM_InternalClockConfig(TIM2);
再配置时基单元
//配置时基单元、
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period=10000-1;
TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit( TIM2,&TIM_TimeBaseInitStruct );
③清空定时器中断溢出标志位,原因是在timebaseinit函数会强制产生一次溢出
//清除中断挂起位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
④开启TIM2中断模块
//开启时钟中断
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
⑤配置TIM2中断优先级分组
初始化NVIC中断模块
//配置中断模块
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);//优先级分组配置
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel= TIM2_IRQn ;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
⑥开始时钟
//开启时钟
TIM_Cmd( TIM2, ENABLE);
⑦配置中断服务函数
注意中断函数名决定了触发中断后执行的函数地址
//中断服务函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET)
{
speed= getspeedn();
}
TIM_ClearITPendingBit( TIM2,TIM_IT_Update );
}
主函数部分,按照需求配置