首页
/
每日頭條
/
圖文
/
cortexm7是内核還是芯片
cortexm7是内核還是芯片
更新时间:2026-01-07 17:58:35

cortexm7是内核還是芯片?一般我們購買一個開發闆,廠家都會給出對應的電路圖文件,我們可以通過搜索對應名稱來查找到對應的外設對于驅動工程師來說,我們隻需要知道外設與SOC交互的一些數據線和信号線即可,接下來我們就來聊聊關于cortexm7是内核還是芯片?以下内容大家不妨參考一二希望能幫到您!

cortexm7是内核還是芯片(9.Cortex-A9LED彙編)1

cortexm7是内核還是芯片

0. 前言

一般我們購買一個開發闆,廠家都會給出對應的電路圖文件,我們可以通過搜索對應名稱來查找到對應的外設。對于驅動工程師來說,我們隻需要知道外設與SOC交互的一些數據線和信号線即可。

用主控芯片控制這些外設的一般步驟:

    看電路原理圖,弄明白主控芯片和外設是怎麼連接的,對于驅動工程師來說,主要是看外設的一些clk、數據引腳、控制引腳是如何連接的;

    外設一般都會連接到SOC的1個或者多個控制器上,比如i2c、spi、GPIO等,有的是數據線有的是信号線,中斷線等;

    根據電路連接和需求對主控芯片進行設置,往往對外設的設置都是通過寄存器操作實現;

    書寫相應代碼,實現功能,不同類型的外設,代碼結構也不盡相同,比如按鍵,我們既可以通過輪詢方式讀取按鍵信息,也可以通過中斷方式來讀取。

下面我們就以華清遠見的fs4412開發闆為例來看如何編寫led的裸機程序。 SOC exynos 4412 datahseet 下載地址自行搜索。

一、LED燈電路圖

通過後續的章節的一些常用外設的分析,相信大家會掌握如何查閱電路圖。

首先看下led電路圖:

LED電路圖

    該闆子有4個LED,是發光二極管,有電流是為藍色;

    led都接了上拉電阻;

    三極管的基極接了SOC的某個GPIO引腳;

    比如GPX1_0,當該引腳為高電平是,三極管pn結導通,于是LED3兩側就有了電勢差,LED3被點亮,如果該引腳為低電平,pn結截止,LED3兩側就沒有了電勢差,LED3熄滅。

下面是CPU核訪問GPIO控制器的數據通路:

    AHB:高速總線

    APB Bridge:APB總線橋

    APB:外設總線,低速總線

    GPIO挂載在APB總線上

由上圖可知,cpu要訪問GPIO的寄存器需要經過的路徑。

二、GPIO

GPIO(General Purpose I/O Ports)意思為通用輸入/輸出端口,通俗地說,就是一些引腳,可以通過它們輸出高低電平或者通過它們讀入引腳的狀态-是高電平或是低電平。

用戶可以通過GPIO口和硬件進行數據交互(如UART),控制硬件工作(如LED、蜂鳴器等),讀取硬件的工作狀态信号(如中斷信号)等。GPIO口的使用非常廣泛。

1. GPIO的優點

低功耗:GPIO具有更低的功率損耗(大約1µA,µC的工作電流則為100µA)。

集成I²C從機接口:GPIO内置I²C從機接口,即使在待機模式下也能夠全速工作。

小封裝:GPIO器件提供最小的封裝尺寸—3mm x 3mm QFN!

低成本:您不用為沒有使用的功能買單!

快速上市:不需要編寫額外的代碼、文檔,不需要任何維護工作!

靈活的燈光控制:内置多路高分辨率的PWM輸出。

可預先确定響應時間:縮短或确定外部事件與中斷之間的響應時間。

更好的燈光效果:匹配的電流輸出确保均勻的顯示亮度。

布線簡單:僅需使用2條I²C總線或3條SPI總線。

2. exynos4412 GPIO特性

    172 個外部中斷

    32個外部可喚醒中斷

    252個多功能 input/output ports

    在休眠模式下也可以控制GPIO引腳,但不包括 GPX0, GPX1, GPX2, and GPX3

3. 6 General Purpose Input/Output (GPIO) Control

Exynos 4412 SCP 包括304個多功能 input/output端口引腳和164 存儲端口引腳. 總共 37 個端口分組和兩個存儲端口分組.。

下圖為GPIO模塊圖:

三、如何操作GPIO?

主要通過寄存器來操作GPIO引腳。

GPxCON用于選擇引腳功能,GPxDAT用于讀/寫引腳數據;另外,GPxUP用于确定是否使用内部上拉電阻。其中x為A、B…..H、J等。

1. GPxCON寄存器

從寄存器的名字可以看出,它用于配置(Configure)-選擇引腳功能。

LED3是連接到GPX1_0,該引腳說明如下:

由上圖所示,

    GPX1CON地址為0x1100C20;

    LED3是輸出設備,所以需要将GPX1CON[3:0]設置為0x1,但是能修改其他的bite。

2. GPxDAT寄存器

