野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25445|回复: 2

入门按键电灯程序问题

[复制链接]
发表于 2021-4-25 20:02:22 | 显示全部楼层 |阅读模式
我编写的一个按下按键,LED灯状态翻转的程序。
为什么我的程序LED和按键的初始化函数只能放在while(1)大循环内部才能正确运行,放在while(1)外面就不行?主程序如下,如果用红色部分就不亮,用绿色部分就可以正常运行。

main.c-------------------------------------------------------
//key0=PE4, 按下key0,绿色灯翻转

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "core_cm3.h"
#include "stdint.h"
#include "system_stm32f10x.h"
#include "bsp_key.h"
#include "bsp_led.h"

int main(void)
{
  /* 设置系统时钟为72M */
        SystemInit();
//        LED_GPIO_Config();
//        KEY_GPIO_config();

       
  while (1)
  {
        LED_GPIO_Config();
        KEY_GPIO_config();
    if(KEY_SCAN(KEY0_GPIO_PORT, KEY0_GPIO_PIN)        ==                KEY_ON)
                {
                LED_G_TOGGLE;
                }
  }
}       

bsp_led.c----------------------------------------------------------

//bsp: board support package 板级支持包
#include "bsp_led.h"

void LED_GPIO_Config(void)
{
        //定义GPIO初始化结构体变量
        GPIO_InitTypeDef GPIO_InitStructure;
        //结构体成员赋值为GPIOE的Pin5(即绿色LED),输出模式PP,速度50MHz
        GPIO_InitStructure.GPIO_Pin                =        LED_G_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode        =        GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed        = GPIO_Speed_50MHz;
        //初始化GPIO函数,配置结构体为GPIOE的Pin5(即绿色LED),输出模式PP,速度50MHz
        GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStructure);
        //开GPIOE的时钟
        RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);
       
       
//        //结构体成员赋值为GPIOB的Pin5(即红色LED),输出模式PP,速度50MHz
//        GPIO_InitStructure.GPIO_Pin                =        LED_R_GPIO_PIN;
//        GPIO_InitStructure.GPIO_Mode        =        GPIO_Mode_Out_PP;
//        GPIO_InitStructure.GPIO_Speed        = GPIO_Speed_50MHz;
//        //初始化GPIO函数,配置结构体为GPIOB的Pin5(即红色LED),输出模式PP,速度50MHz
//        GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStructure);
//        //开GPIOB的时钟
//        RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);
}

//LED状态翻转函数
void LED_TOGGLE()
{

}

bsp_key.c----------------------------------------------------------------------------
#include "bsp_key.h"
#include "stm32f10x_gpio.h"
void delay (unsigned int a)
{
        unsigned int i;
        unsigned int j;
for(i=a;i!=0;i--)
        {
        for(j=0xffff;j!=0;j--);
        }
}

void KEY_GPIO_config(void)
{
        //定义GPIO初始化结构体变量
        GPIO_InitTypeDef GPIO_InitStructure;
        //结构体成员赋值为GPIOE的Pin4(即Key0),上拉输入模式
        GPIO_InitStructure.GPIO_Pin                =        KEY0_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode        =        GPIO_Mode_IPU;
        //初始化GPIO函数,配置结构体为GPIOE的Pin4(即key0),上拉输入模式
        GPIO_Init(KEY0_GPIO_PORT, &GPIO_InitStructure);
        //开GPIOE的时钟
        RCC_APB2PeriphClockCmd(KEY0_GPIO_CLK, ENABLE);
}

uint8_t KEY_SCAN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
        if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)                ==                KEY_ON)
        {
        //消抖
                delay(1);
                if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)                ==                KEY_ON)
                {
                while((GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)                ==                KEY_ON));
                }
                delay(1);
                while((GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)                ==                KEY_ON));
                return(KEY_ON);
        }
        else return(KEY_OFF);               
}


回复

使用道具 举报

发表于 2021-4-26 13:07:57 | 显示全部楼层
你的这情况我也遇到过。灯和按键配置时,那个GPIGx端口的时钟使能要放到初始化的前面。换一下位置就可以了。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-4-26 18:56:20 | 显示全部楼层
huang2015 发表于 2021-4-26 13:07
你的这情况我也遇到过。灯和按键配置时,那个GPIGx端口的时钟使能要放到初始化的前面。换一下位置就可以了 ...

完美解决了我的问题,感谢兄弟!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 13:09 , Processed in 0.042489 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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