快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

马来西亚云顶网址_尤火班网



不停都是用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布局体包孕这些寄存器。假如在其余法度榜样顶用到这些寄存器,只必要如下:

USART_TypeDefUSART1//随意率性马来西亚云顶网址取名,只管即便与Datasheet中给出的名字同等便于理解

USART1.SR=0x00000001;

或者

USART_TypeDef*USART1

USART1-》SR=0x00000001;

(*USART1).SR=0x00000011;

那么详细到各个寄存器的位置到底是如何的呢?从Datasheet和reference manual中可以看到

USART2属于APB1治理的外设,肇端地址是0x4000 4400,STM32上所有的外设的基地址都是0x4000 0000(这着实是AR马来西亚云顶网址M公司规定的),这也是APB1的肇端地址,然后USART2的肇端地址在APB1马来西亚云顶网址外设基地址的根基上偏移0x4400,于是便可以按照下面代码来分配各个外设的肇端地址了

#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)

有了这些外设的基地址,加上上面提到的寄存器布局体,便可以操作各个寄存器了,例如,只必要如下语句,便可以使能USART2

USART_Cmd(USART2,ENABLE);

USART_Cmd这是ST官方给出的库函数,详细定义如下

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);

}

}

假如理解了上述所讲的内容,你会发明,这种经由过程布局体定义寄存器的措施非经常见,这是由于现在的处置惩罚器,各类寄存器相称多(成百上千),假如按照传统的定义措施去操作寄存器,会相称的麻烦。不光是STM32,我知道的有TI的C2000系列DSPNXP的ARM系列MCU瑞萨的ARM R4 RZ/T1处置惩罚器都是按这样的措施来定义寄存器。

责任编辑;zl

您可能还会对下面的文章感兴趣: