高中生
最后登录1970-1-1
在线时间 小时
注册时间2020-12-27
|
我编写的一个按下按键,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);
}
|
|