STM32 - 寄存器设置 GPIO输入输出模式

一.知识点记

CRH和CRL的使用基本相同,CRH用于控制GPIOX(X表示A—G)的高8位(Pin15—Pin8),而CRL用于控制GPIOX(X表示A—G)的低8位(Pin7----Pin0)

CRL寄存器对应的是:GPIO0-GPIO7
CRH寄存器对应的是:GPIO8-GPIO15
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/c26a7e0b99b943599f34b5a32ed0a598.png =100)
CRL的低四位设置为:0001,即可设置GPIO端口0为输出模式,速度为10M
在这里插入图片描述
例:设置GPIO7

#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;  GPIOB->CRL|=0x80000000;}//清零和设置输入模式
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} 
//GPIOB->CRL&=0X0FFFFFFF; 表示PB7先清零
//0x80000000
//其中(u32)8<<28表示0000 0000 0000 0000 0000 0000 0000 1000中的1左移28位(4*7)变为1000 0000 0000 0000 0000 0000 0000 0000 上拉/下拉输入模式
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF; GPIOB->CRL|=0x30000000;}//清零和设置输出模式
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;} //PB7:50MHz推挽输出模式
//GPIOB->CRL&=0X0FFFFFFF; 表示PB7先清零
//0x30000000     0011 0000 0000 0000 0000 0000 0000 0000

GPIO CRL 端口号设置

GPIOB->CRL&=0XFFFFFFF0; //GPIOB0
GPIOB->CRL&=0XFFFFFF0F; //GPIOB1
GPIOB->CRL&=0XFFFFF0FF; //GPIOB2 
GPIOB->CRL&=0XFFFF0FFF; //GPIOB3
GPIOB->CRL&=0XFFF0FFFF; //GPIOB4
GPIOB->CRL&=0XFF0FFFFF; //GPIOB5
GPIOB->CRL&=0XF0FFFFFF; //GPIOB6
GPIOB->CRL&=0X0FFFFFFF; //GPIOB7

二.封装函数

/**************************************************
Function:GPIO_Output
Description:设置GPIO引脚方向为输出模式
Input:无
Output:无
Return:无
**************************************************/
void GPIO_Output(void)
{
    uint8_t iport_num;
    for (iport_num=0;iport_num<16;iport_num++) 
    {
        if(GPIO_PIN_8 & ((uint32_t))0x01 << iport_num));   // 先左移0位,(uint16_t 0x0100)&0x01 = (uint32_t ) 0
        { 
            break;                                         //此处用来判断GPIO口和iport_num是否一致。
        }
     }
    if(iport_num > 7)
    {
         GPIOB->CRH &= ~(0xF<<((iport_num - 8) << 2)); //若 iport_num = 8, 0左移2位,取反0xF得 0000,GPIOB->CRH&=0XFFFFFFF0; //GPIOB8
         GPIOB->CRH |= ~(0x2<<((iport_num - 8) << 2));
    }
    else
    {
         GPIOB->CRL &= ~(0xF<<(iport_num << 2));   //当iport_num=0, 1111 取反 0000 ,GPIOB->CRL&=0XFFFFFFF0; //GPIOB0
         GPIOB->CRL |= ~(0x2<<(iport_num << 2));   //0010 取反 1101,  0000 0000 0000 0000 0000 0000 0000 1101 复用功能通用开漏输出 10Mz
    }    
}
解析:
 GPIOB->CRL &= ~(0xF<<(iport_num << 2));  
//当iport_num=1, (1<<2)得二进制数 0000 0100b,1111左移41111 0000,取反 0000 1111 ,GPIOB->CRL&=0XFFFFFF0F; //GPIOB1
 GPIOB->CRL |= (0x2<<(iport_num << 2)); 
//当iport_num=1,(1<<2)得二进制数 0000 0100b,0010左移40010 000000000000 0000 0000 0000 0000 0000 0010 0000 //GPIOB1 复用通用开漏输出 10Mz

由于0x01左移8位所得为0x0100,则使用0x01时就GPIO_Pin_8的使用
(若要使用GPIO_Pin_8则使用0x02)
(0x01即为0000 0000 0000 0001 移8位则为0x0100即为0000 0001 0000 0000)

/**************************************************
Function:GPIO_Input
Description:设置GPIO引脚方向为输入模式
Input:无
Output:无
Return:无
**************************************************/
void GPIO_Input(void)
{
    uint8_t iport_num;
    for (iport_num=0;iport_num<16;iport_num++)
    {
        if(GPIO_PIN_8 & ((uint32_t))0x01 << iport_num));   
        {
            break;
        }
     }
    if(iport_num > 7)
    {
         GPIOB->CRH &= ~(0xF<<((iport_num - 8) << 2));
         GPIOB->CRH |= (0x2<<((iport_num - 8) << 2));
    }
    else
    {
         GPIOB->CRL &= ~(0xF<<(iport_num << 2));
         GPIOB->CRL |= (0x2<<(iport_num << 2));
    }    
}
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值