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的位带操作
1
2
3#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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67/************************************************************************************************************** 关于配置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内容请搜索靠谱客的其他文章。
发表评论 取消回复