stm32中断向量表处理问题

  新手必看,关于STM32其他问题  1、使用JTAG download程序至STM32F205XX(with Cortex-M3)  问:請教各位先進,若欲使用JTAG interface下載程序至STM32F205XX的板子,似乎一般是透過SEGGER的J-link,是否可使用其他的JTAG-USB下載線如Altera出的USB Blaster?  又是否只要符合JTAG規範的傳輸線皆可?  答1:只要支持M3并且支持STM32F2XX系列就可以,不一定非要JTAG,也可以使用SWD。  答2:ARM KEIL ULINK也行,兼容性非常好呀!  2、STM32触摸屏  问:我想用STM32来触摸一款触摸屏,因为我现在还不了解STM32以及触摸屏,所以我想问一下,具体用那款单片机型号最好? 最好是STM32内部已经具有触摸屏的控制器了。屏有没有数据传输总线是32位的,正好和单片机总线一样 。另要求屏的色彩深度也是32位或者是24位。3.2寸左右,这个可大也可小点。 能不能也推荐一款触摸屏的型号,以及相关资料。  答:1、这个需要根据显示屏来决定,市场上也有很多触摸的显示屏,STM32可以用过SPI、FMCS、IO口等来控制,这个要看你选择的类型 2、型号和资料,这个要找厂家要,厂家一半都会给你合适的建议和 源代码。  3、STM32可以做什么  问:学习了STM32可以做什么?有什么用途或者前途,请告诉,不胜感谢。  答:可以用的方面比较多,比如工业、消费、医疗等。这个要根据产品的需求来决定使用的芯片。  4、STM32F2X系列能能驱动多大尺寸TFTLCD呢?用FSMC模式  问:STM32F2X系列能能驱动多大尺寸TFTLCD呢?用FSMC模式,显示简单的菜单,参数等操作  答:这个没有具体的参数,个人认为10.0一下都没问题。  5、VDD与VSS的去藕电容如何处理?  问:VDD与VSS的去藕电容如何处理?  答:1、每对VDD与VSS都必须在尽可能靠近芯片处分别放置一个10nF~100nF的高频瓷介电容 2、在靠近VDD3和VSS3的地方放置一个4.7μF~10μF的钽电容或瓷介电容  6、系统时钟的监控和切换的作用是什么?  问:系统时钟的监控和切换的作用是什么?  最佳答案:STM32作为一个可靠稳定的微处理器,但是不能排除由于某些外界特殊因素可能造成STM32的外部振荡器失效,所以在芯片中需要一种包含机制能够在STM32运行时,一旦外部晶体振荡器(HSE)失效,切换STM32的系统时钟源到一个稳定的时钟源,以保证STM32能够继续运行,并进行相应的保护操作。  7、PVD的作用是什么?  答:在应用开发中,通常都要考虑到当系统电压下降或掉电状况,一旦出现该状况应对控制系统加以保护。故在程序中需要加入对系统电压的监控。当供电电压降低到某一电压值时,需要系统进入特别保护状态,执行紧急关闭任务:对系统的一些数据保存起来,同时对外设进行相应的保护操作。  8、STM32的三种低功耗模式是什么?  答:1、睡眠模式Sleep:电压调节器开启,Cortex-M3内核停止运行,外设保持运行态; 2、停止模式Stop:电压调节器可选择性开启,所有外设时钟、PLL、HSI和HSE被关闭,Cortex-M3内核和所有外设停止运行,保留SRAM和寄存器的内容; 3、待机模式Standby:电压调节器关闭、整个1.8v区域断电。除了备份区域和待机电路的寄存器以外,SRAM和寄存器的内容全部丢失。  9、STM32103RB的TIM2 channel1以及UART2的CTS都是PA0 pin, 他们是怎么区分的?  答:IC的一根管脚,做多种外设的复用pin,很常见,在PA0上,只能作为一种外设的管脚,但两个外设能同时用吗,当然是可以的。可以设置STM32中有的寄存器AFIO_MAPR来配置复用管脚及外设接口的重新映射,比如你选择PA0为UART2的CTS,PA0肯定不能再作为TIM2的channel1,但可以设置TIM2的channel1的管脚为PA15,请参考如下寄存器说明: Bits 9:8 TIM2_REMAP[1:0]: TIM2 remapping These bits are set and cleared by software. They control the mapping of TIM2 channels 1 to 4 and external trigger (ETR) on the GPIO ports. 00: No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) 01: Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) 10: Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) 11: Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11)  10 CSMA/CA算法  问:STM32W108CBU64执行一次CSMA/CA算法是延时多长时间?  RadioTransmitConfig radioTransmitConfig = {  TRUE, //waitForAck  TRUE, //checkCca  RADIO_CCA_ATTEMPT_MAX_DEFAULT, //ccaAttemptMax  RADIO_BACKOFF_EXPONENT_MIN_DEFAULT, //backoffExponentMin  RADIO_BACKOFF_EXPONENT_MAX_DEFAULT, //backoffExponentMax  TRUE //appendCrc  };  答1:更简单的可以设置两个断点,看下右下方的运行时间,就知道了!  答2:这个没有计算过,你可以在计算前加个定时器获取值,计算完以后再获取一下定时器的值,这样就知道时间了。  11、STM32F4系列软件仿真问题  问:STM32F4系列能用Keil4.54,的debug进行软件仿真吗? 我一仿真,程序指针跳到0x处。很奇怪  而且peripherals菜单选项没有了。 请问这是怎么回事?  答:可以。说明你程序有错误,而不能跳到启动。你应该下载一个最新的KEIL  12、进入SLEEP模式的省电要操作哪些流程?  问:进入SLEEP模式的省电要操作哪些流程?  最佳答案:  1、关闭无需等待中断或事件的外设时钟;  2、设置进入机制(Sleep-Now或Sleep-on-Exit);  3、设置系统进入SLEEP模式。  13、STM32W 的 wireshark 用Mxchip 的ADK-DK 可以充当吗?  问:STM32W 的 wireshark 用Mxchip 的ADK-DK 可以充当吗?  答:Wireshark 抓包器需配合MXCHIP的sniffer-W使用,ADK-DK无法充当。  14、STM8A不能从CAN接收中断中唤醒Halt模式  问1:我是做车载CAN通信的,使用STM8AF51AA的MCU,但是发现CAN接收中断不能唤醒Halt模式,但是改成Wait模式就可以唤醒,Walt模式的功耗过高,不符合车厂的要求。说明书上是说两种都可以唤醒的,我现在不知道是我的设计有问题还是芯片不支持,哪位大虾遇到这种情况的,可以跟大家一起分享吗?谢谢啦!  答1:1、WKUIE中断开启了吗? 2、支持该功能,你怎么判断他没有进入唤醒?第一包的数据会丢失。  问2::WKUIE中断已经开启,因为我在Wait模式下可以正常唤醒,所以中断设置是正常的,我在中断函数里面打个断点,等待中断的到来。  答2:这个时候仿真不管用。你最好使用LED和串口调试信息  15、F0 discovery 固件库在IAR6.0上运行时提示错误  问:IAR ELF Linker V6.40.3.54009/W32 for ARM  Copyright
IAR Systems AB.  Error[Li005]: no definition for "SYSCFG_EXTILineConfig" [referenced from F:新建文件夹STM32F0系列测试程序Test1DebugObjstm32f0_discovery.o]  是哪里的问题呢?我运行demo就无错误  Error[Li005]: no definition for "EXTI_Init" [referenced from F:新建文件夹STM32F0系列测试程序Test1DebugObjstm32f0_discovery.o]  2 358 bytes of readonly code memory  90 bytes of readonly data memory  1 057 bytes of readwrite data memory  Errors: 2  Warnings: none  Link time: 0.05 (CPU) 0.05 (elapsed)  Error while running Linker  Total number of errors: 2  Total number of warnings: 0  答:说明这2个没有被定义,请仔细看一下,是否正确定义。  16、系统时钟的监控和切换的作用是什么?  问:系统时钟的监控和切换的作用是什么?  最佳答案:STM32作为一个可靠稳定的微处理器,但是不能排除由于某些外界特殊因素可能造成STM32的外部振荡器失效,所以在芯片中需要一种包含机制能够在STM32运行时,一旦外部晶体振荡器(HSE)失效,切换STM32的系统时钟源到一个稳定的时钟源,以保证STM32能够继续运行,并进行相应的保护操作。  17、STM32W108CBU64执行一次CSMA/CA算法是延时多长时间?
  问: RadioTransmitConfig radioTransmitConfig = {  TRUE, //waitForAck  TRUE, //checkCca  RADIO_CCA_ATTEMPT_MAX_DEFAULT, //ccaAttemptMax  RADIO_BACKOFF_EXPONENT_MIN_DEFAULT, //backoffExponentMin  RADIO_BACKOFF_EXPONENT_MAX_DEFAULT, //backoffExponentMax  TRUE //appendCrc  };
  最佳答案:更简单的可以设置两个断点,看下右下方的运行时间,就知道了!  18、STM32F407和Android系统的平板电脑通讯问题  问:请问我想用stm32f407的usb和Android系统的平板电脑通讯,现在我知道在xp和w7系统下都可以做到,那在Android下能兼容吗?如果不兼容都需要做哪些工作呢?希望能进快给我答复谢谢。  答1:按照android的通讯协议做就可以。  答2:这个方向我也正在做、已经琢磨了很长时间了、有难度、关键是硬件不懂软件、软件不懂硬件还有协议的问题、后来考虑了个方法但是还没有实施你可以实施看、用stm32枚举成U盘、将你要表达的  协议写成文件格式、你需要收的文件也由android做成文件、以文件的形式来交互协议  19、关于100Pin MCU FSMC的应用咨询  问:根据ST datasheet描述,100pin mcu 的fsmc只支持NE1和NCE2,意味着只能外挂Nor/PSRAM和无中断功能的Nand,并且低地址A[15:0]和D[15:0]是复用方式。  请问:  1:NADV信号是否只有在Nor模式下才能有效输出锁存信号,而在SRAM模式下输出无效信号?  2:如果外挂一颗IS64LV25616这样的SRAM,该如何将复用的A和D分开?  3:如果使用100pin这样的FSMC,是否一定要外加地址锁存器,诸如74XX573这样的芯片才能将复用的A和D分开?  4:如果使用100pin这样的FSMC,市场上有没有与之对应的Nor和SRAM,可以自己解锁出总线上的A和D,ST有没有这样的chip?  答:1、我要看看手册 2、AD复用,也就是只能用1个 3、最好加锁存器 4、有对应SRAM,这个你可以参考各个开发的设计  20、stm32F207的相关资料从何处下载?  问:stm32F207的相关资料从何处下载?比如说,库函数,应用说明,时钟等等。最近做项目要使用stm32F207,但对这款芯片了解甚少。  答:您好,这个可以到社区的资料下载。或者到官方网站的F20X资料区下载。  21、STM32的官方例程在哪下载呢?  问:STM32的官方例程在哪下载呢?  答:你好,社区的资料下载栏目,以及论坛里都可以找到。  详见:1、 http://www.stmcu.org/download/index.php?act=ziliao  2、
http://www.stmcu.org/bbs/forumall_244.html  22、用内部HSI时钟时,外部时钟引脚应该悬空还是接地?  问:用内部HSI时钟时,外部时钟引脚应该悬空还是接地?  最佳答案:悬空。接地都可以。最好是接地  23、stm32f103c8t6芯片烧写问题  问:如题芯片首次jlink烧写程序没有任何问题,第二次烧写,jlink就不能识别,请问什么原因?  现在是第一次连接上jlink以后,jlink就出现问题了,直接显示是红灯了还有一个问题,jtag的上拉下拉电阻是不是可以不接?还有32.768Khz的晶振是不是也可以没有?  答:第一次烧录时应该是空的IC吧,没有烧录过任何CODE吧。用JLINK烧录完成后会自动断开连接,如果你没有对BOOT进行设置就不能再次烧录。BOOT设置可以查看DATA SHEET。  24、CPU休眠后无法唤醒  问:CPU休眠后,RTC无法让它唤醒,外部触发也不能唤醒,示波器测试小晶振,有正常的波形  答:这种情况也有可能是因为你对数组或者指针操作的时候引起的程序错误,而进入硬件错误中断。  25、请问STM32W108CBU64可以构成星型网络吗?  问:可以组成多少个子节点?  最佳答案:一个局域网可以有很多电脑,只要IP地址不一样就可以  26、请问各位大虾STM32F207的Camera接口支持ITU-R BT.656格式的数据输入吗?  问:本人想通过TVP5150将复合视频信号转为ITU-R BT.565后,经STM32F207的Camera接口送到LCD显示,不知道是否能实现,请各位指教。  答:可以,但是效果不是很好。毕竟频率才72Mhz。  27、LWIP和freertos的移植问题  问:请教大家一个问题,我现在想做lwip和freertos的移植,我在金牛 STM32F107_ETH_LwIP_V1.0.0例程的基础之上移植了freertos,为了验证我的系统移植没 有问题,首先我通过利用二值信号量的方式,实现了按键中断等简单程序,在这些都成功的情况下我把System_Periodic_Handle();做在了一个任务函数中,调用这个任务希 望实现telnet等基本功能,总是失败,最后我发现是不能进入总是进不去  EXTI2_IRQHandler(void)中断。我把中断这一块屏蔽了,在任务函数中加入  if (ETH_GetRxPktSize()!=0)  {  LwIP_Pkt_Handle();  }  这样就发现没有问题了,各项功能都能实现。为什么加上系统之后外部中断没有问题而网络中断不能进入,需要修改其他方面设置吗? 我又在官网(stmcu.org)上下载了STM32F107通过以太网实现在程序中编程(IAP) 就 是an3226.进行了简单的修改能在金牛板子上运行了。首先我将例程修改为通过 EXTI2_IRQHandler(void)中断实现TELNET,这样成功,这说明我对EXTI2_IRQHandler (void)的初始化是成功了。再次基础之上又做了freertos的移植,但是还是不成功。 在freertos下如何设置中断才能进如  void ETH_IRQHandler(void),还有什么方面存 在问题。菜鸟一个问的条理性不太好希望有人帮忙,万分感激。  答:这个问题发生的远不能因是你没有处理好中断,你还是处理一下吧.注意系统中中断向量列表处理。  28、stm32f107广域网互联  问:利用两块STM32F107开发板,分别置于两个不同的地区,如何通过公网建立通信,传输语音和其他的一些控制信息 是不是还要用到路由器之类的  答:如果你的距离不超过100米,可以直接用以太网连接,如果超过,就需要走网络了。如宽带,GPRS等。  29、关于LWIP和freertos的问题  问:请教大家一个问题,我现在想做lwip和freertos的移植,我在金牛 STM32F107_ETH_LwIP_V1.0.0例程的基础之上移植了freertos,为了验证我的系统移植没 有问题,首先我通过利用二值信号量的方式,实现了按键中断等简单程序,在这些都成 功的情况下我把System_Periodic_Handle();做在了一个任务函数中,调用这个任务希  望实现telnet等基本功能,总是失败,最后我发现是不能进入总是进不去 EXTI2_IRQHandler(void)中断。  我把中断这一块屏蔽了,在任务函数中加入  if (ETH_GetRxPktSize()!=0)  {  LwIP_Pkt_Handle();  }  这样就发现没有问题了,各项功能都能实现。为什么加上系统之后外部中断没有问题而 网络中断不能进入,需要修改其他方面设置吗? 我又在官网(stmcu.org)上下载了STM32F107通过以太网实现在程序中编程(IAP) 就 是an3226.进行了简单的修改能在金牛板子上运行了。首先我将例程修改为通过 EXTI2_IRQHandler(void)中断实现TELNET,这样成功,这说明我对EXTI2_IRQHandler (void)的初始化是成功了。再次基础之上又做了freertos的移植,但是还是不成功。 在freertos下如何设置中断才能进如voidETH_IRQHandler(void),还有什么方面存 在问题。菜鸟一个问的条理性不太好希望有人帮忙,万分感激~~~  答:这个问题发生的远不能因是你没有处理好中断,你还是处理一下吧.注意系统中中断向量列表处理.  30、keil环境下,如何将函数定义到指定的FLASH地址  问:keil环境下,如何将函数定义到指定的FLASH地址?定义常量变量到指定地址我知道可以通过__attribute__((at(addr))),但是函数的定义不会啊!  答:#program ROM 类似的语句,详情你可以参考帮助  31、STM32103 USART1死机  问:  void USART_Receive(USART_TypeDef* USARTx)  {  if (USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET)  {
  USART_ClearFlag(USARTx,USART_FLAG_RXNE);  s[0]=USART_ReceiveData(USART1);  delay(1000);
  s[1]=USART_ReceiveData(USART1);  delay(1000);  s[2]=USART_ReceiveData(USART1);  delay(1000);  write_char(s[0],s[1],s[2]); //发送数据到PC  //if(s[0]==0xff){GPIO_WriteBit(GPIOE,GPIO_Pin_0,Bit_SET);}
// //write_char(s[0],s[1],s[2]);  //
query_uart_command();
//命令判断  }
  }  上面程序在  发送FF的时候收到FF FF FF  发送FF 22的时候收到FF 22 22  发送FF 22 33时收到FF 22 22  之后再发送数据时串口不响应!!!  最佳答案:  stm32串口有个可以说是bug的地方,就是即使不使能溢出等其他错误中断的情况下,若发生溢出错误,仍会进入中断,而且常规检查中断的方法无法查到中断标志。所以办法就是在串口正常中断处理之后加清除中断的语句。具体网上可以找到。之前因为这个原因,程序经常死掉,结果是死在串口中断处理里,不停中断,有没有清除中断标志哦。  32、关于STM32读取陀螺仪的是电压值,怎么经过积分变成角度的问题  问:请问下,STM32读取陀螺仪的是电压值,怎么经过积分变成角度?而且积分函数怎么写呢?  答:陀螺仪有个参数a,叫做灵敏度,单位是(°/s/V),有个参数b,叫静止电压,单位是(V).  你写的程序有个参数叫做采样率c,单位是(S/s),有一个叫做ADC基准d,单位(V),有一个叫做ADC分辨率e,没有量纲,还有一个ADC输入值f.  知道什么叫做积分,什么叫做微分吗?能够不背概念,按照自己的理解说一遍吗? 假设,每次采样的u分别为u1,u2,u3,...u1000,  令v=u1+u2+u3+...+u1000,v就是从u1到u1000的采样时间内角度的偏差. 就是从采u1到采u1000期间,陀螺仪转过的。  33、STM32F107可以和TI的无线接发模块CC2520配合使用吗?  问:STM32F107可以和TI的无线接发模块CC2520配合使用吗?如果可以,可以怎么实现呢?烦请各位大侠多多赐教!小弟刚刚接触这方面的内容。再次拜谢!  答:无线接发模块CC2520是什么接口,i2c,UART,SPI?主要是看接口支不支持。。  34、关于STM32自带的bootloader的功能  问:STM32F107:memory mapping地址0xx0003FFFF中存放的是什么?如果是历程,则主要是做什么功能,这段程序能不能被读出?  答:在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。 在从待机模式退出时,BOOT引脚的值将被被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。在启动延迟之后,CPU从地址0x获取堆栈顶的地址,并从启动存储器的0x指示的地址开始执行代码。这段代码被固定在MCU内,不能通过外部来修改。  35、关于STM32的代码加密问题  问:产品选用STM32F103,目前电路设计仅留了20pin的JTAG口。请问一下该如何加密。据说如果采用JLINK的secure选项加密,JLINK以后是无法识别和擦除的,请问一下该如何加密。目前串口、RST、BOOT脚单板上没有预留。谢谢。  答:Jlink加密以后,将不能读取FLASH中的内容,但是可以通过JFlashARM先将FLASH擦除掉,再进行新的程序烧写。  36、VDD与VSS的去藕电容如何处理?  问:VDD与VSS的去藕电容如何处理?  答:1、每对VDD与VSS都必须在尽可能靠近芯片处分别放置一个10nF~100nF的高频瓷介电容 2、在靠近VDD3和VSS3的地方放置一个4.7μF~10μF的钽电容或瓷介电容  37、stm32f107 每次ping通要重上电  问:您好,请教一下,107的芯片,phy是lan8700,仿照STM32F107_LK做的硬件,官方例程,mii模式,但是下载之后每次需要重新插拔电源才行,按下rst键或者下载都无法ping通,看了一下,phy初始化已经完成,不知道是哪里有问题,谢谢给分析下  答:应该是你发送完毕数据以后,没有结束。你仿真一下,PING完以后,下一次ping的时候,程序运行的状况。  至少你没有加PHY的reset,要不不会每次reset都无法ping通  38、仿真问题  问:keil4 STM32仿真里面怎样给USART1送入数据?  答:软件仿真的话,可以监视到USART1接收的数据。但要是给USART1送入数据的时候我一般用JLINK硬件仿真,加上电脑的串口助手发送。仿真中可以在USART1中设置断点查看数据是否发送成功(中断接收的时候)。  39、关于STM32 寄存器变量  问:STM32 寄存器变量 #define __IO volatile __IO uint32_t USART_Rx_Done = 0; USART_Rx_Done = 1;  怎样知道这个寄存器变量的地址,它是一个标志位 应该是有地址的 为什么在KEil中看不到  答:都在标准库里,你只能编译后,工程里包含的库文件才会出来,然后你选中寄存器变量,点右键,然后选择里面一个“涉及此参数”的选择。就可以找到地址了。  40、程序问题  问:SET == USART_GetFlagStatus(USART1, USART_FLAG_RXNE)
这句话是什么意思  答:当接收引脚有数据时,状态寄存器的USART_FLAG_RXNE就会为1,此时USART_GetFlagStatus(USART1, USART_FLAG_RXNE)的返回值就为1(SET),若无数据则为RESET,本语句一般用于while(SET == USART_GetFlagStatus(USART1, USART_FLAG_RXNE)),或if语句作为检测或判断条件  41、STM32重映射  问:为了使不同器件封装的外设I/O 功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这里的映射到其他脚上的意义是不是,假设GPIOA的PA1的复用功能是ADC1,那么是不是可以通过改变映射地址,将其映射到GPIOB的PB1上。  答:重映射的作用简单的说就是把管脚的外设功能映射到另一个管脚,但是不是可以随便映射的,具体对应关系参考手册上的管脚说明。比如USART2_TX默认在PA2管脚,当启用复用功能后就会将PD5管脚作为USART2_TX。另外也不是所有的管脚功能都能重映射,比如ADC1_IN0就只能在PA0。  42、STM32F417ZG批产烧程序  问:请问如何批量烧程序,源代码是不能给工人的,只能是编译好的二进制机器码。用的是正版的iar jlinkV8,找了几天没找到能够直接下载二进制的功能。uart串口方式烧写太麻烦了,而且产品不用串口。  答:可以,安装jlink的时候有一个J-Flash ARM的程序,这个可以直接烧写bin文件  深圳信盈达嵌入式、单片机、ARM、MIPS、FPGA、Android培训!  免费试听,满意后给您量身定制课程(包学会),快速提高您的技能!  教学特色:名师督学+工程师指导;项目案列解析+实际解决方案!  更多内容欢迎交流: qq:(谢老师)
楼主发言:2次 发图:0张 | 更多
  更多内容欢迎交流: qq:(谢老师)
请遵守言论规则,不得违反国家法律法规回复(Ctrl+Enter)STM32之中断-爱编程
STM32之中断
Nested vectored interrupt controller :可嵌套向量中断控制器 (NVIC)
82个可屏蔽中断 ##不包括内核的16个中断
16个可编程优先级 ##适用于全部中断
低延迟异常和中断处理
电源管理控制
系统控制寄存器的实现
NVIC与处理器内核接口紧密耦合, 实现了高效快速的中断响应。所有的中断,包括内核异常都被 NVIC 所管理.
2、中断向量表
其实中断向量表在**STM32F4XX**启动文件里面就可以看出来,详情可看 :[STM32F4XX启动文件分析](http://blog.csdn.net/u/article/details/)
3、EXTI(External interrupt/event controller) 外部中断/事件控制器
在每个中断/事件线都有独立的触发和屏蔽功能
每个中断线有专用的状态标志位
可产生高达 23 个软件事件/中断请求
以比APB2时钟周期更短的脉冲宽度检测外部信号
中断与事件配置
硬件中断选择
配置23线为中断源可参考以下配置步骤 :
配置 23 中断线的屏蔽位 (EXTI_IMR)
配置中断线的触发选择位 (EXTI_RTSR and EXTI_FTSR)
配置控制 NVIC IRQ 通道的使能与屏蔽位来使来自 23 线的一个中断可以被正确的应答,NVIC IRQ 被映射到外部中断控制器(EXTI)
硬件事件选择
配置23线为事件源可参考以下配置步骤 :
配置 23 事件线的屏蔽位 (EXTI_EMR)
配置事件线的触发选择位 (EXTI_RTSR and EXTI_FTSR)
软件 中断/事件 选择
23 线可以被配置为软件 中断/事件 线。下面的操作步骤可以产生一个软件中断.
配置 23 事件/中断 线的屏蔽位 (EXTI_IMR, EXTI_EMR)
设置软件中断寄存器的应答位 (EXTI_SWIER)
外部 中断/事件 映射
STM32F407ZG 的 140 个 GPIO 引脚都与一个外部中断线相连,具体如图所示:
上述一共用到了16根 EXTI 线,其余 7 根 EXTI 线的连接使用如下:
EXTI 16 连接到 PVD 输出(PVD:掉电检测)
EXTI 17 连接到 RTC Alarm 事件
EXTI 18 连接到 USB OTG FS Wakeup 事件
EXTI 19 连接到 Ethernet Wakeup 事件
EXTI 20 连接到 USB OTG HS (configured in FS) Wakeup 事件
EXTI 21 连接到 RTC Tamper and TimeStamp 事件
EXTI 22 连接到 RTC Wakeup 事件
中断与事件的区别
一个硬件中断/事件的产生:
input line 输入外部信号
边缘检测电路检测电平变化(电平变化检测可以人为配置,并且上升沿检测与下降沿检测是独立的)
经过一个或门,此或门连接电平检测电路的输出与软件事件/中断寄存器。也因此任意一条线的值为真,那么输出就为真,所以可以产生软触发中断或者事件
或门输入信号分别经过两个与门,另个与门分别再与中断屏蔽寄存器与事件屏蔽寄存器连接,控制中断或者事件的产生。这两个也是独立的,所以可以同时产生中断以及事件
如果是中断的话,输出信号会再经过中断挂起请求寄存器,如果此时芯片正处于不可被中断打断的时候,可以配置中断挂起寄存器来暂时挂起一个中断。需要软件参与
如果是事件的话,输出信号直接输出到一个脉冲发生器里面,脉冲发生器可以产生一个脉冲,调动相应的硬件完成此次事件响应。无需软件参与
DMA传输的例子:
如果配置为中断的话,需要在中断产生之后,进入中断处理函数,在中断处理函数中触发DMA操作,然后进行DMA。
如果配置为事件的话,直接由事件最终输出脉冲来触发DMA操作,不需要经过中断处理函数进行DMA的触发。
事件可以降低CPU的负荷,提高了响应速度
4、内核最重要的两个模块(SCB:System controller block NVIC:Nested vectored interrupt controller)
内核的外设
0xE000E008
Privileged
辅助控制寄存器
0xE000ED00
Privileged
0x410FC240
CPU的ID号码
0xE000ED04
Privileged
中断控制与状态寄存器
0xE000ED08
Privileged
中断向量表偏移,一般只取两个值,第29位为1表示SRAM区,为0表示code区
0xE000ED0C
Privileged
0xFA050000
应用程序中断以及复位
0xE000ED10
Privileged
0xE000ED14
Privileged
配置与控制
0xE000ED18
Privileged
系统中断处理函数优先级寄存器1
0xE000ED1C
Privileged
系统中断处理函数优先级寄存器2
0xE000ED20
Privileged
系统中断处理函数优先级寄存器3
0xE000ED24
Privileged
系统中断处理函数控制与状态
0xE000ED28
Privileged
配置异常状态寄存器
0xE000ED28
Privileged
内存管理异常状态寄存器
0xE000ED29
Privileged
总线异常状态寄存器
0xE000ED2A
Privileged
使用异常状态寄存器
0xE000ED2C
Privileged
硬件异常状态寄存器
0xE000ED34
Privileged
内存管理异常地址寄存器
0xE000ED38
Privileged
总线异常地址寄存器
0xE000ED3C
Privileged
辅助异常状态寄存器
0xE000E100-0xE000E11C
NVIC_ISER0-NVIC_ISER7
Privileged
0XE000E180-0xE000E19C
NVIC_ICER0-NVIC_ICER7
Privileged
0XE000E200-0xE000E21C
NVIC_ISPR0-NVIC_ISPR7
Privileged
0XE000E280-0xE000E29C
NVIC_ICPR0-NVIC_ICPR7
Privileged
0xE000E300-0xE000E31C
NVIC_IABR0-NVIC_IABR7
Privileged
0xE000E400-0xE000E4EF
NVIC_IPR0-NVIC_IPR59
Privileged
中断优先级
0xE000EF00
Configurable
软件触发中断
5、优先级分组的概念
Cortex M4 的优先级分组如下图所示
内核优先级的分组:
要注意的是,在 STM32F407ZG 只使用了 4bits 的位(高4位),也就是说分组情况如下
STM32组编号
Binary point
Group priority bits
Subpriority bits
Group priorities
subpriorities
b.yyyyyyyy
bx.yyyyyyy
bxx.yyyyyy
bxxx.yyyyy
bxxxx.yyyy
在STM32中组编号恰好与内核手册中的是反的,这样设计的原因是为了兼容性,也就是说如果程序移植到了只支持3位优先级设置的系统中也能够运行。另外有三种设计方式分别是:使用高 4bits,组编号不反转;使用低 4bits,组编号不反转;使用低 4bits,组编号反转。这三种方法如果按照内核分组写出来之后会发现会有优先级完全一样的情况出现,所以不可取。
要了解优先级分组,就要明确两个概念:抢占优先级(组优先级)、响应优先级(子优先级)
抢占优先级:可以被中断嵌套。也就是在一个中断发生的时候,另一个抢占优先级比此中断级别高的中断可以打断正在进行的中断,直到更高优先级的中断执行完毕之后,才会返回来继续执行这个被打断的中断
响应优先级:不可以被中断嵌套。也就是说在多个中断同时发生的时候,只能够优先相应较高优先级的中断,并且如果在中断过程中有更高优先级中断发生的时候,正在进行的中断也不能够被打断。
抢占优先级与响应优先级的关系有点像 TCP/IP 协议中的网络号与子网号的区别,两个中断也是先比较抢占优先级然后才是比较响应优先级
6、程序编写
#define SUM_NVIC_PRIOTITY_BITS 4
//一共用了4个位
static void set_priority_group(u8 group_num)
u32 temp = 0, temp1 = 0;
group_num = group_num % (SUM_NVIC_PRIOTITY_BITS + 1);
temp1 = (((~group_num) & 0x07) && 8);
temp = SCB-&AIRCR;
temp &= 0x0000F8FF;
temp |= 0x05FA0000;
temp |= temp1;
SCB-&AIRCR =
void NVIC_set_priority(u8 g_priority, u8 sub_priority, IRQn_Type irq_num, u8 prioritygroup)
int32_t sub_priority_bits = 0;
sub_priority_bits = SUM_NVIC_PRIOTITY_BITS -
ASSERT(sub_priority_bits &= 0);
set_priority_group(prioritygroup);
if(irq_num & 0)
SCB-&SHP[((uint32_t)(irq_num) & 0xF)-4] = ((g_priority && sub_priority_bits) | sub_priority) && (8 - SUM_NVIC_PRIOTITY_BITS);
NVIC-&IP[(uint32_t)(irq_num)] = ((g_priority && sub_priority_bits) | sub_priority) && (8 - SUM_NVIC_PRIOTITY_BITS);
void NVIC_enable_irq(IRQn_Type irq)
NVIC-&ISER[(uint32_t)((int32_t)irq) && 5] |= (uint32_t)(1 && ((uint32_t)((int32_t)irq) % 32));
void EX_irq_config(GPIOx_SELECT gpiox,GPIOx_pn_SELECT gpiox_n,GPIO_IRQ_TRIGGER trigger)
RCC-&APB2ENR |= (1 && 14);
gpio_init(gpiox, gpiox_n, BYM_PULL_UP, BYM_GPI, BYM_HIGH_LEVEL, BYM_PUSH_PULL);
SYSCFG-&EXTICR[gpiox_n/4] &= ~(0xF && ((gpiox_n % 4) * 4));
SYSCFG-&EXTICR[gpiox_n/4] |= (gpiox && ((gpiox_n % 4) * 4));
EXTI-&IMR |= (1 && gpiox_n);
EXTI-&RTSR |= ((trigger & 0x01) && gpiox_n);
EXTI-&FTSR |= ((trigger && 1) && gpiox_n);
void EX_irq_clear(u8 irq)
EXTI-&PR |= (1 && irq);
测试抢占优先级不同的情况
NVIC_set_priority(1, 2, EXTI3_IRQn, 2);
NVIC_set_priority(2, 1, EXTI2_IRQn, 2);
EX_irq_config(BYM_GPIOE, BYM_Px3, IRQ_BOTHEDGE);
EX_irq_config(BYM_GPIOE, BYM_Px2, IRQ_BOTHEDGE);
NVIC_enable_irq(EXTI3_IRQn);
NVIC_enable_irq(EXTI2_IRQn);
中断服务程序
void EXTI3_IRQHandler(void)
if(0 == gpio_get(BYM_GPIOE, BYM_Px3))
printf("Key 1 down \r\n");
delay_ms(1000);
printf("Key 1 end \r\n");
EX_irq_clear(3);
void EXTI2_IRQHandler(void)
if(0 == gpio_get(BYM_GPIOE, BYM_Px2))
printf("Key 2 down \r\n");
delay_ms(1000);
printf("Key 2 end \r\n");
EX_irq_clear(2);
先按下 GPE3(对应EXTI3),立马按下 GPE2(对应EXTI2),有下面的输出结果(不会被打断)
Key 1 down
先按下 GPE2(对应EXTI2),立马按下 GPE3(对应EXTI3),有下面的输出结果(EXTI2的中断被EXTI3打断了)
Key 2 down
Key 1 down
测试抢占优先级相同而响应优先级不同的情况
主程序改变如下
NVIC_set_priority(1, 2, EXTI3_IRQn, 2);
NVIC_set_priority(1, 1, EXTI2_IRQn, 2);
EX_irq_config(BYM_GPIOE, BYM_Px3, IRQ_BOTHEDGE);
EX_irq_config(BYM_GPIOE, BYM_Px2, IRQ_BOTHEDGE);
NVIC_enable_irq(EXTI3_IRQn);
NVIC_enable_irq(EXTI2_IRQn);
先按下 GPE3(对应EXTI3),立马按下 GPE2(对应EXTI2),有下面的输出结果(不会被打断)
Key 1 down
先按下 GPE2(对应EXTI2),立马按下 GPE3(对应EXTI3),有下面的输出结果(不会被打断)
Key 2 down
8、程序编写思路
设置优先级分组,使用 SCB 的 AIRCR 寄存器(重要的是写入钥匙,5FA)
具体规划分组内部抢占与响应优先级,如果中断是内核的,使用 SCB 3. 控制模块,如果是外部的,使用 NVIC 模块
使能 SYSCFG 模块时钟,映射相应的中断线,如果是IO口中断还要设置跳变沿以及初始化IO管脚
解除中断或者事件屏蔽(EXTI寄存器)
NVIC使能相应的中断
编写中断服务程序
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。

我要回帖

更多关于 stm32 中断处理 的文章

 

随机推荐