0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

IMX6ULL正点原子开发板LED驱动

华仔的编程随笔 来源:华仔的编程随笔 作者:华仔的编程随笔 2023-05-02 15:22 次阅读

硬件

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

目的

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

步骤

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

    image.png

  2. 用vscode打开此文件夹:

    image.png

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

    image.png

  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就是跳过来,不行返回来了。

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

  1. 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; 
}
  1. 编写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 $@ $<
	
%.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
  1. 编写链接文件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 = .;
}
  1. 把文件拷到虚拟机下面进行编译:

image.png

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

    9018f98d19e068818ebe36f3f520e67.jpg

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
  1. 把SD卡插到开发板上,上电,可以看到LED以0.5S的频率在闪烁了。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    237

    文章

    22449

    浏览量

    645853
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206730
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93977
  • IMX6ULL
    +关注

    关注

    3

    文章

    15

    浏览量

    3905
收藏 人收藏

    评论

    相关推荐

    如何将u-boot.2022.10版本移植到imx6ull开发板

    今天给大家讲一讲如何将u-boot.2022.10版本移植到imx6ull开发板上。
    发表于 07-12 14:57 729次阅读
    如何将u-boot.2022.10版本移植到<b class='flag-5'>imx6ull</b><b class='flag-5'>开发板</b>

    正点原子阿尔法开发板免费试用免费试用连载】使用正点原子alpha开发板实现多通信接口工业无线终端

    项目名称:使用正点原子alpha开发板实现多通信接口工业无线终端试用计划:申请 正点原子alpha开发板
    发表于 06-05 14:54

    如何实现飞凌iMX6ULL开发板系统的烧写

    本文以飞凌嵌入式OKMX6ULL-S开发板为基础讲解,本文分为三个部分,主要讲解了iMX6ULL SD卡烧写系统及OTG烧写系统的以及单步更新内核的步骤。通过本文您可以快速实现飞凌iMX6UL
    发表于 12-22 06:23

    迅为IMX6ULL开发板Linux下电容触摸实验程序编写

    迅为IMX6ULL开发板Linux下电容触摸实验程序编写
    发表于 12-28 07:00

    iMX6ULL开发板如何配置AP热点

    迅为-iMX6ULL开发板上配置AP热点
    发表于 12-29 06:33

    iMX6ULL开发板的移植和测试介绍

    iMX6ULL开发板的移植和测试
    发表于 12-29 07:55

    IMX6ULL开发板使用前装配流程

    IMX6ULL开发板【终极者】开发板使用前装配流程
    发表于 12-30 07:23

    迅为IMX6ULL开发板的特点

    迅为IMX6ULL开发板有哪些特点
    发表于 01-12 06:33

    基于迅为IMX6ULL开发板文本编辑工具安装过程

    基于迅为IMX6ULL开发板-文本编辑工具
    发表于 01-21 06:29

    imx6ull开发板是什么

    一、前言阿尔法imx6ull开发板正点原子与2019年10月发布的一款Linux开发板,其主控使用恩智浦公司的
    发表于 07-23 09:39

    嵌入式驱动开发分类

    IMX6ULL开发板alpha中记录的笔记,部分摘录自正点原子IMX6ULL开发手册。一、应用程
    发表于 12-24 07:08

    华清远见STM32MP157开发板对比imx6ull开发板优势是什么?

    华清远见STM32MP157开发板对比imx6ull开发板优势是什么?
    发表于 02-28 11:09

    使用openocd调试imx6ull的过程分享

    一、前言目前很多人开发imx6ull基本的组合是uboot+linux,以开发应用层软件的居多(此时可以直接在开发板运行gdb工具链调试APP);其次是
    发表于 04-18 09:44

    iMX6ULL开发板WIFI功能测试(三)

    注意:若 飞凌iMX6ULL 开发板上焊接的是8723 b u,使用lsmod会显示8723 b u
    发表于 04-29 15:10 1227次阅读
    <b class='flag-5'>iMX6ULL</b><b class='flag-5'>开发板</b>WIFI功能测试(三)

    汇编驱动IMX6ULL LED

    用汇编编写正点原子Linux开发板Led驱动
    的头像 发表于 05-01 09:19 25.8w次阅读
    汇编<b class='flag-5'>驱动</b><b class='flag-5'>IMX6ULL</b> <b class='flag-5'>LED</b>灯