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