wx:嵌入式工程师成长日记
具体功能实现
当启动开发板时,OLED上的数字开始每隔1s自增一,实现定时器的功能
器件
STM32F103RCT6,OLED屏,四根杜邦线
前后展示图
前展示图
后展示图
知识介绍
ClearFlag()和ClearITPendingBit()的区别
ClearFlag():清除中断标志位
ClearITPendingBit():清除中断待处理位
标志位是事件发生与否的判断依据,用于支持函数的运行,如果事件发生,则该位至1,但是这不一定会产生中断
待处理位是控制中断发生的标志,如果该位置1(前提是相应标志位置1和中断已使能),则会产生中断,进入中断服务函数,而且在中断服务函数中必须手动将该位置0,否则程序会一直执行该中断。
TIM_Cmd
使能和失能外围设备(开启定时器时钟)
TIM_RepetitionCounter()
只有在高级定时器才能用到
基本定时器:TIM6,TIM7
通用定时器:TIM2~TIM5
高级定时器:TIM1,TIM8
其中TIM1和TIM8的时钟是由APB2输出产生,其他则是由APB1输出产生
NVIC(嵌套向量中断控制)
作用:用于中断分组,从而分配抢占优先级和响应优先级
编程步骤:
①选择优先级分组 NVIC_PriorityGroupConfig
②选择,配置,并使能中断
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //选择定时器2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //响应优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能定时器2中断;
NVIC_Init(&NVIC_InitStructure); //初始化以上参数;
③写出相应的中断函数
void EXTI2_IRQHandler(void)
中断函数都是固定的,需查阅文件
主函数代码(C语言)KEIL5实现
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
void timer_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_InternalClockConfig(TIM2);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
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);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
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);
TIM_Cmd(TIM2,ENABLE);
}
u16 num;
int main()
{
OLED_Init();
timer_init();
OLED_ShowString(1,1,"num");
while(1)
{
OLED_ShowNum(1,5,num,5);
}
}
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
{
num++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
问题解答
Q
什么是抢占优先级和响应优先级?
A
STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。
①抢占优先级:打断其他中断的属性,因为这个属性会出现嵌套中断,在执行完中断服务函数B后再继续执行中断函数A,由NVIC_IRQChannelPreemptionPriority()配置
②响应优先级:在抢占属性相同时,当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断。(优先级数字越小,优先级越高)由NVIC_IRQChannelSubPriority()配置