在线时间717 小时
UID3469866
注册时间2018-4-19
NXP金币3688

TA的每日心情 | 慵懒 2025-5-7 08:45 |
---|
签到天数: 279 天 连续签到: 1 天 [LV.8]以坛为家I
版主
  
- 积分
- 10981

- 最后登录
- 2025-7-30
|
本帖最后由 az158 于 2021-6-1 21:18 编辑
本文我们来讲一下如何使用驱动一个小灯,实现小灯闪烁的效果。
查看原理图,找到小灯所在的IO。
首先是对IO功能的复用。主要使用下面两个函数
设置 IOMUXC 引脚复用模式
- static inline void IOMUXC_SetPinMux(uint32_t muxRegister,
- uint32_t muxMode,
- uint32_t inputRegister,
- uint32_t inputDaisy,
- uint32_t configRegister,
- uint32_t inputOnfield)
复制代码
设置 IOMUXC 引脚配置
- static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,
- uint32_t muxMode,
- uint32_t inputRegister,
- uint32_t inputDaisy,
- uint32_t configRegister,
- uint32_t configValue)
复制代码 看起来输入参数很多,而且要到处找寄存器,很是麻烦。其实官方给我们提供了很多的宏,帮助我们快速实现引脚功能复用。比如我们这次把GPIO11配置为GPIO的功能,需要的宏就是IOMUXC_GPIO_11_GPIOMUX_IO11。这些参数可以在fsl_iomuxc.h找到(不得不说这种方式实在太巧妙了,简化了库又利于使用)。
下面是具体使用
配置IO复用
- IOMUXC_SetPinMux(IOMUXC_GPIO_11_GPIOMUX_IO11, 0U);
复制代码 其中IOMUXC_SetPinMux除了宏以外还有一个参数,用于设置强制输入,一旦设置该位,无论此IO是什么模式,都可以从GPIO_PSR读到该IO的电平。
配置引脚
- //IOMUXC_SetPinConfig(IOMUXC_GPIO_11_GPIOMUX_IO11, 0x10A0U);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_11_GPIOMUX_IO11, IOMUXC_SW_PAD_CTL_PAD_SRE(0) | //压摆率:低
- IOMUXC_SW_PAD_CTL_PAD_DSE(4) | //驱动强度:R/4
- IOMUXC_SW_PAD_CTL_PAD_SPEED(2)| //输出速率:150MHz
- IOMUXC_SW_PAD_CTL_PAD_ODE(0) | //开漏输出使能:关闭
- IOMUXC_SW_PAD_CTL_PAD_PKE(1) | //上下拉电阻和状态保持器使能:使能
- IOMUXC_SW_PAD_CTL_PAD_PUE(0) | //上下拉电阻和状态保持器选择:保持器
- IOMUXC_SW_PAD_CTL_PAD_PUS(0) | //上拉/下拉选择:下拉100K Ohm(无效)
- IOMUXC_SW_PAD_CTL_PAD_HYS(0) //迟滞比较: 关闭
- );
复制代码 上面两种配置引脚的方式等价,可以按照自己喜欢的方式选择,NXP手册里面也提供相关的框图。
简单介绍一下引脚各种的配置参数:
压摆率:简单来说就是输出波形陡峭程度,也就是电平跳变的时间,压摆率越低电磁辐射越低。
驱动强度:IO的驱动能力,在 3.3V 条件下,R0 的值为 150Ω。 最强为R0/7=21.4Ω。
输出速率:IO输出的最大速度,总共有 3 个等级: 50M、 100M 和 200M。
开漏输出使能:开启后只能输出低电平与三态状态,需要上拉电阻才能输出高电平。输入模式时忽略。
上下拉电阻和状态保持器使能:为0时关闭上下拉电阻和状态保持器,为1时开启。
上下拉电阻和状态保持器选择:上下拉电阻和状态保持器只能选择一个。状态保持器开启时,可以在内核关闭的情况下维持当前IO的状态(有利于做低功耗)。
上拉/下拉选择:可配置为100K 下拉、 47K 上拉、 100K 上拉和 22K 上拉。开启保持器后无效。
迟滞比较:开启后会使能输入接收器的施密特触发器,能一定程度上滤除误触发。
接下来是对GPIO功能的配置:
- gpio_pin_config_t led_config =
- {
- .direction = kGPIO_DigitalOutput, //输出模式
- .outputLogic = 0, //默认低电平
- .interruptMode = kGPIO_NoIntmode //不使用中断
- };
- GPIO_PinInit(GPIO1, 11, &led_config); //配置gpio
复制代码 这一段比较简单,就不详细说了。
最后是控制小灯闪烁
- while (1)
- {
- GPIO_PinWrite(GPIO1, 11, 0);
- SDK_DelayAtLeastUs(500*1000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); //500ms
- GPIO_PinWrite(GPIO1, 11, 1);
- SDK_DelayAtLeastUs(500*1000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); //500ms
- }
复制代码 这一段也比较简单。
如果有对GPIO函数不是特别清楚的,可以参考NXP的在线SDK文档GPIO篇里面有很详细的介绍。
运行效果
接下来讲一下使用MCUXpresso Config Tools完成本次实验的方式。
打开工程里面的配置工程。
配置IO复用
IO配置,配置引脚为输出模式
点击更新代码
可以在pin_mux.c里面观察到生成的代码。
这里由于使用的IO配置是默认的,所以没有生成IOMUXC_SetPinConfig的代码,对于程序里面出现的IOMUXC_GPR->GPR26,可以去看看RT1010连载(番外)--1.奇怪的IOMUXC_GPR_GPR26寄存器。
主函数代码也简单了很多(可参考附件工程),运行效果与上面相同。
最后附上工程。
3.led.zip
(1.87 MB, 下载次数: 2)
|
|