特别说明一下:像是STM32,在进行实际操作时很多情况都是读写寄存器,根据不同的情况对寄存器进行操作,并且,STM32的寄存器数量比较多,带着那些外设,所以我在记录这份笔记时,尽量简略关于寄存器的操作流程,把一些功能的函数实现,要注意的细节等进行笔记记录。
时钟源:HSI、HSE、LSI、LSE、PLL
时钟频率都不一样。
为什么要多个时钟源?
A:STM32拥有者丰富的外设,这些外设需要的时钟频率不一定都要有系统时钟那么高,像是看门狗,只需要几十k的时钟频率即可。并且,同一个电路,时钟越快功耗越大,同时,抗电磁干扰能力也会越弱。
系统时钟SYSCLK的分频:
这里要注意APB1余APB2的区别:
APB1连接的是低速外设,包括:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等
APB2连接的是高速外设,包括:UART1、SPI1、Timer1、ADC1、ADC2、所有普通的IO口(PA~PE)、第二功能IO口等
函数设置的GPIO_InitTypeDef 结构体内部的变量
在STM32中选用IO模式
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变 。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
关于GPIO的上拉与下拉:
设置GPIO引脚为上拉模式时默认为高电平,设置GPIO引脚为下拉模式时默认为低电平。
控制对应的引脚如果高有效那么我们就下拉,如果低有效那么就上拉
上拉电阻有时是用来解决总线驱动能力不足时提供电流的,一般说法是拉电流;下拉电阻是用来吸收电流的,也就是灌电流。比如有I2C总线使用会上拉一个10k的电阻。
关于GPIO的上拉与下拉的设置我们可以看一个实例:按键所在的GPIO引脚,设置GPIO为输入功能,低电平有效,那么我们可以将其设置为上拉功能,这样我们在使用GPIO_INIT函数对引脚进行初始化后,引脚默认的电平值即为高电平,待发生按键事件时,引脚电压为低电平。
注意,在进行GPIO引脚的电压读取时,有的时候会要求读取输出电平值或者输入电平值,分别对应函数为:
GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3)//读取输出电平值
GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2)//读取输入电平值
如果程序在关于调用读取输出或者输入电平值时写错,那么很可能读取到的电平值是一个不变的电平值,不会随着引脚的输出输入电平值改变。
GPIO引脚:
设为输入功能时,可以设置为浮动输入或者上拉输入两种方式。浮动输入是 GPIO 的管脚的电平状态是不确定的,容易受到外部电平的干扰;上拉输入时,管脚的电平则只有高电平或低电平两种确定的状态。一般I/O 做外部中断输入时要设置为上拉输入,做 A/D 转换时要设置为浮动输入。
设为输出功能时,可以设置为推挽输出或者开漏输出两种方式。推挽输出方式能够独立的输出高电平和低电平,适合驱动数字器件;开漏输出可以稳定的输出低电平,能承受大的灌电流,但是开漏输出无法输出高电平,需要外接上拉电阻才可以输出高电平,输出的高电平则有外接的上拉电平决定,这种输出方式适合做电流型驱动。
简介
利用数字输出来对模拟电路进行控制,简单说就是对脉冲宽度的控制。
这个简介比较难懂,简单说就是在对应的引脚产生类似于方波似的波形,可以通过设置相应的参数直接来控制波形的周期,以及高电平在整个波形中所占的比例。
STM32的定时器可以用来产生PWM输出,除了TIM6余TIM7以外。并且定时器可以产生好几路的PWM输出。
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable , ENABLE);
注意,这个语句可以使原有的下载用的引脚失能。将其下载功能的引脚变更为普通的GPIO引脚。
PPS:关于屏蔽了STM32下载引脚的解决方案
只是禁止了JTAG下载,没有禁止SWD,将工具(JLINK或STLINK)设置为SWD方式即可下载仿真了。
另一个方法:将BOOT0脚和BOOT1脚接3.3V,断电再重新上电,就能使用仿真了,JTAG方式和SWD方式都可以用,这是因为这种方法是由RAM启动,所以之前你烧进去的程序是不会运行的,也就不存在JTAG被禁止。
boot0拉高,直接下载就可以了。这里看了一下电路,BOOT1连接的是3.3V,只需要将BOOT0的引脚进行拉高,这种与第二种方案一样。