国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令

這篇具有很好參考價(jià)值的文章主要介紹了【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??作者:一只大喵咪1201
??專欄:《理解ARM架構(gòu)》
??格言:你只管努力,剩下的交給時(shí)間!
【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide

??操作寄存器實(shí)現(xiàn)UART

??UART原理

UART的全稱是Universal Asynchronous Receiver and Transmitter,即異步發(fā)送和接收。
串口在嵌入式中用途非常的廣泛,主要的用途有:

  • 打印調(diào)試信息;
  • 外接各種模塊:GPS、藍(lán)牙;

串口因?yàn)榻Y(jié)構(gòu)簡單、穩(wěn)定可靠,廣受歡迎。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示,串口通信只需要三根線,發(fā)送(TXD)、接收(RXD)、地線(GND)。

  • 通信雙方的TXD與對方的RXD相連。

串口發(fā)送數(shù)據(jù)是以幀格式一幀一幀來發(fā)的,幀格式由1bit起始位,8或9bit數(shù)據(jù)位,1或1.5或2bit校驗(yàn)位,1bit停止位組成。

  • 通常情況下都使用8bit數(shù)據(jù)位,不適用校驗(yàn)位,這樣的一幀數(shù)據(jù)有10個(gè)bit。

校驗(yàn)位又叫奇偶校驗(yàn)位,如果8個(gè)數(shù)據(jù)位加校驗(yàn)位中比特為位1的個(gè)數(shù)是奇數(shù),校驗(yàn)位就是1,否則就是0。

由于現(xiàn)在電子技術(shù)的逐漸成熟,串口通信很少出錯(cuò),所以校驗(yàn)位使用的不多。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示是一幀數(shù)據(jù)傳送時(shí)的邏輯電平示意圖。

  • 發(fā)送方將自己的TXD線從高電平拉到低電平,保持一段時(shí)間,接收方讀取到自己的RXD線由高到底以后就知道要接收數(shù)據(jù)了。
  • 發(fā)送方按照自己發(fā)送的這個(gè)字節(jié),從低位開始,改變TXD線的電平,每改變一次保持一段時(shí)間,如此反復(fù)8次完成一字節(jié)數(shù)據(jù)的發(fā)送。
  • 接收方在自己RXD線上的電平保持期間的中間時(shí)刻,根據(jù)電平狀態(tài)記錄該比特位的值,最后組合成一字節(jié)數(shù)據(jù)。
  • 發(fā)送方將一字節(jié)數(shù)據(jù)發(fā)送完畢后,將自己的TXD線拉高方便下次發(fā)送數(shù)據(jù),接收方在接收到8bit數(shù)據(jù)以后,并且檢測到自己RXD線是高電平,就知道這一幀數(shù)據(jù)傳送完畢了。

上面描述數(shù)據(jù)發(fā)送過程中電平維持的時(shí)間,就是根據(jù)波特率來確定的,一般選波特率都會(huì)有9600,19200,115200等選項(xiàng)。

  • 波特率:可以簡單理解為,串口通信過程中1秒鐘能發(fā)送的比特位個(gè)數(shù)。
  • 波特率是通信雙方約定好的,一個(gè)按照這個(gè)速度發(fā)送數(shù)據(jù),另一個(gè)按照這個(gè)速度接收數(shù)據(jù)。

邏輯電平:

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide

如上圖所示是本喵使用的ARM開發(fā)板串口發(fā)出的電平信號(hào),在xV至5V之間,就認(rèn)為是邏輯1,在0V至yV之間就為邏輯0,這叫做TTL/CMOS邏輯電平

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示是RS-232邏輯電平,在-12V至-3V之間,就認(rèn)為是邏輯1,在+3V至+12V之間就為邏輯0,RS-232的電平比TTL/CMOS高,能傳輸更遠(yuǎn)的距離,在工業(yè)上用得比較多。

可以看到,RS-232與TTL/CMOS相同邏輯電平對應(yīng)的真實(shí)電壓正負(fù)是相反的。


【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示,ARM芯片上的串口都是TTL電平的,通過板子上或者外接的電平轉(zhuǎn)換芯片,轉(zhuǎn)成RS232接口,連接到電腦的RS232串口上,實(shí)現(xiàn)兩者的數(shù)據(jù)傳輸。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示,現(xiàn)在的電腦越來越少有RS232串口的接口,但USB是幾乎都有的。因此使用USB串口芯片將ARM芯片上的TTL電平轉(zhuǎn)換成USB串口協(xié)議,即可通過USB與電腦數(shù)據(jù)傳輸。

  • 無論那種接口,板子上的芯片IO口輸出的都是TTL/CMOS電平,我們在寫程序時(shí)僅需要關(guān)心輸出的邏輯電平即可。

