IMX6ULL正点原子开发板LED驱动-最新资讯
2023-05-02 15:13:08华仔的编程随笔

硬件

【正点原子阿尔法 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模式 */    mrsr0, 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<<3);}/************************************************************ * @descriptions: 短时间延时函数 * @param -n    : 要延时循环次数,模式延时 * @return      : 无 *************************************************************/void delay_short(volatile unsigned int n){    while (n--)    {        ;    } }/************************************************************ * @descriptions: 延时函数,在396MHz的主频下延时时间大约为1ms * @param -n    : 要延时的ms数 * @return      : 无 *************************************************************/void delay(volatile unsigned int n){    while (n--)    {        delay_short(0x7ff);    }    }/************************************************************ * @descriptions: main函数 * @param       : 无 * @return      : 无 *************************************************************/int main(void){    clk_enable();  //使能所有时钟    led_init();    //初始化LED    while (1)    {        led_on();   //打开LED        delay(500); //延时        led_off();  //关闭LED        delay(500);    }    return 0; }
编写Makefile

新建Makefile文件,在Makefile文件具体如下:

objs := start.o main.oledc.bin:$(objs)arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis%.o:%.sarm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<%.o:%.Sarm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<%.o:%.carm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $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

ugl@lugl-virtual-machine:~/linux/tool/ledc$ ./imxdownloadledc.bin /dev/sdbI.MX6ULL bin download softwareEdit by:zuozhongkaiDate:2019/6/10Version:V1.1log:V1.0 initial version,just support 512MB DDR3    V1.1 and support 256MB DDR3file ledc.bin size = 601BytesBoard DDR SIZE: 512MBDelete Old load.imxCreate New load.imxDownload load.imx to /dev/sdb  ......[sudo] lugl 的密码: 记录了7+1 的读入记录了7+1 的写出3673字节(3.7 kB,3.6 KiB)已复制,0.0124712 s,295 kB/s
把SD卡插到开发板上,上电,可以看到LED以0.5S的频率在闪烁了。

审核编辑 黄宇

关键词:

下一篇: 维珍航空恢复中国内地首条航线 前沿资讯
上一篇: 天天新消息丨没要到F-16战机,他仍决定……

相关新闻

热搜榜