【蓝桥杯——物联网设计与开发】基础模块1 - GPIO输出

目录

一、LED

(1)原理图

(2)STM32CubeMX 软件配置

(3)代码编写

(4)实验现象

二、继电器

(1)原理图

(2)STM32CubeMX 软件配置

(3)代码编写

(4)实验现象

三、LED & 继电器 接口函数封装

四、踩坑日记


一、LED

(1)原理图

        在蓝桥杯物联网竞赛实训平台中,每个节点都有一个板载 LED,即 LD5;

        🟢️LED 原理图如图1所示:

        LD5 是一个发光二极管,其左侧连接芯片引脚 PC15,右侧连接 VDD_NODE_A,即节点电源。

  • 当引脚 PC15 输出低电平时,LD5 两侧压差大于二极管导通电压而导通,LD5 点亮
  • 当引脚 PC15 输出高电平时,LD5 两侧压差小于二极管导通电压而截止,LD5 熄灭
图1        LD5电路原理图

(2)STM32CubeMX 软件配置

1️⃣打开软件,在搜索栏中搜索 STM32L071KB 系列 → 在右侧下方选择 UFQFPN32 封装 → 点击 "Start Project"

图2        STM32CubeMX芯片选择

2️⃣点击 "Clock Configuration" 栏 → 在系统时钟选择器处,选择 "PLLCLK" (即锁相环时钟) → 在 "HCLK(MHz)" 框中填写最大时钟 32(MHz) → 回车即可自动配置时钟树;

图3        时钟配置

3️⃣回到 "Pinout & Configuration" 栏 → 点击引脚 PC15 → 选择 GPIO_Output 模式(此处默认为推挽输出);

图4        LD5引脚配置

4️⃣点击 "System Core” → 点击 "SYS" → 点击 "Debug Serial Wire",从而配置 Debug 串行线,有助于 Keil 编译器的 Debug 调试;

图5        Debug Serial Wire配置

5️⃣点击 "GPIO" → 点击引脚 PC15 → 将 "GPIO output level" 栏修改为 "High",即将 PC15 引脚初始化为高电平

⚠️此处修改不是必须的,应当根据题意要求进行配置,这里默认为上电熄灭;

图6        PC15引脚初始化配置

6️⃣点击 "Project Manager" 栏 → ⚠️注意 "Toolchain / IDE" 应当修改为 "MDK-ARM" → "Code Generator" 栏中配置如图8所示 → 生成代码,打开文件即可;

图7        工具链切换
图8        Code Generator配置

7️⃣生成代码后先编译❗️

        🟡️此处编译不成功,原因在于 Keil 版本问题,解决方法如下:

                如图10所示,点击魔术棒 → 将 "ARM Compiler" 栏更改为 V6.21 → 重新编译即可;

图9        编译未通过
图10        修改版本配置

8️⃣在魔术棒的 "Debug" 栏中,将下载器更改为 "CMSIS-DAP Debugger"  → 点击 "Settings" → 在 "Flash Download" 栏中,勾选 "Reset and Run";此时代码可以下载到开发板;

图11        下载器选项更改
图12        下载器设置

(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-LEDK2-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 点亮
图13        继电器原理图

(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);
}

四、踩坑日记

  • 30
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逝灮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值