【原创】从零入手Kinetis系统开发(五)之GPIO模块
0赞好久没有写从零入手这个系列了,发现有点生疏了,看来以后不能老搁置下来啊,呵呵~假期临近,貌似最近好多人都得了假前松散症了,我就是这个样子了,天天在等着放假回家,无心科研了,哈哈,但是该做的还得做。闲话说完了,下面进入正题。
可以说,前面几个系列只是个准备阶段,从该篇之后就打算进入到应用阶段了,会以K60为例逐篇介绍Kinetis的各个功能模块,并给以相应的实例工程作为参考,总之希望初手们能尽早入门(加油啊,不然我可白费这么大劲了,呵呵),高手们给点意见,哈哈。本篇就开个好头,说个简单的却是最最常用的模块—GPIO模块。
要想了解一个模块,有些重要的图表必不可少,下面我们看下GPIO模块框图(refer to kinetis datasheet)
然后下面列出Kinetis的GPIO模块的一些特点作为参考(这点对一款芯片的选型很重要的,不得不说kinetis的GPIO功能还是挺强大的):
(1)I/O口兼容5v外部设备(所以不需要像244or245之类的电平转换接口),同时可以支持开漏输出(这点的好处,百度谷歌之,这里不赘述了哈,呵呵)。
(2)5组I/O(PORTA,PORTB,PORTC,PORTD,PORTE)都支持I/O中断和DMA中断(边沿或者电平触发),这点我们可以粗算一下,假设不考虑片子的管脚限制,即每组I/O有32pins,也就是支持32*5个中断,够吓人的吧,不过需要注意的是每组I/O用的是一个中断向量号,具体组内哪个IO中断则需要根据中断标志来判断了,所以如果需要设置优先级的场合还是采用不同组的IO中断吧,这点相信用到的都懂的。
(3)带数字干扰(毛刺or抖动)滤波器(digital glitch filter),可配置滤波宽度和时钟源。这种功能可以用于消除一定脉冲宽度的毛刺减少对有用信号的影响,例如用在按键消抖上,是不是很好,呼呼。另外还有可设置的无源低通滤波器(passive filter),这个需要注意下,如果输入信号频率在2M以上的话,这个无源滤波器要禁止的,不然的话可是会被滤掉了啊,哈哈。
(4)对输入功能,有可选的上拉或者下拉电阻功能。
(5)对输出功能,有可配置的斜率控制和输出驱动能力控制。
还是老套路,硬件特点介绍完了,下面就说说软件的配置了,这里简单列出一下常用到的GPIO通用的寄存器:
(1)PORTx_PCRn——管脚配置寄存器,用于配置复用、中断使能、驱动能力等等;
(2)GPIOx_PDDR——数据方向寄存器,0-input,1-output;
(3)GPIOx_PDOR——数据输出寄存器,0-driven 0,1-driven 1;
(4)GPIOx_PSOR——数据输出置位寄存器,0-invalid,1-driven 1;
(5)GPIOx_PCOR——数据输出清零寄存器,0-invalid,1-driven 0;
(6)GPIOx_PDIR——数据输入寄存器,映射外部IO状态;
(7)GPIOx_PTOR——数据切换寄存器,0-no effect,1-reverse the exiting logic level。
准备工作做好了,下面就给个例程理解一下(附件为完整GPIO初始化文件),呵呵,大家都喜欢看这个的,懂的~
上面只是简单的IO操作例程,以一定延时时间(8000000)反转PORTA0口的电平状态,像GPIO_Init和GPIO_Toggle两个功能子函数程序里有部分注释,另外如果想看完整的可以在附件里找到相关的GPIO文件,该文件部分参考了王宜怀老师的新书例程,对此表示感谢。
还有就是一个好消息,为了更好开源分享Kinetis的资料(咳咳,主要是拉动一下大家开源的精神,我只能抛砖引玉了,呵呵),我最近在整理写了一段时间的K60底层驱动,目前已经写了startcode、mcg、wdog、GPIO、ADC、uart、FlexBus等部分,争取在放假前整理好传到“飞思卡尔创意嘉年华讨论组”的小组话题区里,有兴趣的可以关注一下(得声明一下,可不是为了拉票的,就是希望关于Kinetis的资料能更多些,汗,以前碰壁留下阴影了,所以现在开源的思想老在脑子里转,呼呼),希望能得到高手的意见,当然初手们也可以交流一下,哈哈。未完待续~
附件为GPIO.c和GPIO.h文件(英文注释,这个很必要,希望初手能多加锻炼这方面能力)。