💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
今天是学校stm32的第二天,昨天对整个板子,以及stm32构架有一个大致的了解,今天在解决按键的时候,就轻松多了。 废话不多说,直接进入主题: SW5   PE14 SW4   PE15 SW3   PB10 SW2   PB11 这是我按键对应的管脚【由于我的板子是学长给的,出了板子之外其他的什么都木有,木办法,所有引脚的连接都是用万用表测出来的,费了好大的事,呵呵,废话了】 ### 一、按键管脚的配置【下面是简易图】 ![](https://box.kancloud.cn/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://box.kancloud.cn/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://box.kancloud.cn/2016-06-21_576915b1c0f38.jpg) 这样大家就不难理解了吧? 注意: 我在看好多示例程序的时候,发现那些开发者经常犯一个危险的错误,这里我先说我的代码写法 led->BRR |= GPIO_Pin_0;//LED ON 这里在处理寄存器的时候用了“|=”,就是为了防止影响别的寄存器内容 可能大家都知道,但是经常不注意 OK,今天就先到这里