问题描述
- STM32GPIO配置的问题??
-
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO宏操作结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB,ENABLE); //外设时钟配置,
开启GPIOB和GPIOD的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //配置GPIOB口
请问STM32的GPIO端口配置,最后一条语句,如果我想同时配置GPIOA和GPIOB,能这么写吗?为什么?谢谢
GPIO_Init(GPIOA | GPIOB, &GPIO_InitStructure); //配置GPIOB口
解决方案
GPIOA和GPIOB在stm32f10x.h这个文件里是两个地址,所以你这么写会导致地址不对,当然了这是我的猜测,详细的还是看源代码吧,看看GPIO_Init内部是怎么实现的
解决方案二:
不能,
看这里
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
再看这里
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)
#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)
#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800)
#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00)
(GPIOA | GPIOB) 就是让GPIOA和GPIOB 按位或。最终会成为
(AHB1PERIPH_BASE + 0x0000)|(AHB1PERIPH_BASE + 0x0400),得到(AHB1PERIPH_BASE + 0x0400)
而不是将GPIOA和GPIOB分别初始化。这样只是会将GPIOB初始化,程序可能没有语法错误,但是会出现逻辑错误。