【菜鸟入门】stm32 之 扫描按键
最后更新于:2022-04-01 14:50:36
今天是学校stm32的第二天,昨天对整个板子,以及stm32构架有一个大致的了解,今天在解决按键的时候,就轻松多了。
废话不多说,直接进入主题:
SW5 PE14
SW4 PE15
SW3 PB10
SW2 PB11
这是我按键对应的管脚【由于我的板子是学长给的,出了板子之外其他的什么都木有,木办法,所有引脚的连接都是用万用表测出来的,费了好大的事,呵呵,废话了】
### 一、按键管脚的配置【下面是简易图】
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-21_576915b18a594.jpg)
配置程序:
~~~
int sw5_config()
{
GPIO_TypeDef *sw5 = GPIOE;
RCC->APB2ENR |= 1<<6;
sw5->CRH &= ~(0xf<<(4*6));//Clear PE14 Register
sw5->CRH |= 8<<(4*6); //Set PE14 Register [TO:pull up / down]
sw5->ODR |= GPIO_Pin_14; //Enable PIN14
return 0;
}
~~~
GPIO_TypeDef 这个结构体在stm32f10x.h里面,于是方便了我们的使用;
GPIO_TypeDef *sw5 = GPIOE;这样更方便我们对程序的识别
RCC->APB2ENR |= 1<<6;是选中GPIOE,具体看下面的datasheet
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-21_576915b19d1dd.jpg)
其他的注释都说的很清楚;
### 二、主程序的实现
~~~
int main()
{
GPIO_TypeDef *led = GPIOE;
sys_init(9);
/*Config LED*/
RCC->APB2ENR |= 1<<6;
led->CRL &= 0xFFFFFFF0;
led->CRL |= 0x3 << 0;
led->ODR |= GPIO_Pin_0;
led->BRR |= GPIO_Pin_0; // LED ON
delay_ms(1000);
led->BSRR |= GPIO_Pin_0; // LED¡¡OFF
sw5_config();
while(1)
{
if(!(GPIOE->IDR & GPIO_Pin_14))
{
delay_ms(20);
if(!(GPIOE->IDR & GPIO_Pin_14))
{
led->BRR |= GPIO_Pin_0; //LED ON
}
}
else
{
led->BSRR |= GPIO_Pin_0; //LED OFF
}
}
}
~~~
sys_init()函数昨天已经介绍过了,但是今天发现了一些不足,有重新进行了一下修改
~~~
int sys_init(unsigned char PLL)
{
unsigned char temp = 0;
RCC->CR |= 1<<16; //OPEN HSE
while(!(RCC->CR>>17));
RCC->CFGR = 0x04<<8; //APB1 HSE/2
PLL -= 2; //9-2 = 0111b
RCC->CFGR |= PLL << 18; //0111 ==> X9
RCC->CFGR |= 1 << 16; //PREDIV1 ouput as source of PLL
FLASH->ACR |= 0x32; //With
RCC->CR |= 1<<24; //enable PLL [24bit]
while(!(RCC->CR >> 25));
RCC->CFGR |= 0x2<<0;//PLL As System Clock
while(temp != 0x02)
{
temp = RCC->CFGR >> 2;
temp &= 0x03;
}
return 0;
}
~~~
!(GPIOE->IDR & GPIO_Pin_14)这里是获取14引脚的状态,主要看看IDR寄存器
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-21_576915b1c0f38.jpg)
这样大家就不难理解了吧?
注意:
我在看好多示例程序的时候,发现那些开发者经常犯一个危险的错误,这里我先说我的代码写法
led->BRR |= GPIO_Pin_0;//LED ON
这里在处理寄存器的时候用了“|=”,就是为了防止影响别的寄存器内容
可能大家都知道,但是经常不注意
OK,今天就先到这里