请选择 进入手机版 | 继续访问电脑版
查看: 11133|回复: 3

“逐飞科技RT1064开源库”之GPIO详解

[复制链接]
  • TA的每日心情
    开心
    2021-9-17 11:00
  • 签到天数: 107 天

    [LV.6]常住居民II

    2104

    主题

    4011

    帖子

    0

    金豆

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    19672
    最后登录
    2021-10-25
    发表于 2019-11-28 10:05:17 | 显示全部楼层 |阅读模式
    为方便参加恩智浦大学生智能车设计竞赛的同学们,成都逐飞科技设计制作了i.MX RT1064核心板,并配套开发了相应的函数库。


    本文为逐飞科技来稿,在此分享给大家,对不参加智能车竞赛的朋友也有很大的帮助作用。
    28.png
    i.MX RT1064核心板


    在分享主题之前,先说说继上次发布的开源库之后,逐飞科技RT1064开源库又更新了哪些东西。本次开源库更新了如下4部分内容:
    1、fuse烧写例程
    经常会有用户遇到上电后没法执行程序,查看内核指示灯又是没有问题的。对于这个问题我们首先要知道RT上电后是会根据boot_config_pin进行参数配置,如果boot_config_pin电平设置不对会导致参数配置不正确,那么在我们使用了boot_config_pin相关引脚之后,或者外部添加了上拉都有可能会导致出现这个问题,那么我们又想使用boot_config_pin又不想遇到这样的问题,该怎么办呢?这个时候就可以通过烧写efuse使得RT上电之后参数配置通过fuse来进行配置,从而彻底避免了这个问题。不过需要注意的事,烧写fuse之后,就不能再更改回去了。


    2、USB CDC例程
    大家经常反映串口速度太慢了,那么是否有更好的数据传输方式呢?当然是有的,RT单片机支持高速USB,我们可以将USB虚拟成串口来进行使用,在PC端的使用和普通的串口无异,非常简单,硬件连接也非常简单,使用逐飞RT1064核心板的用户可直接使用板载的TypeC接口和PC端的USB口连接即可,优点是连线通用性高,且速度极快(初步测试可稳定到10MB/s)。


    3、FATFS文件系统例程
    对于需要存储较大数据的用户,经常会需要用到SD卡,本次更新也带来了SD相关的例程,方便用户直接使用。


    4、解决PIT定时器通道1无法使用的问题
    上次开源库中,PIT通道1无法正常使用,经过仔细查找,发现是因为RT1064上电之后默认将通道1的级联位设置为1,从而导致无法使用,解决办法是在初始化时将级联位设置为0即可,这个问题可能是单片机内部ROM API使用了这个定时器之后没有对其进行复位造成的。


    以上更新已发布到码云,链接如下:
    http://gitee.com/seekfree/RT1064_Library


    接下来进入本次分享的主题:


    GPIO模块详解与使用示例
    GPIO功能


    GPIO (General-purpose input/output)是通用输入输出端口,主要功能如下:


    输出模式:可以通过程序控制端口的电平状态(低电平或者高电平),以实现控制外部模块或者传递信息。


    输入模式:可以获取端口状态,用于接收外部模块发送的数字信息。


    中断模式:可以对引脚上的上升沿、下降沿、低电平、高电平、上升沿和下降沿,这五种情况进行中断响应。

    GPIO库函数


    操作GPIO的函数列表如下:
    29.png
    gpio_init()函数参数:
    30.png
    gpio_set()函数参数:
    31.png
    gpio_get()函数参数:
    32.png
    gpio_dir()函数参数:
    34.png
    gpio_toggle()函数参数:
    36.png
    gpio_interrupt_init()函数参数:
    37.png
    gpio_interrupt_init()函数参数:
    38.png
    GET_GPIO_FLAG宏函数参数:
    40.png
    CLEAR_GPIO_FLAG宏函数参数:
    GPIO使用示例


    GPIO输出模式(核心板LED闪烁)


    #include "headfile.h"      //包含头文件


    int main(void)
    {
        DisableGlobalIRQ();
        board_init();         //务必保留,本函数用于初始化MPU 时钟 调试串口
      
          //初始化B9端口 输出模式  初始化之后输出低电平 使用默认引脚配置GPIO_PIN_CONFIG


        gpio_init(B9,GPO,0,GPIO_PIN_CONFIG);
      
        EnableGlobalIRQ(0);
      
        while(1)
        {
            gpio_set(B9,1);         //熄灭核心板LED
            systick_delay_ms(100);  //延时100ms
            gpio_set(B9,0);         //点亮核心板LED
            systick_delay_ms(100);  //延时100ms
        }
    }
    编程要点1:在使用GPIO时,务必在while(1)之前对端口进行初始化,然后再进行其他的操作。


    编程要点2:在初始化GPIO时,最后一个参数可以直接使用GPIO_PIN_CONFIG宏定义参数,不需要自己去选择很多个配置参数然后相或,提高易用性。

    GPIO输入模式


    #include "headfile.h"    // 包含头文件


    uint8 pin_status;
    int main(void)
    {
        DisableGlobalIRQ();
        board_init();         //务必保留,本函数用于初始化MPU 时钟 调试串口


        //初始化D0端口 输入模式  使用默认引脚配置GPIO_PIN_CONFIG
        gpio_init(D0,GPI,0,GPIO_PIN_CONFIG);
      
        EnableGlobalIRQ(0);
      
        while(1)
        {
            pin_status = gpio_get(D0);//获取D0端口电平状态
            //可以直接通过IAR或者MDK的在线调试窗口查看pin_status变量的值
            //0:低电平 1:高电平
            //D0端口接地时为低电平
            //D0端口内部设置了上拉电阻,因此悬空时为高电平
        }
    }
    编程要点:与上一个示例相同。






    GPIO中断模式


    #include "headfile.h"           //包含头文件  
      
    uint32 gpio_interrup_test;
    void GPIO3_Combined_0_15_IRQHandler(void)//D0-D15端口中断函数  
    {
        if(GET_GPIO_FLAG(D0))       //判断是否为D0引脚触发中断  
        {
            CLEAR_GPIO_FLAG(D0);    //清除D0触发的中断标志位  
             
            gpio_interrup_test++;   //测试变量  
        }
    }
      
    int main(void)
    {
        DisableGlobalIRQ();
        board_init();               //务必保留,本函数用于初始化MPU 时钟 调试串口  
          
        //D0端口初始化为中断模式 上升沿中断 使用宏定义的引脚配置参数  
        gpio_interrupt_init(D0,RISING,GPIO_INT_CONFIG);
          
        //D0端口初始化为输出模式 初始化之后为低电平 使用宏定义的引脚配置参数  
        gpio_init(D1,GPO,0,GPIO_PIN_CONFIG);
          
        EnableGlobalIRQ(0);         //打开总中断  
      
        while(1)
        {
            gpio_toggle(D1);                 //D1端口电平翻转  
            systick_delay_ms(500);
             
            //D1引脚每0.5S翻转一次电平
            //因此D1引脚每1S会产生一个上升沿信号
            //将D0 D1使用杜邦线连接起来之后
            //gpio_interrup_test变量一秒钟加一次  
        }
    }
    编程要点1:在使用GPIO中断时,务必在while(1)之前对端口进行初始化。


    编程要点2:在初始化GPIO中断时,最后一个参数可以直接使用GPIO_INT_CONFIG宏定义参数,不需要自己去选择很多个配置参数然后相或,提高易用性。请注意这里与GPIO输出、输入的宏定义不一样。


    编程要点3:进入中断之后我们应该使用GET_GPIO_FLAG函数判断中断是哪个引脚触发的,然后在使用CLEAR_GPIO_FLAG函数清除对应中断标志位,如果不清除标志位则会反复进入中断。



    编程要点4:中断函数名称定义,D0引脚的中断函数为GPIO3_Combined_0_15_IRQHandler,其中GPIO3表示的是D端口,0_15表示的是D0-D15端口所请求的中断都是执行的GPIO3_Combined_0_15_IRQHandler中断函数。详细对应关系如下表:
    41.png
    编程要点5:对于刚接触单片机不久的童鞋来说,对于中断可能有一个疑问,我程序里面并没有调用,为啥中断函数会被运行,中断函数会被运行的原因是因为,当中断被触发之后,由MCU内部硬件从中断向量表中加载函数地址到PC指针,从而跳转到中断函数,因此中断函数得以运行,这一切都是硬件自动的在工作,因此不需要用户调用中断函数。




    本期“逐飞科技RT1064开源库之GPIO详解”专题分享就到这里,大家在使用库的过程中如果遇到什么问题、或发现不足、或对库有什么建议请及时联系逐飞科技!我们将尽快完善。


    PS:通过QQ群联系我们更方便,也方便大家讨论交流,QQ群技术交流平台(逐飞科技__智能车③部:824575535),也可与管理员私信,保障该开源库有问题时可以及时得到解决。然后再分享给各位使用,形成良性循环。

    接下来我们会分章节详细介绍,分享多个模块的使用。感谢关注“逐飞科技”,我们将持续更新“基于RT1064的智能车应用入门指导”的开发分享,下期再见!




    作者:范兵@逐飞科技                          文章出处:恩智浦MCU加油站

    39.png
    跟着日天混,天天饱九顿
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-31 22:43
  • 签到天数: 175 天

    [LV.7]常住居民III

    12

    主题

    607

    帖子

    0

    金豆

    金牌会员

    Rank: 6Rank: 6

    积分
    1367
    最后登录
    2021-1-1
    发表于 2019-11-28 13:17:08 | 显示全部楼层
    好小的板子,功能强大
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    8

    帖子

    0

    金豆

    注册会员

    Rank: 2

    积分
    82
    最后登录
    2021-3-6
    发表于 2019-11-29 17:13:39 | 显示全部楼层
    性能强劲,支持一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:42
  • 签到天数: 680 天

    [LV.9]以坛为家II

    56

    主题

    2060

    帖子

    12

    金豆

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4160
    最后登录
    2021-10-25
    发表于 2019-12-1 10:15:09 | 显示全部楼层
    这个文章可是硬货啊
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2021-10-26 03:51 , Processed in 0.078247 second(s), 17 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表