在嵌入式开发中,映射(Mapping)是指将一段物理地址空间映射到另一段地址空间的过程。这个过程中,硬件会根据相关的特定信息,将物理地址映射到虚拟地址上。在 STM32 中,映射的过程主要是将外设的寄存器映射到内存地址上。
在 STM32 中,映射主要是通过内存映射寄存器(Memory-mapped registers)实现的。这些寄存器通过内存地址映射到特定功能块,例如 GPIO、UART、PWM 以及定时器等。这种映射方式,为使用这些外设提供了一种更加方便的方式。
在 STM32 中,每个外设都有一段内存空间用于存储相关的配置信息,这段空间通常被称为寄存器(Registers)。通过直接访问寄存器,可以控制外设的各种功能,例如使能、禁止、读、写等。这些寄存器可以通过地址访问,因此我们可以采用访问内存的方式来访问这些外设,这就是 STM32 中映射的体现。
映射的方式使得使用外设变得更加方便。通过映射,我们可以使用访问内存的方式来控制外设,这使得我们可以在代码中使用类似于变量访问的方式来与外设进行通信。
同时,映射的方式还可以显著降低编程难度和错误的概率。例如,当我们需要对某个 GPIO 进行配置时,只需要修改相应的寄存器值即可,而不需要手动控制硬件。这减少了不必要的代码和调试,并且可以降低出错的概率。
下面是使用映射的一个简单示例。我们将串口 1 配置为 9600 波特率,8 个数据位,无校验位和 1 个停止位,并且发送一条字符串 "Hello World!":
#include “stm32f1xx.h”
int main(void)
// 使能 GPIOA 时钟和串口 1 时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
// 配置 GPIOA9 和 PA10 为复用输出模式
GPIOA->CRH &= ~(GPIO_CRH_MODE9_Msk | GPIO_CRH_CNF9_Msk | GPIO_CRH_MODE10_Msk | GPIO_CRH_CNF10_Msk);
GPIOA->CRH |= (GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1 | GPIO_CRH_CNF9_1 | GPIO_CRH_MODE10_0);
// 配置串口
USART1->BRR = 0x1d4c; // 设置波特率为 9600
USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 使能发送和接收,使能串口
USART1->CR2 = USART_CR2_STOP_0; // 1 个停止位,无校验位,8 个数据位
// 发送字符串
char *str = "Hello World!\n";
while (*str != '\0') {
// 等待上一个字符发送完成
while ((USART1->SR & USART_SR_TC) == 0);
USART1->DR = *str++; // 发送下一个字符
}
while (1);