【原创】Cortex-M0+单周期GPIO的使用方法
0赞Cortex-M0和Cortex-M0+有什么区别?这个问题经常会有人问我,而我的回答很简单,除了能效比提高30%(M0+功耗比M0还是有明显改进的,从三级流水线改成了二级流水线)以外,其实我最喜欢提的是M0+多了单周期快速GPIO功能,这个功能还是很能让人眼前一亮的(连M4都木有)。至于为啥叫单周期快速GPIO,下面且听我慢慢道来,哈哈~
我们通常使用的GPIO一般来说都是挂载到内部总线上的(一般是AHB Bus),内核操作IO一般都是通过这个总线去读写控制的,而总线时钟往往都是小于内核时钟的且总线也都是被很多外设共同占有的,由此带来一个现象是,往往我们芯片的主频是很高的(一般指的是内核时钟),但是外部IO操作却跟不上,导致一些功能满足不了,比如快速刷彩屏(无拖影)或者一些时序模拟。M0+中RGPIO(Rapid GPIO)则恰恰解决了这个问题,如下图所示(从ARM官网扣下来的),RGPIO是直接挂到内核上的,对其读写都是直接通过内核专用的总线进行操作的,所以我就不多说了,你懂的,呵呵,由此可见ARM的工程师们也是蛮拼的(借用时下时髦的术语,咱这博客得与时俱进啊,哈哈)。
M0+多了这个本事是挺好的,但是怎么去使用它还是有些道道的,不小心就容易被大家所误解。下面我以Freescale Kinetis L系列为例,简单介绍一下其使用方法,在KL系列里,飞思卡尔将这个RGPIO命名为FGPIO(FastGPIO),这个可以直接在其参考手册上找到这一章节(注意,在KL系列里,飞思卡尔还是保留了传统的GPIO,另外添加了FGPIO,但是它们操作的外部IO管脚都是一个),而FGPIO的使用却很简单,只是在传统GPIO寄存器名字的前面加了一个'F‘。我们通常测试一个IO的最高翻转频率的方式都是在一个While(1)或For循环里面去异或1,或者有些芯片自带翻转寄存器(像KL系列里面PTOR寄存器)直接操作该翻转寄存器,然后拿示波器去测该IO的翻转速度,殊不知却跳到一个思维定势里面了,这种方式虽然简单明了,却在IO翻转之后额外插入了While或For的判断指令周期,所以这样测的结果往往与预期不符,看看我下面测出的两张图就明白了。
上面两张图的意思很明显了,单周期快速IO理论最高翻转频率为内核时钟/2(这个理论值需要大家去算一算想一想),我们看到while(1)之前的纯IO翻转是可以达到理论值的(看示波器右上角),但是在While(1)里面则额外插入了指令造成翻转速度的降低,所以说IO翻转是单周期的没错,问题出在测试方法和编译器上(为什么提到编译器,可能有些编译器插入的指令更多,所以建议在使用快速GPIO时打开编译器的优化)。
好了,今儿就说这么多了,其实整篇文章的核心就是最后两张图,看完最后这两图就大致明白了,如果还不明白,那俺只能呵呵了。下班了,收拾下准备撤,今天时间掐的刚刚好,哈哈,未完待续~