打印

请问香主,如何找到寄存器地址?

[复制链接]
8520|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
看完了STM32的数据手册和参考手册,无法找到某一个具体寄存器的地址,文档中给出的都是偏移地址,而且也没有基地址,在哪儿能够查阅到?
沙发
vigia| | 2009-4-8 10:59 | 只看该作者

。。。

参考手册里每一个外设的register map的表的最下面一行都注明了
Refer to Table 1 on page xx for the register boundary addresses.

使用特权

评论回复
板凳
香水城| | 2009-4-8 10:59 | 只看该作者

关于寄存器组的基地址,请看STM32参考手册的表1

每个片内外设章节的末尾都有寄存器列表,列出了这一章中所有寄存器的偏移地址。

使用特权

评论回复
地板
zhangxk|  楼主 | 2009-4-8 13:49 | 只看该作者

STM32参考手册的表1中没有

香主仔细看过没有,表1里并没有地址在0xE0000000~0xE00FF000之间的寄存器描述。

使用特权

评论回复
5
lut1lut| | 2009-4-8 14:22 | 只看该作者

以下是函数库中的中对外设基址的定义

/******************************************************************************/
/*                         Peripheral memory map                              */
/******************************************************************************/
/* Peripheral and SRAM base address in the alias region */
#define PERIPH_BB_BASE        ((u32)0x42000000)
#define SRAM_BB_BASE          ((u32)0x22000000)

/* Peripheral and SRAM base address in the bit-band region */
#define SRAM_BASE             ((u32)0x20000000)
#define PERIPH_BASE           ((u32)0x40000000)

/* FSMC registers base address */
#define FSMC_R_BASE           ((u32)0xA0000000)

/* Peripheral memory map */
#define APB1PERIPH_BASE       PERIPH_BASE
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)

#define TIM2_BASE             (APB1PERIPH_BASE + 0x0000)
#define TIM3_BASE             (APB1PERIPH_BASE + 0x0400)
#define TIM4_BASE             (APB1PERIPH_BASE + 0x0800)
#define TIM5_BASE             (APB1PERIPH_BASE + 0x0C00)
#define TIM6_BASE             (APB1PERIPH_BASE + 0x1000)
#define TIM7_BASE             (APB1PERIPH_BASE + 0x1400)
#define RTC_BASE              (APB1PERIPH_BASE + 0x2800)
#define WWDG_BASE             (APB1PERIPH_BASE + 0x2C00)
#define IWDG_BASE             (APB1PERIPH_BASE + 0x3000)
#define SPI2_BASE             (APB1PERIPH_BASE + 0x3800)
#define SPI3_BASE             (APB1PERIPH_BASE + 0x3C00)
#define USART2_BASE           (APB1PERIPH_BASE + 0x4400)
#define USART3_BASE           (APB1PERIPH_BASE + 0x4800)
#define UART4_BASE            (APB1PERIPH_BASE + 0x4C00)
#define UART5_BASE            (APB1PERIPH_BASE + 0x5000)
#define I2C1_BASE             (APB1PERIPH_BASE + 0x5400)
#define I2C2_BASE             (APB1PERIPH_BASE + 0x5800)
#define CAN_BASE              (APB1PERIPH_BASE + 0x6400)
#define BKP_BASE              (APB1PERIPH_BASE + 0x6C00)
#define PWR_BASE              (APB1PERIPH_BASE + 0x7000)
#define DAC_BASE              (APB1PERIPH_BASE + 0x7400)

#define AFIO_BASE             (APB2PERIPH_BASE + 0x0000)
#define EXTI_BASE             (APB2PERIPH_BASE + 0x0400)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)
#define ADC1_BASE             (APB2PERIPH_BASE + 0x2400)
#define ADC2_BASE             (APB2PERIPH_BASE + 0x2800)
#define TIM1_BASE             (APB2PERIPH_BASE + 0x2C00)
#define SPI1_BASE             (APB2PERIPH_BASE + 0x3000)
#define TIM8_BASE             (APB2PERIPH_BASE + 0x3400)
#define USART1_BASE           (APB2PERIPH_BASE + 0x3800)
#define ADC3_BASE             (APB2PERIPH_BASE + 0x3C00)

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

