前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >i.MXRT1062 | 使用 IOMUXC 和 GPIO 点亮LED

i.MXRT1062 | 使用 IOMUXC 和 GPIO 点亮LED

作者头像
Mculover666
发布2021-12-28 09:42:20
9650
发布2021-12-28 09:42:20
举报
文章被收录于专栏:TencentOS-tiny

一些思考

在上手i.MX RT1062这款芯片的开发时,思考了很多问题,单独分享一篇文章好像有点夸张,所以暂且用一个小节来记录个人的一些思考。

作为一名STM32资深老玩家、野火资深老学生,在最开始玩MCU的时候,先是照着视频学了一遍51,接着再跟着野火来了一遍STM32,不知不觉几年时间已过,仿佛已经形成了一种很局限的思维:

上手一款新的MCU开发,只需要两步:找视频、跟着学。

所以在我半年前刚刚接触RT1062这款芯片时,面对一个全新的MCU,我的思路是:照着之前学STM32的路子,再来一遍

后来逐渐发现,这种思维是错误的,之前学习STM32时教程是面向小白的,没有MCU开发经验,需要一步一步学习,现如今作为一个嵌入式软件工程师,再去一步一步学习如何搭建寄存器工程、如何从0创建工程这些,耗费大量时间和精力,吃力不讨好。

那应该如何做到快速上手呢?

我觉得首先去官方找找资料,看下芯片大致的一些参数和框图,知道芯片内部大致结构。

接着最重要的就是利用好官方给的SDK,这其中在包含固件库的同时,还包含每个外设用法的示例工程,基于这些示例工程以及参考手册,做到快速了解芯片的常用外设用法、掌握官方提供的固件库API如何使用,这就达到目的了。

一、IOMUXC外设

1. I/O引脚(pin或pad)

I/O引脚是指芯片肉眼可见的输入输出引脚,也称为pin。

引脚数量的多少通常由封装决定,比如本文中所使用的i.MXRT1062CVL5B芯片,使用 BGA 封装,总共有196个引脚:

在数据手册中(IMXRT1060CEC)可以看到这 196 个引脚的名称以及默认功能映射表(Table 83,部分截取):

2. GPIO外设和I/O引脚的关系(IOMUXC外设)

GPIO(General Purpose Input/Output)是芯片内的外设,每个GPIO外设连接到了外部的I/O引脚上,这时,和GPIO外设相连的I/O引脚起着通用输入输出的功能,所以被称为 GPIO 引脚。

但是,I/O引脚不仅可以和GPIO外设相连,还可以和芯片内部其它外设相连,比如和UART、IIC、SPI等外设相连作为通信外设的接口引脚,和定时器相连作为PWM输出引脚,等等。

基于这种设计,i.MX RT1062 提供了 IOMUX单元(I/O复用选择器),可以选通I/O引脚与某个具体的外设相连,发挥不同的作用。

一个IOMUX单元最大支持选择 8 个功能,称为ALT,不同的模式分别称为ALT0-ALT7,所以在阅读数据手册时,看到ALT这个英文缩写不要惊讶。

那么,如何控制IOMUX选通某个具体的功能呢?

芯片内部提供了 IOMUXC外设 来控制IOMUX单元,由图中可以看到,IOMUXC有两个作用:

  • SW_MUX_CTL_PAD*寄存器:用于设置某个引脚的IOMUX,选择该引脚的功能;
  • SW_PAD_CTL_PAD*寄存器:用于设置某个引脚的属性,比如驱动能力、是否使用上下拉电阻等;

两个寄存器名称中的 * 表示引脚名称,比如 GPIO_AD_B0_00 引脚的这两个寄存器为:

① SW_MUX_CTL_PAD_GPIO_AD_B0_00

② SW_PAD_CTL_PAD_GPIO_AD_B0_00

该寄存器中每个配置项的作用如下表:

配置项

作用

HYS

是否使用施密特触发器

PUS

是否使用上拉/下拉(输入模式有效)

PUE

选择上下拉或者保持器

PKE

使能上下拉或者保持器

ODE

开漏使能(需要外接上拉电阻)

SPEED

引脚速度

DSE

驱动能力(会串联一个电阻,阻值可选)

SRE

压摆率

综上所述,i.MXRT1062这 196 个引脚,除了一些用作特殊功能(电源、时钟等)的引脚之外,每个功能引脚都需要一个 IOMUX单元来配合才行

二、GPIO外设(GPIO)

RT1062芯片有5个GPIO外设,分别为GPIO1-5,每个GPIO外设可以控制32个GPIO引脚。

每个GPIO外设的框图如下,主要有8个寄存器:

1. 设置 GPIO 引脚方向

通过配置 GPIO 方向寄存器 GDIR(GPIO Direction register) 来设置GPIO引脚的方向:

GDIR寄存器中的32位对应该GPIO外设的32个引脚,置0为输入,置1为输出:

2. 读取/写入 GPIO 数据寄存器

GPIO引脚的电平数据存放在 GPIO数据寄存器 DR (Data Register)中:

三、外设时钟使能

i.MX RT1062的时钟管理单元为CCM(Clock Controller Module),为了保持低功耗,每个外设的时钟是独立且失能的。

本实验中使用了 IOMUXC 和 GPIO1 两个外设,需要使能这两个外设的时钟。

在参考手册 GPIO 章节的 Clock 小节说明了 GPIO 的时钟源:

在参考手册 IOMUCX 章节的 Clock 小节说明了 IOMUCX 的时钟源:

在参考手册 CCM 章节可以看到(Table 18-3)GPIO1外设的时钟源和时钟增益使能寄存器:

