对于自己手上的这款核心板,考虑到还有一个外部外设没有使用,为了比较充分地用好板上的资源,在这里使用一个按键检测。
(一)按键外设
1、核心板
2、核心板原理图
按键上端和PA0引脚相连,按键下端接地。所以当按键被按下的时候,PA0应该读取到的是低电平才对。当按键没有被按下的时候,根据原理图中的这种设计,可见PA0既没有设置成上拉电阻,也没有设置下拉电阻,所以此处PA0不宜设置为浮空输入的模式(即既不上拉也不下拉的模式),从而使得芯片复位后,PA0端口的电平固定。
对于我们这款核心板的硬件设计,PA0的端口模式就应该设置为上拉模式,那么当按键没有按下的时候,PA0就会一定是高电平,以和下拉形成区别。
3、含有硬件消抖的原理图
当按键没有按下的时候,引脚接地;当按键按下的时候,引脚接3.3V高电平。针对这里,引脚的输入模式就可设置为浮空输入的模式。
(二)编写代码:
1、按键GPIO配置
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启按键GPIO口的时钟*/
RCC_AHB1PeriphClockCmd(KEY_GPIO_CLK,ENABLE);
/*选择按键的引脚*/
GPIO_InitStructure.GPIO_Pin = KEY_PIN;
/*设置引脚为输入模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
/*设置引脚为上拉*/
//这时使用万用表可以测得PA0有电压,为高电平;如果设置为GPIO_PuPd_UP,就会变成低电平
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
/*使用上面的结构体初始化按键*/
GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);
/*选择按键的引脚*/
GPIO_InitStructure.GPIO_Pin = KEY_PIN;
/*使用上面的结构体初始化按键*/
GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);
}
根据核心板的硬件设计,按键检测的GPIO引脚设为上拉模式
2、按键检测
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
/*检测是否有按键按下 */
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0 )
{
Delay_ms(10); //延时消抖
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0)
{
return 0;
}
}
else
return 1;
}
这里需要注意的是,按键使用的是软件消抖的方法。关于软件消抖的方法,有很多。有用延时的,也有用定时器计数的。这里只是为了测试F411CEU6这块核心板,使用了延时进行消抖。但要注意 ,这种办法不能用在工业控制中。
3、主函数
int main(void)
{
LED_GPIO_Config();
Key_GPIO_Config();
SysTick_Init();
while(1)
{
if( Key_Scan(KEY_GPIO_PORT,KEY_PIN) == 0 )
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
Delay_ms(200);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
Delay_ms(200);
}
}
}
在主函数里面,我们使用Key_Scan()函数,一旦检测到按键按下,就产生LED闪烁。