硬件
【正點(diǎn)原子阿爾法 IMX6ULL Linux開(kāi)發(fā)板】
目的
學(xué)習(xí)使用C語(yǔ)言點(diǎn)亮開(kāi)發(fā)板上的LED燈
步驟
-
在ALPHA工作目錄下面新建led_c文件夾,用于本次學(xué)習(xí)開(kāi)發(fā)的工作目錄
-
用vscode打開(kāi)此文件夾:
-
在文件夾下新建start.S、main.c、main.h三個(gè)文件
-
編寫匯編代碼部分start.S,由于只須考慮初始化C,具體代碼如下:
/***************************************************************
Copyright ? lugl.
文件名 : start.s
作者 : 劉建華
版本 : V1.0
描述 : I.MX6U-ALPHA/I.MX6ULL 開(kāi)發(fā)板啟動(dòng)文件,完成 C 環(huán)境初始化,
C 環(huán)境初始化完成以后跳轉(zhuǎn)到 C 代碼。
其他 : 此程序?qū)W習(xí)左中凱老師課程
日志 : 初版 2023/5/1 劉建華修改
**************************************************************/
.global _start @全局標(biāo)號(hào)
/*
* 描述:_start函數(shù),程序從此函靈敏開(kāi)始執(zhí)行,
* 此函數(shù)主要功能是設(shè)置C運(yùn)行環(huán)境
*/
_start:
/* 進(jìn)入SVC模式 */
mrs r0, cpsr
bic r0, r0, #0x1f @ 將r0的低5位清零,也就是cpsr的M0-M4
orr r0, r0, #0x13 @ r0或上0x13,表示使用SVC模式
msr cpsr, r0 @ 將r0 的數(shù)據(jù)寫入到cpsr_c中
ldr sp, =0x80200000 @ 設(shè)置棧指針
b main @ 跳轉(zhuǎn)到main函數(shù)(再也不用回來(lái)了)
【學(xué)習(xí)注釋】
第20行到23行,就是進(jìn)入SVC模式。用mrs指令先把cpsr讀出來(lái),然后修改bit[4:0]為0x13后用msr寫回去。
第25行是設(shè)置SVC模式下的SP指針。
第26行是跳轉(zhuǎn)到main函數(shù)。用B就是跳過(guò)來(lái),不行返回來(lái)了。
- 編寫main.h:
#ifndef __MAIN_H
#define __MAIN_H
/***************************************************************
Copyright ? lugl.
文件名 : main.h
作者 : 劉建華
版本 : V1.0
描述 : 時(shí)鐘GPIO1_IO03的寄存器地址定義。
其他 : 此程序?qū)W習(xí)左中凱老師課程
日志 : 初版 2023/5/1 劉建華修改
**************************************************************/
/************************************************************
* CCM 相關(guān)寄存器地址
*************************************************************/
#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 相關(guān)寄存器地址
*************************************************************/
#define SW_MUX_GPIO01_IO03 *((volatile unsigned int *)0x020e0068)
#define SW_PAD_GPIO01_IO03 *((volatile unsigned int *)0x020e02f4)
/************************************************************
* IOMUX GPIO1相關(guān)寄存器地址
*************************************************************/
#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中,以宏定義的形式定義了,需要使用到的寄存器,后面的數(shù)字就是基地址。
- main.c
/***************************************************************
Copyright ? lugl.
文件名 : main.c
作者 : 劉建華
版本 : V1.0
描述 : 使用C語(yǔ)言來(lái)點(diǎn)亮開(kāi)發(fā)板的LED燈,
學(xué)習(xí)掌握如何用c語(yǔ)言來(lái)完成對(duì)I.MX6U的GPIO初始化和控制
其他 : 此程序?qū)W習(xí)左中凱老師課程
日志 : 初版 2023/5/1 劉建華修改
**************************************************************/
#include "main.h"
/************************************************************
* @descriptions: 使能I.MX6U所有外設(shè)時(shí)鐘
* @param : 無(wú)
* @return : 無(wú)
*************************************************************/
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對(duì)應(yīng)的GPIO
* @param : 無(wú)
* @return : 無(wú)
*************************************************************/
void led_init(void)
{
/* 1 初始化IO 復(fù)用,復(fù)用為GPIO1_IO03 */
SW_MUX_GPIO01_IO03 = 0x05;
/* 2 配置GPIO01_IO03的IO屬性
*bit 16:0 HYS 關(guān)閉
*bit [15:14]: 00 默認(rèn)下拉
*bit [13]: 0 kepper 功能
*bit [12]: 1 pull/keeper 使能
*bit [11]: 0 關(guān)閉開(kāi)路輸出
*bit [7:6]: 10 速度 100Mhz
*bit [5:3]: 110 R0/6 驅(qū)動(dòng)能力
*bit [0]: 0 低轉(zhuǎn)換率
*/
SW_PAD_GPIO01_IO03 = 0x00010b0;
/* 3 初始化GPIO, GPIO1_IO03 設(shè)置為輸出 */
GPIO1_GDIR = 0x00000008;
/* 4 設(shè)置CPIO1_IO03 輸出高電平, 半閉led0 */
GPIO1_DR |= (1<<3);
}
/************************************************************
* @descriptions: 打開(kāi)LED燈
* @param : 無(wú)
* @return : 無(wú)
*************************************************************/
void led_on(void)
{
/*
* 將GPIO1_DR 的bit3清零,打開(kāi)led0燈
*/
GPIO1_DR &= ~(1<<3);
}
/************************************************************
* @descriptions: 關(guān)閉LED燈
* @param : 無(wú)
* @return : 無(wú)
*************************************************************/
void led_off(void)
{
/*
* 將GPIO1_DR 的bit3置1,關(guān)閉led0燈
*/
GPIO1_DR |= (1<<3);
}
/************************************************************
* @descriptions: 短時(shí)間延時(shí)函數(shù)
* @param -n : 要延時(shí)循環(huán)次數(shù),模式延時(shí)
* @return : 無(wú)
*************************************************************/
void delay_short(volatile unsigned int n)
{
while (n--)
{
;
}
}
/************************************************************
* @descriptions: 延時(shí)函數(shù),在396MHz的主頻下延時(shí)時(shí)間大約為1ms
* @param -n : 要延時(shí)的ms數(shù)
* @return : 無(wú)
*************************************************************/
void delay(volatile unsigned int n)
{
while (n--)
{
delay_short(0x7ff);
}
}
/************************************************************
* @descriptions: main函數(shù)
* @param : 無(wú)
* @return : 無(wú)
*************************************************************/
int main(void)
{
clk_enable(); //使能所有時(shí)鐘
led_init(); //初始化LED
while (1)
{
led_on(); //打開(kāi)LED
delay(500); //延時(shí)
led_off(); //關(guān)閉LED
delay(500);
}
return 0;
}
- 編寫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
- 編寫鏈接文件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 = .;
}
- 把文件拷到虛擬機(jī)下面進(jìn)行編譯:
-
燒寫到SD中,SD使用的為雷龍發(fā)展提供的CS創(chuàng)世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字節(jié)(3.7 kB,3.6 KiB)已復(fù)制,0.0124712 s,295 kB/s
- 把SD卡插到開(kāi)發(fā)板上,上電,可以看到LED以0.5S的頻率在閃爍了。
審核編輯 黃宇
-
led
+關(guān)注
關(guān)注
242文章
23277瀏覽量
660869 -
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209496 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5050瀏覽量
97468 -
IMX6ULL
+關(guān)注
關(guān)注
3文章
16瀏覽量
4042
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論