查阅 CCM_CCGR1(CCM Clock Gating Register 1 )寄存器描述

其中 CG13 位用来控制GPIO1外设的时钟:

那么,这两位的值应该设置为多少呢?参考手册中也已给出:

四、点亮LED

1. 基于SDK新建MDK工程

这里使用 NXP 官方提供的 MCUXpresso Config Tools,下载链接:。

修改LED使用的GPIO引脚

查看时钟配置:

点击【更新源代码】,修改引脚会更新文件pin_mux.hpin_mux.c

2. 修改MDK工程

打开生成的keil工程:

修改LED引脚定义:

3. 调试

编译,点击调试,全速运行,可以看到 LED 闪烁。

4. 代码分析

该实验的核心逻辑都在 source 文件夹中的 gpio_led_output.c 文件中。

4.1. 通用逻辑

在main函数中,首先完成了IOMUX、时钟的初始化,这两个都可以使用Config Tool 工具来配置生成文件,并初始化了MPU、以及一个自带的组件Debug_console,方便在工程中使用 PRINTF 函数来打印,默认调试串口是LPUART1。

4.2. GPIO操作API

针对GPIO外设,FSL库提供对应的库函数,在fsl_gpio.hfsl_gpio.c中。

(1)初始化结构体

代码语言:javascript
复制
/*! @brief GPIO Init structure definition. */
typedef struct _gpio_pin_config
{
    gpio_pin_direction_t direction; /*!< Specifies the pin direction. */
    uint8_t outputLogic;            /*!< Set a default output logic, which has no use in input */
    gpio_interrupt_mode_t
        interruptMode; /*!< Specifies the pin interrupt mode, a value of @ref gpio_interrupt_mode_t. */
} gpio_pin_config_t;

成员 direction 用来指明引脚方向:

代码语言:javascript
复制
/*! @brief GPIO direction definition. */
typedef enum _gpio_pin_direction
{
    kGPIO_DigitalInput  = 0U, /*!< Set current pin as digital input.*/
    kGPIO_DigitalOutput = 1U, /*!< Set current pin as digital output.*/
} gpio_pin_direction_t;

成员 outputLogic 用来设置默认输出逻辑,设为0即可。

成员 interruptMode 用来设置引脚中断模式:

代码语言:javascript
复制
/*! @brief GPIO interrupt mode definition. */
typedef enum _gpio_interrupt_mode
{
    kGPIO_NoIntmode              = 0U, /*!< Set current pin general IO functionality.*/
    kGPIO_IntLowLevel            = 1U, /*!< Set current pin interrupt is low-level sensitive.*/
    kGPIO_IntHighLevel           = 2U, /*!< Set current pin interrupt is high-level sensitive.*/
    kGPIO_IntRisingEdge          = 3U, /*!< Set current pin interrupt is rising-edge sensitive.*/
    kGPIO_IntFallingEdge         = 4U, /*!< Set current pin interrupt is falling-edge sensitive.*/
    kGPIO_IntRisingOrFallingEdge = 5U, /*!< Enable the edge select bit to override the ICR register's configuration.*/
} gpio_interrupt_mode_t;

(2)初始化函数

初始化结构体创建完成后,调用FSL库API初始化底层寄存器:

代码语言:javascript
复制
/*!
 * brief Initializes the GPIO peripheral according to the specified
 *        parameters in the initConfig.
 *
 * param base GPIO base pointer.
 * param pin Specifies the pin number
 * param initConfig pointer to a ref gpio_pin_config_t structure that
 *        contains the configuration information.
 */
void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *Config)

第一个参数用来指定GPIO外设基地址,这种参数都定义在芯片头文件 MIMXRT1062.h 中:

代码语言:javascript
复制
/* GPIO - Peripheral instance base addresses */
/** Peripheral GPIO3 base address */
#define GPIO3_BASE                               (0x401C0000u)
/** Peripheral GPIO3 base pointer */
#define GPIO3                                    ((GPIO_Type *)GPIO3_BASE)

第二个参数用来指定 GPIO 外设的具体某个引脚,直接使用数字即可。

第三个参数当然就是上一步创建的初始化结构体啦!

(3)GPIO操作函数

GPIO引脚初始化完成之后,使用如下的API来操作引脚电平:

代码语言:javascript
复制
/*!
 * brief Sets the output level of the individual GPIO pin to logic 1 or 0.
 *
 * param base GPIO base pointer.
 * param pin GPIO port pin number.
 * param output GPIOpin output logic level.
 *        - 0: corresponding pin output low-logic level.
 *        - 1: corresponding pin output high-logic level.
 */
void GPIO_PinWrite(GPIO_Type *base, uint32_t pin, uint8_t output)

前两个参数用来指明某个GPIO的某个引脚,第三个参数是输出值:0对应低电平、1对应高电平。

至此,代码就分析完毕啦~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mculover666 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一些思考
  • 一、IOMUXC外设
    • 1. I/O引脚(pin或pad)
      • 2. GPIO外设和I/O引脚的关系(IOMUXC外设)
      • 二、GPIO外设(GPIO)
        • 1. 设置 GPIO 引脚方向
          • 2. 读取/写入 GPIO 数据寄存器
          • 三、外设时钟使能
          • 四、点亮LED
            • 1. 基于SDK新建MDK工程
              • 2. 修改MDK工程
                • 3. 调试
                  • 4. 代码分析
                    • 4.1. 通用逻辑
                    • 4.2. GPIO操作API
                相关产品与服务
                腾讯云代码分析
                腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档