硬件原理
从图中可以看出,LED0 接到了 GPIO_3 上,GPIO_3 就是 GPIO1_IO03,当 GPIO1_IO03 输出低电平(0)发光二极管时 LED0 点亮,当 PIO1_IO03 输出高电平(1)的时候发 光二极管 LED0 不会导通,所以 LED0 所以 LED0 亮灭取决于 GPIO1_IO03 输出电平,输出 0 就亮,输出 1 就灭。
创建在虚拟机下strat.c main.h main.c makefile
1.汇编文件
.global _start /* 全局标号 */ /* 文件名:start.s 创建人:JonathanQian 创建时间:2022.6.8 /* /* * 描述: _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函数 */
2.C语言文件
/* 文件名:main.c 创建人:JonathanQian 创建时间:2022.6.8 /* #include "main.h" /* * @description : 使能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; } /* * @description : 初始化LED对应的GPIO * @param : 无 * @return : 无 */ void led_init(void) { /* 1、初始化IO复用 */ SW_MUX_GPIO1_IO03 = 0x5; /* 复用为GPIO1_IO03 */ /* 2、、配置GPIO1_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_GPIO1_IO03 = 0X10B0; /* 3、初始化GPIO */ GPIO1_GDIR = 0X0000008; /* GPIO1_IO03设置为输出 */ /* 4、设置GPIO1_IO03输出低电平,打开LED0 */ GPIO1_DR = 0X0; } /* * @description : 打开LED灯 * @param : 无 * @return : 无 */ void led_on(void) { /* * 将GPIO1_DR的bit3清零 */ GPIO1_DR &= ~(1<<3); } /* * @description : 关闭LED灯 * @param : 无 * @return : 无 */ void led_off(void) { /* * 将GPIO1_DR的bit3置1 */ GPIO1_DR |= (1<<3); } /* * @description : 短时间延迟函数 * @param - n : 延迟循环次数(空操作循环次数,模式延时) * @return : 无 */ void delay_short(volatile unsigned int n) { while(n--){} } /* * @description : 延时函数,在396Mhz的主频下 * 延迟时间约为1ms * @param - n : 要延时的ms数 * @return : 无 */ void delay(volatile unsigned int n) { while(n--) { delay_short(0x7ff); } } /* * @description : mian函数 * @param : 无 * @return : 无 */ int main(void) { clk_enable(); /* 所有时钟 */ led_init(); /* 初始化led */ while(1) /* 死循环 */ { led_off(); /* 关闭LED */ delay(500); /* 延时大约500ms */ led_on(); /* 打开LED */ delay(500); /* 延时大约500ms */ } return 0; }
3.H头文件
main.h
#ifndef __MAIN_H #define __MAIN_H /* 文件名:main.h 创建人:JonathanQian 创建时间:2022.6.8 /* #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_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
/*
* 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
4.创建Makefile文件
makefile
objs := start.o main.o
ledc.bin : $(objs)
arm-linux-gnueabihf-ld -Ttext 0X87800000 $^ -o ledc.elf
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
%.o:%.c
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
%.o:%.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
clean:
rm -rf *.o ledc.bin ledc.elf ledc.dis
在终端中输入
make
调用makefile,生成.bin文件。
5.挂载SD卡
将开发板SD卡装入读卡器连接到虚拟机之前,先用
ls /dev/sd*
命令查看当前虚拟机外接设备,当读卡机插入电脑,连接到虚拟机后,再用同样的命令查看,会得到SD卡插入位置。
6.代码烧写
用imxdownload将文件烧写到SD卡中
将imxdownload文件复制到文件夹内,更改其权限。
chmod 777 imxdownload
烧写至SD卡
./imxdownload led.bin /dev/sdb
7.代码验证
设置开发板的拨码开关如下图,SD卡启动开发板方式,验证发光二极管效果
将SD卡插回开发板,可以看到LED灯闪烁效果。
LED灯闪烁