学习工具:keil5+cubemx(废话不多说,对应的工具下载就直接省略了)
学习方法:在cubemx上选择芯片型号,配置对应的功能后下载生成代码,最后通过keil编译下载到板子
学习芯片:stm32f103c8t6
一、点灯
从单片机原理图可以看到LED灯分别连接在PC13和GND两个引脚,另一端连接到3.3V电源,所以当单片机上电D1灯会直接亮起,D2灯连接在PC13引脚,当PC13引脚输出低电平,D2灯会亮起。
1、搭建cubemx工程
(1)新建工程:
点击file->new project新建工程,选择对应的stm32f103c8t6芯片
(2)配置PC13输出低电平
在芯片图上点击PA13引脚,将其配置为输出模式,并置为低电平
也可以在生成的代码中使用hal库函数自定义设置引脚的输出电平:
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); //GPIO_PIN_RESET为低电平,GPIO_PIN_SET为高电平
(3)代码生成管理
点击GENERATE CODE生成代码即可。
注意:第一次使用这个芯片可能需要下载对应的固件库,下载固件库需要登录账户才可以下载
然后打开keil工程,选择烧录器下载
二、按键控制小灯
按键控制
(1)首先在原理图中找到按键key对应的控制引脚,通过检测引脚电平变化判断按键是否被按下。
电路图中的电容起到消抖的作用(属于硬件消抖,也可以使用软件消抖)。当按键松开时因为有上拉电阻R11的存在PB12引脚处的电压约等于3.3V,当按键按下时,PB12引脚处的电压与GND相等为0V,这里我们需要将PB12的引脚模式设置为浮空输入模式,用于读取PB12处的电压值来判断按键是否被按下。
根据需求,在cubemx中配置对应GPIO引脚模式,生成代码后在while循环中不断的检测PB12引脚的电平状态,如果为低电平则表示按键被按下,再控制LED小灯连接的引脚输出对应的电平让小灯亮起来。这里我们使用到的是HAL_GPIO_ReadPin()函数,用来读取PB12引脚处电平状态
然后控制led等是否亮起即可。
还有一种情况:按下按键小灯亮起,再次按下小灯熄灭
if判断语句,当按键按下后,控制LED灯引脚电平翻转,但需要注意的是,这里要加入while循环等待按键松开(如果不加,在按键按下,LED引脚电平将不断翻转,会出现LED灯亮灭紊乱现象)
三、GPIO的八大模式
在stm32芯片手册中可以看到这样一张图片。
由于芯片内部电路所能承受的电压有限,因而从I/O引脚向里是两个保护二极管。当有静电等瞬间电压波动进入I/O引脚时若此电压大于VDD 3.3v则上方的保护二极管导通,将电压引入电源由电源网络吸收。当波动电压小于VSS也就是0v时,下方保护二极管导通,波动电压被引入GND中吸收。
此外在STM32芯片中有一部分I/O口可以做到5V容忍(可以承受5V电压作为高电平输入),这种I/O口的上方保护二极管电压为5V。
在芯片手册中有一张GPIO引脚定义表,表中I/O level为FT的引脚 便是5v容忍引脚
1、推挽输出与开漏输出
在上图的输出驱动器模块可以看到被输出控制模块控制的两个MOS:P-MOS和N-MOS(两个被控制的开关),P-MOS上连接的是VDD(3.3V高电平)、N-MOS下连接的是VSS(0V的低电平)。
STM32的输出模式分为两类:推挽输出和开漏输出
在推挽输出模式下,P-MOS和N-MOS协同工作,当控制I/O口输出高电平时,P-MOS被激活、N-MOS关闭,此时VDD与I/O引脚连通输出3.3v高电平。同理当控制I/O口输出低电平时,P-MOS关闭、N-MOS被激活,此时VSS与I/O引脚连通输出0v低电平。(在该模式下,其具有一定的电压和电流驱动能力,但在推挽输出模式下最高只能输出3.3v高电压,而有的外设设备3.3v还达不到工作电压,需要对外设接入外部电源,如果仍需要通过此I/O控制外设,则需要使用开漏输出,连接外设,并在外设的另一端接入满足外设工作的电源模块为其提供电压)
在开漏输出模式下,只有N-MOS工作, P-MOS一直处于断开状态。当控制I/O口输出高电平时,则N-MOS断开,整个I/O口处于高阻态或者说"断路",并不对外输出电平信号。当控制I/O口输出低电平时,N-MOS管被激活,VSS与I/O连接,I/O口输出低电平,此时如果外接电源模块。此时电路就有电压差,可以产生电流,其中的外设设备自然就可以工作。
总结:推挽输出可以控制I/O输出低电平和高电平,但输出的高电平只能是3.3v,对于需要更高或者更低电压驱动的外设设备显然不适用。而开漏输出只能控制I/O口输出低电平或者不输出电平信号,使用开漏输出的I/O口另一端一般都是连接电源模块,这使得其更加灵活可以对接更多的电压信号,但需要注意的是如果是外接的5V电源,则需要使用5V容忍的I/O(FT标识)才行,如果电压过高可能会损坏芯片。
2、复用推挽输出与复用开漏输出
如果输出控制来源于片上外设,则使用复用推挽输出与复用开漏输出,此时电平信号受片上外设控制。
3、浮空输入
有上图的输入驱动器模块可以看到,I/O口电平信号输入时,会经过两个电阻:上拉电阻和下拉电阻。
浮空输入时,上拉电阻和下拉电阻均处于断开状态,输入寄存器将直接读取I/O口电压信号。由上图可以看到I/O口的电平信号除了被输入数据寄存器读取还被模拟输入和复用功能输入读取。
4、上拉输入
上拉输入时,上拉电阻导通,会将I/O口电压上拉至3.3v
5、下拉输入
下拉输入时,下拉电阻导通,会将I/O口电压下拉至0v
6、模拟输入
模拟输入与其他两种不同,模拟输入是直接读取I/O口的真实模拟电压值(模拟信号),一般配合ADC使用,用来读取I/O口电压值。而输入数据寄存器和复用功能输入则是读取了I/O口的高低电平(统称为数字信号)
四、中断
更新中.......