中断
控制LED的方式有两种:轮询和中断
中断包含在异常中,但异常不一定是中断。
STM32参考手册中,中断向量表描述了发生何种中断后会跳转到相应的地址中。表中灰色部分为系统异常,白色部分为外设中断/外部中断。系统异常中编号为负的中断优先级无法改变。每种中断的地址是固定的,即PC指针所跳转到的位置是固定的。stm32f10x_gpio.c文件中,__Vectors到__EndVectors中也定义了中断向量表的内容。stm32f10x_it.c中可以定义相关中断发生后会进行的操作。
中断控制器的初始化
STM32参考手册中,外部中断/事件线路映像描述了I/O端口到外部中断/事件线的连接方式。 例如I/O端口PA[0]与EXTI0外部中断线是相连的。
CoreM3权威手册中,向量中断控制器,简称为NVIC。
void PA0_EXTI0_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//该结构体成员设置了结构体变量的抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
//该结构体成员设置了结构体变量的响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//该结构体成员设置了结构体变量的是否使能
NVIC_Init(&NVIC_InitStructure);
}
中断控制器与GPIO的连接
STM32库函数手册中,GPIO_EXTILineConfig
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
中断模式的设置
STM32库函数手册中,EXTI库函数GPIO_EXTILineConfig
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.NVIC_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
中断标志位的检测
利用EXTI_GetITStatus()函数来检测是否存在置位。
中断标志位的清除
利用EXTI_ClearITPendingBit()函数来清除标志位置位。
如果不清除标志位,则程序一直循环进入到中断中。
SysTick
STM32有三种基本的定时器:
高级控制定时器
通用定时器
基本定时器
STM32内部有一个硬件定时器——SysTick,滴答定时器。
异常向量表中,有一个内部中断向量 SysTick Handler。SysTick并不属于STM32的外设部分。SysTick定时器绑定在NVIC中,当SysTick计数达到一定值就会产生SysTick中断。
24bit
向下递减,减为0则读入load寄存器里的值
STK_VAL的值从STK_LOAD里所存的值开始递减,减到0,发生一次中断,并把STK_LOAD的值重新读入到STK_VAL。
STK_CTRL
AHB是72MHz
定时器配置完成后,需要先关闭定时器,需要时再开启。