??編程

一款A(yù)RM芯片上會(huì)有多個(gè)USART串口,一般UART1用來輸出調(diào)試信息,這里本喵也使用USART1。

確定引腳:

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖,本喵使用的STMF103ZET6芯片上,USART1的USART1_RX、USART1_TX,接到了PA10、PA9。

將引腳配置為UART功能:

  • 使能GPIOA/USART1模塊

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖是,RCC_APB2ENR寄存器,GPIOA模塊、USART1模塊的使能都是在這一個(gè)寄存器里實(shí)現(xiàn)。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖,從芯片手冊中查看Reset and clock control RCC寄存器的基地址是0x40021000,再根據(jù)RCC_APB2ENR的偏移地址0x18得到該寄存器的絕對地址是0x40021000 + 0x18。

將該寄存器的bit2和bit14寫一,此時(shí)就使能了GPIOA和USART1模塊。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide

  • 配置引腳功能

從上面的芯片原理圖可以知道,PA9、PA10有三種功能:GPIO、USART1、TIMER1,所以這里要將其配置為USAT1功能。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示GPIOx_CRH寄存器,該寄存器的絕對地址是0x40010800 + 0x04,PA9配置為輸出,所以將MODE9代表的bit4和bit5配置成01,將CNF9代表的bit6和bit7配置為10

PA10配置為輸入,將MODE10代表的bit8和bit9配置為00,再將CNF10代表的bit10和bit11配置成01。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide

由于這里僅使能了USART1,沒有使能定時(shí)器,所以PA9和PA10的默認(rèn)復(fù)用功能就是USART1,使用默認(rèn)值即可。

設(shè)置串口參數(shù):

  • 設(shè)置波特率

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示是波特率的計(jì)算公式,USARTDIV由整數(shù)部分、小數(shù)部分組成,USARTDIV = DIV_Mantissa + (DIV_Fraction / 16) 。fck是內(nèi)部時(shí)鐘頻率,這里就使用默認(rèn)值,是8MHZ。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖USART_BRR寄存器,DIV_Mantissa表示整數(shù)部分,占用該寄存器的bit4~bit15,DIV_Fraction表示小數(shù)部分,占用該寄存器的bit0~bit3。

以常用的波特率115200為例,來計(jì)算該寄存器的值:

設(shè)置波特率
	 * 115200 = 8000000/16/USARTDIV
	 * USARTDIV = 4.34
	 * DIV_Mantissa = 4
	 * DIV_Fraction / 16 = 0.34
	 * DIV_Fraction = 16*0.34 = 5

所以給USART_BRR寄存器的bit4~bit15賦值4,bit0~bit3賦值5,根據(jù)這兩個(gè)值再來倒推一下真實(shí)的波特率:

真實(shí)波特率:
	 * DIV_Fraction / 16 = 5/16=0.3125
	 * USARTDIV = DIV_Mantissa + DIV_Fraction / 16 = 4.3125
	 * baudrate = 8000000/16/4.3125 = 115942

可以看到,雖然和115200有點(diǎn)差距,但是并不影響。

  • 設(shè)置數(shù)據(jù)格式

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示USART1_CR1寄存器,本喵將幀格式設(shè)置為1個(gè)起始位,8個(gè)數(shù)據(jù)位,無校驗(yàn)位,1個(gè)停止位,所以將bit13設(shè)置1,bit12設(shè)置為0,bit10設(shè)置為0,bit3設(shè)置為1,bit2設(shè)置為1。

但是此時(shí)并沒有設(shè)置幾個(gè)停止位,還需要設(shè)置另一個(gè)寄存器:

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示USART_CR2寄存器,將bit12~bit13設(shè)置為00,表示1個(gè)停止位。

根據(jù)狀態(tài)寄存器讀寫數(shù)據(jù):

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示串口模塊結(jié)構(gòu)圖,發(fā)送有一個(gè)發(fā)送數(shù)據(jù)寄存器和發(fā)送移位寄存器,接收有一個(gè)接收數(shù)據(jù)寄存器和接收移位寄存器。

