以下的代码烧录进去后,第一个按键能正常实现亮灭状态改变,但是第二个不行 板子是f103rct6
main 主函数
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"
#define GPIOB_ODR_Addr (GPIOB_BASE+0X0C)
#define PBout(n) *(unsigned int*)((GPIOB_ODR_Addr & 0xF0000000)+0x2000000+((GPIOB_ODR_Addr & 0x00FFFFFF)<<5)+(n<<2))
#define GPIOA_IDR_Addr (GPIOA_BASE+0X08)
#define PAin(n) *(unsigned int*)((GPIOA_IDR_Addr & 0xF0000000)+0x2000000+((GPIOA_IDR_Addr & 0x00FFFFFF)<<5)+(n<<2))
void Delay( uint32_t count)
{
for(; count!=0;count--);
}
int main(void)
{
LED_GPIO_Config();
KEY_GPIO_Config();
#if 0
while(1)
{
// GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);
// LED_R(ON);
PBout(2) = 1;
Delay(0xFFFFF);
// GPIO_ResetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);
// LED_R(OFF);
PBout(2) = 0;
Delay(0xFFFFF);
}
#else
while(1)
{
if( PAin(0) == KEY_ON)
{
while(PAin(0) == KEY_ON);
LED_R_TOGGLE;
}
if( PAin(1) == KEY_ON)
{
while(PAin(1) == KEY_ON);
LED_R_TOGGLE;
}
}
#endif
}
这是bsp_led.h函数
#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "stm32f10x.h"
#define LED_B_GPIO_PIN GPIO_Pin_2
#define LED_B_GPIO_PORT GPIOB
#define LED_B_GPIO_CLK RCC_APB2Periph_GPIOB
#define ON 1
#define OFF 0
//\ 续航符
#define LED_R(q) if(q)\
GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN); \
else \
GPIO_ResetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);
#define LED_R_TOGGLE {LED_B_GPIO_PORT->ODR ^= LED_B_GPIO_PIN;}
void LED_GPIO_Config(void);
#endif /*__BSP_LED_H*/
这是bsp_led.c函数
// bsp: board support package 板级支持包
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LED_B_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin = LED_B_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_B_GPIO_PORT, &GPIO_InitStruct);
}
bsp_key.C 函数
#ifndef __BSP_KEY_H
#define __BSP_KEY_H
#include "stm32f10x.h"
#define KEY_ON Bit_SET //1
#define KEY_OFF Bit_RESET //0
#define KEY1_GPIO_PIN GPIO_Pin_0
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY2_GPIO_PIN GPIO_Pin_1
#define KEY2_GPIO_PORT GPIOA
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOA
void KEY_GPIO_Config(void);
uint8_t Key_Scanf(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);
#endif /*__BSP_KEY_H */
bsp_key.h 函数
#include "bsp_key.h"
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);
RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);
}
uint8_t Key_Scanf(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON )
{
//松手检测
while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else return KEY_OFF;
}
下面是按键的原理图
