完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
搞单片机的应该都会知道NMI的意思,即不可屏蔽中断,大多数半导体厂商一般情况下也不会舍弃这个管脚,其中我觉着有一部分是历史遗留问题,早期的单片机主频低,NMI中断用来保证特殊实时性的要求,而如今随着MCU主频和性能的不断提高(今年下半年ARM发布的Cortex-M7理论最高主频已经可以达到400MHz,接近MPU了已经),已经足以保证大多数中断的实时性。而NMI的属性问题即其中断不可屏蔽的特性也给原本不需要使用它的用户带来一些困扰,NMI管脚是低电平中断,因此如果不用它的话需要外部加上拉电阻(单片机内部有很弱的上拉,为保证可靠性,外部还是建议上拉4.7k或者10k电阻),更为头疼的是如果用户由于管脚资源不够想将NMI管脚复用成普通的GPIO而这个IO外接的元器件默认上电的属性为低电平则会造成单片机由于死在NMI中断中而启动不起来(因为NMI这个管脚上电默认是NMI功能,而单片机还没有来的及启动去重新配置该管脚为普通IO时就已经被迫进到NMI中断了)。呵呵,说了这么多,卖了半天关子,自然是有其解决办法的了,而且这个处理办法,飞思卡尔也已经为我们想好了,类似我之前写过的Flash加密的配置,如下图1,Kinetis可以通过FTFA_FOPT这个flash加载寄存器来禁掉NMI功能,而这个寄存器的值是在Kinetis复位之后立刻从Flash地址0x40D这个地址读取数据并赋给FTFA_FOPT这个寄存器的,因为我们只需要修改0x40D地址的数据即可以禁掉NMI功能。下面我就分别介绍下在IAR,Keil和Codewarrior这三大IDE环境下的配置方法: 1. IAR: 针对IAR开发环境禁掉NMI的方法,这篇中我一步到位地连RESET脚禁用也一块讲到,该篇文章主要以禁用RESET脚为例写的,换成NMI脚禁用的话,只要将配置数据由0xF7换成0xFb即可。
2. Keil MDK: 相对于IAR和Codewarrior,我觉着在Keil里禁掉NMI功能的方法是最简单快捷的。Keil里针对kinetis的启动代码部分是遵循ARM CMSIS软件标准格式来写的,而且在启动代码中加入了html语言,keil的编辑器可以自动识别到html语言并且将其直接翻译成配置选项,在工程中找到并打开相应的启动代码的汇编文件(一般命名格式为startup_MKxxxZx.s),如下图所示,用鼠标选中“NMI interrupts are always blocked”,即禁掉了NMI响应中断,修改完之后保存,重新编译整个工程,然后下载进去并复位芯片,可以看到以后就一直也不会进入到NMI中断里了,有没有So Easy的赶脚,呵呵。 3. Codewarrior 10.x: 在Codewarrior中禁掉NMI功能有点类似IAR的方法,需要手动去添加或修改相应的代码到工程中,不过在Codewarrior中我探索了两种方法,殊途同归啦,反正都是可以实现禁掉NMI脚的,就看个人喜欢去选择哪一种了,下面我分两种简单介绍一下:
第一种方法: 首先我们先找到Codewarrior中工程的链接文件(路径在本工程下Project_Settings->Linker_Files下的.ld文件),打开该.ld文件如下图,可以看到链接文件中已经为Flash配置域分配了16个字节的地址空间即m_cfmprotrom,其起始地址为0x400。继续往下看,该链接文件根据该地址空间分配了一个段即cfmconfig。 上述的cfmconfig段请记住它,我们下面只要在main.c中定义一个数组并把它指定分配到该段空间内即可实现对0x400开始的16个字节数据配置,具体配置方法如下,类似我很早之前在IAR加密那篇文章中提到的方法: const unsigned int __attribute__ ((section(".cfmconfig"))) flash_config[] = //@ ".intvec" =
第二种方法: 实际上第一种方法给人的感觉是比较简单的,毕竟不需要修改任何代码,只需要在main.c里添加上述数组定义即可,不过它有一定的局限性,也就是说如果我们给该工程开了一定的优化等级的话,这个数组定义有被优化掉的风险,因为该数组没有在程序中被调用,编译器可能会把该段去掉以节省空间,我之所以只说可能是因为不同的编译器编译效果不一样,所以还不能下结论。所以我只好探索出另一种更为保险的方法,直接在链接文件中修改m_cfmprotrom地址空间范围的定义,如下,即把之前的.cfmconfig段定义注释掉,然后直接在m_cfmprotrom地址范围内写入4个32位的数据(我让其四字节对齐),这种语法格式是可以在GCC工具链中支持的,所以不必担心其编译问题。修改之后保存并重新编译,再下载进去之后,NMI中断就被屏蔽了,是不是这种方法更快捷呢,哈哈。 |
|
|
|
只有小组成员才能发言,加入小组>>
1935个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36428 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4971 浏览 1 评论
6114 浏览 1 评论
6821 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4252 浏览 0 评论
653浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
646浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
647浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
737浏览 2评论
849浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 04:08 , Processed in 1.580260 second(s), Total 43, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号