寄存器配置GPIO

  配置引脚口,基本没有坑,无非只有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(GPIOx==GPIOA)
    {
        RCC->APB2ENR |=((1)<<2);
    }
    else if(GPIOx==GPIOB)
    {
        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<<(4*PINx));
        GPIOx->CRL |=(1<<(4*PINx));
    }
    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(GPIOx==GPIOA)
    {
        RCC->APB2ENR |=((1)<<2);
    }
    else if(GPIOx==GPIOB)
    {
        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<<(4*PINx));
        GPIOx->CRL |=(0x08<<(4*PINx));
    }
    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;
}

 

posted @ 2021-04-21 16:10  LiXintao  阅读(544)  评论(0)    收藏  举报