中级会员
- 积分
- 254
- 金钱
- 254
- 注册时间
- 2020-3-22
- 在线时间
- 35 小时
|
/********************************************/
时间 :2020/03/22/
作者 :YOKI
导师 :正点原子 左忠凯
硬件 :正点原子 ALPHA I.MX LINUX 开发板
/*******************************************/
本例程通过编写 按键输入实验 练习 GPIO 口的输入设置(其实和输出差别不大)
GPIO1->GDIR &= ~(1<<0); //GDIR 置 0 输入模式
GPIO1->GDIR |= (1<<0); //GDIR 置 1 输出模式
/**按键初始化函数**/
/******************************************************************************************************
查看原理图 key与 核心板 GPIO1_IO18 相连 该引脚也是 UART1_CTS_B 因此要对该口进行复用设置查看 fsl_iomuxc.h 搜索 GPIO1_IO18
#define IOMUXC_UART1_CTS_B_GPIO1_IO18 0x020E008CU, 0x5U, 0x00000000U, 0x0U, 0x020E0318U
使用 IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);函数进行复用
宏定义 IOMUXC_UART1_CTS_B_GPIO1_IO18 各值的具体含义如下:
0x020E008C IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B 也就是 功能复用寄存器 地址
0x5 对该寄存器写入的值 (1010) 查询IMX6ULL参考手册 可知该值含义:将该引脚复用为 GPIO1
0x00000000U, 0x0U, 无意义 (未执行任何有效操作)
0x020E0318 IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B 也就是 电气配置寄存器 地址
函数 IOMUXC_SetPinMux(),最后一个(第五个)参数: 0 未对 IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B 进行配置
*******************************************************************************************************/
/***********************************电气属性设置*********************************************************
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0x1F080);
最后一个参数: OXF080 对 IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B 进行配置
0XF080各位含义如下:
bit0: 0 低压摆率(边延变化时间)
bit1-2: 00 系统保留位
bit5-bit3: 000 关闭输入驱动
bit7-bit6: 10 中速 100M Hz
bit10-bit8: 000 系统保留位
bit11: 0 开路输出关闭
bit12: 1 输出后 pull/keeper 使能
bit13: 1 关闭 保持 keepr 选择 拉高/低 pull
bit15-bit14: 11 22K 上拉
bit16: 1 HYS 使能位(磁滞电路) 开启(滤波/消抖)
bit31-bit17: 全0 系统保留位
计算得 (1 1111 0000 1000 0000)=0X1F080
**************************************************************************************************/
我在写 IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0x1F080);
时给的最后一个参数和 视频中不一样 视频给的是 0XF080
而我给的是 0X1F080,前面多给了个1 也就是 第16位 HYS 被我开启了
原因是 HYS 表示 Hysteresis(磁滞电路)再查看 IMX6ULL 参考手册后发现 磁滞电路的作用是消除纹波(滤波)
也就是说开启了 HYS 滤波电路后可以由芯片自身去滤波,而按键抖动的本质也就是 由按键抖动产生的 纹波 所以开启 HYS 可以起到 消抖 作用。
本讲视频中实验的重点在最后部分,imx6.lds 链接脚本的修改
SECTIONS
{ . = 0X87800000; //IMX6ULL 的汇编起始地址
.text :
{
obj/start.o
*(.text)
}
.rodata ALIGN(4) :{*(.rodata)} //只读数据段(4字节对齐)
.data ALIGN(4) : {*(.data)} //数据段(4字节对齐)
. = ALIGN(4);
__bss_start = . ;
.bss ALIGN(4) : {*(.bss) *(COMMON)} //bss段四字节对齐
__bss_end = . ;
}
对比之前的链接脚本 在 第57行 (原文件的第11行)添加了一条语句:
. =ALIGN(4);
这条语句的作用是4字节对齐,加在 __bss_start = . 语句前
表示 __bss_start 的地址要进行四字节对齐,否则可能引起致命错误,
因为32位的芯片访问内存时是 以4字节为单位 访问
而程序的其实地址是以 0结尾 当你发现 __bss_start 的起始地址 不为 “ 0 4 8 C ” 为结尾时说明发生了这类错误,
对芯片来说在 错误读取内存 之后你的代码段都是发生了1~3位位移的,属于乱码!芯片不能正常执行。
而且该错误可能会随机发生(杀个程序员祭天?!)这是属于 小白劝退型 的错误,会让人抓狂!
当然 查坑方式 就是看 反汇编文件 xxx.dis ,左萌主 在这加上这条语句后可以帮我们 避坑
所以 左萌主 的视频里出现了翻车(>_<!)他在这里提前替我们踩了雷(*_*!) 非常感谢呢!
关于 imx6.lds 里的代码我一直都不太完全懂,所以没有好的注释,有没有大神帮助理解下???
最后留下一个疑问:
函数 IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0) 的第四个参数:
0x020E0318 IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B 也就是 电气配置寄存器 地址
这里已经把 IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B 写上去了
但是却在最后一个(第五个)参数写了0 未对 IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B 进行配置
假如直接写成下面这个语句:
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0X1F080)
是否就完成了 IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B 也就是 电气配置寄存器 的配置?
也就不需要后面第二条语句来配置电气属性了
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0x1F080);
大家自己验证以下吧
/**********************************************************************************************/
个人总结: 按键实验
因为感觉 按键实验 比较简单,所以这个例程是我自己编写的,写完之后验证和视频里的例程对照,有点不一样,但是原理相同。
以上注释和代码都是在学习 《正点原子 linux 第二期 裸机开发视频 P23-P24 第13讲 按键输入实验程序》 过程中
跟着 左萌主 编写并加入了一点点自己的思考写成的,发出来跟大家一起记录学习
如果有帮助请大家自行参考、下载,如果 转载 请注明出处,并在论坛和我联系。如果有错误请大神指正!左萌主赛高!
作者 :YOKI
导师 :正点原子 左忠凯 (请允许我叫你一声导师吧)
硬件 :正点原子 ALPHA I.MX LINUX 开发板
/*********************************************************************************************/
|
|