發(fā)送數(shù)據(jù)時(shí),CPU將數(shù)據(jù)寫入到發(fā)送數(shù)據(jù)寄存器,然后由發(fā)送移位寄存器一位一位將數(shù)據(jù)通過TXD線發(fā)送出去。

接收數(shù)據(jù)時(shí),RXD線上的數(shù)據(jù)一位一位放入接收移位寄存器,該寄存器接收完畢后將整個(gè)字節(jié)數(shù)據(jù)放入到接收數(shù)據(jù)寄存器,CPU從接收數(shù)據(jù)寄存器中可以直接讀取數(shù)據(jù)。

  • 狀態(tài)寄存器

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示USART_SR狀態(tài)寄存器,TXE表示發(fā)送數(shù)據(jù)寄存器是否為空,該位并不能說明數(shù)據(jù)已經(jīng)發(fā)送完了,因?yàn)檎嬲l(fā)送數(shù)據(jù)的是移位寄存器,只能說發(fā)送數(shù)據(jù)寄存器將數(shù)據(jù)給了移位寄存器,CPU可以再向數(shù)據(jù)寄存器中寫數(shù)據(jù)了。

TC表示發(fā)送數(shù)據(jù)完成,即發(fā)送數(shù)據(jù)寄存器和移位寄存器中的數(shù)據(jù)都發(fā)送完畢了。RXNE表示接收數(shù)據(jù)寄存器中有數(shù)據(jù)了,說明已經(jīng)接收到了數(shù)據(jù),CPU可以來讀取了。

  • 數(shù)據(jù)寄存器

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示USART_DR寄存器,寫、讀這個(gè)寄存器,就可以發(fā)送、讀取串口數(shù)據(jù)。


在配置完引腳和功能選擇以后,本喵在介紹USART_XXX寄存器的時(shí)候并沒有說它的地址,因?yàn)闊o論是設(shè)置波特率的USART_BRR,還是設(shè)置數(shù)據(jù)格式的USART_CR1,再或者狀態(tài)寄存器USART_SR,以及數(shù)據(jù)寄存器USART_DR這些都是以USART為基地址的。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示USART1的基地址是0x40013800,上面本喵提到的這些寄存器都是在這個(gè)基地址的基礎(chǔ)上進(jìn)行偏移,也就是說它們都屬于USART1模塊中的寄存器。

typedef unsigned int uint32_t;
typedef struct
{
  volatile uint32_t SR;    /*!< USART Status register, Address offset: 0x00 */
  volatile uint32_t DR;    /*!< USART Data register,   Address offset: 0x04 */
  volatile uint32_t BRR;   /*!< USART Baud rate register, Address offset: 0x08 */
  volatile uint32_t CR1;   /*!< USART Control register 1, Address offset: 0x0C */
  volatile uint32_t CR2;   /*!< USART Control register 2, Address offset: 0x10 */
  volatile uint32_t CR3;   /*!< USART Control register 3, Address offset: 0x14 */
  volatile uint32_t GTPR;  /*!< USART Guard time and prescaler register, Address offset: 0x18 */
} USART_TypeDef;

如上面代碼所示,用一個(gè)結(jié)構(gòu)體來表示USART模塊,里面的成員變量表示各個(gè)寄存器,讓它們在結(jié)構(gòu)體中的偏移量和寄存器相對于USART模塊的偏移量相對應(yīng),此時(shí)就可以通過訪問這個(gè)結(jié)構(gòu)體訪問到各個(gè)寄存器。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示是整個(gè)串口的初始化代碼,其中配置波特率等參數(shù)使用的是結(jié)構(gòu)體訪問的寄存器,串口結(jié)構(gòu)體是一個(gè)局部變量。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示,定義發(fā)送一個(gè)字符和接收一個(gè)字符的函數(shù),通過判斷狀態(tài)寄存器的值,進(jìn)而讀寫DR寄存器,也是通過結(jié)構(gòu)體訪問的寄存器,結(jié)構(gòu)體是一個(gè)局部變量。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖,此時(shí)將程序燒錄到開發(fā)板以后,會(huì)通過串口發(fā)送Hello字符串,在PC端發(fā)送一個(gè)字符,板子接收到以后返回該字符及下一個(gè)字符,此時(shí)我們的串口是配置好了。

問題:為什么每個(gè)函數(shù)中都得創(chuàng)建一個(gè)uart1結(jié)構(gòu)體局部變量,而不是創(chuàng)建全局變量供這些函數(shù)使用呢?

