STM32入门
意法半导体公司推出STM32芯片。
只需动手。
第一步安装开发环境。
STM32CubeIDE
点灯大师
1.新建工程
File -> New -> STM32 Project
选择自己的开发版型号,输入项目名称,创建一个STM32工程。
点亮红色小灯的引脚为PB0(不了解的情况下,需要先阅读该开发板的开发手册如下图)
鼠标左键点击后将模式改为GPIO_OutPut模式。鼠标右键添加用户标签为LED_RED。
- STM32控制PA7的方式为推挽输出(Output Push Pull)
按住ctrl+s保存,自动跳转到main.c文件中
方式一:找到mian()函数程序入口,在while(1)括号内添加点灯代码,后运行。
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
方式二:
在图形界面
Pinout & Configuration -> System Core -> GPIO -> 点击PB0 ->将GPIO output level 改为 high -> ctrl +s 保存 直接运行
- 运行需要使用ST-LINK将开发板连接到电脑上。
控制小灯的亮灭
1.控制程序延后执行,单位ms(毫秒)
HAL_Delay(1000);
2.读取按键此时的电频状态
HAL_GPIO_ReadPin(KEY_GPIO_Pin,KEY1_Pin)
HAL_GPIO_ReadPin返回值为GPIO_PinState,即
typedef enum
{
GPIO_PIN_RESET = 0u,
GPIO_PIN_SET
} GPIO_PinState;
3.按键的浮空输入模式Nopushup -No pushDown(GPIO八大模式之一)以及上拉操作的实现
将此GPIO口处于一个高阻态的状态下,相当于芯片内部有一个很大的电阻,此时PB12处如果接的是上拉电源,则芯片读取到的PB12为高电平(上拉操作实现方法:使用电源将GPIO口处的电平拉高)
- 注意:上拉电源需要接一个电阻,此电阻称为上拉电阻,上拉也被称为加个上拉电阻。此电阻作用有四个作用:
- 确定逻辑电平:在数字电路中,某些引脚如果悬空(未连接),其逻辑电平可能不确定,容易受到外界噪声干扰,导致信号不稳定。通过上拉电阻,可以将引脚拉到一个确定的逻辑高电平(比如Vcc),避免悬空状态。
- 确保输入稳定:对于某些输入引脚,如果直接悬空,输入信号可能会因为噪声等干扰产生不确定性。上拉电阻提供了一个稳定的路径,将输入电平维持在高电平,确保输入状态稳定。
- 与开漏(open-drain)电路配合:在一些情况下(如I²C总线),设备的输出引脚可能是开漏(open-drain)或开集电极(open-collector)结构。这类输出电路只能拉低电平,无法拉高。此时,上拉电阻用于提供逻辑高电平,当设备不主动拉低时,电阻将输出引脚拉到高电平。
- 限制电流:上拉电阻还能限制电流的大小,防止短路时电流过大对电路造成损坏。
当KEY1按下导线接地(GND),此时芯片读取到的PB12为低电平
下拉操作:
将3.3V电源与GND进行交换就得到了下拉电路
此时当KEY1断开时,PB12与地线相连接,此时芯片读取到的PB12为低电平,当KEY1按下时,PB12与3.3V电源相连接,且设置了PB12为浮空输出状态,PB12处的电阻极大,此时芯片读取到的PB12则为高电平,与上拉正好相反。
此下拉电阻的作用:
-
确定逻辑电平:当输入引脚没有接入信号(悬空)时,可能会处于不确定状态,容易受到噪声或干扰。下拉电阻可以确保在引脚未被主动驱动时,将其逻辑电平拉到低电平(通常为0V),从而避免悬空状态。
-
防止浮动:在一些电路中,如果输入端悬空,可能会随机捕获干扰信号,导致逻辑状态漂移。通过下拉电阻,可以避免输入端在没有信号输入时浮动,确保引脚在没有外部驱动时处于稳定的低电平。
-
与开路结构配合:在某些应用场景中,电路可能只负责拉高电平,而不主动拉低(例如开路集电极或开漏输出)。在这种情况下,下拉电阻可以确保当输出引脚未被驱动时,引脚被拉到低电平。
-
提供明确的默认状态:下拉电阻可以为电路中的输入或输出引脚提供一个明确的默认状态,防止其在未连接或未驱动时进入未知状态。这在一些逻辑电路和输入按钮设计中尤为重要。
需要达到的能力:看到逻辑电路知道其是上拉操作还是下拉操作,什么状态下开关是松开,什么时候是按下。
如:看下图
可知,这是一个上拉操作的电路图,未按下KEY1时处于高电平GPIO_PIN_SET,按下时处于低电平(GPIO_PIN_RESET)
下图可知KEY2是一个不是上拉也不是下拉的电路图,当KEY2按下时没有电平的改变。此时你就疑惑了,这种按键如何检测其按下与否。下面介绍GPIO八大模式之一的上拉输入模式,
需要在图形界面Pinout & Configuration -> System Core -> GPIO -> 点击PB13 ->将GPIO Pull-up/Pull-down 改为 Pull-up -> ctrl +s 保存
更改成功后就与上面相同了。
)
4.翻转小灯状态
HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
每执行一次,会改变小灯的状态在GPIO_PIN_SET与GPIO_PIN_RET之间转换。
5.阅读下面代码,理解其逻辑
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)==GPIO_PIN_RESET) {
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
}else {
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
}
代码逻辑:当读取KEY1按下时(低电平RESET)将小灯点亮),当KEY1抬起时小灯熄灭。
代码二:
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)== GPIO_PIN_RESET){
HAL_Delay(10);
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)== GPIO_PIN_RESET){
HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
while(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)== GPIO_PIN_RESET){}
}
}
代码逻辑:
key为上拉操作,只有当key2按下时检测到低电平,延迟10ms(此区间为波动较大可软件消抖)后再次读取到低电平,就将LED_GREEN的状态改变,改变后,key2依然处于低电平,死等,等待到该状态结束。直到按键松开,循环才会结束,代码才能继续执行。
RESET){}
}
}
代码逻辑:
key为上拉操作,只有当key2按下时检测到低电平,延迟10ms(此区间为波动较大可软件消抖)后再次读取到低电平,就将LED_GREEN的状态改变,改变后,key2依然处于低电平,死等,等待到该状态结束。直到按键松开,循环才会结束,代码才能继续执行。