STM32实现通断检测装置(基于 STM32F103C6T6A + HAL 库)

一、硬件准备

1. STM32F103C6T6A + STLink 仿真器

2. LED 1 只

3. 杜邦线母对母 2 条,公对母 2 条

4. 面包板 1 块


二、线路连接

1. STM32核心板 PA1、PA2 接公对母杜邦线 2 条,末端公头悬空,等待插入面包板孔检测通断。

2. LED 接母对母杜邦线 2 条,正极接 PA3,负极接 GND。


 

三、端口配置

1. PA2、PA3 设置为 GPIO_Output

2. PA1 设置为 GPIO_Input


 

四、代码编写

1. 改写 GPIO 初始化函数:

 1 static void MX_GPIO_Init(void)
 2 {
 3   GPIO_InitTypeDef GPIO_InitStruct = {0};
 4 /* USER CODE BEGIN MX_GPIO_Init_1 */
 5 /* USER CODE END MX_GPIO_Init_1 */
 6 
 7   /* GPIO Ports Clock Enable */
 8   __HAL_RCC_GPIOA_CLK_ENABLE();
 9 
10   /*Configure GPIO pin Output Level */
11   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
12 
13   /*Configure GPIO pins : PA2 PA3 */
14   GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
15   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
16   GPIO_InitStruct.Pull = GPIO_NOPULL;
17   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
18   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
19 
20   /*Configure GPIO pin : PA1 */
21   GPIO_InitStruct.Pin = GPIO_PIN_1;
22   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
23   GPIO_InitStruct.Pull = GPIO_PULLDOWN;
24   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
25 
26 /* USER CODE BEGIN MX_GPIO_Init_2 */
27 /* USER CODE END MX_GPIO_Init_2 */
28 }

改写的代码只有第 23 行,电平设为低,也就是接受高电平输入。

2. main 初始化部分加入 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); 使 PA2 输出高电平用以通断检测。

3. main 循环部分:

1 if(GPIO_PIN_SET == HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1))
2 {
3     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
4 }
5 else
6 {
7     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
8 }

意思是检测 PA1 的输入,如果为高电平则控制 PA3 接 LED 灯亮,否则灯灭(通亮断灭)。


 

五、测试运行

烧写代码后,将 PA1 PA2 连接的杜邦线末端公头分别插入面包板的两个孔,若 LED 灯亮,则表示两孔连通,否则为断开。

如此便实现了通断检测的功能。

posted @ 2024-11-27 09:41  永恒月华  阅读(306)  评论(0)    收藏  举报