??段的概念

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示,增加三個(gè)函數(shù),用來打印字符串及變量的地址。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示,創(chuàng)建四個(gè)全局變量,g_ConstChar被const修飾,然后在mymain中分別打印四個(gè)變量的地址及它們的值。

將程序編譯后燒錄到開發(fā)板中,通過串口工具來觀察輸出的內(nèi)容。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示,來看這四個(gè)變量的地址,只有g_ConstChar這個(gè)被const修飾的變量地址是位于Flash中的,其他幾個(gè)變量都是位于RAM中。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖,keil中只能了Flash和RAM的起始地址,根據(jù)這兩個(gè)參數(shù)很容易判斷出這四個(gè)變量所處的位置。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖,再來看輸出的這四個(gè)變量的值,可以看到,只有const修飾的g_ConstChar變量輸出了B,其他幾個(gè)變量都沒有輸出對應(yīng)的則,而是奇怪的東西。

  • 其他變量輸出的奇怪值表明,這幾個(gè)變量地址處的值是亂碼。

g_ConstChar變量位于Flash,也就是ROM,ROM是只讀的,不能寫,而其他三個(gè)變量位于RAM,RAM是可讀可寫的。

在編譯的時(shí)候,編譯器進(jìn)行了判斷處理,g_ConstChar是只讀的,不會(huì)寫,所以把它放在Flash就可以。

  • Flash上存放這種只讀數(shù)據(jù)的區(qū)域叫做只讀數(shù)據(jù)段。

其他三個(gè)變量會(huì)進(jìn)行讀和寫的操作,所以編譯器給了它們一個(gè)鏈接地址,這個(gè)地址對應(yīng)在RAM上,方便CPU進(jìn)行讀寫。

  • RAM上存放這種可讀可寫全局變量的區(qū)域叫做可讀可寫數(shù)據(jù)段。

無論有沒有被const修飾的變量,它們都有初始值A或者B,這個(gè)兩個(gè)數(shù)值是不會(huì)變的,只是用來使用的,所以編譯器將這兩個(gè)值放在這兩個(gè)變量位于Flash上的地址處(加載地址)。

  • 有幾個(gè)有初始值的全局變量,F(xiàn)lash中就會(huì)保存幾個(gè)初始值。
  • Flash以及內(nèi)存中并沒有變量名,只會(huì)在變量的地址處直接存放數(shù)值。

char g_A = 0這種初始值為0的全局變量,以及char g_B這種沒有初始值的全局變量,F(xiàn)lash上就沒有必要存放它們的初始值。

假設(shè)初始值為0的變量有一萬個(gè),F(xiàn)lash中難道要存放1萬個(gè)0嗎?肯定不會(huì)的,這樣浪費(fèi)內(nèi)存不說,還沒有任何意義。對于沒有初始值的全局變量Flash中更不會(huì)存放它的初始值了。

所以編譯器在編譯的時(shí)候,直接給這種初始值為0或者沒有初始值的全局變量分配一個(gè)鏈接地址,位于RAM中,CPU直接去鏈接地址讀寫就可以了。

  • 這種存放初始值為0或者沒有初始值所在的RAM區(qū)域被叫做BSS段或者ZI段。

我們寫的代碼經(jīng)過編譯鏈接以后,會(huì)生成一個(gè)二進(jìn)制可執(zhí)行文件,里面全部都是機(jī)器碼,這部分代碼并不會(huì)改變,所以也存放到Flash上。

  • 存放代碼的Flash區(qū)域被叫做代碼段。

至于棧以及堆本喵在前面的文章中就詳細(xì)講解過,這里就不再說了,有興趣的小伙伴可以移步單片機(jī)中的C語言。

所以,程序分為這幾個(gè)段:

  • 代碼段(RO-CODE):就是程序本身,不會(huì)被修改
  • 可讀可寫的數(shù)據(jù)段(RW-DATA):有初始值的全局變量、靜態(tài)變量,需要從ROM上復(fù)制到內(nèi)存
  • 只讀的數(shù)據(jù)段(RO-DATA):可以放在ROM上,不需要復(fù)制到內(nèi)存
  • BSS段或ZI段:
    • 初始值為0的全局變量或靜態(tài)變量,沒必要放在ROM上,使用之前清零就可以
    • 未初始化的全局變量或靜態(tài)變量,沒必要放在ROM上,使用之前清零就可以
  • 局部變量:保存在棧中,運(yùn)行時(shí)生成
  • 堆:一塊空閑空間,使用malloc函數(shù)來管理它,malloc函數(shù)可以自己寫

