STM32-寄存器点灯案例详解 本文以PA1引脚点亮LED灯为案例解析了STM32寄存器操作的配置过程以及从手册查询方法和寄存器配置步骤。一、概念1.十六进制和二进制之间相互转换关系首先需要了解十六进制和二进制之间的基本转换方法。十六进制是一种基数为16的数制用数字0到9和字母A到F或a至f)表示。二进制则是基数为2的数制仅使用数字0和1表示。每一个十六进制的数字可以转换成一个四位的二进制数。如十六进制的1转换为二进制是0001,十六进制的A (或a)转换为二进制是1010对于0xFFFFFFF0来说可以拆分并转换为对应的二进制F 1111编00000因此0xFFFFFFF0的完整二进制表示是1111 1111 1111 1111 1111 1111 1111 0000二、步骤1.定位APB总线寄存器位置第一步 开启外设时钟使能寄存器当外设时钟没有启用时软件不能读写外设寄存器数值。返回值始终为0x00首先找寄存器映射表STM32第6章提供了储存器映像由此观察RCC的起始和终止地址分别为RCC_Start: 0x4002 1000RCC_End: 0x4002 1400接着看具体RCC中有关IO PortA寄存器偏置位由图可知APB2外设时钟使能寄存器的偏移地址为0x18;即如果你想设置RCC_APB2ENR这个寄存器你就必须先定位RCC地址(0x4002 100)偏移(0x18)#define RCC_APB2ENR *((volatile unsigned int *) (0x40021000 0x18))2.定位IO口端口配置寄存器位置这里我们使用IO口的A2作为例子查询寄存器映射可得PortA起始地址为0x4001 0800 终止地址为 0x4001 0C00同理配置IO端口配置寄存器首先要找到GPIO的偏移地址查表可得该寄存器的地址为GPIO_PortA 偏移0x00#define GPIOA_CRL (*((volatile unsigned int *) (0x40010800 0x00)))3.定位IO口引脚使能寄存器位置GPIO_PortA 偏移0x10#define GPIOA_BSRR (*((volatile unsigned int *) (0x40010800 0x10)))4.APB总线使能RCC_APB2ENR | 12; //RCC PortA 时钟启用5.IO口端口配置GPIOA_CRL 0xFFFFFF0F;//端口配置CNF1和MODE1清零 GPIOA_CRL | 0x00000030;//端口配置CNF1设定推挽输出MODE1设定输出模式最大速度50MHz 00116.引脚使能GPIOA_BSRR 11;//端口位设置SET/RESET ,即BS1设定为SET三、案例#include stm32f10x.h // Device header //定义三个寄存器 #define RCC_APB2ENR (*((volatile unsigned int *) (0x40021000 0x18)))//控制RCC_APB2总线 #define GPIOA_CRL (*((volatile unsigned int *) (0x40010800 0x00)))//GPIO_CRLGPIO_A端口配置低配置寄存器 #define GPIOA_BSRR (*((volatile unsigned int *) (0x40010800 0x10)))//GPIOA_BSRR(GPIO端口位设置/清除寄存器) int main(){ //对寄存器进行相应设定 RCC_APB2ENR | 12; //RCC PortA 时钟启用 GPIOA_CRL 0xFFFFFF0F;//端口配置CNF1和MODE1清零 GPIOA_CRL | 0x00000030;//端口配置CNF1设定推挽输出MODE1设定输出模式最大速度50MHz 0011 GPIOA_BSRR 11;//端口位设置SET/RESET ,即BS1设定为SET while(1){ }; return 0; }