c++ - 这里的以下 oop 结构是什么?
问题描述
在下面的代码中,变量在哪里,变量类型在哪里?我们在这里更改了寄存器的属性。
如果它是面向对象的,那么我们需要一个对象名称来更改其属性。
在这里,我看不到类型在哪里,变量名在哪里,以及我们如何更改其内部属性?
#include <stm32f0xx.h>
int main(void)
{
RCC->AHBENR|=RCC_AHBENR_GPIOCEN ;
GPIOC->MODER|=GPIO_MODER_MODERG_O ;
}
解决方案
这与OOP无关,它只是一个结构成员分配。 RCC
并GPIOC
在stm32f0xx.h中定义:
#define RCC ((RCC_TypeDef *) RCC_BASE)
和
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
whereRCC_BASE
和GPIOC_BASE
are 与 abaolute 地址在同一个标头中定义,并且 RCC_TypeDef
和GPIO_TypeDef
是结构类型 - 例如:
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint16_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
uint16_t RESERVED0; /*!< Reserved, 0x06 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint16_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
uint16_t RESERVED1; /*!< Reserved, 0x12 */
__IO uint16_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
uint16_t RESERVED2; /*!< Reserved, 0x16 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset registerBSRR, Address offset: 0x18 */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function low register, Address offset: 0x20-0x24 */
__IO uint16_t BRR; /*!< GPIO bit reset register, Address offset: 0x28 */
uint16_t RESERVED3; /*!< Reserved, 0x2A */
}GPIO_TypeDef;
因此将宏扩展为:
RCC->AHBENR|=RCC_AHBENR_GPIOCEN ;
决议:
((RCC_TypeDef*)0x40021000)->AHBENR |= ((uint32_t)0x00080000) ;
0x40021000
RCC 的基地址在哪里,anAHBENR
是指设置了 GPIOC 使能标志的 RCC 寄存器。
stm32f0xx.h 为每个外设的寄存器集定义结构,然后定义将结构映射到每个外设所在地址的宏。
推荐阅读
- jquery - 我如何通过定价 00 美元的产品来查询 WooCommerce 产品?
- javascript - 如何通过 JavaScript 避免图像 src 字符串重复
- sql - 如何 PIVOT 查询中提到的选择结果
- git - git 不会在没有明确原因的情况下推送任何内容
- google-apps-script - 我可以在谷歌电子表格上的谷歌脚本上执行 getCursor() 吗?
- javascript - 如何从 JavaScript 中的表情符号中获取真正的字符代码?
- javascript - 如何获取地理位置数据并将其从浏览器发送到快递服务器
- android-studio - 向元素添加拖放功能
- java - Double.toString 总是产生与双文字完全相同的结果吗?
- python - 如何从pygame中的if语句中传输文本?