??IDE背后的命令

IDE指集成開發(fā)環(huán)境(Integrated Development Environment)。我們開發(fā)STM32F103等單片機(jī)程序時(shí)使用是keil5就是一種IDE。

使用IDE,很容易操作,點(diǎn)點(diǎn)鼠標(biāo)就可完成,添加文件,指定文件路徑(頭文件路徑、庫文件路徑),指定鏈接庫,編譯、鏈接,下載、調(diào)試等功能。

其實(shí)在我們點(diǎn)下某一個(gè)按鈕以后,IDE的背后會(huì)執(zhí)行一系列指令:

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖,在keil5的Output選擇中勾選Create Batch File,然后重新全部編譯。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖,此時(shí)在當(dāng)前工程的Objects目錄下會(huì)多出上面紅色框中的四個(gè)文件。

【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令,理解ARM架構(gòu),arm開發(fā),架構(gòu),ide
如上圖所示分別是這幾個(gè)文件中的內(nèi)容,都是一系列的命令行指令,用來編譯和鏈接文件的指令,具體怎么用不用管,只需要知道有這些東西。

  • start._ia中的命令行就是在讓start.s匯編文件編譯成start.o目標(biāo)文件。
  • main._i中的命令行就是在讓main,c源文件編譯成main.o目標(biāo)文件。
  • uart._i中的命令行就是在讓uart.c源文件編譯成uart.o目標(biāo)文件。
  • led.linp中的命令行就是把這幾個(gè).o目標(biāo)文件鏈接在一起形成一個(gè)二進(jìn)制可執(zhí)行文件led.axf,我們燒錄的就是這個(gè)文件。

當(dāng)我們點(diǎn)下IDE上的編譯選項(xiàng)時(shí),IDE會(huì)自動(dòng)執(zhí)行上面四個(gè)文件中的內(nèi)容,最后生成我們需要的東西。

??總結(jié)

雖然配置串口已經(jīng)是一個(gè)老生常談的問題了,但是相信大家很少直接使用寄存器地址來配置吧,這個(gè)過程中可以加深對ARM架構(gòu)的理解。

串口配好后通過打印數(shù)據(jù)過程中出現(xiàn)的問題介紹了段的概念,編譯器不同類型的變量放在內(nèi)存中不同的位置。

要意識(shí)到,編譯一個(gè)工程的背后沒有那么簡單。文章來源地址http://www.zghlxwxcb.cn/news/detail-754619.html

