IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 教程1—stm32CubeMx—HAL库—按键LED实验 -> 正文阅读

[嵌入式]教程1—stm32CubeMx—HAL库—按键LED实验

教程1—stm32CubeMx—HAL库—按键LED实验

写在前面:本专栏的所有代码都是在H743VIT6的基础上开发的,本人接触这块板子的时间也不长,写这个的目的是给自己规定一个ddl,很多具体管脚的用法可以直接在IDE里面看见。因为时间紧迫,文章力求简单明了,以功能实现为目标,如有错误,希望各位斧正。

一、初建工程+简单的GPIO设置

右键工作区,新建stm32工程,进入界面,直接选择自己芯片的型号(教程中使用的是H743VIT6X)。
怎么判断自己的芯片的型号
板载芯片一般在开发版上可以直接看到,看的时候用手电筒照一照,就可以看见芯片上的型号。工程建立,选择芯片的时候也会有相应芯片的样子。
在这里插入图片描述
如图,我们直接选择芯片之后就可以点击next进行下一步:
在这里插入图片描述
然后自己编一个名字就能完成工程建造。
新建工程之后,我们就可以开始设置基本每一个代码模块使用都会用到的板块(时钟和),基本操作可以参见
【STM32】STM32CubeMX教程二–基本使用(新建工程点亮LED灯)
在这里插入图片描述
如果想要点亮单片机板载上的小灯,需要先查datasheet看led灯的管脚是什么,比如H743VIT6X的灯泡管脚就是PE3。
怎么查找小灯泡的管脚—原理图
本人一般喜欢直接查找原理图,H743这块板子管脚已标到相应的引针处,查看原理图可以很快找到功能管脚。请添加图片描述
其它的芯片同理。
查找到管脚之后,设置为GPIO-OUTPUT,设置的configuration如下:请添加图片描述
至此,我们完成对led灯的初始化。
根据这个原理图我们也可以完成对开关的初始化,以K1为例,可以看见K1的管脚为PC13,设置开关一般和GPIO中断相挂钩,所以我们对开关的设置为:
请添加图片描述
还有一件特别特别重要的事情就是,一定要在配置的时候开启全局中断!(本人自己需要开的GPIO中断有一点多),line的意思是不同的GPIO位于不同的中断线(EXIT)上的,这个中断线也一般是由端口号(PIN)进行区分的。
请添加图片描述
GPIO的中断线位可以在这里面看见:
请添加图片描述

二、实验板块

代码块总结

// 常见的HAL函数
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET); //写信号GPIO_SET:1 GPIO_RESET:0
HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13);//读取数字信号 返回值:GPIO_SET/GPIO_RESET
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);//反转当前状态
HAL_Delay(500);//延时ms

至此,我们已经设置完一个KEY1和一个LED灯。下面开始做一些实验。

实验1——流水灯

如果你的单片机有足够多的LED灯,比如rm的A类开发板,上面有八个LED小灯可以闪烁,那么就可以尝试做一做流水灯,代码实现如下:

// 小兔子的实验——流水灯
//PIN1在pin初始化界面可以看到,也可以crtl进初始化代码区看具体的pin,h743只有一个led灯,但是这个开发板有8个灯,具体的灯只需要改一改管脚号即可
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_1);
	  HAL_Delay(500);//延时500ms
	  HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_2);
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_3);
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_4);
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_5);
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_6);
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_7);
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_8);
	  HAL_Delay(500);
	  MX_GPIO_Init();
	  //初始化可以全部关掉LED灯,当然也可以自己再关一遍
	 /* USER CODE END 3 */

如果你没有那么多的LED灯,那么用面包板搭一个流水灯也可,用GPIO输出模式,分别给八个LED灯供电,代码跟上面的一样,只是注意管脚的不同。

实验2—自画键盘PCB实验

实验室内部自画了一个小的无脑键盘,只需要通过读键盘的电平就可以实现中断功能,但是由于键盘的抖动比较大,还是需要设置一个中断消抖实现相应的功能。

请添加图片描述
键盘不接的时候默认是接地的,如果把输出的GPIO设置为上拉模式,则只有在按下的时候为高的,如果我们要实现按键识别的话,最好开中断实现这些功能。

// 变量的定义
/* USER CODE BEGIN PD */
//	int n = 0;
	uint16_t num = 0;
	uint16_t sum = 0;
	uint16_t array[32] = { 0 };
	uint16_t i = 0;
/* USER CODE END PD */

// 小兔子的实验——按键显示数字
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
	/* Prevent unused argument(s) compilation warning */
	switch(GPIO_Pin)
	{

		HAL_Delay(20);/* 延时一小段时间,消除抖动 */

	    case GPIO_PIN_13:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_SET)
				HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_3);
			__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);
			break;
		case GPIO_PIN_1:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1)==GPIO_PIN_RESET)
				num = num*10 +0;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
		    break;
		case GPIO_PIN_9:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==GPIO_PIN_RESET)
				num = num*10 +1;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9);
		    break;
		case GPIO_PIN_7:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_RESET)
				num = num*10 +2;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_7);
		    break;
		case GPIO_PIN_5:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)==GPIO_PIN_RESET)
				num = num*10 +3;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);
		    break;
		case GPIO_PIN_3:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==GPIO_PIN_RESET)
				num = num*10 + 4;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
		    break;
		case GPIO_PIN_6:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_6)==GPIO_PIN_RESET)
				num = num*10 + 5;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_6);
		    break;
		case GPIO_PIN_4:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_4)==GPIO_PIN_RESET)
				num = num*10 + 6;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
		    break;
		case GPIO_PIN_2:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_2)==GPIO_PIN_RESET)
				num = num*10 + 7;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
		    break;
		case GPIO_PIN_0:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_0)==GPIO_PIN_RESET)
				num = num*10 + 8;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
		    break;
		case GPIO_PIN_11:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */
			if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_11)==GPIO_PIN_RESET)
				num = num*10 + 9;
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_11);
		    break;
		case GPIO_PIN_15:
			HAL_Delay(20);/* 延时一小段时间,消除抖动 */

			for(i=0;i<=31;i++)
			{
				array[i] = 0;//对存储值,存储数组进行初始化
			}
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)==GPIO_PIN_RESET)
				{sum = num;
				num = 0;}
			i = 0;
		    while (sum!=0)//对按键输入对数字进行二制化处理
		    {
		        array[i] = sum % 2;
		        i++;
		        sum = sum / 2;
		    }
		    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_15);
		    break;
		default:break;
	}
	/* NOTE: This function Should not be modified, when the callback is needed,
	 the HAL_GPIO_EXTI_Callback could be implemented in the user file
	 */
}

具体的管脚要根据自己在键盘上是怎么接的来定,但要注意中断里的delay函数不能用得太猛,否则会卡死在中断里面。(虽然但是,HAL库的按键中断其实特别容易卡死,减小一下delay的时间救一下)

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 13:27:32  更:2021-07-28 13:27:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:37:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码