硬汉嵌入式论坛

 找回密码
 立即注册
查看: 995|回复: 6
收起左侧

[有问必答] bsp_IsLedOn()读取状态问题

[复制链接]

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2023-2-4 15:14:35 | 显示全部楼层 |阅读模式
请问,我在使用V5开发板测试LED灯的时候,读取LED3的状态是否亮灭,使用函数  bsp_IsLedOn(3) 不能正确读取,使用  HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_8)  函数就可以回读到正常的0或1。
/******************************************
    bsp_LedOn(3); //高电平
    //bsp_LedOff(3);//低电平
    bsp_DelayMS(100);
    bsp_IsLedOn(3);
    printf("\n\r");
    printf("LED3的状态 = %d\n\r", bsp_IsLedOn(3));

    HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_8);
    printf("\n\r");
    printf("GPIO_PIN_8状态 = %d\n\r", HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_8));

*****************************************/

以上是我在mian函数的写法,一下是我串口打印信息
/***********************
     LED3的状态 = 0
     GPIO_PIN_8状态 = 1
**********************/



然后我在看 bsp_IsLedOn()函数原型是如下
/********************************************
uint8_t bsp_IsLedOn(uint8_t _no)
{
        if (_no == 1)
        {
                if ((GPIO_PORT_LED1->ODR & GPIO_PIN_LED1) == 1)
                {

                        return 1;
                }
                return 0;
        }
        else if (_no == 2)
        {
                if ((GPIO_PORT_LED2->ODR & GPIO_PIN_LED2) == 1)
                {
                        return 1;
                }
                return 0;
        }
        else if (_no == 3)
        {
        if ( (GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == 1)
                {
                        return 1;
                }
                return 0;
        }
        else if (_no == 4)
        {
                if ((GPIO_PORT_LED4->ODR & GPIO_PIN_LED4) == 1)
                {
                        return 1;
                }
                return 0;
        }

        return 0;
}

************************************************************/

然后我把函数判断改成
        if ( (GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) != 0)
                {
                        return 1;
                }
                return 0;
        }

后即可判断正常
串口打印信息如下:
  LED3的状态 = 1
  GPIO_PIN_8状态 = 1


目前就是不知道哪里出现了问题,  ”!=0“   跟 “ == 1 ” 的问题吗

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2023-2-4 15:24:49 | 显示全部楼层
不能 == 1,比如你这个
   if ( (GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == 1)

要改成
   if ( (GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == GPIO_PIN_LED3)

GPIO_PIN_LED3有不同的bit
回复

使用道具 举报

8

主题

136

回帖

160

积分

初级会员

积分
160
发表于 2023-2-4 15:26:11 | 显示全部楼层
if ((GPIO_PORT_LED1->ODR & GPIO_PIN_LED1) == 1)肯定有问题啊, 这个只能判断Px0位, 无法判断其他位啊.
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-2-4 15:36:35 | 显示全部楼层
eric2013 发表于 2023-2-4 15:24
不能 == 1,比如你这个
   if ( (GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == 1)

你好!我是直接使用资料包里面 《V5-000程序模板》的bsp_led.c文件中的 bsp_IsLedOn() 函数.
我看判断条件都是
if ((GPIO_PORT_LED1->ODR & GPIO_PIN_LED1) == 1)
if ((GPIO_PORT_LED2->ODR & GPIO_PIN_LED2) == 1)
if ( (GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == 1)
这些的,不能用的话是不是这个函数要重新写?还是现在更新了新的模板?
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-2-4 15:52:17 | 显示全部楼层
eric2013 发表于 2023-2-4 15:24
不能 == 1,比如你这个
   if ( (GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == 1)

我是参考<V5-000程序模板>里面的 bsp_led.c文件里的

/*
*********************************************************************************************************
*        函 数 名: bsp_IsLedOn
*        功能说明: 判断LED指示灯是否已经点亮。
*        形    参:  _no : 指示灯序号,范围 1 - 4
*        返 回 值: 1表示已经点亮,0表示未点亮
*********************************************************************************************************
*/
uint8_t bsp_IsLedOn(uint8_t _no)
{
        if (_no == 1)
        {
                if ((GPIO_PORT_LED1->ODR & GPIO_PIN_LED1) == 1)
                {
            
                        return 1;
                }
                return 0;
        }
        else if (_no == 2)
        {
                if ((GPIO_PORT_LED2->ODR & GPIO_PIN_LED2) == 1)
                {
                        return 1;
                }
                return 0;
        }
        else if (_no == 3)
        {
        if ( (GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == 1)
                {

                        return 1;
                }

                return 0;
        }
        else if (_no == 4)
        {
                if ((GPIO_PORT_LED4->ODR & GPIO_PIN_LED4) == 1)
                {
                        return 1;
                }
                return 0;
        }

        return 0;
}


来调用的,这个现在是不能使用了吗?还是更新了新的模板?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2023-2-4 16:05:58 | 显示全部楼层
LSHY 发表于 2023-2-4 15:52
我是参考里面的 bsp_led.c文件里的

/*

这个函数有误,之前客户反馈过,忘了改了
按照我二楼的方法,自己手动修改下即可。


回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-2-4 16:57:43 | 显示全部楼层
eric2013 发表于 2023-2-4 16:05
这个函数有误,之前客户反馈过,忘了改了
按照我二楼的方法,自己手动修改下即可。

好的,非常感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 04:47 , Processed in 0.206534 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表