硬件【正点原子阿尔法 imx6ull linux开发板】
目的学习使用c语言点亮开发板上的led灯
步骤在alpha工作目录下面新建led_c文件夹,用于本次学习开发的工作目录
用vscode打开此文件夹:
在文件夹下新建start.s、main.c、main.h三个文件
编写汇编代码部分start.s,由于只须考虑初始化c,具体代码如下:
/***************************************************************copyright © lugl.文件名 : start.s作者 : 刘建华版本 : v1.0描述 : i.mx6u-alpha/i.mx6ull 开发板启动文件,完成 c 环境初始化, c 环境初始化完成以后跳转到 c 代码。其他 : 此程序学习左中凯老师课程日志 : 初版 2023/5/1 刘建华修改**************************************************************/.global _start @全局标号/** 描述:_start函数,程序从此函灵敏开始执行,* 此函数主要功能是设置c运行环境*/_start: /* 进入svc模式 */ mrs r0, cpsr bic r0, r0, #0x1f @ 将r0的低5位清零,也就是cpsr的m0-m4 orr r0, r0, #0x13 @ r0或上0x13,表示使用svc模式 msr cpsr, r0 @ 将r0 的数据写入到cpsr_c中 ldr sp, =0x80200000 @ 设置栈指针 b main @ 跳转到main函数(再也不用回来了)【学习注释】
第20行到23行,就是进入svc模式。用mrs指令先把cpsr读出来,然后修改bit[4:0]为0x13后用msr写回去。
第25行是设置svc模式下的sp指针。
第26行是跳转到main函数。用b就是跳过来,不行返回来了。
编写main.h:#ifndef __main_h#define __main_h/***************************************************************copyright © lugl.文件名 : main.h作者 : 刘建华版本 : v1.0描述 : 时钟gpio1_io03的寄存器地址定义。其他 : 此程序学习左中凯老师课程日志 : 初版 2023/5/1 刘建华修改**************************************************************//************************************************************ * ccm 相关寄存器地址 *************************************************************/#define ccm_ccgr0 *((volatile unsigned int *)0x020c4068)#define ccm_ccgr1 *((volatile unsigned int *)0x020c406c)#define ccm_ccgr2 *((volatile unsigned int *)0x020c4070)#define ccm_ccgr3 *((volatile unsigned int *)0x020c4074)#define ccm_ccgr4 *((volatile unsigned int *)0x020c4078)#define ccm_ccgr5 *((volatile unsigned int *)0x020c407c)#define ccm_ccgr6 *((volatile unsigned int *)0x020c4080)/************************************************************ * iomux 相关寄存器地址 *************************************************************/#define sw_mux_gpio01_io03 *((volatile unsigned int *)0x020e0068)#define sw_pad_gpio01_io03 *((volatile unsigned int *)0x020e02f4)/************************************************************ * iomux gpio1相关寄存器地址 *************************************************************/#define gpio1_dr *((volatile unsigned int *)0x0209c000)#define gpio1_gdir *((volatile unsigned int *)0x0209c004)#define gpio1_psr *((volatile unsigned int *)0x0209c008)#define gpio1_icr1 *((volatile unsigned int *)0x0209c00c)#define gpio1_icr2 *((volatile unsigned int *)0x0209c010)#define gpio1_imr *((volatile unsigned int *)0x0209c014)#define gpio1_isr *((volatile unsigned int *)0x0209c018)#define gpio1_edge_sel *((volatile unsigned int *)0x0209c01c)# endif【注释】
在main.h中,以宏定义的形式定义了,需要使用到的寄存器,后面的数字就是基地址。
main.c/***************************************************************copyright © lugl.文件名 : main.c作者 : 刘建华版本 : v1.0描述 : 使用c语言来点亮开发板的led灯, 学习掌握如何用c语言来完成对i.mx6u的gpio初始化和控制其他 : 此程序学习左中凯老师课程日志 : 初版 2023/5/1 刘建华修改**************************************************************/#include main.h/************************************************************ * @descriptions: 使能i.mx6u所有外设时钟 * @param : 无 * @return : 无 *************************************************************/void clk_enable(void){ ccm_ccgr0 = 0xffffffff; ccm_ccgr1 = 0xffffffff; ccm_ccgr2 = 0xffffffff; ccm_ccgr3 = 0xffffffff; ccm_ccgr4 = 0xffffffff; ccm_ccgr5 = 0xffffffff; ccm_ccgr6 = 0xffffffff;}/************************************************************ * @descriptions: 初始化led对应的gpio * @param : 无 * @return : 无 *************************************************************/void led_init(void){ /* 1 初始化io 复用,复用为gpio1_io03 */ sw_mux_gpio01_io03 = 0x05; /* 2 配置gpio01_io03的io属性 *bit 16:0 hys 关闭 *bit [15:14]: 00 默认下拉 *bit [13]: 0 kepper 功能 *bit [12]: 1 pull/keeper 使能 *bit [11]: 0 关闭开路输出 *bit [7:6]: 10 速度 100mhz *bit [5:3]: 110 r0/6 驱动能力 *bit [0]: 0 低转换率 */ sw_pad_gpio01_io03 = 0x00010b0; /* 3 初始化gpio, gpio1_io03 设置为输出 */ gpio1_gdir = 0x00000008; /* 4 设置cpio1_io03 输出高电平, 半闭led0 */ gpio1_dr |= (1<<3);}/************************************************************ * @descriptions: 打开led灯 * @param : 无 * @return : 无 *************************************************************/void led_on(void){ /* * 将gpio1_dr 的bit3清零,打开led0灯 */ gpio1_dr &= ~(1<<3);}/************************************************************ * @descriptions: 关闭led灯 * @param : 无 * @return : 无 *************************************************************/void led_off(void){ /* * 将gpio1_dr 的bit3置1,关闭led0灯 */ gpio1_dr |= (1< ledc.dis %.o:%.s arm-linux-gnueabihf-gcc -wall -nostdlib -c -o2 -o $@ $< %.o:%.s arm-linux-gnueabihf-gcc -wall -nostdlib -c -o2 -o $@ $< %.o:%.c arm-linux-gnueabihf-gcc -wall -nostdlib -c -o2 -o $@ $< clean: rm -rf *.o ledc.bin ledc.elf ledc.dis编写链接文件imx6ul.lds如下:sections{ .= 0x87800000; .text : { start.o main.o *(.text) } .rodata alig(4): {*(.rodata)} .data alig(4) : {*(.data)} __bss_start = .; .bss align(4) : { *(.bss) *(common) } __bss_end = .;}把文件拷到虚拟机下面进行编译:
烧写到sd中,sd使用的为雷龙发展提供的cs创世sd nand
从Verilog PLI到SystemVerilog DPI的演变过程
工信部移动物联网生活智慧化应用案例锦集
LED电路保护的必要性 LED损坏的原因 保护LED电路小绝招
带你读懂3D结构光和ToF是什么又有何用
美国的限售禁令 VS 中国的实体清单,谁将获胜?
IMX6ULL正点原子开发板LED驱动
便携式系统开关电源PCB排版技术
安森美针对充电电池的低成本CCR充电解决方案
三大运营商将于11月底之前在全国范围内提供携号转网服务
可穿戴设备集成物联网解决方案如何帮助医疗保健行业应对疫情
航天遥感红外探测器需求与发展综述
噪声对策基础(一):什么是EMI滤波器?
盘点无人机避障技术原理及厂商
荣耀8评测:为荣耀9让路,华为荣耀8直降400,配置双面玻璃+独特光纹,颜值仍然抢眼!
TE亮相2017 IAS, 展现“小身材连接大智慧”硬实力
220V单相电机电容器好坏的判断方法(二)
联想YOGAS730评测 内外兼修的移动伴侣
口罩过滤测试仪简介
多尼卡牵手Enter Air,并拿下在海外改装市场首次EASA取证
第三代半导体功率器件在新能源汽车应用中的两大关键因素