一.知识点记
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左移4位 1111 0000,取反 0000 1111 ,GPIOB->CRL&=0XFFFFFF0F; //GPIOB1
GPIOB->CRL |= (0x2<<(iport_num << 2));
//当iport_num=1,(1<<2)得二进制数 0000 0100b,0010左移4位 0010 0000, 0000。0000 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));
}
}