https://blog.csdn.net/qq_38351824/article/details/94038740
这部分讲的很好。
misc.h文件其实就是stm32f10x_NVIC.h,NVIC的主要操作都在其中,还包括systick的选择源操作。
core_cm3文件里面是内核外设,当然包括NVIC,l里面包含NVIC的寄存器操作。
- NVIC叙述
- NVIC寄存器
- NVIC操作
- NVIC代码示例
NVIC叙述
NVIC是位于内核的中断控制器,是所有中断在内核处理的中枢,想要使用中断必须先配置它。
高达81个中断,实际上是67stm外设中断(60个settable,由库函数interrupt number可知)+16cortex内核中断(7个settable)。
0-15优先级等级。
可用电压和脉冲作为中断信号.。(未尝试)
NVIC寄存器
ISERx\ICERx\ISPRx\ICPRx\IABRx
每32个中断使用使能、失能、挂起、清除挂起、激活寄存器各一个。
无论使能与否,每个中断都可被挂起。
这几个其实没啥卵用。。之后的misc库函数封装得很完善了。
NVIC的寄存器操作也可以在core_m3.h文件中NVIC function中找到,但是一般不使用。
重要的是:
IPRx寄存器
cortex给了81个中断预留IP[X],st显然没有全用。
cortex每个中断分配8bit的中断优先级编程区域,一个IPRx管四个中断。
实际上st只用了8bit里面的4bit,还用了抢占、响应两个优先级。
NVIC操作
NVIC属于cortex,无时钟使能。
之前说过这几个寄存器其实没啥卵用,库函数的操作如下:
- 设置优先级组型。
- 初始化NVIC,包括其中断渠道、抢占优先级、响应优先级、使能与否。
如此简单就完成了NVIC的中断设置。
NVIC代码示例
NVICConfig.h
#include "NVICConfig.h"
void NVIC_Config( uint8_t NVIC_IRQChannel , uint32_t NVIC_PriorityGroup ,\
uint8_t NVIC_IRQChannelPreemptionPriority , uint8_t NVIC_IRQChannelSubPriority , FunctionalState NVIC_IRQChannelCmd )
{
NVIC_InitTypeDef* NVIC_InitStruct;
NVIC_InitStruct->NVIC_IRQChannel = NVIC_IRQChannel;
NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority = NVIC_IRQChannelPreemptionPriority;
NVIC_InitStruct->NVIC_IRQChannelSubPriority = NVIC_IRQChannelSubPriority;
NVIC_InitStruct->NVIC_IRQChannelCmd = NVIC_IRQChannelCmd;
NVIC_PriorityGroupConfig( NVIC_PriorityGroup );
NVIC_Init( NVIC_InitStruct );
}
NVICConfig.c
#ifndef __NVIC_CONFIG_H_
#define __NVIC_CONFIG_H_
#include "stm32f10x.h"
void NVIC_Config( uint8_t NVIC_IRQChannel , uint32_t NVIC_PriorityGroup ,\
uint8_t NVIC_IRQChannelPreemptionPriority , uint8_t NVIC_IRQChannelSubPriority , FunctionalState NVIC_IRQChannelCmd );
#endif
main.c
int main()
{
NVIC_Config( EXTI0_IRQn , NVIC_PriorityGroup_0 ,\
0 , 1 , ENABLE );
}
//配置EXTIO 组0优先级 抢占0 响应1 使能
欢迎交流指正~~