野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1022|回复: 3

控制LED灯时加while函数灯很亮,不加很暗并且颜色不对

[复制链接]
发表于 2023-10-23 09:47:36 | 显示全部楼层 |阅读模式

前提:使用固件库控制led灯亮红色,编写代码已实现,但出现了偏差
问题:main主函数中,加while函数灯很亮,不加很暗并且颜色不对

以下是代码,请大神解惑
下面是bsp_lcd.c代码

#include "stm32f10x.h"
void LED_GPIO_Conifg(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  GPIO_Init(GPIOB, &GPIO_InitStruct);
         
        GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_1;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
}

下面是bsp_led.h代码

#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "stm32f10x.h"
void LED_GPIO_Conifg(void);
#endif /*__BSP_LED_H*/

下面是main代码

#include "stm32f10x.h"
#include "bsp_led.h"
int main(void)
{
        #if 0
        while(1)
        {LED_GPIO_Conifg();}   //灯很亮,并且控制颜色正确
        #endif
        #if 1
        LED_GPIO_Conifg();  //灯暗,并且颜色不正确
        #endif
}
void SystemInit(void)
{
       
}



回复

使用道具 举报

发表于 2023-10-25 09:43:32 | 显示全部楼层
1.GPIO_Init(GPIOB, &GPIO_InitStruct);函数应该放在最后,你要配置完GPIO_InitStruct再去调用GPIO_Init;
所以,你没有正确配置IO,所以灯暗,并且颜色不对.
2.因为GPIO_InitStruct是临时变量,你使用while(1)循环调用,可能每次进入LED_GPIO_Conifg函数给GPIO_InitStruct分配的是同一地址,所以恰好你上一次写入结构体的数据还被保存在同一位置,所以第二次循环的时候GPIO_Init函数正确的初始化了.
这也是为什么加上while(1)现象正常.这一点只是我的猜测.不知我解释是否清楚.你可以使用单步调试,看第一次循环是否与不加while(1)现象一致,第二次循环出现了你预期的现象.
同样你也可以通过DEBUG观察第一次循环与后面循环你GPIO_Init函数调用时,观察GPIO_InitStruct结构体里面数据的区别来验证这点
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-10-25 15:01:28 | 显示全部楼层
Nalimca 发表于 2023-10-25 09:43
1.GPIO_Init(GPIOB, &GPIO_InitStruct);函数应该放在最后,你要配置完GPIO_InitStruct再去调用GPIO_Init;
...

是这样的
回复 支持 反对

使用道具 举报

发表于 2023-10-28 18:36:22 | 显示全部楼层
你这问题多了,基本的编程先学习一下吧。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 06:54 , Processed in 0.105851 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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