tag 标签: nvic

相关博文
  • 热度 18
    2013-8-14 12:37
    1349 次阅读|
    2 个评论
    kinetis L系列的 NVIC 与实现(二)   在我们熟悉了默认的 NMI Interrupt 后, Kinetis L Peripheral Module Quick Reference.pdf 给我们提供了一个非常稀奇的 sample, 也是 interrupt 的第一课, 使用 PIN interrupt. (a) 之所以说稀奇的原因, 是这个 PIN 利用的又是 NMI PIN(PTA4), 其目的是复用 PTA4, 禁止 NMI interrupt PIN 功能, 使能 GPIO 功能后, 把 PTA4 当成普通的 GPIO, 实现 PIN Interrupt. 怀着复杂的心情, 我们学习着这个 sample, 至于为什么要偏偏复用 NMI GPIO(而默认NMI_b属于 ARM cortex-m0+ core 中断), 我们不知道, 文档说"因为边缘敏感的中断, 要优于电平敏感的中断, 保证每次按下 button 都只会触发一次中断"``` (b) 我们通过工程项目的经验, 一般都很敏感于各种说明和 samples 将说未说的言外之意. 那么这是否说明, Freescale 对设计的 NMI PIN 没有太多的信心, 在受到诸多 delta 版本发布给专业用户测试后, 得到评价是 NMI 作为 PIN interrupt 的不可靠而受到投诉? (c) 我们已经决定在我们的将来设计中, 无论是否使用 PIN interrupt, 只要 NMI pin 的默认 NMI Interrupt 没有使用, 我们都打算在 init 阶段, 把 PTA4 复用为 GPIO, 而中止其默认 NMI Interrupt 功能. -- 理由仅仅是因为一个 sample 带给我们的直觉``` 而我们已经打算忍受同行们对我们过份敏感的耻笑了```  ; ( (d) 如前所述, 我们将 PTA4 复用为 GPIO,         // Configure the PTA4 pin for its GPIO function         PORTA_PCR4 = PORT_PCR_MUX(0x1); Note: 这个初始化动作, 我们必须在 open port clock 完成后才能进行. 否则我们将发现 hard fault 中断频繁出现, 甚至无法运行到 main() 函数入口点. 一旦完成该初始化, 则 NMI PIN 不再能触发 Interrupt. 并注意到, PTA4 复用为 GPIO 后, 仍然存在内部上拉. (e) 建立 PTA4 的 rising edge interrupt, 见图例9:   匹配上对应 IRQ 的 isr 程序名, 我们很容易就实现了一个 PIN interrupt, 见图例10:   我们不晓得, 有多少同行验证过这 PTA4 停止 NMI Interrupt, 改写为 PIN rising interrupt 的sample. 我们的经验是, 中断触发行为非常古怪, 用镊子可以进入 ISR, 而直接短暂短接到 GND, 则时有时无. 我们用 10k 上拉后, 终于可能保证短暂短接到GND(模拟按下 push button) 可以进入到 ISR 了.但是, "rising edge interrupt 更好, 只会触发一次 ISR" 的说法我们一点也感觉不到, 照样经常触发两次中断. 如果排除实验步骤错误, 以及 KL25Z 开发板的相关PIN脚(特别是 NMI PIN)故障的因素, 我们的这个非常短暂的实验经验是,   无论是否内部上拉, 还是说PIN脚内部有滤波器, 如果我们项目中需要 PIN interrupt, 那么一个外部的上拉电阻看起来是必要的, 而一个小的外部滤波(比如加入电容之类)的电路或者也应该必要. 或者说, 我想干脆建议同行用timer延时过比如说 10ms 滤除抖动后实现一个模拟的"PIN interrupt". 如我有任何错误, 请提醒我.     值得一提的是, 在简单调试中, 我们观察到一个 enable interrupt 的例程中, 反应出诸多代码的不足之处, 我犹豫是否将其写出来给大家共享``` 总之, 这些 kinetis L series 的 sample code 看起来似乎代码质量不高, 或者可能有颇多疏漏之处, 一些代码风格, 类似一位初学者的水平(尽管我自己的水平不高),学习上述 sample code 的代码风格, 可能会容易误人子弟吧? 可能会 降低中国工程师的代码编程能力和代码欣赏水平?``` 与同行们商榷. 我们的建议是, 正在着手 Kinetis L 的亲爱同行, 是否应该尽量从 bare project 着手, 并反复检查从 sample 中copy 出来的代码片段, 认真测试我们的产品, 以免实际出货后造成不可预计之损失?    
  • 热度 15
    2013-8-12 14:58
    1417 次阅读|
    1 个评论
    kinetis L系列的 NVIC 与实现(一)   作为 uController 的从业人员, 我们频繁使用中断, 那么我们尝试根据各种 samples 的支持下, 增加对 kinetis L serials (cortex-M0+) 的interrupt 的理解, 并用实际的 sample 的实现来强化我们对 L series 的 Interrupt 的认知.   在 Kinetis L series 中, NVIC 位于 Private Peripheral Bus(PPB) memory map. 要提到的是, 从 0xE0000000 到 0xE00FFFFF 的 1M 系统地址空间, 都是 ARM core 留给 PPB 使用. 这里的 Relative Interrupt Registers, 应该包括: ISER, ICER, ISPR, ISCP, IP (我们这里类似 Sample Code 的头文件定义, 均省略上述 registers 的后缀 R 称呼, R 代表 Register).  遗憾的是, Interrupt Registers 的定义, 翻遍了 RM(Reference Manual) 也没有找到, 至于其他的更简略的 reference documents, 更不必提. 带着疑惑, 我们对 PPB memory map 相关的 NVIC registers 与 System control Block 的 registers 定义进行了广泛的查找, 最终 clue 在: https://community.freescale.com/community/kinetis/content?query=0xE000ED04 答案是: 因为 NVIC 属于 ARM Core(即ARM IP), 故 Freescale 不提供任何文档支持, 这样, 在 http://infocenter.arm.com/help/index***p?topic=/com.arm.doc.ddi0337e/Cihcbadd.html 我们 download 到了: Cortex-M0+ Technical Reference Manual.pdf, 里面提到了 ISER, ICER, ISPR, ISCP, IP 的 registers 定义, 应该在 ARMv6-M Architecture Reference Manual.pdf 中查找. 最终, 我们同样在 ARM infocenter, down 到了该篇 document(From: https://silver.arm.com/browse/AR585) 同样的, 从 sample code 里, 我们也提取到相应文档(Architecture RM)的下列 Interrupt Registers 的结构体定义:   敬爱的同行之诸君, 我们进入 Kinetis L series Interrupt 的实现之旅, 第一步或许我们应该举出 NMI 中断例子. 其深刻的内在原因是, NVIC(Nested Vectored Interrupt Controller), 首先是属于 Arm Cortex-M0+ Core 的组成 Module. 而 NVIC 本身, 如我们之前在文章, "Kinetis L系列的启动过程及其实现" (http://forum.eet-cn.com/BLOG_allen_zhan_359.HTM) 提及的, 通过异常向量表, 以及实际 datasheet 中的定义, 共有着 48 pcs 中断向量. 而 48pcs 中断 module 中, 又记有 16pcs core-interrupt (Vector numer向量编号为: ). 以及, 48-16 = 32pcs non-core interrupt (Vector numer向量编号为: ), 我们也注意到, 只有 non-core interrupt 才有着 IRQ number( ). 这也似乎是否提醒我们, 如果我们参与一款 arm cortex-m0 的设计, 可能我们必须保留 16pcs core-interrupt 设计, 但是因各个sub-modules 的不同或者增减, 或因具体功能不同, 我们可以设计不同数目的 IRQ, 甚至自行安排编写其在 non-core interrupt 中的 NO. 位序? 当然, 根据 ARM cortex-M0+ TRM 文档, 事实上最大的外部 interrupt 数目应该是 32pcs, 可以减少, 不能超过, 见到类似 ISER 的定义则原因自明: 对于 4-byte 的 word 长度的 register, 每个 bit 对应一个 interrupt 的使能与否, 当然我们判断出 non-core interrupt 即 IRQ 至多为 32pcs.   回到 NMI sample, 我们阅读下面的图例3, 可知 NMI 就是 core-interrupt 的其中一个中断向量, 甚至它是在我们之前"Kinetis L系列的启动过程及其实现" 一文中, 就已经提到的, 在 system boot 之际, 最重要的异常向量表的 No.1(SP), No.2(PC) 之后, 表现为 No.3(NMI interrupt, Non-maskable Interrupt).   在 uController world 中, blinky sample 往往等同于高级言语第一课 "hello world". 不意外的, 我们从 blinky sample(从 IAR 的自带 sample 与 freescale 的网站上都可以下载, 或者开发板安装自带), 检查到了 sample 已经完整替我们建立了一个 interrupt 的完成机制, 我们注意到除 sp 与 pc, 剩余的全部中断, 都被对应了 default_isr 这个 ISR (中断服务例程).   通过完成 rebuild 生成 .bin, 我们明确见到这个 ISR:   这实际意味着, 我们无需其他工作, NMI 中断 ISR 已经实现并完成. 由于 NMI_PIN 默认启用, 为 PTA4 复用. 在 KL25Z 开发板上, 我们测量存在高电平(与 RM 中提到内部弱上拉的说法一致). 短暂用 GND 触碰 FREEDOM KL25Z 开发板之 PTA4, 我们进入了 default_isr(已预置断点), 与预期一致. 应当说明的是, 在 default_isr 中, 我们 read 0xE000ED04, 也就是 ICSR(Interrupt Control State Register) 为: 0x80002002. 根据 ICSP 的定义分析(From: Architecture RM): (a) bit31 表示: activate NMI exception, 与我们的触发 NMI 中断动作一致. (b) 0x20xx 表示: vector number(0x02), 即此时最高优先级的 pending interrupt(也就是 NMI) (c) 0x02 表示": vector number(0x02) 当前中断为 NMI(0x02). 因此, 不意外的, 我们在完成该 NMI ISR 后, 再次进入了 ISR 的调用, 此时 ICSR 为: 0x02(表当前中断为 NMI). 要提及到的是, NMI PIN(NMI_b) 有内部上拉, 我们猜测是一个弱上拉, 对 PIN 脚信号非常敏感, 经常的, 不用短路 GND, 仅仅镊子尖端碰到, NMI Interrtupt 即可触发. 使用下述代码, 我们直观见到了 NMI 的 low level 事件触发了 2pcs NMI's ISR 的的效果, 表现为 green led 进行了连续2组闪烁.     Tip1: 使用代码触发 NMI 中断 如果我们使用类似的代码: #define SET_NMI_INTERRUPT() SCB_ICSR |= SCB_ICSR_NMIPENDSET_MASK 那么, SET_NMI_INTERRUPT() 理应当触发 NMI 中断, 进入 ISR (目前它是 default_isr). 我们没有测试这段代码. ;O 因我们有 FREEDOM 开发板可以用来真实低电平触发中断, 而无需上述代码替代测试. Tip2: 复位是否会触发的中断服务例程 ISR? 当我们检查 ICSP 以及 IPSR, 从中获得当前的异常序号(Exception Number) 时, 根据 Exception Number 的定义, 请看图例7: 我们有个质朴的疑问, 如果 RESET 事件被命名为 Exception numbers 的 No.1, 那么在 RESET 过程发生后, 也就是 RESET 事件触发瞬间与 SYSTEM REBOOT 的过程, 是否会进入 ISR. 带着这个疑问, 我们反复测试 RESET button, 以及 power on 过程, 我们并回忆了我们的"Kinetis L系列的启动过程及其实现" 一文, 确认 reset 与 boot 过程, 在当前的工程中, 没有进入 ISR. 但是, 如图例8中, 文档提到了, ICSP 与 IPSR 会在 RESET 时产生一个瞬变的 0x01 的过程("甚至软件无法看到")... -- 这个解释也有够奇怪: 如果 software 都无法 read 到这个 register 的瞬变 0x00 - 0x01 - 0x00 的过程, 那么为什么要保留... 说出疑惑与诸君知道. 不过这句话也恰好解答了, 为何 Reset 被编入 Exception number, 作为 No.1, 但是又不进入 ISR. 当然, 通过软件对 exception vector 的实现, 以及对 .bin 的认知, 反过来或者可以理解为, RESET 已经触发了 ISR... 但是这个 ISR 并没有指向 default_isr, 而是如我们前文中提到的 PC 指针, 标志着一次 RESET 引起 SYSTEM BOOT 过程的开始``` 罗列此刻思路, 与诸君共赏```    
相关资源
  • 所需E币: 0
    时间: 2021-3-17 16:58
    大小: 5.56MB
    上传者: Argent
    arm公司设计的内核在电子产品MCU中仍占据主流,其设计的armcortex内核有多个系列,根据产品设计需求选择相应的类型,而Cortex-M系列是面向具有确定性的微控制器应用的成本敏感型解决方案,分享关于Cortex-M3的综合性讲解资料,欢迎下载阅读。
  • 所需E币: 3
    时间: 2019-12-25 12:46
    大小: 604.61KB
    上传者: wsu_w_hotmail.com
    针对ARM_Cortex_M3平台的代码移植DESIGNSTRATEGIESANDMETHODOLOGIES针对ARMCortexM3平台的代码移植作者:ARMCortexTM-M3是一款高性能、地重新排列优先顺序。它支持电平和脉ARM中国低成本、低功耗的32位RISC处理器。它冲中断源。处理状态会在中断进入时由仅执行16位、32位混合的Thumb-2指令,硬件自动保存,并在中断退出时恢复。同不支持ARM指令集。Cortex-M3处理器时,NVIC对于末尾连锁(tail-chaining)集成了一个ARMv7-M架构的高效哈佛中断有独特的处理方式,将中断响应时间3级流水线ARM内核,支持硬件除法器和减到最小。快速ISR(中断服务程序)响应。除CPU内核外,Cortex-M3处理器还包括许多其他在Cortex-M3中使用NVIC意味着组件,嵌套向量中断控制器(NVIC)、可选Cortex-M3的向量表与之前的ARM内核的存储器保护单元(MPU)、计时器、调试有着显著的区别。与大多数其他ARM内核……
  • 所需E币: 4
    时间: 2019-12-25 12:43
    大小: 2.08MB
    上传者: 238112554_qq
    ARMCortex-M3处理器简介TECHNOLOGYIN-DEPTHARMCortex-M3处理器简介1.简介35%。作者基于ARM嵌入式处理器的SoC解ShyamSadasivan决方案可应用于企业应用、汽车系统、家1.2快速有效的应用程序开发源于简单ARMCPU产品经理庭网络和无线技术等不同的市场领域。的使用方法ARMCortexTM系列处理器以一个标准缩短上市时间与降低开发成本是选的架构满足了不同市场领域中各种技术择微控制器的重要标准,而能够快速简的不同性能需求。ARMv7架构的ARM单地开发软件是达到这些要求的关键所Cortex系列处理器拥有三个分工明确的在。Cortex-M3处理器专门针对快速简分支系列;A系列面向复杂的高端应用程……