1.如何将寄存器组变成结构体
以时钟控制RCC为例:
在头文件中会看到如下结构体:
typedef struct
{
__IO uint32_t CR; //6.3.1 时钟控制寄存器
__IO uint32_t CFGR; //6.3.2 时钟配置寄存器
__IO uint32_t CIR; //6.3.3 时钟中断寄存器
__IO uint32_t APB2RSTR;//6.3.4 APB2外设复位寄存器
__IO uint32_t APB1RSTR;//6.3.5 APB1外设复位寄存器
__IO uint32_t AHBENR; //6.3.6 AHB外设时钟使能寄存器
__IO uint32_t APB2ENR;//6.3.7 APB2 外设时钟使能寄存器
__IO uint32_t APB1ENR;//6.3.8 APB1 外设时钟使能寄存器
__IO uint32_t BDCR; //6.3.9 备份域控制寄存器
__IO uint32_t CSR; //6.3.10 控制/状态寄存器
#ifdef STM32F10X_CL
__IO uint32_t AHBRSTR;
__IO uint32_t CFGR2;
#endif /* STM32F10X_CL */
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
uint32_t RESERVED0;
__IO uint32_t CFGR2;
#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */
} RCC_TypeDef;
有定义:
#define RCC ((RCC_TypeDef *) RCC_BASE) //含义:转换结构体指针,那么RCC所指向的头就为RCC_BASE,
//这样操作结构体就间接的在访问寄存器地址了;
RCC_BASE如下:地址为0x40021000 该地址对应下图中的复位和时钟控制(RCC)地址;
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
继续追下去:地址为0x40020000
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
继续
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */

现在反过来捋一捋,即实现寄存器组转成结构体操作了;
7015

被折叠的 条评论
为什么被折叠?



