STM32 中断非常强大,每个外设都可以产生中断
中断类型有:系统异常、外部中断。
NVIC:嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。两个重要的库文件:core_cm3.h和misc.h
中断编程的顺序
1-使能中断请求
2-配置中断优先级分组
3-配置NVIC寄存器,初始化NVIC_InitTypeDef;
4-编写中断服务函数
EXTI—外部中断/事件控制器
EXTI输入线有20条 通过AFIO外部中断寄存器来配置
EXTI初始化结构体
EXTI_InitTypeDef
1-EXTI_Line:用于产生 中断/事件 线
2-EXTI_Mode:EXTI模式(中断/事件)
3-EXTI_Trigger:触发(上/下/上下)
4-EXTI_LineCmd:使能或者失能(IMR/EMR)
系统定时器 SysTick :系统定时器,24位,只能递减,存在于内核,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。
相关延时时间计算
t = reload * ( 1/clk )
Clk = 72M时,t = (72) *(1/ 72 M )= 1US
Clk = 72M时,t = (72000) *(1/ 72 M )= 1MS 时间单位换算: 1s = 1000ms = 1000 000 us = 1000 000 000ns
-systick中断优先级配置的是scb->shprx寄存器;而外设的中断优先级配置的是nvic->iprx,有优先级分组,有抢占优先级和子优先级的说法。
3-STM32里面无论是内核还是外设都是使用4个二迚制位来表示中断优先级。 4-中断优先级的分组对内核和外设同样适用。当比较的时候,只需要把内核外设的中断优先级的四个位按照外设的中断优先级来分组来解析即可,即人为的分出抢占优先级和子优先级。
三种延时
1 软件延时`
`void delay(uint32_t count)
{
for(;count!=0;count--);
}
delay(0xffffff);//直接调用
2.查询延时
void SysTick_Delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);
for(i=0;i<ms;i++)
{
while(!(SysTick->CTRL) &(1<<16));
}
//失能SysTick_CTRL_ENABLE_Msk
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
3.中断延时
volatile uint32_t isr_ms;//在stm32f10x_it.c里要用extern声明
void SysTick_Delay_ms_INT(uint32_t ms)//中断
{
isr_ms=ms;
SysTick_Config(72000);
while(isr_ms);
//失能SysTick_CTRL_ENABLE_Msk
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}