欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

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

时间:2023-05-26

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

编程环境搭建:

开发板:野火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: %.sarm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<%.o: %.Sarm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<%.o: %.carm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $ led.disdowmload:./imxdownload led.bin /dev/sdb

试试编译效果:

motiongui@motiongui-VirtualBox:~/work/imxAss/Ledc$ makearm-linux-gnueabihf-gcc -Wall -nostdlib -c -o start.o start.Sarm-linux-gnueabihf-gcc -Wall -nostdlib -c -o led.o led.carm-linux-gnueabihf-ld -Timxu.lds -o led.elf start.o led.oarm-linux-gnueabihf-objcopy -O binary -S led.elf led.bin

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。