方式1:

查手册找到相关寄存器的地址,自行编写代码,定义指针指向该地址,并根据需要进行寄存器读写。

举例:

//方式1举例:自定义GPIOB_ODR寄存器
#define GPIOB_ODR (*(volatile unsigned int *)0x40010C0C)//定义寄存器GPIOB_ODR,

 GPIOB_ODR &= ~(1uL<<5);//PB5输出低电平,
 GPIOB_ODR |= (1uL<<5);//PB5输出高电平。

《嵌入式系统》知识总结8:寄存器编程方式操纵GPIO-LMLPHP

方式2:

利用厂商写好的宏定义,根据手册中寄存器的命名读写相关寄存器。

具体说明:

由 K e i l M D K 自 动 产 生 的s t m 3 2 f 1 0 x . h 文 件 中 以 宏 定 义 方 式 定 义 了STM32F103ZET6微控制器的各种片内外设的寄存器结构体指针,可以直接使用。

stm32f10x.h定义的GPIO基地址

 stm32f10x_gpio.h定义的GPIO结构类型

#define __IO volatile

/* 定义 */
typedef struct
{ __IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;

/* 使用 */
GPIO_TypeDef GPIOx;
GPIOx.CRL = 0;
GPIO_TypeDef * GPIOx;
GPIOx->CRL = 0;

直接对配置寄存器编程

06-05 01:17