概述
GPIO初始化结构体
GPIO初始化
先声明GPIO初始化的结构体;然后打开GPIO所挂载的总线的时钟;再对结构体成员进行配置,包括GPIO的引脚,模式,速度;最后对GPIO的结构体进行初始化并选定指定的GPIO组。
GPIO_Mode相关内容
模拟输入、浮空输入、下拉输入、上拉输入、通用开漏输出、通用推挽输出、复用开漏输出、复用推挽输出。
GPIO相关函数
①GPIO初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
②GPIO结构体初始化函数
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
③设置一组IO口为高电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
④设置一组IO口为低电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
⑤设置一个IO口为高或低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
⑥设置一组IO口为高或低电平
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
⑦读取一个引脚的输入值
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
⑧读取一组引脚的输入值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
⑨读取一个引脚的输出值
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
⑩读取一组引脚的输出值
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
GPIO的位带操作
#define GPIOC_ODR_Addr (GPIOC_BASE + 0X0C)
#define PCout(n) *(uint16_t*)((GPIOC_ODR_Addr & 0xF0000000+0X02000000+(GPIOC_ODR_Addr & 0x00FFFFFF)<<5)+(n<<2))
寄存器配置GPIO
/**************************************************************************************************************
关于配置GPIO输出状态的三个寄存器ODR、BRR、BSRR
1.ODR寄存器:可读可写,既能控制管脚为高电平,也能控制管脚为低电平。管脚对应位写1为高电平,写0为低电平。
2.BSRR只写寄存器:既能控制管脚为高电平,也能控制管脚为低电平。
对寄存器高16bit写1对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平;写0无动作。
3.BRR只写寄存器:只能改变管脚状态为低电平,对寄存器管脚对于位写1相应管脚会为低电平。写0无动作。
*注意:用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。
置位 |= , 清0 &=~
GPIO输出初始化顺序
1.选定具体的GPIO
2.配置GPIO工作模式(CRL和CRH寄存器)
3.控制GPIO输出高低电平(ODR、BRR、BSRR)
**************************************************************************************************************/
#define PERIPH_BASE ((uint32_t)0x40000000) //外设总线基地址
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) //APB2总线基地址
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) //GPIOA基地址
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) //GPIOB基地址
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) //GPIOC基地址
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) //GPIOD基地址
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) //GPIOE基地址
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) //GPIOF基地址
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) //GPIOG基地址
#define GPIOx_CRL (GPIOx_BASE + 0X00) //端口配置低寄存器
#define GPIOx_CRH (GPIOx_BASE + 0X04) //端口配置高寄存器
#define GPIOx_IDR (GPIOx_BASE + 0X08) //端口输入数据寄存器
#define GPIOx_ODR (GPIOx_BASE + 0X0C) //端口输出数据寄存器
#define GPIOx_BSRR (GPIOx_BASE + 0X10) //端口位设置/清除寄存器
#define GPIOx_BRR (GPIOx_BASE + 0X14) //端口位清除寄存器
#define GPIOx_LCKR (GPIOx_BASE + 0X18) //端口配置锁定寄存器
//eg: GPIOC_IDR : 0x40000000+0x10000+0x1000+0X08 = 0x40011008
//示例:闪烁灯
void GPIOC3_Init(void)
{
*(unsigned int*)0x40021018 |= 0x01 << 4; //打开GPIOC端口的时钟RCC,APB2外设时钟使能寄存器
*(unsigned int*)0x40011000 |= 0x03 << 12; //配置CRL寄存器中的IO3的模式为输出模式,最大速度50Mhz
// *(unsigned int*)0x40011000 |= 0x01 << 12; //最大速度10Mhz
// *(unsigned int*)0x40011000 |= 0x02 << 12; //最大速度2Mhz
*(unsigned int*)0x4001100C &=~ (0x01 << 3); //控制ODR寄存器,对IO3进行清零复位
}
int main(void)
{
GPIOC3_Init();
while(1)
{
//unsigned int *p 表示定义变量unsigned int类型的指针变量p
//向地址0x40011010指向的内存里的第19位写入1
*(unsigned int*)0x40011010 |= (0x01 << (16+3)); //BSRR寄存器写GPIO低电平
SysTick_Delay_ms(500);
*(unsigned int*)0x40011010 |= (0x01 << 3); //BSRR寄存器写GPIO高电平
SysTick_Delay_ms(500);
}
}
STM32F10xxx存储器映像图
最后
以上就是俊逸哈密瓜为你收集整理的STM32之GPIO配置(寄存器/库函数)GPIO初始化结构体GPIO初始化GPIO_Mode相关内容GPIO相关函数GPIO的位带操作寄存器配置GPIOSTM32F10xxx存储器映像图的全部内容,希望文章能够帮你解决STM32之GPIO配置(寄存器/库函数)GPIO初始化结构体GPIO初始化GPIO_Mode相关内容GPIO相关函数GPIO的位带操作寄存器配置GPIOSTM32F10xxx存储器映像图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复