栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

IMX6ULL裸机开发学习2-使用C语言点亮LED指示灯

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

IMX6ULL裸机开发学习2-使用C语言点亮LED指示灯

本章节接着上一章进行升级改造代码。

编程环境搭建:

开发板:野火Imx6ull mini板

编程环境:Ubuntu18.04 + VScode

开始进入代码内容:

C语言需要运行起来,少不了汇编准备好运行的环境。

汇编代码start.S如下:


 .global    _start      @全局标号

 
  _start :

 
  mrs r0,   cpsr                       @拷贝CPSR状态寄存器到R0中
  bic r0,   r0,   #0x1f              @清楚CPU模式位BIT4-BIT0
  orr r0,   r0,   #0x13             @配置BIT4-0为SVC模式
  msr cpsr,   r0                       @将寄存器R0数据写回到CPSR中


 
  ldr sp,   =0x80200000       @设置堆栈0x80200000->0x80000000  2M空间
  b   main                                 @跳转到C语言main函数


  

有了上述代码,就能和stm32一样写代码了。

C代码部分来个头文件led.h,将CPU相关寄存器地址指针给定义出来:

#ifndef _H_LED_H
#define _H_LED_H


#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)


#define SW_MUX_GPIO5_IO3           *((volatile unsigned int *)0x02290014)
#define SW_PAD_GPIO5_IO3           *((volatile unsigned int *)0x02290058)


#define GPIO5_DR                 *((volatile unsigned int *)0x020AC000)
#define GPIO5_GDIR            *((volatile unsigned int *)0x020AC004)


#define LED_ON()                      (GPIO5_DR &= ~(1<<3))
#define LED_OFF()                    (GPIO5_DR |= (1<<3))


#endif // !_H_LED_H

可执行代码片段:

#include "led.h"


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 ;       
}


void led_Init(void)
{
  
  SW_MUX_GPIO5_IO3 = 0x5;        //AL5

  
  SW_PAD_GPIO5_IO3 = 0x08B0;


    GPIO5_GDIR = 0x08;      


    LED_ON() ;

}


void delay_ms(volatile unsigned int nms)
{
    unsigned int nus;

    while(nms--)
    {
        //1 ms延时
           nus=0x7ff;
           while(nus--)
           {

           }
    }
}


int main(void)
{
    clk_enable();       //使能时钟
    led_Init();             //初始化led灯

    //led闪烁循环
    while(1)
    {
        LED_OFF();
        delay_ms(500);
        LED_ON();
        delay_ms(500);
    }
    return 0;
}

代码部分好了,接下来准备一下链接脚本,用于指定编译程序起始地址和顺序

SECTIONS{
            . = 0x87800000;
            .text :
            {
                start.o
                led.o
                *(.text)
            }
            .rodata ALIGN(4)    :   {*(.rodata*)}
            .data   ALIGN(4)    :   {  *(.data) }
            __bss_start = .;
            .bss   ALIGN(4)    :   {  *(.bss) *(COMMON)}
            __bss_end = .;
}

准备Makefile进行起飞编译吧:

objs := start.o led.o 

led.bin : $(objs)
	arm-linux-gnueabihf-ld	-Timxu.lds -o led.elf $^
	arm-linux-gnueabihf-objcopy -O binary -S  led.elf $@

%.o	: %.s
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<

%.o	: %.S
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<

%.o	: %.c
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<

clean:
	rm -rf *.o led.bin led.elf led.dis *.imx

dump:
	arm-linux-gnueabihf-objdump -D -m arm led.elf > led.dis

dowmload:
	./imxdownload led.bin /dev/sdb

试试编译效果:

motiongui@motiongui-VirtualBox:~/work/imxAss/Ledc$ make
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o start.o start.S
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o led.o led.c
arm-linux-gnueabihf-ld  -Timxu.lds -o led.elf start.o led.o
arm-linux-gnueabihf-objcopy -O binary -S  led.elf led.bin
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/739344.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号