到了這里,關(guān)于【理解ARM架構(gòu)】操作寄存器實(shí)現(xiàn)UART | 段的概念 | IDE背后的命令的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [C#] .NET8增加了Arm架構(gòu)的多寄存器的查表函數(shù)(VectorTableLookup/VectorTableLookupExtension)

    作者: zyl910 發(fā)現(xiàn).NET8增加了Arm架構(gòu)的多寄存器的查表函數(shù)(VectorTableLookup/VectorTableLookupExtension),這給編寫SIMD向量化算法帶來了方便。 在學(xué)習(xí)Arm的AdvSimd(Neon)指令集時(shí),發(fā)現(xiàn)它的Lookup(查表)功能,類似X86的Sse系列指令集中的字節(jié)Shuffle(換位。如 _mm_shuffle_epi8 )功能。 而

    2024年03月24日
    瀏覽(16)
  • 【ARM 嵌入式 C 入門及漸進(jìn) 12 --寄存器位清0和置位函數(shù)實(shí)現(xiàn)】

    在 C 語言中,可以使用宏定義來創(chuàng)建用于清除(清零)或設(shè)置(置一)32位地址中特定位的函數(shù)。以下是兩個(gè)宏定義的示例: 這里的 addr 是指向目標(biāo)32位地址的指針, bit 是需要操作的位的索引(從0開始計(jì)數(shù))。 示例使用方式 假設(shè)要操作的是一個(gè)具有可讀寫屬性的寄存器,它

    2024年03月22日
    瀏覽(32)
  • ARM 寄存器

    ARM 寄存器

    Cortex A 系列的 ARM 處理器共有 40 個(gè) 32 位寄存器,其中 33 個(gè)為通用寄存器,7 個(gè)為狀態(tài)寄存器。用戶模式和系統(tǒng)模式共用同一組寄存器。 一、未分組寄存器 R0~R7 有些寄存器是所有運(yùn)行模式共用的,如 R0~R7,它們被稱為未分組寄存器。 在所有運(yùn)行模式下,未分組寄存器都指向同

    2024年02月02日
    瀏覽(24)
  • ARM寄存器組

    ARM寄存器組

    CM3 擁有通用寄存器 R0‐R15 以及一些特殊功能寄存器。 R0-R7也被稱為低組寄存器,所有指令可以訪問它們,它們的字長為32位,復(fù)位后的初始值是不可預(yù)料的。 R8-R12也被稱為高組寄存器,所有指令可以訪問它們,它們的字長為32位,復(fù)位后的初始值是不可預(yù)料的。 R13寄存器中

    2024年02月10日
    瀏覽(19)
  • ARM寄存器組織

    ARM寄存器組織

    ?ARM有37個(gè)32位長的寄存器: 1個(gè)用做PC(Program Counter); 1個(gè)用做CPSR(Current Program Status Register); 5個(gè)用做SPSR(Saved Program Status Registers); 30個(gè)通用寄存器。 ARM處理器共有37個(gè)寄存器,被分為若干個(gè)組(BANK),這些寄存器均為32位的寄存器。6個(gè)狀態(tài)寄存器,用以標(biāo)識(shí)CPU的工作狀

    2024年02月01日
    瀏覽(39)
  • Arm匯編---寄存器

    寄存器:r0~r15, sp, lr, sb, sl, fp, ip, pc 條件碼:eq, ne, hs, lo, mi, pl, vs, vc, hi, ls, ge, lt, gt, le, al ------------------------------------------ 一、數(shù)據(jù)寄存器 --------------------------------------------- ------------------------------------------ 二、指針寄存器 --------------------------------------------- --------------------

    2024年02月02日
    瀏覽(22)
  • ARM處理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM異常中斷處理流程?

    ARM處理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM異常中斷處理流程?

    快速學(xué)習(xí)嵌入式開發(fā)其他基礎(chǔ)知識(shí)? 返回專欄總目錄 《嵌入式工程師自我修養(yǎng)/C語言》 Tip??:鼠標(biāo)懸停雙虛線/句,可獲得更詳細(xì)的描述 ??ARM處理器有多種工作模式,如下表所示。應(yīng)用程序正常運(yùn)行時(shí),ARM處理器工作在 用戶模式(User mode) ,當(dāng)程序運(yùn)行出錯(cuò)或有中

    2024年02月21日
    瀏覽(567)
  • ARM中的寄存器

    ARM中的寄存器

    ARM工作模式 ARM有8個(gè)基本的工作模式 User 非特權(quán)模式,一般在執(zhí)行上層的應(yīng)用程序時(shí)ARM處于該模式 FIQ 當(dāng)一個(gè)高優(yōu)先級中斷產(chǎn)生后ARM將進(jìn)入這種模式 IRQ 當(dāng)一個(gè)低優(yōu)先級中斷產(chǎn)生后ARM將進(jìn)入這種模式 SVC 當(dāng)復(fù)位或執(zhí)行軟中斷指令后ARM將進(jìn)入這種模式 Abort 當(dāng)產(chǎn)生存取異常時(shí)ARM將進(jìn)

    2024年02月03日
    瀏覽(20)
  • 12.3 ARM寄存器組織

    12.3 ARM寄存器組織

    目錄 ARM寄存器組織(一) 寄存器 概念 作用 分類 ARM寄存器 ARM寄存器組織(二) 專用寄存器 R15(PC,Program Counter) R14(LR,Link Register) R13(SP,Stack Pointer) ARM寄存器組織(三) CPSR寄存器 ARM寄存器組織(一) 寄存器 概念 寄存器是處理器內(nèi)部的存儲(chǔ)器,沒有地址 C語言中register存儲(chǔ)在寄

    2024年02月13日
    瀏覽(20)
  • ARM編程模型-寄存器組

    ARM編程模型-寄存器組

    Cortex A系列ARM處理器共有40個(gè)32位寄存器,其中33個(gè)為通用寄存器,7個(gè)為狀態(tài)寄存器。usr模式和sys模式共用同一組寄存器。 通用寄存器包括R0~R15,可以分為3類: 未分組寄存器R0~R7 分組寄存器R8~R14、R13(SP) 、R14(LR) 程序計(jì)數(shù)器PC(R15)、R8_fiq-R12_fir為快中斷獨(dú)有 在不同模式下,名稱相同的

    2024年02月10日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包