前言
从这篇文章开始,我们讲解 stm32 f103 ,详细介绍各个模块的知识。
一、LED 原理图
参考 原理图:
可以看到 对于 103 板子,有 3 个 LED:
分别为 LED1 , LED2 , LED3 ;分别对应 io 端口 PB0 , PB1 ,PB5。
可以看到 LED 左边 接 3V 的电压,要想点亮 LED,只需在 右边的 io 端口输出 低电平 即可。
反之,要想 熄灭 LED,就在 右边的 io 端口输出 高电平 。
我这里的是 RGB灯,可以闪烁不同的颜色:红,绿,蓝。
二、CubeMX创建工程
选择芯片
选择 Debug 模式
选择外部时钟
配置系统时钟,在 红框中输入 72 ,然后点击 回车 两次,即可配置好。
配置 io 引脚 为 输出引脚
设置工程模式和版本
选取加入.c /.h文件(便于编写代码)
创建工程
三、LED 相关函数
1. 输出电平函数:
功能 :控制一个 GPIO 引脚输出 高 或者 低 电平。
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
1
例如: 点亮 LED1
// 根据原理图,点电平点亮 led HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
1
2
2. 延时函数:
功能:作为 毫秒 级延迟的函数。
__weak void HAL_Delay(uint32_t Delay)
1
例如:延迟 500 ms(毫秒)
HAL_Delay(500);
1
3. 翻转电平函数:
功能 :控制一个 GPIO 引脚电平 翻转 ,调用一次电平 翻转一次。
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); 1
例如:让 led 闪烁:
方法一:
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);
1
2
3
4
方法二:
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); HAL_Delay(500); 1
2
四、详细代码
由于我们采用 封装的方法来写程序:
函数封装:
函数封装是指将一组相关的功能封装到一个函数中,以便重复使用。它可以帮助程序员更有效地编写代码,并减少重复代码的重复编写。
所以 , 我们将 led 程序用一个 .c .h 文件封装起来,这样便于我们对代码进行修改与移植。
在 .c 里进行代码的实现 ;.h 里进行代码的声明和宏定义。
在 led.h 文件中声明 函数 :
#ifndef _LED_H #define _LED_H /*led 初始化*/ void Led_init(void); /* led 点亮 */ void Led_on(void); /* led 熄灭 */ void Led_off(void); #endif
在 led.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 中进行调用:
Led_on(); HAL_Delay(500); Led_off(); HAL_Delay(500);
1
2
3
4
注意: 最好在 main 里面 初始化 led , 先让 led 全部熄灭,这样便于观察, 调用 Led_init 函数
实验现象 :
对于RGB 灯闪烁的实验现象,我放在了 B占,有兴趣的可以看看,在以下网址:
https://www.bilibili.com/video/BV1384y1J7tr/?vd_source=986c364d205fa1124b337bc665f57c4f
总结
下篇文章我们讲解 按键 的驱动程序,大家可以自己试试 写一个 流水灯,跑马灯。
代码 源码:
stm32f103 点亮 LED程序 源码