kinetis L系列的 NVIC 与实现(二)
[NMI PIN(PTA4)复用为 GPIO 后实现PIN中断的 Sample]
在我们熟悉了默认的 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:
[图例9: Blinky sample 中的使能 PTA4 上升沿中断]
匹配上对应 IRQ 的 isr 程序名, 我们很容易就实现了一个 PIN interrupt, 见图例10:
[图例10: 实现 PIN Interrupt 的代码片段]
allen_zhan_752827529 2013-8-15 12:33
用户1277994 2013-8-15 09:24