教程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_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
HAL_Delay(500);
至此,我们已经设置完一个KEY1和一个LED灯。下面开始做一些实验。
实验1——流水灯
如果你的单片机有足够多的LED灯,比如rm的A类开发板,上面有八个LED小灯可以闪烁,那么就可以尝试做一做流水灯,代码实现如下:
while (1)
{
HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_1);
HAL_Delay(500);
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灯,那么用面包板搭一个流水灯也可,用GPIO输出模式,分别给八个LED灯供电,代码跟上面的一样,只是注意管脚的不同。
实验2—自画键盘PCB实验
实验室内部自画了一个小的无脑键盘,只需要通过读键盘的电平就可以实现中断功能,但是由于键盘的抖动比较大,还是需要设置一个中断消抖实现相应的功能。
键盘不接的时候默认是接地的,如果把输出的GPIO设置为上拉模式,则只有在按下的时候为高的,如果我们要实现按键识别的话,最好开中断实现这些功能。
uint16_t num = 0;
uint16_t sum = 0;
uint16_t array[32] = { 0 };
uint16_t i = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
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;
}
}
具体的管脚要根据自己在键盘上是怎么接的来定,但要注意中断里的delay函数不能用得太猛,否则会卡死在中断里面。(虽然但是,HAL库的按键中断其实特别容易卡死,减小一下delay的时间救一下)
|