STM32f103 CubeMX封装 led程序

举报
糖果罐子 发表于 2023/10/31 20:39:44 2023/10/31
【摘要】 > 本文代码使用 `HAL` 库。@[TOC](文章目录)---# 前言从这篇文章开始,我们讲解 **stm32 f103** ,详细介绍各个模块的知识。---# 一、LED 原理图参考 原理图:可以看到 对于 103 板子,有 3 个 LED:分别为 ==LED1 , LED2  , LED3== ;分别对应 io 端口 ==PB0 , PB1 ,PB5==。可以看到  `LED 左边 接...

> 本文代码使用 `HAL` 库。

@[TOC](文章目录)

---
# 前言
从这篇文章开始,我们讲解 **stm32 f103** ,详细介绍各个模块的知识。

---
# 一、LED 原理图
参考 原理图:

可以看到 对于 103 板子,有 3 个 LED:
分别为 ==LED1 , LED2  , LED3== ;分别对应 io 端口 ==PB0 , PB1 ,PB5==。

可以看到  `LED 左边 接 3V`  的电压,要想点亮 LED,只需在 右边的 `io 端口输出 低电平` 即可。
反之,要想 `熄灭 LED`,就在 右边的 `io 端口输出 高电平` 。

我这里的是 RGB灯,可以闪烁不同的颜色:红,绿,蓝。
![在这里插入图片描述](https://img-blog.csdnimg.cn/75cc7fb175ff4799b0daca051bf48a5d.png)



# 二、CubeMX创建工程
1. 选择芯片
![在这里插入图片描述](https://img-blog.csdnimg.cn/951e644a478a4c648ccd4b776e47901c.png)
2. 选择 Debug 模式
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e2b25670f6a4bc8974be436d52bef49.png)
3. 选择外部时钟
![在这里插入图片描述](https://img-blog.csdnimg.cn/c4cf418c573c4192825819ac1984cc6f.png)
4. 配置系统时钟,在 红框中输入 72 ,然后点击 回车 两次,即可配置好。
![在这里插入图片描述](https://img-blog.csdnimg.cn/01897a074b1b4ab68247208742990314.png)
5. 配置 io 引脚 为 输出引脚
![在这里插入图片描述](https://img-blog.csdnimg.cn/6258cf8de001475b8c3fc35adc338ee9.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/a05cd5e41c524fa89a9851887a3eb718.png)

6. 设置工程模式和版本
![在这里插入图片描述](https://img-blog.csdnimg.cn/4ba62069fa5442da954a804f2492a5fb.png)
7. 选取加入.c /.h文件(便于编写代码)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1638a2a712854e48b01ededf0cc9c51f.png)
8. 创建工程
![在这里插入图片描述](https://img-blog.csdnimg.cn/1abb22f5f93c4f1a813a2cb9b916927e.png)
# 三、LED 相关函数
### 1. 输出电平函数:
功能 :控制一个 *GPIO* 引脚输出 高 或者 低 电平。

```c
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
```
>例如: 点亮 LED1

```c
// 根据原理图,点电平点亮 led
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
```
### 2. 延时函数:
功能:作为 ==毫秒== 级延迟的函数。

```c
__weak void HAL_Delay(uint32_t Delay)
```
>例如:延迟 500 ms(毫秒)

```c
HAL_Delay(500);
```
### 3. 翻转电平函数:
功能 :控制一个 *GPIO* 引脚电平 翻转 ,调用一次电平 ==翻转一次==。
```c
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
```
>例如:让 led 闪烁:
- 方法一:

```c
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(500);
```


- 方法二:
```c
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_Delay(500);
```

 
# 四、详细代码
由于我们采用 `封装`的方法来写程序:
> 函数封装:
> 函数封装是指将一组相关的功能封装到一个函数中,以便重复使用。它可以帮助程序员更有效地编写代码,并减少重复代码的重复编写。

所以 , 我们将 led 程序用一个 ==**.c .h**== 文件封装起来,这样便于我们对代码进行修改与移植。

**在 .c 里进行代码的实现 ;.h 里进行代码的声明和宏定义。**
![在这里插入图片描述](https://img-blog.csdnimg.cn/5318654d4ac742828ce63a9aca9a0024.png)
- 在 led.h 文件中声明 函数 :

```c
#ifndef _LED_H
#define _LED_H

/*led 初始化*/
void Led_init(void);

/* led 点亮 */
void Led_on(void);  

/* led 熄灭 */
void Led_off(void);

#endif

```
- 在 led.c 中 进行函数的实现:

```c
#include "led.h"
#include "main.h"

//led 初始化
void Led_init(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
/* led 点亮 */
void Led_on(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
}
/* led 熄灭 */
void Led_off(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
```
- 在 main 中进行调用:

```c
  Led_on();
  HAL_Delay(500);
  Led_off();
  HAL_Delay(500);
```


`注意: 最好在 main 里面 初始化 led , 先让 led 全部熄灭,这样便于观察, 调用 Led_init 函数`

---
### 实验现象 :
对于RGB 灯闪烁的实验现象,我放在了 B占,有兴趣的可以看看,在以下网址:

https://www.bilibili.com/video/BV1384y1J7tr/?vd_source=986c364d205fa1124b337bc665f57c4f

# 总结
下篇文章我们讲解 **按键** 的驱动程序,大家可以自己试试 写一个 流水灯,跑马灯。



### 代码 源码:
[stm32f103 点亮 LED程序 源码](https://download.csdn.net/download/wuyiyu_/87484450)

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。