目錄前言
一、目的
二、原理
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...