日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]一直都是用STM32做項目中的主控芯片,在編程的時候,之前一直忽視了一個問題,那就是寄存器的位置是如何定義的,為什么用一個USART1->CR操作就能夠給這個CR寄存器賦值?其實這是一個比較底層的問題,不懂這方面的知識

一直都是用STM32做項目中的主控芯片,在編程的時候,之前一直忽視了一個問題,那就是寄存器的位置是如何定義的,為什么用一個USART1->CR操作就能夠給這個CR寄存器賦值?其實這是一個比較底層的問題,不懂這方面的知識也并不影響使用STM32,因為底層的定義工作,廠家一般都會做好,但是多了解一點原理性的東西,對自己還是很有幫助的。

這里我就以STM32F407的USART寄存器為例,介紹一下ST廠家是如何做寄存器定義的。

首先在stm32f4xx.h中


typedefstruct

{

__IOuint16_tSR;/*!

uint16_tRESERVED0;/*!

__IOuint16_tDR;/*!

uint16_tRESERVED1;/*!

__IOuint16_tBRR;/*!

uint16_tRESERVED2;/*!

__IOuint16_tCR1;/*!

uint16_tRESERVED3;/*!

__IOuint16_tCR2;/*!

uint16_tRESERVED4;/*!

__IOuint16_tCR3;/*!

uint16_tRESERVED5;/*!

__IOuint16_tGTPR;/*!

uint16_tRESERVED6;/*!

}USART_TypeDef;

這是因為USART的寄存器組包括SR,DR,BRR,CR1,CR2,CR3,GPTR這幾個寄存器,所以用一個USART_TypeDef結(jié)構(gòu)體包含這些寄存器。如果在別的程序中用到這些寄存器,只需要如下:


USART_TypeDefUSART1//任意取名,盡量與Datasheet中給出的名字一致便于理解

USART1.SR=0x00000001;

或者


USART_TypeDef*USART1

USART1->SR=0x00000001;


(*USART1).SR=0x00000011;


那么具體到各個寄存器的位置到底是怎樣的呢?從Datasheet和reference manual中可以看到

USART2屬于APB1管理的外設(shè),起始地址是0x4000 4400,STM32上所有的外設(shè)的基地址都是0x4000 0000(這其實是ARM公司規(guī)定的),這也是APB1的起始地址,然后USART2的起始地址在APB1外設(shè)基地址的基礎(chǔ)上偏移0x4400,于是便可以按照下面代碼來分配各個外設(shè)的起始地址了


#definePERIPH_BASE((uint32_t)0x40000000)

/*!

/*!

#defineAPB1PERIPH_BASEPERIPH_BASE

#defineUSART2_BASE(APB1PERIPH_BASE+0x4400)

#defineUSART3_BASE(APB1PERIPH_BASE+0x4800)

#defineUART4_BASE(APB1PERIPH_BASE+0x4C00)

#defineUART5_BASE(APB1PERIPH_BASE+0x5000)

#defineUSART2((USART_TypeDef*)USART2_BASE)

#defineUSART3((USART_TypeDef*)USART3_BASE)

#defineUART4((USART_TypeDef*)UART4_BASE)

#defineUART5((USART_TypeDef*)UART5_BASE)

有了這些外設(shè)的基地址,加上上面提到的寄存器結(jié)構(gòu)體,便可以操作各個寄存器了,例如,只需要如下語句,便可以使能USART2


USART_Cmd(USART2,ENABLE);

USART_Cmd這是ST官方給出的庫函數(shù),具體定義如下


voidUSART_Cmd(USART_TypeDef*USARTx,FunctionalStateNewState)

{

/*Checktheparameters*/

assert_param(IS_USART_ALL_PERIPH(USARTx));

assert_param(IS_FUNCTIONAL_STATE(NewState));

if(NewState!=DISABLE)

{

/*EnabletheselectedUSARTbysettingtheUEbitintheCR1register*/

USARTx->CR1|=USART_CR1_UE;

}

else

{

/*DisabletheselectedUSARTbyclearingtheUEbitintheCR1register*/

USARTx->CR1&=(uint16_t)~((uint16_t)USART_CR1_UE);

}

}

如果理解了上述所講的內(nèi)容,你會發(fā)現(xiàn),這種通過結(jié)構(gòu)體定義寄存器的方法非常常見,這是因為現(xiàn)在的處理器,各種寄存器相當(dāng)多(成百上千),如果按照傳統(tǒng)的定義方法去操作寄存器,會相當(dāng)?shù)穆闊2恢皇荢TM32,我知道的有TI的C2000系列DSP,NXP的ARM系列MCU,瑞薩的ARM R4 RZ/T1處理器都是按這樣的方法來定義寄存器。


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