【菜鸟入门】stm32 之 扫描按键

今天是学校stm32的第二天,昨天对整个板子,以及stm32构架有一个大致的了解,今天在解决按键的时候,就轻松多了。

废话不多说,直接进入主题:

SW5   PE14
SW4   PE15
SW3   PB10
SW2   PB11

这是我按键对应的管脚【由于我的板子是学长给的,出了板子之外其他的什么都木有,木办法,所有引脚的连接都是用万用表测出来的,费了好大的事,呵呵,废话了】

一、按键管脚的配置【下面是简易图】



配置程序:

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


其他的注释都说的很清楚;

二、主程序的实现

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寄存器


这样大家就不难理解了吧?


注意:

我在看好多示例程序的时候,发现那些开发者经常犯一个危险的错误,这里我先说我的代码写法

led->BRR |= GPIO_Pin_0; //LED ON

这里在处理寄存器的时候用了“|=”,就是为了防止影响别的寄存器内容

可能大家都知道,但是经常不注意

OK,今天就先到这里




你可能感兴趣的:(stm32)