您的位置 首页 硬件

STM32单片机寄存器的方位是怎么界说的

STM32单片机寄存器的位置是如何定义的-一直都是用STM32做项目中的主控芯片,在编程的时候,之前一直忽视了一个问题,那就是寄存器的位置是如何定义的。

一向都是用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(这其实是ARM公司规则的),这也是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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/343731.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部