查看: 1729|回复: 2

RT1010连载--3.点亮小灯

[复制链接]
  • TA的每日心情
    慵懒
    2025-5-7 08:45
  • 签到天数: 279 天

    连续签到: 1 天

    [LV.8]以坛为家I

    114

    主题

    1313

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10981

    热心会员

    最后登录
    2025-7-30
    发表于 2021-6-2 17:29:34 | 显示全部楼层 |阅读模式
    本帖最后由 az158 于 2021-6-1 21:18 编辑

    本文我们来讲一下如何使用驱动一个小灯,实现小灯闪烁的效果。

    查看原理图,找到小灯所在的IO。
    QQ截图20210530162400.png
    首先是对IO功能的复用。主要使用下面两个函数
    设置 IOMUXC 引脚复用模式
    1. static inline void IOMUXC_SetPinMux(uint32_t muxRegister,
    2.                                     uint32_t muxMode,
    3.                                     uint32_t inputRegister,
    4.                                     uint32_t inputDaisy,
    5.                                     uint32_t configRegister,
    6.                                     uint32_t inputOnfield)
    复制代码

    设置 IOMUXC 引脚配置
    1. static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,
    2.                                        uint32_t muxMode,
    3.                                        uint32_t inputRegister,
    4.                                        uint32_t inputDaisy,
    5.                                        uint32_t configRegister,
    6.                                        uint32_t configValue)
    复制代码
    看起来输入参数很多,而且要到处找寄存器,很是麻烦。其实官方给我们提供了很多的宏,帮助我们快速实现引脚功能复用。比如我们这次把GPIO11配置为GPIO的功能,需要的宏就是IOMUXC_GPIO_11_GPIOMUX_IO11。这些参数可以在fsl_iomuxc.h找到(不得不说这种方式实在太巧妙了,简化了库又利于使用)。

    下面是具体使用
    配置IO复用
    1. IOMUXC_SetPinMux(IOMUXC_GPIO_11_GPIOMUX_IO11, 0U);
    复制代码
    其中IOMUXC_SetPinMux除了宏以外还有一个参数,用于设置强制输入,一旦设置该位,无论此IO是什么模式,都可以从GPIO_PSR读到该IO的电平。

    配置引脚
    1. //IOMUXC_SetPinConfig(IOMUXC_GPIO_11_GPIOMUX_IO11, 0x10A0U);
    2. IOMUXC_SetPinConfig(IOMUXC_GPIO_11_GPIOMUX_IO11, IOMUXC_SW_PAD_CTL_PAD_SRE(0)  | //压摆率:低
    3.                                        IOMUXC_SW_PAD_CTL_PAD_DSE(4)  | //驱动强度:R/4
    4.                                        IOMUXC_SW_PAD_CTL_PAD_SPEED(2)| //输出速率:150MHz
    5.                                        IOMUXC_SW_PAD_CTL_PAD_ODE(0)  | //开漏输出使能:关闭
    6.                                        IOMUXC_SW_PAD_CTL_PAD_PKE(1)  | //上下拉电阻和状态保持器使能:使能
    7.                                        IOMUXC_SW_PAD_CTL_PAD_PUE(0)  | //上下拉电阻和状态保持器选择:保持器
    8.                                        IOMUXC_SW_PAD_CTL_PAD_PUS(0)  | //上拉/下拉选择:下拉100K Ohm(无效)
    9.                                        IOMUXC_SW_PAD_CTL_PAD_HYS(0)    //迟滞比较: 关闭
    10. );
    复制代码
    上面两种配置引脚的方式等价,可以按照自己喜欢的方式选择,NXP手册里面也提供相关的框图。
    QQ截图20210530162432.png

    简单介绍一下引脚各种的配置参数:
    压摆率:简单来说就是输出波形陡峭程度,也就是电平跳变的时间,压摆率越低电磁辐射越低。
    驱动强度:IO的驱动能力,在 3.3V 条件下,R0 的值为 150Ω。 最强为R0/7=21.4Ω。
    输出速率:IO输出的最大速度,总共有 3 个等级: 50M、 100M 和 200M。
    开漏输出使能:开启后只能输出低电平与三态状态,需要上拉电阻才能输出高电平。输入模式时忽略。
    上下拉电阻和状态保持器使能:为0时关闭上下拉电阻和状态保持器,为1时开启。
    上下拉电阻和状态保持器选择:上下拉电阻和状态保持器只能选择一个。状态保持器开启时,可以在内核关闭的情况下维持当前IO的状态(有利于做低功耗)。
    上拉/下拉选择:可配置为100K 下拉、 47K 上拉、 100K 上拉和 22K 上拉。开启保持器后无效。
    迟滞比较:开启后会使能输入接收器的施密特触发器,能一定程度上滤除误触发。


    接下来是对GPIO功能的配置:
    1. gpio_pin_config_t led_config =
    2. {
    3.     .direction     = kGPIO_DigitalOutput, //输出模式
    4.     .outputLogic   = 0,                   //默认低电平
    5.     .interruptMode = kGPIO_NoIntmode      //不使用中断
    6. };

    7. GPIO_PinInit(GPIO1, 11, &led_config);     //配置gpio
    复制代码
    这一段比较简单,就不详细说了。
    最后是控制小灯闪烁
    1. while (1)
    2. {
    3.     GPIO_PinWrite(GPIO1, 11, 0);
    4.     SDK_DelayAtLeastUs(500*1000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); //500ms
    5.     GPIO_PinWrite(GPIO1, 11, 1);
    6.     SDK_DelayAtLeastUs(500*1000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); //500ms
    7. }
    复制代码
    这一段也比较简单。
    如果有对GPIO函数不是特别清楚的,可以参考NXP的在线SDK文档GPIO篇里面有很详细的介绍。

    运行效果
    动画.gif



    接下来讲一下使用MCUXpresso Config Tools完成本次实验的方式。
    打开工程里面的配置工程。

    配置IO复用
    QQ截图20210530171058.png

    IO配置,配置引脚为输出模式
    QQ截图20210530213556.png

    点击更新代码
    QQ截图20210530171530.png

    可以在pin_mux.c里面观察到生成的代码。
    QQ截图20210530213730.png

    这里由于使用的IO配置是默认的,所以没有生成IOMUXC_SetPinConfig的代码,对于程序里面出现的IOMUXC_GPR->GPR26,可以去看看RT1010连载(番外)--1.奇怪的IOMUXC_GPR_GPR26寄存器

    主函数代码也简单了很多(可参考附件工程),运行效果与上面相同。

    最后附上工程。
    3.led.zip (1.87 MB, 下载次数: 2)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-6-11 09:06
  • 签到天数: 83 天

    连续签到: 1 天

    [LV.6]常住居民II

    7

    主题

    3446

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3048
    最后登录
    2025-7-15
    发表于 2021-6-3 09:54:01 | 显示全部楼层
    很好的入门教程,辛苦了。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    5
    最后登录
    2021-11-8
    发表于 2021-7-13 18:38:56 | 显示全部楼层
    确实是大神,写的很详细
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-1 00:43 , Processed in 0.092287 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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