STM32中断NVIC部分知识总结

发布者:科技律动最新更新时间:2017-11-05 来源: eefocus关键字:STM32  中断  NVIC 手机看文章 扫描二维码
随时随地手机看文章

1.assert_param

实际上assert_param是一个宏定义,在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。当参数无效时,assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误。

2.NVIC_TypeDef结构体成员:

(1)ISER[2](Interrupt Set Enable Register)中断使能,ISER[0]的bit0~bit31对应中断0~31,ISER[1]的bit0~bit27对应中断的32~59,置1对应中断被使能;(还要分组、屏蔽、IO映射)

(2)ICER[2](Clear),置1有效;

(3)ISPR[2](Set Pending)置1正在执行的对应中断被挂起;

(4)IABR[2](Active Bit)只读,可知正在执行的中断;

(5)IPR[15](Priority)分配抢占、响应优先级,每个中断占用8bits,只使用高4位,两个优先级设置根据SCB->AIRCR配置决定。

3.关于中断的“向量表偏移量寄存器”(地址在0xE000E008):

#define NVIC_VectTab_RAM             ((uint32_t)0x20000000)

#define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)

SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80); //设置NVIC的向量表偏移量寄存器。(SCB_TypeDef结构体)功能是用于标示向量表是在Code区还是在RAM区。

定位向量表:知系统向量个数,再扩大到2的整数幂,四位乘4,边界对齐。 Offset是偏移量计算,STM32共60个加16内核中断=76,扩2次幂=128,乘4=512=0x200   0x400...

NVIC_VectTab基址,屏蔽前七位0x1FFFFF80和后三位+Offset+VECTTOR就是开始地址。

4.关于中断NVIC分组设置:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)

{

 

SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;

}

   #define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)

   #define NVIC_PriorityGroup_0         ((uint32_t)0x700)  //0位抢占

   #define NVIC_PriorityGroup_1         ((uint32_t)0x600)  //1位抢占

   #define NVIC_PriorityGroup_2         ((uint32_t)0x500)  //2位抢占

   #define NVIC_PriorityGroup_3         ((uint32_t)0x400)  //3位抢占

   #define NVIC_PriorityGroup_4         ((uint32_t)0x300)  //4位抢占

(1)应用程序中断及复位控制寄存器(AIRCR)(地址:0xE000ED00)[10:8]三位用于优先级分组。

STM32中断NVIC部分知识总结 表1  AIRCR中断分组设置表

(2)要修改SCB->AIRCR,需要向高16位赋值0x05FA秘钥。

5.配置GPIO口为中断源:

PAx ~ PGx 端口的中断事件都连接到了 EXTIx,即同一时刻 EXTIx 只能响应一个端口的事件触发,不能够同一时间响应所有GPIO 端口的事件,但可以分时复用。 

STM32中断NVIC部分知识总结图1  EXTI与GPIO连接图

STM32中断NVIC部分知识总结图2 EXTICR外部中断配置寄存器 

void NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)


  u8 EXTIADDR; 
  u8 EXTIOFFSET; 
  EXTIADDR=BITx/4; 
  EXTIOFFSET=(BITx%4)*4;

  RCC->APB2ENR|=0x01;//使能io复用时钟          
  AFIO->EXTICR[EXTADDR]&=~(0x000F<  AFIO->EXTICR[EXTADDR]|=GPIOx<  EXTI->IMR|=1<//EXTI->EMR|=1<  if(TRIM&0x01)EXTI->FTSR|=1<  if(TRIM&0x02)EXTI->RTSR|=1<

}

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

{

  uint32_t tmp = 0x00;

  tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));

  AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; //右移2位确定EXTICR[x],并清零

  

  AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));//配置相应的EXTICR[x],EXTI.BITx映射到 GPIOx.BITx

}


关键字:STM32  中断  NVIC 引用地址:STM32中断NVIC部分知识总结

上一篇:STM32 IAP+APP应用
下一篇:关于STM32开发板晶振相关的问题汇总

推荐阅读最新更新时间:2024-03-16 15:43

