概述
文章目录
- 前言
- 一、准备工作
- 二、点亮一盏LED灯
- 1.配置工程
- 2.代码实现
- 3.程序烧录注意
- 三、按键控制LED灯
- 1.配置工程
- 2.代码实现
- 按键控制
- 按键进阶1:
- 按键进阶2
- 3.基于自己理解写的多次按键控制
- 总结
前言
单片机相当于是一种微型的电脑,我们可以利用它实现许多功能,而stm32以其独特的性能优势脱颖而出,很多人都开启了学习stm32的学习,本文就来记录一下我学习最小系统板stm32f411CEU6的小小历程以及学习的基础内容,希望能以这种方式让自己进步,内容相当基础,大佬勿喷。
一、准备工作
我主要学习的是基于HAL库进行开发的内容,需要提前下载好keil 5,STM32CubeMX的软件,买好单片机、调试器以及杜母线。
二、点亮一盏LED灯
提示:点亮LED灯算得上是每个人学习stm32的最最基础部分
1.配置工程
首先应该在cubeMX中根据自己的芯片原理图配置自己LED灯的GPIO引脚,我的是PC13,即配置它就好了。如图所示:
LED的低电平与GND接近,低电平则亮;反之高电平与VCC接近,则灭。
因此,选择high是为了在最初时LED灯是灭的,再经过我们的代码实现灯亮。output push pull(推挽输出)具有一定的驱动能力,有接VCC和GND的两个开关,即3.3V和0V两种电压。而开漏输出则只有接GND的一个开关,故有可能出现0~3.3V的不确定任意值,所以一般少用。
2.代码实现
在main.c的while中的bigin与end之间写代码,否则之后会消失。
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
//让LED由高电平(灭)变为低电平(亮)
HAL_Delay(1000);//延迟1000ms
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
//再高电平
HAL_Delay(1000);//延迟1000ms
3.程序烧录注意
由于我使用的并非ST-Link,所以需要进行一些修改,根据自己情况进行选择。
修改完成后编译、下载即可。
三、按键控制LED灯
1.配置工程
LED部分和之前一样,以下为KEY部分
如图所示:
2.代码实现
按键控制
仍在main.c的while中的begin与end之间写代码.
代码如下:
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET)
HAL_GPIO_WritePin (GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
else HAL_GPIO_WritePin (GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
按键进阶1:
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
uint8_t flag=0;//提前定义该种状态
/* USER CODE END 2 */
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET&&flag==0 )
{
HAL_Delay (10);//消抖
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET&&flag==0 )
{
flag=1;
HAL_GPIO_TogglePin (GPIOC,GPIO_PIN_13);//翻转电平
}
}
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_SET&&flag==1 )
{
HAL_Delay (10);//消抖
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_SET&&flag==1 ) flag=0;
//由于用的是TogglePin这个函数,相对于WritePin在这里用更加简便,直接让flag=0回到之前的循环,再翻转电平,这就是定义了flag的优点
}
这两种代码实现的效果是不同的:第一种是按下就亮,松开就灭;第二种是按一下亮,再按一下灭,如此循环。
按键进阶2
利用回调函数优化进阶1中的代码,由于我的单片机只有一个LED,所以写不写这个函数实现都无所谓,不过这种方法确实有必要掌握,可以使得代码内部模块化,当有多个LED需要控制时,这种方法可以很好地简化内部结构,更方便理解。
可以导入一个自己定义的头文件,在其中写自己定义的函数,把flag变为数组的形式,因此可以调用多个LED灯,其他思想是类似的。3.基于自己理解写的多次按键控制
由于之前一直不能体会到TogglePin函数于WritePin的各自妙用,也尝试着用WritePin来写这个按两次亮,再按两次灭的功能,但均以败告终,后来才发现TogglePin可以很好地实现
/* USER CODE BEGIN 2 */
uint8_t flag=0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET&&flag==0 )
{
HAL_Delay (10);
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET&&flag==0 ) flag=1;
}
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_SET&&flag==1 )
{
HAL_Delay (10);
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_SET&&flag==1 ) flag=2;
}
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET&&flag==2 )
{
HAL_Delay (10);
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET&&flag==2 )
{
flag=3;
HAL_GPIO_TogglePin (GPIOC,GPIO_PIN_13);
}
}
if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_SET&&flag==3 ) flag=0;
效果确实比较low,但是也算是有自己的想法吧
总结
以上就是今天分享的内容,本文仅仅简单介绍了点亮LED灯以及按键控制LED灯,本人刚学,还有众多不足之处,请各位多多包涵,愿各位能够不吝赐教。
最后
以上就是和谐小土豆为你收集整理的记录1——stm32f411CEU6之点亮一盏LED灯+按键控制LED灯前言一、准备工作二、点亮一盏LED灯三、按键控制LED灯总结的全部内容,希望文章能够帮你解决记录1——stm32f411CEU6之点亮一盏LED灯+按键控制LED灯前言一、准备工作二、点亮一盏LED灯三、按键控制LED灯总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复