MDK中寄存器地址名称映射分析
对MCU而言, 一切得底层配置,都是配置寄存器.
用户想直接把某一个电路给断开那是不可能得,只能是配置寄存器. 它给你提供一个寄存器配置, 让某一个点断开,
调用库函数也是操作相关寄存器, 我们得位操作也是操作相关寄存器.
51中映射方法
sft P0 = 0x80; //P0映射到地址 0x80
P0 = 0x00 //往寄存器地址 0x80赋值 0x00
STM32的操作
GPIOA->ODR = 0x00000000
值0x00000000是怎么赋值给了 GPIOA的ODR寄存器地址的呢 ?
也就是说GPIOA->ODR 这种写法,是怎么与GPIOA的ODR寄存器地址映射起来的 ?
我们可以先看源代码 在stm32f10x.h 里面
是怎么跟名称映射的 ? 我们要找到GPIOA的基地址, GPIOA下的寄存器就是以这个基地址为开头加上他们的偏移.
GPIOA的基地址是怎么来的呢 ? 是挂载一个总线,例如 挂载在APB2总线之下 , 它是由APB2总线的外设的基地址加上GPIOA 与 APB2基地址的一个偏移值, 这些值都是常量, 那这个APB2的外设的基地址它又是怎么来的呢 ? 它又是根据总外设基地址这样一个比较顶级的基地址, 然后加上 APB2 偏移的值, 就是APB2的地址, APB2的基地址 加上GPIOA偏移的值就说GPIOA的基地址, 然后再找到 GPIOA底下寄存器的地址,
把它强转为一个结构体是什么概念呢 ?
就是以GPIOA的基地址为首地址, 它把下面的存储区 直接强转成GPIO_TypeDef 这个结构体, 也就是说它的数据组织将会按照 结构体这样的方式来组织, 所以它会按顺序存放.
第一个 CRL 占四个字节, 32个比特位,
第二个 CRH 占四个字节, 32个比特位
第三个 IDR 占四个字节, 32个比特位
第四个 ODR 占四个字节, 32个比特位
…
MDK 就是通过这样的方法, 把地址跟 寄存器映射起来的,.
像RCC 结构体也是这样的形式 ,等等 其他结构体, 映射方式都是一样的,