zoukankan      html  css  js  c++  java
  • RIOT 技术笔记-04 RIOT操作系统中 CC2538的编译和GPIO

     1、首先我们还是把riot/examples文件夹中的helloworld例程复制到riot的根目录下(可以建一个文件夹来存放,我建的文件夹是“”mjy-cc2538“”),然后把复制的文件夹改个名称吧,比如led什么的。


            

            2、打开复制并改好名字的文件夹。我们可以看见3个文件 main.c 、makefile和readme.md。首先我们打开makefile文件。如下图所示



            这里先插句话,推荐大家使用一款软件notepad。因为在ubuntu中修改文件很麻烦,关键词没法高亮,很容易出错。推荐先把文件拖出来,然后用notepad编辑,然后再放回ubuntu中编译。

            上面的图片中我们看见最开始的  “APPLICATION” 这个的含义是工程的名称。我们可以在这里任意选择自己想定义的名称。"BOARD ?="的意思是选择的硬件平台,我改成了cc2538dk,必须是这个哦。这两个地方修改完之后,makefile就可以了。

            然后再把makefile文件放回到ubuntu中。打开终端进入该文件夹然后输入 “make” 然后回车就可以编译了。如果在makefile中,BOARD 没有改成cc2538dk,make编译的命令就是 “make BOARD=cc2538dk” 。



            如图中所示,这样就初步编译成功了。之后的例程都基本上按照这样修改初始文件。


    CC2538的GPIO

            GPIO的应用也就是流水灯的控制了。这个是每个单片机工程师都想知道的第一个问题。

            首先我们先在riot/cpu/cc2538/



            我们可以看见riot提供了完整cc2538的gpio函数。因此要使用gpio也是非常简单了。我们可以看见上图中的很多函数。

            相信能看这个的都应该懂stm32。stm32的gpio使用流程是,初始化gpio,然后就可以对gpio进行操作了。因为cc2538的内核也是arm的,因此,对于gpio的使用,可以通过几个函数就能完成。流程如下。
            (1)、初始化端口,我们先看这个函数 int gpio_init(gpio_t dev, gpio_mode_t mode);

                初始化函数有两个参数:

                gpio_t dev                        我们可以在riotdriversincludeperiphgpio.h 中找到gpio_t 。他的定义是 typedef unsigned  int  gpio_t;

                gpio_mode_t  mode     我们可以在riotdriversincludeperiphgpio.h中 。看见如下定义

                            typedef enum

                            {
                                    GPIO_IN ,               /**< configure as input without pull resistor */
                                    GPIO_IN_PD,             /**< configure as input with pull-down resistor */
                                    GPIO_IN_PU,             /**< configure as input with pull-up resistor */
                                    GPIO_OUT,               /**< configure as output in push-pull mode */
                                    GPIO_OD,                /**< configure as output in open-drain mode without  pull resistor */
                                    GPIO_OD_PU              /**< configure as output in open-drain mode with   pull resistor enabled */
                            } gpio_mode_t;


                在riotcpucc2538includecc2538_gpio.h 中我们可以看到cc2538中,只给我们提供了5种模式。下面所示:                             
                            #define IOC_OVERRIDE_OE    0x00000008    /**< Output Enable */
                            #define IOC_OVERRIDE_PUE  0x00000004    /**< Pull Up Enable */
                            #define IOC_OVERRIDE_PDE  0x00000002    /**< Pull Down Enable */
                            #define IOC_OVERRIDE_ANA   0x00000001    /**< Analog Enable */
                            #define IOC_OVERRIDE_DIS    0x00000000    /**< Override Disabled */

            因此,如果我们要初始化PC0端口为上拉输出模式那么我们应该这么用: gpio_init( GPIO_PC0, IOC_OVERRIDE_PUE);  具体其中一个参数为什么使用GPIO_PC0,这个和上面的gpio_t dev有什么联系呢?我们下面介绍。

            (2)、端口使用
            对于流水灯,我们使用的是推挽模式。其直接应用函数有3个。

                              void gpio_set(gpio_t dev);     //拉高

                             void gpio_clear(gpio_t dev);     //拉低

                             void gpio_toggle(gpio_t dev);   //反转

            这里有个问题,端口的使用的时候,只有一个参数的时候,怎么去确定 P几 和pin几?对于这个问题,我们打开文件riotcpucc2538includecc2538_gpio.h


    下面截取一小片段看看。

                    GPIO_PA0 = GPIO_PXX_TO_NUM(PORT_A, 0),          /**< PA0 */
                    GPIO_PA1 = GPIO_PXX_TO_NUM(PORT_A, 1),          /**< PA1 */
                    GPIO_PA2 = GPIO_PXX_TO_NUM(PORT_A, 2),          /**< PA2 */
                    GPIO_PA3 = GPIO_PXX_TO_NUM(PORT_A, 3),          /**< PA3 */
                    GPIO_PA4 = GPIO_PXX_TO_NUM(PORT_A, 4),          /**< PA4 */
                    GPIO_PA5 = GPIO_PXX_TO_NUM(PORT_A, 5),          /**< PA5 */
                    GPIO_PA6 = GPIO_PXX_TO_NUM(PORT_A, 6),          /**< PA6 */

    同一个文件中另外再找到

                    #define GPIO_PXX_TO_NUM(port_num, bit_num) ( ((port_num) << GPIO_PORT_SHIFT) | (bit_num) )

    再找到

                    #define GPIO_PORT_SHIFT 3   

    再找到

                   enum

                   {
                       PORT_A = 0,
                       PORT_B = 1,
                       PORT_C = 2,
                       PORT_D = 3,
                   };

            比如我们想定义PD4这个端口。那么

                    GPIO_PD3 = GPIO_PXX_TO_NUM(PORT_D, 4),          /**< PD3 */

                 下面我们开始计算了 :

            1,PORT_D=3;二进制是0000 0011

                 2,然后根据 ( ((port_num) << GPIO_PORT_SHIFT) | (bit_num) )这个,我们要左移3位。那么0000 0011就变成了 0001 1000。

                 3,然后再与4或运算,也就是 0001 1000 和0000 0100或运算 得到 0001 1100 。转成10进制也就是28。  

                 4,因此我们得到了    GPIO_PD4 = 28。那么可以这么算每组gpio有8个io后,D是第四组,前三组共24个io了,PD4是第四组的第4个io口,24+4=28。因此28可以代表PD4。riotcpucc2538periphgpio.c的最前面有一点说明,自己去找找。

                  5,void gpio_set(gpio_t dev);我们就可以用作 gpio_set(GPIO_PD4 );

                     因此我们使用void gpio_set(gpio_t dev);这些函数的时候,里面的参数直接使用GPIO_PXX就好,没必要去计算了。当然为什么28能够代替PD4,那就自己去找找吧,这个类似stm32中的偏移地址,也就是基地址+偏移地址=端口地址。自己去找找吧。。。。


            然后我们就可以使用了。比如

                             gpio_set(GPIO_PC0);     //拉高

                             gpio_clear(GPIO_PC0);     //拉低

                             gpio_toggle(GPIO_PC0);   //反转
            到此,gpio的使用就介绍到这里,对于gpio的其他模式,大家可以取试试,后面就不多做介绍。

            (3)、cc2538继续流水灯
          我们继续本帖最上面的话题,复制好了文件和修改makefile后,我们就可以打开main文件了。看下图中main文件,不想写了,太麻烦了。。。。。


            然后放回ubuntu中,再编译,在bin文件里面找到 下载文件就可以下载了。。

           只能看看静态图片了。3个灯,运行正常,一闪一闪的。


     
    ————————————————
    版权声明:本文为CSDN博主「莫九玉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/mx1252111/java/article/details/52694076

  • 相关阅读:
    Blank page instead of the SharePoint Central Administration site
    BizTalk 2010 BAM Configure
    Use ODBA with Visio 2007
    Handling SOAP Exceptions in BizTalk Orchestrations
    BizTalk与WebMethods之间的EDI交换
    Append messages in BizTalk
    FTP protocol commands
    Using Dynamic Maps in BizTalk(From CodeProject)
    Synchronous To Asynchronous Flows Without An Orchestration的简单实现
    WSE3 and "Action for ultimate recipient is required but not present in the message."
  • 原文地址:https://www.cnblogs.com/caobw/p/13226561.html
Copyright © 2011-2022 走看看