STM32通用I/O(GPIO)
从嵌入式开发实践中总结出来的教程,深入浅出地教大家怎样掌握STM32IO口的使用。所谓寄存器配置,其实就是通过直接操作寄存器相应的位,来实现某些特定功能,这种方法比较灵活,且操作简便,由于STM32寄存器太多,实际编程中,不建议牢记住这些寄存器,用到时再回来翻翻手册或者找度娘,看多了不然而然就记住了。此外本教程所讲到的IO配置方法也适用于库函数版本。
GPIO功能描述
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似STM32 GPIOx Px1-Px15(例:GPIOA PA1,PA2),其接脚可以供开发者由程控自由使用,PIN脚依现实考量可作为通用输入与输出(INT/OUT),复用功能(AF),模拟配置(AIN)。
GPIO相关寄存器
1.GPIO端口模式寄存器GPIOx_MODER:
00输入(复位状态)01输出模式 10复用模式 11模拟模式
每两位配置一个IO端口模式(位31:0)
2.GPIO输出类型寄存器GPIOX_OTYPER:
0输出推挽 1输出开漏
每一位配置一个IO端口输出类型(位31:16保留
位15:0)
3.GPIO输出速度寄存器GPIOX_OSPEEDR:
00 2MHz 01 25MHz 10 50MHz 11 100MHz
每两位配置一个IO端口输出速率(位31:0)
4.GPIO上下拉寄存器GPIOX_PUPDR:
00无上下拉 01上拉 10下拉 11保留
每两位配置一个IO端口上下拉功能(位31:0)
5.GPIO输入寄存器GPIOX_IDR:
0保留复位值 1开启io口输入功能
每一位配置一个IO端口输入开关(位31:16保留
位15:0)
6.GPIOX_ODR输出寄存器:
0保留复位值 1开启io口输出功能
每一位配置一个IO端口输出开关(位31:16保留
位15:0)
7.GPIOX_BSRR置位复位寄存器:
位31:16(0不对ODRX寄存器复位 1对ODRX寄存器复
位)
位15:0(0不对ODRX寄存器置位 1对ODRX寄存器置
位)
每一位配置一个IO端口置复位(位31:16复位
位15:0置位)
8.GPIOX_LCKR配置锁定寄存器:
位31:17保留复位值 ;位16:锁定键 0端口配置锁定键未
激活 1端口配置已激活 ;
位15:0端口x锁定位(0端口配置未锁定 1端口配置
已锁定)
每一位配置一个IO端口是否锁定(位15:0)
9.GPIOX_AFR复用功能低位寄存器:
AF0:MCO/SWD/SWCLK/RTC AF1:TIM1/TIM2
AF2:TIM3-TIM5 AF3:TIM8-TIM11
AF4:I2C1~I2C3 AF5:SPI1/SPI2
AF6:SPI3 AF7:USART1~3
AF8:USART4~6 AF9;CAN1/CAN2/TIM12-TIM14
AF10:USB_OTG/USB_HS AF11:ETH
AF12:FSMC/SDIO/OTG/HS AF13:DCIM
AF14: AF15:EVENTOUT
IO口位7:0操作GPIOx_AFR[0]寄存器
IO口位15:8操作GPIOx_AFR[1]寄存器
每四位配置一个复用功能I/O
AF0~AF7:分别对应一个16位数0000-0111
AF8~AF15:分别对应一个16位数1000-1111
10.操作以上这些寄存器只是配置了IO的功能,要想IO端口能
正常工作,还要开启对应GPIO时钟。
时钟外设寄存器:AHB1ENR(0~8位表示IO口GPIOA-
GPIOI时钟使能)0:禁止 1使能**
操作寄存器初始化代码
**直接操作相关寄存器,相对应的位写入值,达到改变IO口功能的目的。例如:设置IO口PA0功能为推挽输出,上拉,速率100M,高电平**
1
// An highlighted block
**方法1**
void GPIOA_PA0_Init(void)//初始化
{
RCC->AHB1ENR|=1<<0;//使能PORTA时钟
GPIOA->MODER&=~(0X00000001);//对应位清零
GPIOA->MODER|=0X00000001;//配置为输出模式
//GPIOA->MODER|=1<<0;
GPIOA->OTYPER&=~(0X0001);//对应位清零
GPIOA->OTYPER&=0XFFFE;配置为推完功能
//GPIOA->OTYPER&=~(1<<0);
GPIOA->OSPEEDR&=~(0X00000003);//对应位清零
GPIOA->OSPEEDR|=(0X00000003);//配置速率为100MHz
//GPIOA->OSPEEDR|=3<<0;
GPIOA->PUPDR&=~(0X00000001);//对应位清零
GPIOA->PUPDR|=0X00000001;//配置为上拉
//GPIOA->PUPDR|=1<<0;
GPIOA->ODR&=~(0X0001);//清零
GPIOA->ODR|=1<<0;//输出高电平
/*或者操作BSRR寄存器
GPIOA->BSRRL|=1<<0;//输出高电平*/
}
**方法2**
//如果使用正点原子开发板,会有相应的IO口配置封装函数,直接调用即可
//x:GPIOA~GPIOI
//a:PIN0~PIN15
//b:GPIO_MODE_IN输入/GPIO_MODE_OUT输出/GPIO_MODE_AF复用/GPIO_MODE_AIN模拟
//c:GPIO_OTYPE_PP推挽/GPIO_OTYPE_OD开漏
//d:GPIO_SPEED_2M/GPIO_SPEED_25M/GPIO_SPEED_50M/GPIO_SPEED_100M 速率/单位:MHz
//e:GPIO_PUPD_PU上拉/GPIO_PUPD_PD下拉
//PIN_Num:0-15(PIN0~PIN15)
//AF_Num:0~15(AF0~AF15)
void GPIOA_PA0_Init(void)//初始化
{
RCC->AHB1ENR|=1<<0;//使能PORTA时钟
GPIO_Set(x,a,b,c,d,e);
//例:GPIO_Set(GPIOA,PIN0,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PA0推挽输出,上拉,100MHz
GPIOA->ODR&=~(0X0001);//清零
GPIOA->ODR|=1<<0;//输出高电平
/*或者操作BSRR寄存器
GPIOA->BSRRL|=1<<0;//输出高电平*/
/*****复用*****/
//GPIO_AF_Set(x,PIN_Num,AF_Num);
//例:GPIO_AF_Set(GPIOB,9,2);PB9,AF2
**注意:复用io口时,要根据数据手册找到你要使用到的外设,然后再找到其对应的IO口引脚****
}
附:
操作寄存器需要掌握C语言位带运算,学习链接:http://c.biancheng.net/view/2038.html
以上教程是针对刚上手STM32的小白,大佬就别来踢馆啦!觉得写得不好请勿喷哈!
STM32通用I/O(GPIO)
从嵌入式开发实践中总结出来的教程,深入浅出地教大家怎样掌握STM32IO口的使用。所谓寄存器配置,其实就是通过直接操作寄存器相应的位,来实现某些特定功能,这种方法比较灵活,且操作简便,由于STM32寄存器太多,实际编程中,不建议牢记住这些寄存器,用到时再回来翻翻手册或者找度娘,看多了不然而然就记住了。此外本教程所讲到的IO配置方法也适用于库函数版本。
GPIO功能描述
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似STM32 GPIOx Px1-Px15(例:GPIOA PA1,PA2),其接脚可以供开发者由程控自由使用,PIN脚依现实考量可作为通用输入与输出(INT/OUT),复用功能(AF),模拟配置(AIN)。
GPIO相关寄存器
1.GPIO端口模式寄存器GPIOx_MODER:
00输入(复位状态)01输出模式 10复用模式 11模拟模式
每两位配置一个IO端口模式(位31:0)
2.GPIO输出类型寄存器GPIOX_OTYPER:
0输出推挽 1输出开漏
每一位配置一个IO端口输出类型(位31:16保留
位15:0)
3.GPIO输出速度寄存器GPIOX_OSPEEDR:
00 2MHz 01 25MHz 10 50MHz 11 100MHz
每两位配置一个IO端口输出速率(位31:0)
4.GPIO上下拉寄存器GPIOX_PUPDR:
00无上下拉 01上拉 10下拉 11保留
每两位配置一个IO端口上下拉功能(位31:0)
5.GPIO输入寄存器GPIOX_IDR:
0保留复位值 1开启io口输入功能
每一位配置一个IO端口输入开关(位31:16保留
位15:0)
6.GPIOX_ODR输出寄存器:
0保留复位值 1开启io口输出功能
每一位配置一个IO端口输出开关(位31:16保留
位15:0)
7.GPIOX_BSRR置位复位寄存器:
位31:16(0不对ODRX寄存器复位 1对ODRX寄存器复
位)
位15:0(0不对ODRX寄存器置位 1对ODRX寄存器置
位)
每一位配置一个IO端口置复位(位31:16复位
位15:0置位)
8.GPIOX_LCKR配置锁定寄存器:
位31:17保留复位值 ;位16:锁定键 0端口配置锁定键未
激活 1端口配置已激活 ;
位15:0端口x锁定位(0端口配置未锁定 1端口配置
已锁定)
每一位配置一个IO端口是否锁定(位15:0)
9.GPIOX_AFR复用功能低位寄存器:
AF0:MCO/SWD/SWCLK/RTC AF1:TIM1/TIM2
AF2:TIM3-TIM5 AF3:TIM8-TIM11
AF4:I2C1~I2C3 AF5:SPI1/SPI2
AF6:SPI3 AF7:USART1~3
AF8:USART4~6 AF9;CAN1/CAN2/TIM12-TIM14
AF10:USB_OTG/USB_HS AF11:ETH
AF12:FSMC/SDIO/OTG/HS AF13:DCIM
AF14: AF15:EVENTOUT
IO口位7:0操作GPIOx_AFR[0]寄存器
IO口位15:8操作GPIOx_AFR[1]寄存器
每四位配置一个复用功能I/O
AF0~AF7:分别对应一个16位数0000-0111
AF8~AF15:分别对应一个16位数1000-1111
10.操作以上这些寄存器只是配置了IO的功能,要想IO端口能
正常工作,还要开启对应GPIO时钟。
时钟外设寄存器:AHB1ENR(0~8位表示IO口GPIOA-
GPIOI时钟使能)0:禁止 1使能**
操作寄存器初始化代码
**直接操作相关寄存器,相对应的位写入值,达到改变IO口功能的目的。例如:设置IO口PA0功能为推挽输出,上拉,速率100M,高电平**
1
// An highlighted block
**方法1**
void GPIOA_PA0_Init(void)//初始化
{
RCC->AHB1ENR|=1<<0;//使能PORTA时钟
GPIOA->MODER&=~(0X00000001);//对应位清零
GPIOA->MODER|=0X00000001;//配置为输出模式
//GPIOA->MODER|=1<<0;
GPIOA->OTYPER&=~(0X0001);//对应位清零
GPIOA->OTYPER&=0XFFFE;配置为推完功能
//GPIOA->OTYPER&=~(1<<0);
GPIOA->OSPEEDR&=~(0X00000003);//对应位清零
GPIOA->OSPEEDR|=(0X00000003);//配置速率为100MHz
//GPIOA->OSPEEDR|=3<<0;
GPIOA->PUPDR&=~(0X00000001);//对应位清零
GPIOA->PUPDR|=0X00000001;//配置为上拉
//GPIOA->PUPDR|=1<<0;
GPIOA->ODR&=~(0X0001);//清零
GPIOA->ODR|=1<<0;//输出高电平
/*或者操作BSRR寄存器
GPIOA->BSRRL|=1<<0;//输出高电平*/
}
**方法2**
//如果使用正点原子开发板,会有相应的IO口配置封装函数,直接调用即可
//x:GPIOA~GPIOI
//a:PIN0~PIN15
//b:GPIO_MODE_IN输入/GPIO_MODE_OUT输出/GPIO_MODE_AF复用/GPIO_MODE_AIN模拟
//c:GPIO_OTYPE_PP推挽/GPIO_OTYPE_OD开漏
//d:GPIO_SPEED_2M/GPIO_SPEED_25M/GPIO_SPEED_50M/GPIO_SPEED_100M 速率/单位:MHz
//e:GPIO_PUPD_PU上拉/GPIO_PUPD_PD下拉
//PIN_Num:0-15(PIN0~PIN15)
//AF_Num:0~15(AF0~AF15)
void GPIOA_PA0_Init(void)//初始化
{
RCC->AHB1ENR|=1<<0;//使能PORTA时钟
GPIO_Set(x,a,b,c,d,e);
//例:GPIO_Set(GPIOA,PIN0,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PA0推挽输出,上拉,100MHz
GPIOA->ODR&=~(0X0001);//清零
GPIOA->ODR|=1<<0;//输出高电平
/*或者操作BSRR寄存器
GPIOA->BSRRL|=1<<0;//输出高电平*/
/*****复用*****/
//GPIO_AF_Set(x,PIN_Num,AF_Num);
//例:GPIO_AF_Set(GPIOB,9,2);PB9,AF2
**注意:复用io口时,要根据数据手册找到你要使用到的外设,然后再找到其对应的IO口引脚****
}
附:
操作寄存器需要掌握C语言位带运算,学习链接:http://c.biancheng.net/view/2038.html
以上教程是针对刚上手STM32的小白,大佬就别来踢馆啦!觉得写得不好请勿喷哈!
举报