硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3475|回复: 4
收起左侧

[开发资料] MIMXRT1050EVK上手笔记(1)---如何点亮一个LED

[复制链接]

18

主题

261

回帖

315

积分

高级会员

积分
315
发表于 2017-11-10 16:09:14 | 显示全部楼层 |阅读模式
搬运自微信https://mp.weixin.qq.com/s/bXbBvRTq27OmXVSZw90N8Q
640.jpg

昨天给大家show了一下RT1050的跑分,今天来点个灯吧。



点亮一个灯当然要从看电路图开始。打开MIMXRT1050,找到uesr led。
641.jpg



由图可以得知这个是USER_LED拉低LED发光。虽然MCU的驱动能都不是很强,但是驱动一个
LED还是没啥问题的。下面找到该引脚。
642.jpg

卧槽,USER_LED怎么还连着其他的鬼东西。先不管哪些。顺着蓝线看,找到USER_LED是连接
在GPIO_AD_B0_09上的。记下这个,我们要点亮LED就靠它了。
下面我们的目标就是把GPIO_AD_B0_09这个pad的电平拉低。这个时候就得祭出我们的大杀器
了。IMXRT1050RM,看目录翻到GPIO这一章节。找到了这个图。
643.jpg

看来想要一个pad输出低电平要从IOMUXC和GPIO 上下手。
“The GPIO functionality is provided through eight registers, an edge-detect circuit, and
interrupt generation logic.”


这是手册上的原话。大概就是GPIO功能和上面拿8个GPIO寄存器有关。
下边就是这8个寄存器的关系图。
644.jpg

下边是pad的功能框图。
645.jpg

我们的控制信号就是从DSE这里并穿过Output Driver到PAD的。但是这Output还有个管理员
叫Driver Config Logic。这个管理员还有个上司叫ODE。我们要先买通ODE,再搞定Driver
Config Logic才能让我们的信号顺利从Output Deiver通过。到底怎么才能搞定这些单位呢?手册上还有一段话:
The programming sequence for driving output signals should be as follows:
1. Configure IOMUX to select GPIO mode (Via IOMUXC),also enable SION if need to read loopback pad value through PSR
2. Configure GPIO direction register to output(GPIO_GDIR[GDIR] set to 1b).
3. Write value to data register (GPIO_DR).
A pseudocode description to drive 4'b0101 on
[output3utput0] is as follows:
// SET PADS TO GPIO MODE VIA IOMUX.
write sw_mux_ctl_pad_<output[0-3]>.mux_mode, <GPIO_MUX_MODE>
// Enable loopback so we can capture pad value into PSR in output mode
write sw_mux_ctl_pad_<output[0-3]>.sion, 1
// SET GDIR=1 TO OUTPUT BITS.
write GDIR[31:4,output3_bit,output2_bit, output1_bit, output0_bit,] 32'hxxxxxxxF
// WRITE OUTPUT VALUE=4’b0101 TO DR.
write DR, 32'hxxxxxxx5
// READ OUTPUT VALUE FROM PSR ONLY.
read_cmp PSR, 32'hxxxxxxx5


大概意思就是说:
1、去配置IOMUX选择GPIO的模式。如果要通过PSR读取状态也可以使能SION。
2、配置GPIO方向寄存器为输出。也就是将GPIO_GDIR的相应位置位。
3、向GPIO_DR中写数值。


同时还用伪代码为我们做了个示范:
这个例子将output3utput0输出为4'b0101
//通过IOMUX把PAD设定为GPIO模式
写 sw_mux_ctl_pad_<output[0-3]>.mux_mode, <GPIO_MUX_MODE>
//把输出状态回环到PSR上。
写 sw_mux_ctl_pad_<output[0-3]>.sion, 1
//设定GDIR=1来使能输出
写 GDIR[31:4,output3_bit,output2_bit, output1_bit, output0_bit,] 32'hxxxxxxxF
//写输出值4'b0101到DR
write DR, 32'hxxxxxxx5
//从PSR读取数据确认一下。
读取并比较PSr和32'hxxxxxxx5,



有了这个将它转换为我们要做的。
1写sw_mux_ctl_pad_<output[9]>.mux_mode, <GPIO_MUX_MODE>
2写sw_mux_ctl_pad_<output[9]>.sion, 1
3写GDIR的Bit9为1
4写DR的bit9为0,输出低电平。
5读psr,检查bit9是否为0.当然,我们采用更直接简单的方法,看灯。


下面查找这几个寄存器的地址:
首先是SW_MUX_CTL_PAD_GPIO_AD_B0_09
646.jpg

我们要把sion位置位使能输出,把mux_mode设定为GPIO输出。即将bit4置一,将bit2:bit0些微101.使用GPIO1_IO09模式这就完成了第一步和第二步。
647.jpg

我们用的是GPIO1中的09号,
所以GDIR的地址为0x401B_8004
DR地址为0x401B_8000
下面开始偷盗工程,没错就是偷盗工程。
把\SDK_2.3.0_EVK-MIMXRT1050\boards\evkmimxrt1050\driver_examples\gpio下的
led_output复制一份改名为led_reg
打开led_reg\iar下的igpio_led_output.eww工程文件
打开工程里的pin-mux.c
把这几行注释了
648.jpg

改成这种:
649.jpg

打开工程中的gpio_led_output.c
注释原本的GPIO设定操作,并进行如下修改:
650.jpg

GPIO输出电平修改:把原来的操作注释掉,改成我们的寄存器操作。
编译,下载,go!!!
what fuck!!!!为啥灯不亮。。。。。
仔细想想是啥问题???
追查一下,GPIO_PinInit(),发现了这一行:
651.jpg

好像我们没有打开这块外设的时钟诶。。
好了,添加时钟的使能;
652.jpg

编译,下载,gogogo!!!
灯终于亮了
回复

使用道具 举报

27

主题

95

回帖

181

积分

初级会员

积分
181
发表于 2017-11-10 19:20:32 | 显示全部楼层
[s:149]
回复

使用道具 举报

680

主题

3480

回帖

5545

积分

论坛元老

积分
5545
发表于 2017-11-10 20:27:57 | 显示全部楼层
这么牛逼呀,板子都到手了
回复

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
QQ
发表于 2018-1-8 11:15:57 | 显示全部楼层
mark
回复

使用道具 举报

0

主题

60

回帖

60

积分

初级会员

积分
60
发表于 2018-2-2 08:58:50 | 显示全部楼层
有没有像ST的Cube MX类似的配置工具?查手册看寄存器太费时间了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-12 21:08 , Processed in 0.233835 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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