新闻中心

EEPW首页>嵌入式系统>设计应用> 【Alientek STM32 实验2】--按键输入

【Alientek STM32 实验2】--按键输入

作者: 时间:2016-11-25 来源:网络 收藏
上一节介绍了STM32的IO口输出,这一节,我们将向大家介绍如何使用STM32的IO口作为输入用。通过本节的学习,你将了解到STM32的IO口作为输入使用的方法。本节分为如下几个小节:

3.2.1 STM32 IO口简介

本文引用地址://m.amcfsurvey.com/article/201611/321132.htm

3.2.2硬件设计

3.2.3软件设计

3.2.1 STM32 IO口简介

STM32的IO口在上一节已经有了详细的介绍,这里我们不再多说。STM32的IO口做输入使用的时候,是通过读取IDR的内容来读取IO口的状态的。了解了这点,就可以开始我们的代码编写了。

这一节,我们将通过MiniSTM32板上载有的3个按钮,来控制板上的2个LED,其中KEY0控制DS0,按一次亮,再按一次,就灭。KEY1控制DS1,效果同KEY0。KEY_2(KEY_UP),同时控制DS0和DS1,按一次,他们的状态就翻转一次。

3.2.2硬件设计

该实验所需要的硬件电路在MiniSTM32开发板上都已经连接好了,不需要经过任何设置,直接编写代码就可。LED的连接在上一节已经介绍过了,在MiniSTM32开发板上的按键KEY0是接在PA13上,KEY1是接在PA15上的,WK_UP(KEY2)接在PA0上。如下图所示:

按钮新建一个文件,然后保存在HARDWARE->KEY文件夹下面,保存为key.c。在该文件中输入如下代码:

#include

#include "key.h"

#include "delay.h"

//Mini STM32开发板

//按键输入驱动代码

//正点原子@ALIENTEK

//2010/5/27

//按键初始化函数

//PA0.13.15设置成输入

void KEY_Init(void)

{

RCC->APB2ENR|=1<<2;//使能PORTA时钟

RCC->APB2ENR|=1<<0;//开启辅助时钟

AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]

AFIO->MAPR|=0X04000000; //关闭JTAG

GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入

GPIOA->CRL|=0X00000008;

GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入

GPIOA->CRH|=0X80800000;

GPIOA->ODR|=1<<13;//PA13上拉,PA0默认下拉

GPIOA->ODR|=1<<15;//PA15上拉

}

//按键处理函数

//返回按键值

//0,没有任何按键按下

//1,KEY0按下

//2,KEY1按下

//3,KEY2按下

//注意此函数有响应优先级,KEY0>KEY1>KEY2!!

u8 KEY_Scan(void)

{

static u8 key_up=1;//按键按松开标志

if(key_up&&(KEY0==0||KEY1==0||KEY2==1))

{

delay_ms(10);//去抖动

key_up=0;

if(KEY0==0)return 1;

else if(KEY1==0)return 2;

else if(KEY2==1)return 3;

}else if(KEY0==1&&KEY1==1&&KEY2==0)key_up=1;

return 0;//无按键按下

}

在段代码包含了2个函数,void KEY_Init(void)和u8 KEY_Scan(void),KEY_Init是用来初始化按键输入的IO口的。实现PA0、PA13、PA15的输入设置,这里和上一节的输出配置不同,还有一个JTAG的禁用设置。

JTAG的禁用,是通过AFIO的MAPR寄存器来配置的。要对复用IO口配置,必须先启用AFIO时钟,AFIO的时钟使能在APB2ENR寄存器里面设置。如下句,就是使能AFIO的时钟:

RCC->APB2ENR|=1<<0;//开启辅助时钟

在使能了AFIO时钟之后,我们就可以对AFIO的相关寄存器进行设置了。这里我们要关闭JTAG,与JTAG设置相关的寄存器是AFIO->MAPR寄存器。该寄存器的各位描述如下:


图3.2.3.2AFIO->MAPR寄存器各位描述

其中SWJ_CFG[2:0](AFIO->MAPR[26:24])是与JTAG相关的配置寄存器位,这几位的具体设置以及其对应的描述如下:


图3.2.3.2SWJ_CFG位段设置关系

在这里我们把JTAG和SW口全部禁用了,设置AFIO->MAPR [26:24]为100,如下:

AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]

AFIO->MAPR|=0X04000000; //关闭JTAG

以上在设置MAPR的[26:24]位的时候,我们先把这几位清空,然后在置位这几个位。这样,才不会影响之前对AFIO->MAPR的设置。这一点在以后的寄存器配置的时候,大家一定要注意,否则,可能引起之前的配置失效!


上一页 1 2 下一页

评论


技术专区

关闭