Linux嵌入式學習第二節 C語言版本點亮LED燈

2021-10-09 18:28:44 字數 3058 閱讀 6952

目錄前言

一、目的

二、原理

1.硬體分析

2.c語言環境

(1)設定使用者模式

(2)邏輯運算指令

(3)編寫c語言gpio配置** 總結

開發板:正點原子阿爾法開發板(i.mx6ull)

環境:ubuntu 20.04 (lts)  (核心版本:linux 5.4.0)

交叉編譯器:arm-linux-gnueabihf 4.9.4

搭建c語言環境

通過c語言程式設計點亮led

同第一節「linux嵌入式學習第一節:彙編點亮led燈」中「硬體電路分析」小節。

我們選擇svc特權模式。據本人查詢資料得知,一般晶元上電後會預設進入此模式(未測試)。

每種模式對應一組暫存器。如下圖

cpsr暫存器定義如下

這裡我們本節用到的是[4:0]低5位。相應功能如下:

我們要進入的是svc模式,所以需要將cpsr暫存器的[4:0]設定為:10011(bin)即13(hex)。但是值得注意的是,除了前5位,剩下的位也是有功能的,比如設定指令集、大小端模式之類、現在還用不到且不知道怎麼設定的情況下怎麼辦呢?所以我們不能像上一節設定時鐘使能那樣簡單粗暴的全部寫1開啟。這時候就需要我們學會arm彙編中的邏輯運算指令了。還好arm指令中有非常方便的清除位和寫位的邏輯運算指令。

如圖所示。本次我們需要清除cpsr的[4:0]位,所以我們首先需要使用位清除指令:bic rd,rn ,#immed。根據相應計算公式,我們可以知道rd是我們需要清除相應位的目標暫存器,即cpsr暫存器,rn和~rm相與。然後再將0x13寫到cpsr的[4:0]低5位。然後設定sp指標位置為0x80200000(imx.6u的ddr3位址為0x80000000向上擴充,而cortex-a7的堆疊向下增長。這裡我們設定為0x80200000已經有2mb大小的棧空間)。最後我們將**指向c檔案的主函式main就可以了。

.global start

__start:

mrs r0, cpsr @讀cpsr到r0

bic r0, r0, #0x1f @清除位[4:0]

orr r0, r0, #0x13 @將0x13寫入低5位[4:0]

msr cpsr, r0 @寫入cpsr暫存器

ldr sp, =0x80200000 @設定sp指標(棧指標)

b main @指向main函式

編寫c語言點亮led登的思路和彙編是一樣的。

檔案1:main.h

#ifndef __main_h

#define __main_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_gpio1_io03 *((volatile unsigned int *) 0x020e0068)

#define sw_pad_gpio1_io03 *((volatile unsigned int *) 0x020e02f4)

#define gpio1_gdir *((volatile unsigned int *) 0x0209c004)

#define gpio1_dr *((volatile unsigned int *) 0x0209c000)

#endif

然後是主函式檔案,對相關暫存器進行配置。(配置內容與第一節一致,只不過這裡用c來寫)

檔案2:main.c

#include "main.h"

void clk_init(void)

void led_init(void)

void led_off(void)

void led_on(void)

void delay_ms(volatile unsigned int n)

int main(void)

return 0;

}

用c語言進行點亮led燈的思路與彙編版本基本一致,不同之處是需要先將函式入口導向main。

在我的理解中,在嵌入式開發(包括其他開發)中,無論是c語言還是彙編都只是乙個工具,採用什麼語言、什麼工具並不重要,怎麼去實現目標,具體的過程和邏輯才是最重要的。選擇更好的工具,搭建環境是為了讓我們更加方便的開發,沒有核心,其他什麼東西都是徒有其表。

python學習第二節

1.直接執行.py檔案和進入python互動模式有什麼不同 輸入python進入python直譯器相當於輸入一行執行一行,直接執行.py檔案相當於直接輸出最後結果,不看中間是如何執行的 2.python的迴圈有兩種,一種是for in,一次遍歷元素,for x in 迴圈就是把每個元素代入變數x,然...

python學習 第二節

鏈式賦值a b 1 系列解包賦值a,b 1,2 注 系列解包賦值可實現變數值得交換 a,b 1,2 a,b b,a a 2,b 1 常量 python中不存在常量,只是約定常量命名規則 1.整型int int 實現其他型別轉換到int python3整數取值可以是任意範圍 2.浮點型float 用科...

嵌入式學習(二) 嵌入式系統C 語言

1 從 cpu 復位時的指定位址開始執行 2 跳轉至彙編 startup 處執行 3 跳轉至使用者主程式 main 執行,在 main 中完成 a.初試化各硬體裝置 b.初始化各軟體模組 c.進入死迴圈 無限迴圈 d呼叫各模組的處理函式 下面是幾個 著名 的死迴圈 1 作業系統是死迴圈 2 win3...