esp32有多少个寄存器_esp32有多少个寄存器

这是一块普中STM32-F1开发板,具体型号是PZ6806L-STM32F103,用到了

STM32F103ZET6芯片。在创建好寄存器模板工程的前提下,我将进一步使用寄存器点亮一个LED灯(D1),具体步骤及说明如下:

1

在开发板原理图中查看LED模块电路原理,易知该模块共8个LED小灯,分别为D1~D8,且共阳极,连接在3.3V的电源上。

esp32有多少个寄存器_esp32有多少个寄存器_02

灯D1的阴极连接在芯片的26号引脚PC0(GPIO端口C的第0管脚)上,当PC0输出低电平时,发光二极管正向导通,D1被点亮。因此,我将转而对PC0进行操作。

esp32有多少个寄存器_stm32核心板可以点亮灯吗_03

2

结合《芯片数据手册》和《中文参考手册》,确定GPIO端口C在内存中的地址。首先,Cortex-M3是32位的内核,其PC指针可以指向232=4G的地址空间,ARM将这4G的存储空间划分成8块大小均为512MB的区域,分别是block0~block7。

esp32有多少个寄存器_stm32核心板可以点亮灯吗_04

block2连接的是STM32的片上外设,根据速度的不同,这些外设分别挂载在APB1、APB2、AHB总线上。相应总线的最低地址为该总线的基地址,例如:APB1的基地址是0x40000000,片上外设就从这个地址开始,所以也称为外设基地址(PERIPH_BASE)。

esp32有多少个寄存器_stm32核心板可以点亮灯吗_05

查阅《寄存器组起始地址表》可知:GPIO端口A ~GPIO端口G都挂接在APB2总线上,其中GPIO端口C的基地址为0x40011000,相对APB2总线的地址偏移为0x00001000。有了外设端口地址后,还需要知道GPIO端口C中各寄存器的地址,可查阅《中文参考手册》关于GPIO寄存器的描述,结果如下:

esp32有多少个寄存器_stm32呼吸灯程序_06

另外,STM32为了实现低功耗,将所有外设的时钟都设置成disable(不使能),而使用任何外设都必须先启动相应的时钟,所以还要用到APB2外设时钟使能寄存器(RCC_APB2ENR) ,因为GPIO端口C挂载在APB2总线上。

接下来,就可以利用这些地址信息来配置stm32f10x.h头文件了,其中第6行定义是将表示地址的立即数先转换成指针类型,再读取该指针指向的内存单元的内容,以实现对寄存器的操作。

//配置头文件stm32f10x.h//定义外设、APB2、GPIOC基地址及GPIOC所包含的寄存器地址#define PERIPH_BASE ((unsigned int)0x40000000)#define APB2_BASE (PERIPH_BASE + 0x00010000)          #define GPIOC_BASE (APB2_BASE + 0x1000)            #define GPIOC_CRL *(unsigned int*)(GPIOC_BASE + 0x00)#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE + 0x04)#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE + 0x08)#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE + 0x0C)#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE + 0x10)#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE + 0x14)#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE + 0x18)//定义AHB、RCC基地址及APB2外设时钟使能寄存器地址//AHB的起始地址是0x40018000(SDIO的地址),标准库中是0x40020000(DMA1外设的地址)#define AHB_BASE (PERIPH_BASE + 0x20000)#define RCC_BASE (AHB_BASE + 0x1000)#define RCC_APB2ENR *(unsigned int*)(RCC_BASE + 0x18)

3

在编写主程序main.c之前,我还需要有两个知识储备:C语言位操作方法和寄存器操作方法。

先看前者,以8位的无符号整型变量A为例,将A的第6位清零,其他位不变,编写代码如下:

A &= ~(1<<5);
  • 1左移5位,得到0010 0000
  • 按位取反,得到1101 1111
  • 和A相与,第6位被清零,其它位不变

再看后者,以开启GPIO端口C的时钟为例,根据《中文参考手册》可知,将APB2外设时钟使能寄存器(RCC_APB2ENR) 的“位4”置1即可,编写代码如下:

RCC_APB2ENR|=(1<<4);

4

是时候开始编写主程序main.c了!首先,开启GPIO端口C的时钟;接着,配置GPIO端口C的工作模式和工作速度,在本例中选择通用推挽输出模式且最大速率为50MHz,通过设置端口配置低寄存器(GPIOC_CRL) 即可完成;最后,使用端口位设置/清除寄存器(GPIOC_BSRR)间接控制PC0输出低电平。

#include"stm32f10x.h"void SystemInit()  //初始化内部FALSH、PLL并且更新系统时钟{  }int main(){  RCC_APB2ENR|=(1<<4);  GPIOC_CRL&=~(0x0f<4*  GPIOC_CRL|=(3<4*  GPIOC_BSRR=(1<16+}

编译链接0报错,即可将程序通过ARM仿真器下载到开发板内,灯D1被点亮,发出微弱的红光!

esp32有多少个寄存器_esp32有多少个寄存器_07

5

学习单片机总是从点亮LED灯开始,就好比学习编程语言总是先输出“Hello World !”。如果你完全看懂了以上所述,毋庸置疑,你也会觉得这是一个不错的应用示例,即串起了许多重要的知识点,又能让初学者略感成就。

在此基础上,可以继续尝试点亮更多的LED灯,以及改变它们的发光样式,常亮或者闪烁都是可以做到的,Just do it !