GPxDAT用于讀/寫引腳;當引腳被設為輸入時,讀此寄存器可知相應引腳的電平狀态是高還是低;當引腳被設為輸出時,寫此寄存器相應位可以令此引腳輸出高電平或是低電平。

    GPX1DAT的地址是0x1100C24

    LED3對應的輸出引腳是GPX1DAT[0],點燈隻需要将該引腳設置為1即可,滅燈将bite0置0。

3. GPxUP寄存器

GPxUP:某位為1時,相應引腳無内部上拉電阻;為0時,相應引腳使用内部上拉電阻。

上拉電阻的作用在于:當GPIO引腳處于第三态(即不是輸出高電平,也不是輸出低電平,而是呈高阻态,即相當于沒接芯片)時,它的電平狀态由上拉電阻、下拉電阻确定。

本例不用設置。

四、驅動編寫

下面我們分别用彙編和C語言來給LED編寫驅動程序。

1. 彙編代碼

大家如果掌握了我之前講解的彙編指令的知識點,那麼這個代碼很容易就能看明白:

.globl_start .arm _start: LDRR0,=0x11000C20@将配置寄存器GPX1CON的地址寫入到R0 LDRR1,[R0]@讀取寄存器GPX1CON的值保存到R1 BICR1,R1,#0x0000000f@将R1的3:0位清0,目的是不覆蓋到其他bit的值 ORRR1,R1,#0x00000001@将R1的3:0位置1 STRR1,[R0]@将R1的值寫回寄存器GPX1CON loop: LDRR0,=0x11000C24@将data寄存器GPX1DAT的地址寫入到R0 LDRR1,[R0]@讀取寄存器GPX1DAT的值保存到R1 ORRR1,R1,#0x01@将R1的值bite0設置為1,即拉高,點燈 STRR1,[R0]@将R1的值寫回寄存器GPX1DAT BLdelay@調用延時函數 LDRR1,[R0] BICR1,R1,#0x01@将R1的值bite0設置為0,即拉低,滅燈 STRR1,[R0] BLdelay Bloop delay:@delay延時函數 LDRR2,=0xfffffff loop1: SUBR2,R2,#0x1 CMPR2,#0x0 BNEloop1 MOVPC,LR@返回 .end

Makefile

TARGET=gcd all: arm-none-linux-gnueabi-gcc-O0-g-c-o$(TARGET).o$(TARGET).s arm-none-linux-gnueabi-ld$(TARGET).o-Ttext0x40008000-N-o$(TARGET).elf arm-none-linux-gnueabi-objcopy-Obinary-S$(TARGET).elf$(TARGET).bin clean: rm-rf*.o*.elf*.dis*.bin

程序功能很簡單,就是讓LED3呈現一閃一閃的效果。

執行make,最終生成的gcd.bin文件。

2. c語言實現

如果要進入C語言執行環境,那麼就必須為設置棧空間,函數調用參數和返回值會壓棧。

start.s

.text .global_start _start: ldrsp,=0x70000000/*getstacktoppointer*/ bmain

main.c

/*GPX1*/ typedefstruct{ unsignedintCON; unsignedintDAT; unsignedintPUD; unsignedintDRV; }gpx1; #defineGPX1(*(volatilegpx1*)0x11000C20) voidled_init(void) { GPX1.CON=GPX1.CON&(~(0x0000000f))|0x00000001; } voidled_on(intn) { GPX1.DAT=GPX1.DAT|0x01; } voidled_off() { GPX1.DAT=GPX1.DAT&(~(0x01)); } voiddelay_ms(unsignedintnum) {inti,j; for(i=num;i>0;i--) for(j=1000;j>0;j--) ; } intmain(void) { led_init(); while(1){ led_on(); delay_ms(500); led_off(); delay_ms(500); } while(1); return0; }

map.lds

OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { .=0x40008000;;從該地址開始 .=ALIGN(4); .text:;指定代碼段 { gcd.o(.text);代碼的第一個部分,絕對不能錯 *(.text) } .=ALIGN(4); .rodata:;隻讀數據段 {*(.rodata)} .=ALIGN(4); .data:;讀寫數據段 {*(.data)} .=ALIGN(4); .bss: {*(.bss)} }

Makefile

TARGET=gcd TARGETC=main all: arm-none-eabi-gcc-O0-g-c-o$(TARGETC).o$(TARGETC).c arm-none-eabi-gcc-O0-g-c-o$(TARGET).o$(TARGET).s arm-none-eabi-gcc-O0-g-S-o$(TARGETC).s$(TARGETC).c arm-none-eabi-ld$(TARGETC).o$(TARGET).o-Tmap.lds-o$(TARGET).elf arm-none-eabi-objcopy-Obinary-S$(TARGET).elf$(TARGET).bin clean: rm-rf*.o*.elf*.dis*.bin

執行make命令,最終生成的gcd.bin文件。

這段代碼中,讀者可能不能理解的是下面的定義:

typedefstruct{ unsignedintCON; unsignedintDAT; unsignedintPUD; unsignedintDRV; }gpx1; #defineGPX1(*(volatilegpx1*)0x11000C20)

