一 、控制原理

LED灯外部电路为上拉电路,所以单片机给低电平时LED点亮,高电平时熄灭

3144E的霍尔传感器两个引脚分别是3V3和GND,以及一个输出引脚。当无磁场时测得输出引脚与GND之间电压为1.85V,有磁场靠近时该引脚电压为0V。

通过单片机检测引脚状态,来实现LED的亮灭。程序运行前,添加一个LED闪烁动作。当附近无磁场时,LED灯熄灭,有磁场时LED灯点亮

两个LED灯分别是PF9,PF10,霍尔传感器输出引脚使用PC7

二、具体操作

第一步:CubeMX配置

  1. PC7GPIO_Input → 在GPIO设置中启用Pull-up

  2. PF9, PF10GPIO_Output → 初始电平设为High(LED默认灭)

  3. 生成代码

第二步:在main.c中添加逻辑

c

/* USER CODE BEGIN 2 */
// 可选:初始化时让LED闪一下,表示程序运行
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET); // 全亮
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);   // 全灭
/* USER CODE END 2 */

/* USER CODE BEGIN WHILE */
while (1)
{
    // 读取PC7的电平状态
    if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_7) == GPIO_PIN_RESET)  // 检测到低电平(有磁场)
    {
        // 点亮两个LED(低电平点亮)
        HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET);
        
        // 可选:串口输出调试信息
        // printf("磁场 detected!\r\n");
    }
    else  // 高电平(无磁场)
    {
        // 熄灭两个LED
        HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);
    }
    
    HAL_Delay(50);  // 延时50ms,避免过于频繁读取(去抖)
}
/* USER CODE END WHILE */

第三步:进阶版(带消抖,防止误触发)

c

/* USER CODE BEGIN 2 */
uint8_t magnetic_field_detected = 0;
/* USER CODE END 2 */

/* USER CODE BEGIN WHILE */
while (1)
{
    // 读取当前状态
    uint8_t current_state = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_7);
    
    // 状态变化检测(下降沿:高→低)
    if (current_state == GPIO_PIN_RESET && magnetic_field_detected == 0)
    {
        // 第一次检测到磁场,延时消抖
        HAL_Delay(20);
        
        // 再次确认
        if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_7) == GPIO_PIN_RESET)
        {
            magnetic_field_detected = 1;
            
            // 点亮LED
            HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
            
            // 可以在这里加一个计数或执行其他动作
        }
    }
    // 上升沿检测(低→高)
    else if (current_state == GPIO_PIN_SET && magnetic_field_detected == 1)
    {
        HAL_Delay(20);
        
        if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_7) == GPIO_PIN_SET)
        {
            magnetic_field_detected = 0;
            
            // 熄灭LED
            HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
        }
    }
    
    HAL_Delay(10);  // 主循环延时
}
/* USER CODE END WHILE */

✅ 验证步骤

  1. 无磁场时:PC7应该是稳定的高电平(3.3V),LED熄灭

  2. 有磁场时:PC7变为低电平(0V),LED点亮

  3. 磁场移除后:LED熄灭

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