配置引脚口,基本没有坑,无非只有CRL,CRH,IDR,ODR,BSRR,BRR,LOCK七个寄存器可以控制,看一下STM32中文参考手册基本可以直接上手。
下面来讲一下参考手册上需要注意的一些地方:
1.在配置GPIO时,会发现要是想配置为上下拉,只用相应位写入0x02。可是如何选择上拉还是下拉呢?需要我们配置ODR寄存器,相应位置1则上拉,置0就下拉。
2.个人感觉BSRR和BSR的作用可以合并,或者说可以除去BRR寄存器。是否可行呢?本人现在的理解深度浅,尚不明确设置这两个寄存器的作用,等以后有感觉时再来补充。(拼命挖坑……)
3.开启引脚口对应的时钟,不然心脏都没了,自然工作不了。
直接献上写的一个很简陋的点灯代码(点灯老好玩了,直接点,按键点,中断点,串口点,IIC点……用刘火良老师的语气:“哼~点到你饱!!!”)
代码老基础了,没有必要看,别看了别看了………………
/引用stm32f10x.h文件,如果不引用,比我还狠,就直接翻看手册,慢慢加地址,最后强制指针转化,我在最开始就这样操作,但是方法掌握就没有必要了/ static uint8_t GPIO_RCC(GPIO_TypeDef * GPIOx) { if(GPIOxGPIOA) { RCC->APB2ENR |=((1)<<2); } else if(GPIOxGPIOB) { RCC->APB2ENR |=((1)<<3); } else if(GPIOx==GPIOC) { RCC->APB2ENR |=((1)<<4); } else { return 1; } return 0; }
//LED灯初始化 void LED_Init(GPIO_TypeDef * GPIOx,uint16_t PINx) { //开启GPIOx的时钟 while(GPIO_RCC(GPIOx)); if(PINx<=7) { GPIOx->CRL &=~(0x0f<<(4PINx)); GPIOx->CRL |=(1<<(4PINx)); } else if(PINx>=8&&PINx<=15) { //CRH寄存器端位清空 GPIOx->CRH &=~(0x0f<<(4*(PINx-8))); //CRH寄存器至于0001 GPIOx->CRH |= (1<<(4*(PINx-8))); } //ODR寄存器置于0 GPIOx->ODR &=~(1<<PINx); }
//关灯 void LED_ON(GPIO_TypeDef * GPIOx,uint16_t PINx) { //配置BRy和BSy位控制引脚口状态 GPIOx->BSRR &=~(0x1<<PINx); GPIOx->BSRR |=(1<<(16+PINx)); }
//开灯 void LED_OFF(GPIO_TypeDef * GPIOx,uint16_t PINx) { GPIOx->BSRR |=(1<<PINx); }
//开启GPIOx的时钟 static uint8_t GPIO_RCC(GPIO_TypeDef * GPIOx) { if(GPIOxGPIOA) { RCC->APB2ENR |=((1)<<2); } else if(GPIOxGPIOB) { RCC->APB2ENR |=((1)<<3); } else if(GPIOx==GPIOC) { RCC->APB2ENR |=((1)<<4); } else { return 1; } return 0; }
void KEY_Init(GPIO_TypeDef * GPIOx,uint16_t PINx) { //开启GPIOx的时钟 while(GPIO_RCC(GPIOx)); if(PINx<=7) { GPIOx->CRL &=~(0x0f<<(4PINx)); GPIOx->CRL |=(0x08<<(4PINx)); } else if(PINx>=8&&PINx<=15) { //CRH寄存器端位清空 GPIOx->CRH &=~(0x0f<<(4*(PINx-8))); //CRH寄存器置于1000,配置为上拉输入 GPIOx->CRH |= (0x08<<(4*(PINx-8))); } GPIOx->ODR |=(0x1<<PINx); }
//检测输入GPIO口状态 uint8_t KEY_State(GPIO_TypeDef * GPIOx,uint16_t PINx) { uint8_t state; state = (GPIOx->IDR)&(0x01<<PINx); if(state!=0) state=1; return state; }
|