STM32-寄存器点灯案例详解

本文以PA1引脚点亮LED灯为案例,解析了STM32寄存器操作的配置过程,以及从手册查询方法和寄存器配置步骤。

一、概念

1.十六进制和二进制之间相互转换关系

首先,需要了解十六进制和二进制之间的基本转换方法。十六进制是一种基数为16的数制,用数字0到9和字母A到F(或a至f)表示。

二进制则是基数为2的数制,仅使用数字0和1表示。

每一个十六进制的数字可以转换成一个四位的二进制数。

如:十六进制的1转换为二进制是0001,十六进制的A (或a)转换为二进制是1010

对于0xFFFFFFF0来说,可以拆分并转换为对应的二进制:F = 1111编,0=0000因此,0xFFFFFFF0的完整二进制表示是:

1111 1111 1111 1111 1111 1111 1111 0000

二、步骤

1.定位APB总线寄存器位置

第一步 开启外设时钟使能寄存器,当外设时钟没有启用时,软件不能读写外设寄存器数值。返回值始终为0x00

首先找寄存器映射表

STM32第6章提供了储存器映像,由此观察RCC的起始和终止地址分别为

RCC_Start: 0x4002 1000

RCC_End: 0x4002 1400

接着看具体RCC中有关IO PortA寄存器偏置位:

由图可知APB2外设时钟使能寄存器的偏移地址为:0x18;

即,如果你想设置RCC_APB2ENR这个寄存器,你就必须先定位RCC地址(0x4002 100)+偏移(0x18)

cpp 复制代码
#define   RCC_APB2ENR   *((volatile unsigned int *) (0x40021000 + 0x18))

2.定位IO口端口配置寄存器位置

这里我们使用IO口的A2作为例子,查询寄存器映射可得,PortA起始地址为0x4001 0800 终止地址为 0x4001 0C00

同理,配置IO端口配置寄存器首先要找到GPIO的偏移地址

查表可得该寄存器的地址为GPIO_PortA 偏移0x00

cpp 复制代码
#define GPIOA_CRL (*((volatile unsigned int *) (0x40010800 + 0x00)))

3.定位IO口引脚使能寄存器位置

GPIO_PortA 偏移0x10

cpp 复制代码
#define GPIOA_BSRR (*((volatile unsigned int *) (0x40010800 + 0x10)))

4.APB总线使能

复制代码
RCC_APB2ENR  |= 1<<2; //RCC PortA 时钟启用

5.IO口端口配置

复制代码
GPIOA_CRL &= 0xFFFFFF0F;//端口配置,CNF1和MODE1清零
GPIOA_CRL |= 0x00000030;//端口配置,CNF1设定推挽输出,MODE1设定输出模式,最大速度50MHz (0011)

6.引脚使能

复制代码
GPIOA_BSRR = 1<<1;//端口位设置,SET/RESET  ,即BS1设定为SET

三、案例

cpp 复制代码
#include "stm32f10x.h"                  // Device header

//定义三个寄存器
#define RCC_APB2ENR (*((volatile unsigned int *) (0x40021000 + 0x18)))//控制RCC_APB2总线,
#define GPIOA_CRL (*((volatile unsigned int *) (0x40010800 + 0x00)))//GPIO_CRL(GPIO_A端口配置低配置寄存器)
#define GPIOA_BSRR (*((volatile unsigned int *) (0x40010800 + 0x10)))//GPIOA_BSRR(GPIO端口位设置/清除寄存器)


int main(){
//对寄存器进行相应设定
RCC_APB2ENR  |= 1<<2; //RCC PortA 时钟启用
	
GPIOA_CRL &= 0xFFFFFF0F;//端口配置,CNF1和MODE1清零
GPIOA_CRL |= 0x00000030;//端口配置,CNF1设定推挽输出,MODE1设定输出模式,最大速度50MHz (0011)


	GPIOA_BSRR = 1<<1;//端口位设置,SET/RESET  ,即BS1设定为SET
	
while(1){

};

return 0;
}
相关推荐
笨笨没好名字5 小时前
怎么看懂51单片机电路图与功能实现的C语言编写(2-7入门篇)
c语言·嵌入式硬件·51单片机
项目題供诗9 小时前
STM32-TIM输入捕获(十四)
stm32·单片机·嵌入式硬件
cpsss068110 小时前
Freertos的Systick_Handler重定义
单片机·嵌入式硬件
国产电子元器件11 小时前
电流传感器的输出可以直接接示波器吗?
stm32·单片机·嵌入式硬件
zlinear数据采集卡11 小时前
SPI Flash存储电路深度解析:从芯片选型到ZLinear采集卡的实战设计
c语言·嵌入式硬件·自动化·硬件架构
m0_7471245313 小时前
单片机 VSCode 开发环境搭建
vscode·单片机·嵌入式硬件
嵌入式小站13 小时前
STM32 零基础可移植教程 21:1602A 并口 4 位模式,先显示 Hello
stm32·单片机·嵌入式硬件
夜月yeyue14 小时前
KCP 与 UDP 可靠传输
linux·网络·单片机·网络协议·udp·php
WIZnet14 小时前
W55RP20-EVB-MKR MicroPython 实战(14):MQTT 协议与 OneNET 平台对接
单片机·网络协议·wiznet
三佛科技-1873661339714 小时前
AIP8P005B(SOP14)中微爱芯8位MCU用辉芒微FT60E112A SOP14替代
单片机·嵌入式硬件