STM32 -- 笔记一 -- CLK、GPIO、PWM

特别说明一下:像是STM32,在进行实际操作时很多情况都是读写寄存器,根据不同的情况对寄存器进行操作,并且,STM32的寄存器数量比较多,带着那些外设,所以我在记录这份笔记时,尽量简略关于寄存器的操作流程,把一些功能的函数实现,要注意的细节等进行笔记记录。

时钟

时钟源:HSI、HSE、LSI、LSE、PLL
时钟频率都不一样。

为什么要多个时钟源?
A:STM32拥有者丰富的外设,这些外设需要的时钟频率不一定都要有系统时钟那么高,像是看门狗,只需要几十k的时钟频率即可。并且,同一个电路,时钟越快功耗越大,同时,抗电磁干扰能力也会越弱。

系统时钟SYSCLK的分频:

  • 通过AHB分频器分频以后送给各模块使用
  • 模块包括总线,内核,内存,DMA等
  • 送给APB1分频器。APB1分频器输出一路供APB1外设使用(PCLK1,最大频率36Hz),另一路送给定时器2/3/4倍频器使用
  • 送给APB2分频器。APB2分频器输出一路供APB2外设使用(PCLK2,最大频率72Hz),另一路送给定时器1倍频器使用

这里要注意APB1余APB2的区别:
APB1连接的是低速外设,包括:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等
APB2连接的是高速外设,包括:UART1、SPI1、Timer1、ADC1、ADC2、所有普通的IO口(PA~PE)、第二功能IO口等

GPIO

函数设置的GPIO_InitTypeDef 结构体内部的变量

  • GPIO_Pin;GPIO对应的引脚
    • GPIO_Pin_5,GPIO_Pin_6,GPIO_Pin_7
  • GPIO_Speed;输出的频率
    • GPIO_Speed_10MHz 最高输出速率10MHz
    • GPIO_Speed_2MHz 最高输出速率2MHz
    • GPIO_Speed_50MHz 最高输出速率50MHz
  • GPIO_Mode;输入输出的模式
    • GPIO_Mode_AIN 模拟输入
    • GPIO_Mode_IN_FLOATING 浮空输入
    • GPIO_Mode_IPD 下拉输入
    • GPIO_Mode_IPU 上拉输入
    • GPIO_Mode_Out_OD 开漏输出
    • GPIO_Mode_Out_PP 推挽输出
    • GPIO_Mode_AF_OD 复用开漏输出
    • GPIO_Mode_AF_PP 复用推挽输出

在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 转换时要设置为浮动输入。

设为输出功能时,可以设置为推挽输出或者开漏输出两种方式。推挽输出方式能够独立的输出高电平和低电平,适合驱动数字器件;开漏输出可以稳定的输出低电平,能承受大的灌电流,但是开漏输出无法输出高电平,需要外接上拉电阻才可以输出高电平,输出的高电平则有外接的上拉电平决定,这种输出方式适合做电流型驱动。

PWM

简介

利用数字输出来对模拟电路进行控制,简单说就是对脉冲宽度的控制。

这个简介比较难懂,简单说就是在对应的引脚产生类似于方波似的波形,可以通过设置相应的参数直接来控制波形的周期,以及高电平在整个波形中所占的比例。

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的引脚进行拉高,这种与第二种方案一样。

你可能感兴趣的:(STM32)