【正点原子阿尔法 IMX6ULL Linux开发板】C语言驱动LED灯,并闪烁!

2024-01-05 18:17:51 雷龙发展

硬件

【正点原子阿尔法 IMX6ULL Linux开发板】

目的

学习使用C语言点亮开发板上的LED灯

步骤

1. 在ALPHA工作目录下面新建led_c文件夹,用于本次学习开发的工作目录

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

2. 用vscode打开此文件夹:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

3. 在文件夹下新建start.S、main.c、main.h三个文件

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

4. 编写汇编代码部分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就是跳过来,不行返回来了。


5. 编写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中,以宏定义的形式定义了,需要使用到的寄存器,后面的数字就是基地址。


6. main.c

/***************************************************************

Copyright © lugl.

文件名 : main.c

作者 : 刘建华

版本 : V1.0

描述 : 使用C语言来点亮开发板的LED灯,

       学习掌握如何用c语言来完成对I.MX6U的GPIO初始化和控制

其他 : 此程序学习左中凯老师课程

日志 : 初版 2023/5/1 刘建华修改

**************************************************************/

#include "main.h"


/************************************************************

 * @descriptions: 使能I.MX6U所有外设时钟

 * @param       : 无

 * [url=home.php?mod=space&uid=784970]@return[/url]      : 无

 *************************************************************/

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; 

}


7. 编写Makefile

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


objs := start.o main.o


ledc.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:%.s

    arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ EEWORLDBBCODETK10lt;

    

%.o:%.S

    arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ EEWORLDBBCODETK10lt;

    

%.o:%.c

    arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ EEWORLDBBCODETK10lt;

    

clean:

    rm -rf *.o ledc.bin ledc.elf ledc.dis


8. 编写链接文件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 = .;

}



9.把文件拷到虚拟机下面进行编译:


10.烧写到SD中,SD使用的为**雷龙发展提供的CS创世SD NAND**


ugl@lugl-virtual-machine:~/linux/tool/ledc$ ./imxdownload ledc.bin /dev/sdb

I.MX6ULL bin download software

Edit by:zuozhongkai

Date:2019/6/10

Version:V1.1

log:V1.0 initial version,just support 512MB DDR3

    V1.1 and support 256MB DDR3

file ledc.bin size = 601Bytes

Board DDR SIZE: 512MB

Delete Old load.imx

Create New load.imx

Download load.imx to /dev/sdb  ......

[sudo] lugl 的密码: 

记录了7+1 的读入

记录了7+1 的写出

3673字节(3.7 kB,3.6 KiB)已复制,0.0124712 s,295 kB/s


11.把SD卡插到开发板上,上电,可以看到LED以0.5S的频率在闪烁了。

————————————————

  1. 【本文转载自电子工程,作者:lugl4313820 】

  1.   亲爱的卡友们,欢迎光临雷龙官网,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。


  2.   SD NAND,贴片式TF卡,贴片式SD卡

Tel & Email

Tel:+86 13691982107(priority)+86 17727831243

Email:line@longsto.com

info@longsto.com

Complaint:ceo@longsto.com |+8613923450403

Address: Room 1907, Block B, Zhantao Technology Building, Minzhi Street, Longhua District, Shenzhen City, Guangdong Province, China.

HOME
Product
Technical Q&A
Contact