目录
一、LED
(1)原理图
在蓝桥杯物联网竞赛实训平台中,每个节点都有一个板载 LED,即 LD5;
🟢️LED 原理图如图1所示:
LD5 是一个发光二极管,其左侧连接芯片引脚 PC15,右侧连接 VDD_NODE_A,即节点电源。
- 当引脚 PC15 输出低电平时,LD5 两侧压差大于二极管导通电压而导通,LD5 点亮;
- 当引脚 PC15 输出高电平时,LD5 两侧压差小于二极管导通电压而截止,LD5 熄灭;
(2)STM32CubeMX 软件配置
1️⃣打开软件,在搜索栏中搜索 STM32L071KB 系列 → 在右侧下方选择 UFQFPN32 封装 → 点击 "Start Project";
2️⃣点击 "Clock Configuration" 栏 → 在系统时钟选择器处,选择 "PLLCLK" (即锁相环时钟) → 在 "HCLK(MHz)" 框中填写最大时钟 32(MHz) → 回车即可自动配置时钟树;
3️⃣回到 "Pinout & Configuration" 栏 → 点击引脚 PC15 → 选择 GPIO_Output 模式(此处默认为推挽输出);
4️⃣点击 "System Core” → 点击 "SYS" → 点击 "Debug Serial Wire",从而配置 Debug 串行线,有助于 Keil 编译器的 Debug 调试;
5️⃣点击 "GPIO" → 点击引脚 PC15 → 将 "GPIO output level" 栏修改为 "High",即将 PC15 引脚初始化为高电平;
⚠️此处修改不是必须的,应当根据题意要求进行配置,这里默认为上电熄灭;
6️⃣点击 "Project Manager" 栏 → ⚠️注意 "Toolchain / IDE" 应当修改为 "MDK-ARM" → "Code Generator" 栏中配置如图8所示 → 生成代码,打开文件即可;
7️⃣生成代码后先编译❗️
🟡️此处编译不成功,原因在于 Keil 版本问题,解决方法如下:
如图10所示,点击魔术棒 → 将 "ARM Compiler" 栏更改为 V6.21 → 重新编译即可;
8️⃣在魔术棒的 "Debug" 栏中,将下载器更改为 "CMSIS-DAP Debugger" → 点击 "Settings" → 在 "Flash Download" 栏中,勾选 "Reset and Run";此时代码可以下载到开发板;
(3)代码编写
🟢️main函数
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET); // PC15输出低电平 - LD5点亮
HAL_Delay(500); // 延时500ms
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); // PC15输出高电平 - LD5熄灭
HAL_Delay(500); // 延时500ms
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
(4)实验现象
- LD5 以 1s 为间隔亮灭闪烁
二、继电器
(1)原理图
在蓝桥杯物联网竞赛实训平台上,除了 LD5,还有两个继电器。
这两个继电器分别带有 K1-LED 和 K2-LED。
🔵继电器原理图如图13所示:
继电器 RELAY1 左侧为 5V 电源,右侧为引脚 A_RELAY1,引脚 A_RELAY1 通过芯片 ULN2803(达林顿管)与芯片引脚 PA11 连接;
继电器 RELAY2 左侧为 5V 电源,右侧为引脚 A_RELAY2,引脚 A_RELAY2 通过芯片 ULN2803(达林顿管)与芯片引脚 PA12 连接;
- 当引脚 PA11 输出低电平时,通过 ULN2803 内部的反相器和放大器输出后, A_RELAY1 引脚电平为高电平,此时 RELAY 不通电,开关 K1 不被吸引,LD2 熄灭;
- 当引脚 PA11 输出高电平时,通过 ULN2803 内部的反相器和放大器输出后, A_RELAY1 引脚电平为低电平,此时 RELAY 通电,开关 K1 被吸引,LD2 点亮;
- 当引脚 PA12 输出低电平时,通过 ULN2803 内部的反相器和放大器输出后, A_RELAY2 引脚电平为高电平,此时 RELAY 不通电,开关 K2 不被吸引,LD3 熄灭;
- 当引脚 PA12 输出高电平时,通过 ULN2803 内部的反相器和放大器输出后, A_RELAY2 引脚电平为低电平,此时 RELAY 通电,开关 K2 被吸引,LD3 点亮;
(2)STM32CubeMX 软件配置
1️⃣将引脚 PA11 与 PA12 均配置为 GPIO_Output 模式即可;
(3)代码编写
🟢️main函数
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET); // PA11输出低电平 - LD2点亮
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); // PA12输出高电平 - LD3熄灭
HAL_Delay(1000); // 延时1000ms
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); // PA11输出高电平 - LD2点亮
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); // PA12输出低电平 - LD3熄灭
HAL_Delay(1000); // 延时1000ms
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
(4)实验现象
- 继电器1与继电器2每间隔 1s 交替吸合
- LD2 每间隔 1s 亮灭闪烁
- LD3 每间隔 1s 亮灭闪烁
三、LED & 继电器 接口函数封装
🟡️LED & 继电器 接口函数
/**
* @brief LED_Disp
* @param state_led 8位变量,第0位影响LD5状态,
* 第1位影响LD2状态,
* 第2位影响LD3状态,
* @retval None
*/
void LED_Disp(uint8_t state_led)
{
/* LD5 */
if((state_led & 1) == 1)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
/* LD2 K1- LED */
if((state_led & 2) == 0) // 注意此处判断为0,因为达林顿管中的反相器
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
/* LD3 K2 - LED */
if((state_led & 4) == 0) // 注意此处判断为0,因为达林顿管中的反相器
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
}