jicheng0622

【原创】从零入手Kinetis系统开发(五)之GPIO模块

0
阅读(15551) 评论(15)

    好久没有写从零入手这个系列了,发现有点生疏了,看来以后不能老搁置下来啊,呵呵~假期临近,貌似最近好多人都得了假前松散症了,我就是这个样子了,天天在等着放假回家,无心科研了,哈哈,但是该做的还得做。闲话说完了,下面进入正题。

    可以说,前面几个系列只是个准备阶段,从该篇之后就打算进入到应用阶段了,会以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文件(英文注释,这个很必要,希望初手能多加锻炼这方面能力)。

  1. ***此内容已被管理员屏蔽***

  2. 回复:回复
    回复:回复

    图中程序  SIM_SCGC5=    那句什么意思 ? 在看苏大给的程序  上面说加载所有GIO端口的时钟, 供高层驱动调用 。    不明白什么意思

    这个是Kinetis的特色啊,所有的外设都是时钟门控的(为低功耗考虑,可开关),在用到外设的寄存器的时候必须要先打开相应的时钟门控,否则操作失败,你可以看看datasheet 里关于SIM模块的介绍

    明白了 ,我再看看   谢谢

  3. 回复:回复

    图中程序  SIM_SCGC5=    那句什么意思 ? 在看苏大给的程序  上面说加载所有GIO端口的时钟, 供高层驱动调用 。    不明白什么意思

    这个是Kinetis的特色啊,所有的外设都是时钟门控的(为低功耗考虑,可开关),在用到外设的寄存器的时候必须要先打开相应的时钟门控,否则操作失败,你可以看看datasheet 里关于SIM模块的介绍

  4. 图中程序  SIM_SCGC5=    那句什么意思 ? 在看苏大给的程序  上面说加载所有GIO端口的时钟, 供高层驱动调用 。    不明白什么意思

  5. 回复:回复

    真心谢谢!写的东西对我帮助很大。

    呵呵,就是写出来大家交流,有问题可博客留言~

  6. 真心谢谢!写的东西对我帮助很大。

  7. 回复:回复
    回复:回复

    kinetis的gpio翻转频率不高啊,96M的情况下,翻转频率不到10M,不知道博主有没有更好的方法?因为要涉及到用io口操作一些屏

    嗯,翻转IO频率就是这个速度差不多,如果你想快的话可以用DMA方式,把想要传的数据放到RAM里,然后DMA方式直接传到IO上,应该会快些~

    主要是想用模拟io接屏,速度快慢还是有影响的,真没想到 这个芯片的io翻转比其他的m3还慢

  8. 回复:回复

    kinetis的gpio翻转频率不高啊,96M的情况下,翻转频率不到10M,不知道博主有没有更好的方法?因为要涉及到用io口操作一些屏

    嗯,翻转IO频率就是这个速度差不多,如果你想快的话可以用DMA方式,把想要传的数据放到RAM里,然后DMA方式直接传到IO上,应该会快些~

  9. kinetis的gpio翻转频率不高啊,96M的情况下,翻转频率不到10M,不知道博主有没有更好的方法?因为要涉及到用io口操作一些屏

  10. 回复:回复

    我想问下如何一下改变8个IO口的值,如以前“PORTA=0X33"改为”PORTA=0X22",数据是按字节改变的。此问题是在做静态数码管位码单个依次变化导致位跳变影响显示中发现。

    其实我给出的例子是位操作的,用来测试玩的,如果想完整字节改变也简单,你可以查手册找到他的方向寄存器GPIOA_PDDR和数据寄存器GPIOA_PDOR,直接赋值即可,如果你用的是低8位的话(注意ARM的GPIO寄存器都是32位的),可以这样:

    GPIOA_PDDR |= 0x000F;    //设置PORTA方向寄存器为输出

     GPIOA_PDOR = 0x0033;    //设置PORTA 数据寄存器为你想要的值

  11. 我想问下如何一下改变8个IO口的值,如以前“PORTA=0X33"改为”PORTA=0X22",数据是按字节改变的。此问题是在做静态数码管位码单个依次变化导致位跳变影响显示中发现。

  12. 回复:回复

    hi 感谢楼主的分享,希望楼主能提供DMA的例子,小弟不胜感激

    会的,不过得过一段时间了,最近比较忙,如果你先写出来了,也希望能共享出来,呵呵
  13. hi 感谢楼主的分享,希望楼主能提供DMA的例子,小弟不胜感激

  14. 回复:回复

    最喜欢的就是GPIO了,从最简单的入手

    呵呵,是啊,希望对你有所帮助

  15. 最喜欢的就是GPIO了,从最简单的入手