#define DMA1_BASE             (AHBPERIPH_BASE + 0x0000)
#define DMA1_Channel1_BASE    (AHBPERIPH_BASE + 0x0008)
#define DMA1_Channel2_BASE    (AHBPERIPH_BASE + 0x001C)
#define DMA1_Channel3_BASE    (AHBPERIPH_BASE + 0x0030)
#define DMA1_Channel4_BASE    (AHBPERIPH_BASE + 0x0044)
#define DMA1_Channel5_BASE    (AHBPERIPH_BASE + 0x0058)
#define DMA1_Channel6_BASE    (AHBPERIPH_BASE + 0x006C)
#define DMA1_Channel7_BASE    (AHBPERIPH_BASE + 0x0080)
#define DMA2_BASE             (AHBPERIPH_BASE + 0x0400)
#define DMA2_Channel1_BASE    (AHBPERIPH_BASE + 0x0408)
#define DMA2_Channel2_BASE    (AHBPERIPH_BASE + 0x041C)
#define DMA2_Channel3_BASE    (AHBPERIPH_BASE + 0x0430)
#define DMA2_Channel4_BASE    (AHBPERIPH_BASE + 0x0444)
#define DMA2_Channel5_BASE    (AHBPERIPH_BASE + 0x0458)
#define RCC_BASE              (AHBPERIPH_BASE + 0x1000)
#define CRC_BASE              (AHBPERIPH_BASE + 0x3000)

/* Flash registers base address */
#define FLASH_R_BASE          (AHBPERIPH_BASE + 0x2000)
/* Flash Option Bytes base address */
#define OB_BASE               ((u32)0x1FFFF800)

/* FSMC Bankx registers base address */
#define FSMC_Bank1_R_BASE     (FSMC_R_BASE + 0x0000)
#define FSMC_Bank1E_R_BASE    (FSMC_R_BASE + 0x0104)
#define FSMC_Bank2_R_BASE     (FSMC_R_BASE + 0x0060)
#define FSMC_Bank3_R_BASE     (FSMC_R_BASE + 0x0080)
#define FSMC_Bank4_R_BASE     (FSMC_R_BASE + 0x00A0)

/* Debug MCU registers base address */
#define DBGMCU_BASE          ((u32)0xE0042000)

/* System Control Space memory map */
#define SCS_BASE              ((u32)0xE000E000)

#define SysTick_BASE          (SCS_BASE + 0x0010)
#define NVIC_BASE             (SCS_BASE + 0x0100)
#define SCB_BASE              (SCS_BASE + 0x0D00)

使用特权

评论回复
6
vigia| | 2009-4-8 16:17 | 只看该作者

0xE0xxxxxx地址是内核自己用的

要看Cortex-M3的参考手册。

与STM32关系密切的部分寄存器也在STM32的参考手册中列出绝对地址,如DBGMCU_CR等。

使用特权

评论回复
7
smallfishyjt| | 2009-4-12 09:58 | 只看该作者

内核寄存器地址

外设寄存器地址是有的
有一张表格 里面列出了所有外设的基地址 根据寄存器在外设里面的偏移地址就能够计算出寄存器地址的

从库函数里面能够看到多内核操作的寄存器
但是在文档里面找不到这些寄存器
是不是不允许用户进行修改?

使用特权

评论回复
8
xmfbit| | 2015-3-16 17:26 | 只看该作者
感谢楼上的讨论,其实这个问题很简单。给后来者一个总结:
如果你正好在写代码,那么只用使用"寄存器 + BASE"的形式,就能够跳转到头文件中的相应位置,就像这样的一些宏定义,直接引用它们就可以了:


注意,这里得到的是寄存器的基地址,那么如果我想得到里面具体一些寄存器的值呢?可以去查阅手册,比如《STM32中文参考手册》,搜索关键字就行了。比如我想知道USART1的数据存储器DR的内存中的映射地址,就可以搜索“USART1”,可以得到第25章的最后有这样一张寄存器偏移地址表,只需要在表中都出来相应的值,再加上基地址就好了!


也就是说,USART1的DR地址可以这样写:

#define ADDR_USART1_DR  (USART1_BASE + 0x04)

使用特权

评论回复
9
myxiaonia| | 2015-3-16 20:16 | 只看该作者
其实楼上最简单写法$UART1->DR

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

69

帖子

1

粉丝