(二)STM32F407 cubemx按键点灯

2024-01-08 09:27:41

(二)STM32F407 cubemx按键点灯

     这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。

废话不多说直接开始主题,本人是基于STM32F407VET6芯片,但是意在你看懂这篇文章后,不管是F1,F4,H7等一系列系统点灯按键配置都能明白如何通过参考手册去学习配置。而不是Ctrl c,Ctrl v。
首先要明白一个知识点,led灯、按键需要用到什么,引脚输出功能,引脚读取功能?这些功能具体到底是什么?

数据手册内容

1.首先我得看看我F407开发板的原理图,我发现我的开发板电流是涌入电流(injected current)PC13,PC13需要拉低才能点亮LED。

在这里插入图片描述总注入电流(所有I/O和控制引脚之和),F407涌入的电流之和不能大于25mA,3.3V/360Ω=9.1mA满足条件。

在这里插入图片描述输出驱动电流
gpio(通用输入/输出)可以吸收或源高达±8ma,吸收或源高达±20ma(放宽VOL /VOH),但PC13, PC14和PC15可以吸收或源高达±3mA。PC13 ~ PC15的gpio在输出模式时,速度不能超过2mhz,最大负载30pf。这一部分内容是对于引脚拉高向外输出电流的必要知识点,但说实在的尽量不要用PC13-15去驱动led避免未知的麻烦,但是我这块开发板偏偏就是PC13,改不了了。

参考手册内容

在这里插入图片描述
在这里插入图片描述

根据原理图,
若是上拉电阻:按键未按下时引脚读取的是VDD高电平1,若按键按下input被短接直接读取GND低电平0,状态有明确对应关系符合要求。
若是下拉电阻:按键未按下时引脚读取电平为GND低电平0,当若按键按下input被短接直接读取GND低电平0,不管按下还是不按都没有变化始终是低电平0。不符合要求。

cubemx配置

时钟配置详见文一。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述输入模式根据要求配置成上拉模式,cubemx配置完成。

函数调用

在这里插入图片描述去hal库里面看看有什么函数是可以调用的。
在这里插入图片描述读取引脚函数,读取引脚输入状态,这个函数可以供按键使用。

在这里插入图片描述
状态改变函数,可改变输出状态。
go to definition后找到变量出处,SET对应1,RESET对应0。由上图知PC13需要为低电平0才可点亮LED灯,即选择状态为GPIO_PIN_RESET点亮。
在这里插入图片描述在这里插入图片描述
toggled切换状态函数,可用于按键按下后翻转当前状态。
基于以上编写主程序。

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_SET);  //熄灭LED
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_RESET); //点亮LED
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==0)
		{ 
				HAL_Delay(50);
				if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==0)
			{
				  while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==0);  //必须松开按键方可进入下一行程序
				  HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
			}
	  }
  }
  /* USER CODE END 3 */
}

在这里插入图片描述这一步作用是下载完程序之后自动复位,若没有此过程需要人工手动复位。切记下载完程序是需要复位的。

编写完程序后测试效果

F407按键点灯

代码链接百度网盘:
链接:https://pan.baidu.com/s/1qXNn2ARYShyCGsNaRbtLMg?pwd=qk8w
提取码:qk8w

文章来源:https://blog.csdn.net/weixin_52531699/article/details/135384911
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。