由上圖所示:

    (volatile gpx1 *)0x11000C20 ) :将常量0x11000C20 強轉成struct gpx1類型指針

    (* (volatile gpx1 *)0x11000C20 ):查找指針對應的内存驅動,即對應整個結構體變量,結構體變量地址為0x11000C20

    #define GPX1 (* (volatile gpx1 *)0x11000C20 ) :GPX1等價于地址為0x11000C20的結構體變量

這樣我們要想操作GPX1的寄存器,就可以像結構體變量一樣操作即可。

3. 測試

采用UBOOT自帶的命令loadb,通過串口以baud速率下載binary(.bin)至SDRAM中某一地址中,然後用go 命令從某地址處開始執行程序。

該命令使用了kermit protocol,嵌入式系統通常使用該協議與pc傳送文件。

操作步驟如下:

    串口連接開發闆,開發闆啟動後在讀秒階段,立即按下回車,進入uboot命令界面

    執行loadb 40008000 【該地址與Makefile 和map.lds文件中的地址保持一緻】

    選擇菜單transfer->send Kermit,

    然後選擇我們編譯好的gcd.bin文件,

    點擊OK,出現"Staring kermit transfer."字樣,

    執行 go 40008000,運行程序

執行結果:

可以看到LED閃爍的現象。

5. 注意

該種測試方法需要bootloader選用uboot,并且需要串口工具支持Kermit協議,一口君使用的是SecureCRT7.3.3版本【其他低一些的版本可能不支持該協議】,該軟件的下載和安裝方法【安裝方法有點繁瑣】可以加我好友 後台回複【SecureCRT】。

SecureCRT版本

Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
kpl夏季賽賽程ag回放(KPL春季預選賽賽程公布)
kpl夏季賽賽程ag回放(KPL春季預選賽賽程公布)
  2019年的KPL春季賽預選賽較以往開動得更早一些,秋季常規賽還沒結束,新一輪預選賽就将要開啟。9支隊伍争奪一個晉級明年春季賽的名額,可以說是相當激烈。除了玩家和觀衆所熟悉的AG超玩會二隊SG和WFD,其他都是新隊伍。      這次預選賽的機制和往年相比也有所改變,參與隊伍都是來此次級聯賽,沒有降級戰隊,最後的晉級名額也隻有一個。9争1,戰鬥相當慘烈。...
2026-01-07
三伏貼主要夏天什麼時候貼(夏季三伏貼火了)
三伏貼主要夏天什麼時候貼(夏季三伏貼火了)
  三伏貼,又名天灸,是一種傳統中醫的治療方法,源自于清朝。它結合針灸、經絡與中藥學,在夏季三伏天,以中藥直接貼敷于穴位,經由中藥對穴位産生微面積化學性、熱性刺激,達到治病、防病的效果。      什麼是冬病?   冬病就是在冬季易發作、常發作的疾病或不适。表現在:呼吸系統、消化系統、生殖系統、骨關節系統。   具體來說“冬病”的易發人群多為虛寒性體質,也就...
2026-01-07
乸粵語讀la還是na(這兩個字如何讀)
乸粵語讀la還是na(這兩個字如何讀)
     我們國家所使用的漢字可以說是世界上曆史最悠久的文字之一,同時也是唯一一個從古至今一直傳承下來的文字。他的出現可以說對推動整個東亞地區的文化發展都起到了極大的作用,像日本,韓國等附近一些國家的文字都是從漢字演變出來的。   而正是因為漢字廣泛的地區傳播性以及悠久的曆史造成了他所産生的字數達到了一個十分驚人的地步,僅僅是現在已經發現的漢字都已經達到了1...
2026-01-07
lol德雲色比賽(天不怕地不怕的德雲色)
lol德雲色比賽(天不怕地不怕的德雲色)
  就像DOTA2玩家都喜歡看yyf領銜的OB戰隊直播一樣,在LOL這邊也有一個民間團體深受英雄聯盟玩家喜愛,那就是德雲色,它是由笑笑,西卡為核心組建而成的,近日德雲色由于直播的時候聲音太大,被鄰居大爺投訴了,被迫搬家,此前的房子也進入了轉租狀态,并且因為他們住過之後的髒亂差被中介diss,在玩家中引起了熱議,那麼德雲色要如何化解這場輿論危機呢?      ...
2026-01-07
兼職鑽石畫靠譜嗎(朋友圈最大兼職騙局)
兼職鑽石畫靠譜嗎(朋友圈最大兼職騙局)
  如今很多人都能在視頻軟件看到這樣貼鑽石畫的小視頻,并且很多都是招人一起貼拿工錢。      圖源網絡   這種情況就會吸引很多在家帶孩子的寶媽和學生黨的注意,看起來操作非常簡單,大家都希望在空閑之餘掙錢。下面我們一起看一下此騙局的真實内幕!   首先利用網絡全方面推廣,比如拍視頻,發布到兼職王者,甚至購物軟件和搜索軟件。通過各方信息你可以加上他們的好友,...
2026-01-07
Copyright 2023-2026 - www.tftnews.com All Rights Reserved