今天是学校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 } } }
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; }
这样大家就不难理解了吧?
注意:
我在看好多示例程序的时候,发现那些开发者经常犯一个危险的错误,这里我先说我的代码写法
led->BRR |= GPIO_Pin_0; //LED ON
这里在处理寄存器的时候用了“|=”,就是为了防止影响别的寄存器内容
可能大家都知道,但是经常不注意
OK,今天就先到这里