STM32三种BOOT模式介绍
一、三种BOOT模式介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。 Main Flash memory 是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。 System memory 从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一
[单片机]
<font color='red'>STM32</font>三种BOOT模式介绍
STM32 模拟IIC协议驱动TEA5767
IIC驱动程序参考自《ALIENTEK MINISTM32 实验16 IIC实验》,做了简单的修改就轻易驱动TEA5767。至于TEA5767内部寄存器的配置就不说了。看程序: 文件:I2C_Driver.h #ifndef __I2C_Driver_H #define __I2C_Driver_H #define uchar unsigned char #define uint unsigned short int #define ulint unsigned int #define delay_nus 2 //IO方向设置 #define SDA_IN() {GPIOB- CRH&=0XFFFF0FFF;
[单片机]
<font color='red'>STM32</font> 模拟IIC协议驱动TEA5767
中断&定时器(三)
单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 T0 - 定时器/计数器0中断, 由T0计数器计满回零引起 T1 - 定时器/计数器1中断, 由T1计数器计满回零引起 T2 - 定时器/计数器2中断, 由T2计数器计满回零引起 TI/RI - 串行口中断,串行端口完成一帧字符发送/接收后引起 其中T2是52单片机特有的。 中断允许寄存器IE 中断优先级寄存器IP 定时器中断 51单片机内部共有两个16位可编程的
[单片机]
<font color='red'>中断</font>&定时器(三)
基于STM32的跑马灯实验的详细解析
我们用C语言来再学习STM32,以加深理解,并且应用相关资料和官方固件标准库。因此,我们来编写一个跑马灯实验 先前准备 一, 开发环境 安装MDK5,并且导入STM32官方标准库。 STM32官方标准库名称:stm32f4_dsp_stdperiph_lib 这个STM32官方固件标准库以前是可以在ST官网下载,现在好像在官网上找不到了。 二,相关应用资料:STM32F4XX中文参考手册 相关函数 一,因为要使用GPIO,在使用GPIO时需要先使能IO口时钟。 使能IO时钟就要使用到RCC寄存器。RCC寄存器相关知识,见中文参考手册6.3章节。 调用函数:RCC_AHB1PeriphClockCmd(); 二,因为要用
[单片机]
基于<font color='red'>STM32</font>的跑马灯实验的详细解析
基于STM32利用TIM3的通道输出四个不同的PWM波
2019年7月25日 做小车的第五天。 今天我实现了一个新的功能:利用一个定时器的个各通道输出4路PWM波(可用来控制2个直流电机) 大致思路是:通过改变每个每个通道PWM波的占空比,达到输出4路不同的PWM波,可利用差值实现差速,从而控制电机的运转。 代码如下: /********************.h文件/ #ifndef __TIM3_H #define __TIM3_H #include “stm32f10x.h” #include “sys.h” void TIM3_PWM_Init(u16 arr,u16 psc); //声明函数 #endif /.c文件/ / 在.c文件里主要是配置TIM3的4个通道对用的IO
[单片机]
基于<font color='red'>STM32</font>利用TIM3的通道输出四个不同的PWM波
STM32 USB-HID的调试记录
1、使用USB 的鼠标方式进行。HID设备方式,即插即用。在输入端可以看到人体输入端; 2、HID设备,可以使用porthelper调试USB,BUS Hound抓取USB包。 资料参考1: http://www.openedv.com/posts/list/41451.htm 2.1 通过Bus Hound软件可以看到连接成功外设USB设备:(如下图所示) 2.2 鼠标按下后获取的数据,左键、右键还有翻页和空键。 2.3 USB调试器可以发现外接的设备。查找后界面如下。但是无法在接收区接收到数据。 将CC1101和USB-HID通信以及串口结合起来,做了简单的演示功能。 测试条件:PC机使用
[单片机]
<font color='red'>STM32</font> USB-HID的调试记录
初学stm32-PWM的应用-呼吸灯
PWM概述 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,PWM 原理如图: STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。通过查看开发板的原理图(如下),可发现PF9引脚连接LED0,同时也是作为TIM14_CH1的复用输出端口,知道此前提,我们就可以开始搞事情了。 PWM输出步骤 使能定时器14和相关IO口时钟。 使能定时器14时钟:RCC_APB1PeriphClockCmd(); 使能GPIOF时钟:RCC_AHB1Per
[单片机]
初学stm32-PWM的应用-呼吸灯
stm32定时器优先级
什么是优先级   优先级是具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。   当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 stm32定时器优先级   STM32 可以支持的 68 个外部中断通道,已经固定的分配给相应的外部设备。每个中断通道都具备自己
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved