1.使能时钟
RCC->APB2ENR|=1<<2;//使能GPIOA的时钟
RCC->APB2ENR|=1<<6;//使能GPIOE的时钟
2.设置GPIO输入模式
PA0设置为输入,当ODR不设置时,默认为下拉,也可以将ODR设置位0来设置下拉输入
GPIOA->CRL&=0xfffffff0;
GPIOA->CRL|=0x00000008;
PE3/4设置为输入,设置为上拉输入
GPIOE->CRL&=0xfff00fff;
GPIOE->CRL|=0x00088000;
GPIOE->ODR|=3<<3;(
为啥ODR左移三位就可以呢,我们可以展开来看3<<3就是0000,0000,0000,0011这个数左移3位:0000,0000,0001,1000)
思考点:
上拉,下拉的区别是啥??
上拉则该引脚初始是一个高电平,下拉该引脚是低电平.,当我们配置了相应的模式,芯片将会按我们配置设置相应模式.
3.判断端口的高低电平
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
uint8_t bitstatus = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
{
bitstatus = (uint8_t)Bit_SET;
}
else
{
bitstatus = (uint8_t)Bit_RESET;
}
return bitstatus;
}
我们可以参考库函数的做法来判断端口的高低电平:
if ((GPIOx->IDR & GPIO_Pin) !=
(uint32_t)Bit_RESET):通过按位与的做法,来实现.例如当PE3口输入时:GPIOE->IDR&(0000,0000,0000,1000),也就是GPIOE->IDR&0x08;
如果输入为高电平:
if((GPIOA->IDR&0x01)!=0)//判断PA0是否为高电平
if((GPIOE->IDR&0x08)!=0)//判断PA3
if((GPIOE->IDR&0x10)!=0)//判断PA4
4.写一个延时函数
void delay(u32 i)
{
while(i--);
}
程序:
#include "stm32f10x.h"
void delay(u32 i){while(i--);}
int main(void)
{
RCC->APB2ENR=1<<3;
GPIOB->CRL&=0xff0fffff;
GPIOB->CRL|=0x00300000;
GPIOB->ODR|=1<<5;
RCC->APB2ENR|=1<<2;//使能GPIOA的时钟
RCC->APB2ENR|=1<<6;//使能GPIOE的时钟
GPIOA->CRL&=0xfffffff0;
GPIOA->CRL|=0x00000008;
GPIOE->CRL&=0xfff00fff;
GPIOE->CRL|=0x00088000;
GPIOE->ODR|=3<<3;
while(1)
{
// if((GPIOA->IDR&0x01)!=0)//该引脚设为下拉输入,按键接高电平,所以按下按键时,电平为高
if((GPIOE->IDR&0x08)==0)//判断PA3,该引脚设为上拉输入,按键接的低电平,所以按下按键时,电平为低.
// if((GPIOE->IDR&0x10)==0)//判断PA4
{
delay(1000000);
// if((GPIOA->IDR&0x01)!=0)
if((GPIOE->IDR&0x08)==0)//判断PA3
// if((GPIOE->IDR&0x10)==0)//判断PA4
GPIOB->ODR=~(GPIOB->ODR);
}
}
}