0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

IMX6ULL正點(diǎn)原子開(kāi)發(fā)板LED驅(qū)動(dòng)

華仔的編程隨筆 ? 來(lái)源:華仔的編程隨筆 ? 作者:華仔的編程隨筆 ? 2023-05-02 15:22 ? 次閱讀

硬件

【正點(diǎn)原子阿爾法 IMX6ULL Linux開(kāi)發(fā)板】

目的

學(xué)習(xí)使用C語(yǔ)言點(diǎn)亮開(kāi)發(fā)板上的LED

步驟

  1. 在ALPHA工作目錄下面新建led_c文件夾,用于本次學(xué)習(xí)開(kāi)發(fā)的工作目錄

    image.png

  2. 用vscode打開(kāi)此文件夾:

    image.png

  3. 在文件夾下新建start.S、main.c、main.h三個(gè)文件

    image.png

  4. 編寫匯編代碼部分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)了。

  1. 編寫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ù)字就是基地址。

  1. 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; 
}
  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. 把文件拷到虛擬機(jī)下面進(jìn)行編譯:

image.png

  1. 燒寫到SD中,SD使用的為雷龍發(fā)展提供的CS創(chuàng)世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字節(jié)(3.7 kB,3.6 KiB)已復(fù)制,0.0124712 s,295 kB/s
  1. 把SD卡插到開(kāi)發(fā)板上,上電,可以看到LED以0.5S的頻率在閃爍了。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led
    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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何將u-boot.2022.10版本移植到imx6ull開(kāi)發(fā)板

    今天給大家講一講如何將u-boot.2022.10版本移植到imx6ull開(kāi)發(fā)板上。
    發(fā)表于 07-12 14:57 ?1393次閱讀
    如何將u-boot.2022.10版本移植到<b class='flag-5'>imx6ull</b><b class='flag-5'>開(kāi)發(fā)板</b>

    正點(diǎn)原子阿爾法開(kāi)發(fā)板免費(fèi)試用免費(fèi)試用連載】使用正點(diǎn)原子alpha開(kāi)發(fā)板實(shí)現(xiàn)多通信接口工業(yè)無(wú)線終端

    項(xiàng)目名稱:使用正點(diǎn)原子alpha開(kāi)發(fā)板實(shí)現(xiàn)多通信接口工業(yè)無(wú)線終端試用計(jì)劃:申請(qǐng) 正點(diǎn)原子alpha開(kāi)發(fā)板
    發(fā)表于 06-05 14:54

    如何實(shí)現(xiàn)飛凌iMX6ULL開(kāi)發(fā)板系統(tǒng)的燒寫

    本文以飛凌嵌入式OKMX6ULL-S開(kāi)發(fā)板為基礎(chǔ)講解,本文分為三個(gè)部分,主要講解了iMX6ULL SD卡燒寫系統(tǒng)及OTG燒寫系統(tǒng)的以及單步更新內(nèi)核的步驟。通過(guò)本文您可以快速實(shí)現(xiàn)飛凌iMX6UL
    發(fā)表于 12-22 06:23

    iMX6ULL開(kāi)發(fā)板如何配置AP熱點(diǎn)

    迅為-iMX6ULL開(kāi)發(fā)板上配置AP熱點(diǎn)
    發(fā)表于 12-29 06:33

    iMX6ULL開(kāi)發(fā)板的移植和測(cè)試介紹

    iMX6ULL開(kāi)發(fā)板的移植和測(cè)試
    發(fā)表于 12-29 07:55

    IMX6ULL開(kāi)發(fā)板使用前裝配流程

    IMX6ULL開(kāi)發(fā)板【終極者】開(kāi)發(fā)板使用前裝配流程
    發(fā)表于 12-30 07:23

    迅為IMX6ULL開(kāi)發(fā)板的特點(diǎn)

    迅為IMX6ULL開(kāi)發(fā)板有哪些特點(diǎn)
    發(fā)表于 01-12 06:33

    imx6ull開(kāi)發(fā)板是什么

    一、前言阿爾法imx6ull開(kāi)發(fā)板正點(diǎn)原子與2019年10月發(fā)布的一款Linux開(kāi)發(fā)板,其主控使用恩智浦公司的
    發(fā)表于 07-23 09:39

    使用openocd調(diào)試imx6ull的過(guò)程分享

    一、前言目前很多人開(kāi)發(fā)imx6ull基本的組合是uboot+linux,以開(kāi)發(fā)應(yīng)用層軟件的居多(此時(shí)可以直接在開(kāi)發(fā)板運(yùn)行g(shù)db工具鏈調(diào)試APP);其次是
    發(fā)表于 04-18 09:44

    iMX6ULL開(kāi)發(fā)板WIFI功能測(cè)試(三)

    注意:若 飛凌iMX6ULL 開(kāi)發(fā)板上焊接的是8723 b u,使用lsmod會(huì)顯示8723 b u
    發(fā)表于 04-29 15:10 ?1681次閱讀
    <b class='flag-5'>iMX6ULL</b><b class='flag-5'>開(kāi)發(fā)板</b>WIFI功能測(cè)試(三)

    NXP iMX6ULL開(kāi)發(fā)板的WIFI接口功能測(cè)試

    iMX6ULL開(kāi)發(fā)板上電,啟動(dòng)Linux系統(tǒng)。 步驟2: 連接USB?WIFI到飛凌iMX6ULL開(kāi)發(fā)板的USB Host接口 步驟 3 : 按照如下格式輸入相應(yīng)的參數(shù):? ? -
    的頭像 發(fā)表于 05-05 17:02 ?2429次閱讀

    匯編驅(qū)動(dòng)IMX6ULL LED

    用匯編編寫正點(diǎn)原子Linux開(kāi)發(fā)板Led驅(qū)動(dòng)
    的頭像 發(fā)表于 05-01 09:19 ?25.9w次閱讀
    匯編<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>IMX6ULL</b> <b class='flag-5'>LED</b>燈

    i.MX6ULL開(kāi)發(fā)板源碼編譯

    開(kāi)發(fā)板是武漢芯路遙科技有限公司與武漢萬(wàn)象奧科電子有限公司合作推出的一款開(kāi)發(fā)板。此開(kāi)發(fā)板基于 NXP iMX6ULL 系列 Cortex-A7 高性能處理器設(shè)計(jì),適用于
    的頭像 發(fā)表于 12-16 15:56 ?843次閱讀
    i.MX<b class='flag-5'>6ULL</b><b class='flag-5'>開(kāi)發(fā)板</b>源碼編譯

    iMX6ULL動(dòng)態(tài)評(píng)測(cè)-老將新甲 29*40mm的iMX6ULL 夠小

    iMX6ULL核心尺寸僅29*40mm,采用NXP iMX6ULL低功耗處理器設(shè)計(jì),小尺寸,高性能應(yīng)用領(lǐng)域更加廣泛
    的頭像 發(fā)表于 05-05 11:58 ?2458次閱讀
    <b class='flag-5'>iMX6ULL</b>動(dòng)態(tài)評(píng)測(cè)-老將新甲 29*40mm的<b class='flag-5'>iMX6ULL</b> 夠小

    IMX6ULL開(kāi)發(fā)板

    i. MX6ULL 開(kāi)發(fā)板板載資源豐富,核心通過(guò)郵票孔將 i.MX6ULL 的所有資源幾乎全部引出,接口豐富,可以滿足各種應(yīng)用的需求。核心
    發(fā)表于 11-12 15:41 ?26次下載