学习stm32也快一年了,现在工作的内容跟用的是stm32平台的,趁着年前工作量比较小,总结一下stm32的基础知识,不出意外的话将会连续发布完整的笔记整理,学习的时候主要是跟着野火教程学的,然后在整理出适合自己的笔记。 2.1nvic 配置 1 、中断分组 在配置
学习stm32也快一年了,现在工作的内容跟用的是stm32平台的,趁着年前工作量比较小,总结一下stm32的基础知识,不出意外的话将会连续发布完整的笔记整理,学习的时候主要是跟着野火教程学的,然后在整理出适合自己的笔记。2.1 nvic配置1、中断分组在配置优先级的时候,nvic 只可以配置 16 种中断向量的优先级,抢占优先级和响应优先级的数量由一个 4 位的数字来决定,把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。
有 5 组分配方式:
第0组:所有4位用来配置响应优先级。
第1组:最高1位配抢占优先级,低3位配响应优先级。2^1=2 种抢占优先级(0,1),2^3=8 种响应优先级,
第2组:2位配抢占优先级,2位配响应优先级。4种抢占优先级,4种响应优先级。
第3组:高3位配抢占优先级,1位配响应优先级。8 种抢占优先级,2种响应优先级。
第4组:所有4位配抢占优先级,16 种中断向量都是抢占属性,没有响应属性。
2、中断优先级1、stm32中断向量有抢占属性和响应属性,编号越小,级别越高。
2、抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断
3、响应,当两个中断向量的抢占优先级相同时,如两个中断同时到达,则先处理响应优先级高的中断
3、中断通道中断服务函数的名字必须要与启动文件startup_stm32f10x_hd.s 中的中断向量表定义一致(以下是相对应的表)
中断通道 中断服务函数 中断线路中断引脚
exti0_irqn exti0_irqhandler ; exti line 0 pa0~pg0
exti1_irqn exti1_irqhandler; exti line 1 pa1~pg1
exti2_irqn exti2_irqhandler ; exti line 2 pa2~pg2
exti3_irqn exti3_irqhandler ; exti line 3 pa3~pg3
exti4_irqn exti4_irqhandler ; exti line 4 pa4~pg4
exti9_5_irqn exti9_5_irqhandler ; exti line 9..5
exti15_10_irqn exti15_10_irqhandler ; exti line 15..10
4、代码static void nvic_a11exti_inti(void)
{
nvic_inittypedef nvic_initstructure;
nvic_prioritygroupconfig(nvic_prioritygroup_1);//选择中断分组1
nvic_initstructure.nvic_irqchannel = exti0_irqn;//选择中断通道0
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;//抢占式中断优先级设置
nvic_initstructure.nvic_irqchannelsubpriority =0; //响应式中断优先级设置
nvic_initstructure.nvic_irqchannelcmd = enable;//使能中断
nvic_init(&nvic_initstructure);
}
2.1 外部中断配置1、使能 extix 线的时钟和第二功能 afio 时钟
2、配置 extix 线的中断优先级(nvic)
3、配置gpio引脚
4、配置为 exti模式和中断线路
void exti_pa0_inti(void)
{
gpio_inittypedef gpio_initstructure; //定义gpio宏操作的结构体
exti_inittypedef exti_initstructure;//定义exti宏操作的结构体
exti_clearitpendingbit(exti_line0);//清空中断标志
/*config the exitline clock and afio clock*/
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_afio,enable);//使能gpio时钟
/*config the nvic*/
nvic_a11exti_inti();//配置中断
/*exti line gpio config*/
gpio_initstructure.gpio_pin = gpio_pin_0; //选定引脚号
gpio_initstructure.gpio_mode = gpio_mode_ipd;//上拉输入
gpio_init(gpioa, &gpio_initstructure);//配置输出
/*exyi line mode config*/
gpio_extilineconfig(gpio_portsourcegpioa, gpio_pinsource0);//选择中断引脚
exti_initstructure.exti_line = exti_line0;//选择中断线路0
exti_initstructure.exti_mode = exti_mode_interrupt;//设置为中断请求,非事件请求
exti_initstructure.exti_trigger = exti_trigger_falling;//下降沿中断
exti_initstructure.exti_linecmd = enable;//外部中断使能
exti_init(&exti_initstructure);
}
2.1 服务函数void exti0_irqhandler(void)
{
if(exti_getitstatus(exti_line0) != reset)
{
//uart_sendstr(usart1,q );
exti_clearitpendingbit(exti_line0);
}
}