STM32

寄存器

在STM32中一个寄存器有32个位,每个位有它自己的功能,这里我们查表即可知道每个位的功能

寄存器的设置

在c/cpp中写:寄存器范类->指定寄存器(细化)=0x00000000 即可设置寄存器的值,其中0x00000000是你想要设置的状态,具体看实际情况设置。

RCC->AHB2ENR=0x00000010

RCC寄存器(重置与时钟控制寄存器(Reset and Clock Control))

AHB2ENR寄存器(外设时钟启用寄存器(AHB2 Peripheral Clock Enable Register))

STM32的时钟系统通过一系列的时钟控制寄存器来管理不同总线上外设的时钟,其中包括AHB、APB1和APB2三条总线。AHB2ENR 属于AHB总线的二级复用器(AHB2)部分,它控制着连接到AHB2总线上的外设的时钟线是否激活。通过设置或清除这个寄存器中的相应位,可以启用或禁用特定外设的时钟,从而控制外设的功能和功耗。

例:

RCC->AHB2ENR=0x00000010;//将IOPCEN置1

如图,在二进制下寄存器的位每4个一组,将IOPCEN置1则需将第二组的状态设置成0001,十六进制下就是1。其他位都设成0000,十六进制下是0,组合起来就是0x00000010.

GPIO寄存器(通用输入输出寄存器(General Purpose Input Output))

从硬件层面上讲,它是芯片上的一组引脚,用于收/发信号,由于不是为任何特定目的而设计的,所以称之为“通用”IO。

关于难推难挽和开漏输出,下面这篇文章有详细介绍,这里就暂时只用知道难推难挽既可以输出高电平,也可以输出低电平,直接驱动一些耗电量相对较小的器件就行了。

参考资料:STM32 GPIO口的推挽输出与开漏输出

GPIO的CRL与CRH寄存器(端口配置高寄存器(Configuration Register Low&Configuration Register High))

低寄存器管理PC0~7,高寄存器管理PC8~15

GPIOC->CRH=0x00300000;

寄存器相关信息如下: 这里将PC13口启用为通用难推难挽输出模式的输出口,则需置CNF13为00,MODE13为1其他口不变

GPIO的ODR寄存器(端口输出数据寄存器 (Output Data Register))

GPIOC->ODR=0x00002000

寄存器相关信息如下: 这里将ODR13口置高电平,则需设其为1,其余设为低电平0.

端口相关

以下端口标绿的优先使用;标红的强烈建议别使用,因为它们是用来下载程序的,如果被占用就烧不进程序了:

端口表:

引脚号 端口 类型 I/O口电平 主功能 默认复用功能 重定义功能
1 VBAT S VBAT *暂时不想抄*
2 PC13 I/O TAMPER-RTC
3 PC14 I/O OSC32_IN
4 PC15 I/O OSC32_OUT
5 OSC_IN I OSC_IN
6 OSC_OUT O OSC_OUT
7 NRST I/O NRST
8 VSSA S VSSA
9 VDDA S VDDA
10 $\color{#00ff00}{\text{PA0}}$ I/O PA0
11 $\color{#00ff00}{\text{PA1}}$ I/O PA1
12 $\color{#00ff00}{\text{PA2}}$ I/O PA2
13 $\color{#00ff00}{\text{PA3}}$ I/O PA3
14 $\color{#00ff00}{\text{PA4}}$ I/O PA4
15 $\color{#00ff00}{\text{PA5}}$ I/O PA5
16 $\color{#00ff00}{\text{PA6}}$ I/O PA6
17 $\color{#00ff00}{\text{PA7}}$ I/O PA7
18 $\color{#00ff00}{\text{PB0}}$ I/O PB0
19 $\color{#00ff00}{\text{PB1}}$ I/O PB1
20 PB2 I/O FT PB2/BOOT1
21 $\color{#00ff00}{\text{PB10}}$ I/O FT PB10
22 $\color{#00ff00}{\text{PB11}}$ I/O FT PB11
23 VSS_1 S VSS_1
24 VDD_1 S VDD_1
25 $\color{#00ff00}{\text{PB12}}$ I/O FT PB12
26 $\color{#00ff00}{\text{PB13}}$ I/O FT PB13
27 $\color{#00ff00}{\text{PB14}}$ I/O FT PB14
28 $\color{#00ff00}{\text{PB15}}$ I/O FT PB15
29 $\color{#00ff00}{\text{PA8}}$ I/O FT PA8
30 $\color{#00ff00}{\text{PA9}}$ I/O FT PA9
31 $\color{#00ff00}{\text{PA10}}$ I/O FT PA10
32 $\color{#00ff00}{\text{PA11}}$ I/O FT PA11
33 $\color{#00ff00}{\text{PA12}}$ I/O FT PA12
34 $\color{#00ff00}{\text{PA13}}$ I/O JTMS/SWDIO
35 VSS_2 S VSS_2
36 VDD_2 S VDD_2
37 $\color{#ff0000}{\text{PA14}}$ I/O JTCK/SWCLK
38 $\color{#ff0000}{\text{PA15}}$ I/O JTDI
39 $\color{#ff0000}{\text{PB3}}$ I/O JTDO
40 $\color{#ff0000}{\text{PB4}}$ I/O NJTRST
41 $\color{#00ff00}{\text{PB5}}$ I/O FT PB5
42 $\color{#00ff00}{\text{PB6}}$ I/O FT PB6
43 $\color{#00ff00}{\text{PB7}}$ I/O FT PB7
44 BOOT0 I BOOT0
45 $\color{#00ff00}{\text{PB8}}$ I/O FT PB8
46 $\color{#00ff00}{\text{PB9}}$ I/O FT PB9
47 VSS_3 S VSS_3
48 VDD_3 S VDD_3

其中I/O即输入输出,S代表电源,FT代表能接受5V电压。

杂项

为什么不推荐使用cpp?因为cpp的模板类太大了,stm32f1的flash最多只能存64k的程序,你随便写个vector什么的都要动辄300多k。