注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
kingdomlzq的个人空间 https://home.eeworld.com.cn/space-uid-57809.html [收藏] [复制] [分享] [RSS]
日志

寄存器理解

已有 1555 次阅读2018-7-31 21:44 |个人分类:STM32学习笔记| 寄存器

1.寻址空间:STM32F429有4G寻址空间,表示其最多有4G个32位的可寻址空间。这里的寻址空间,可以理解为每个寻址空间对应一唯一个32位的存储单元
2.存储单元映射---寻址空间和存储单元一一对应
3.寄存器---特殊功能存储单元的别名。即寄存器的本质还是存储单元
4.寄存器通过头文件宏定义来实现,例如:#define GPIOH_ODR   *(unsigned int*)(0x4002 1C14)  表示地址为(0x4002 1C14)的存储单元,其中 (unsigned int*)(0x4002 1C14) 表示0x4002 1C14是一个32位的地址指针,指针指向0x4002 1C14地址,*(unsigned int*)(0x4002 1C14)表示(0x4002 1C14)地址内存单元的内容。这种方式在单片机等底层文件普遍采用
5.更通用的寄存器访问,是通过结构体来实现的,把一定功能的寄存器统一定义为一个结构体,然后对结构体基址幅值为特定功能寄存器组的基址,举例如下:

/* GPIO 寄存器列表 *///定义结构体GPIO列表GPIO_TypeDef
typedef struct {
uint32_t MODER; /*GPIO 模式寄存器 地址偏移: 0x00 */
  uint32_t OTYPER; /*GPIO 输出类型寄存器 地址偏移: 0x04 */
uint32_t OSPEEDR; /*GPIO 输出速度寄存器 地址偏移: 0x08 */
uint32_t PUPDR; /*GPIO 上拉/下拉寄存器 地址偏移: 0x0C */
uint32_t IDR; /*GPIO 输入数据寄存器 地址偏移: 0x10 */
uint32_t ODR; /*GPIO 输出数据寄存器 地址偏移: 0x14 */
uint16_t BSRRL; /*GPIO 置位/复位寄存器低16 位部分 地址偏移: 0x18 */
uint16_t BSRRH; /*GPIO 置位/复位寄存器高16 位部分 地址偏移: 0x1A */
uint32_t LCKR; /*GPIO 配置锁定寄存器 地址偏移: 0x1C */
uint32_t AFR[2]; /*GPIO 复用功能配置寄存器 地址偏移: 0x20-0x24 */
} GPIO_TypeDef;
GPIO_TypeDef * GPIOx; //定义一个GPIO_TypeDef 型结构体指针GPIOx
GPIOx = GPIOH_BASE; //把指针地址设置为宏GPIOH_BASE 地址
然后接下来就可以通过结构体GPIOx来访问结构体内的寄存器了
GPIOx->BSRRL = 0xFFFF;

更直接的办法:使用宏定义   GPIO_TypeDef 把地址强制转换成指针
/*使用GPIO_TypeDef 把地址强制转换成指针*/
#define GPIOA     ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB     ((GPIO_TypeDef *) GPIOB_BASE)


评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章