stm32中GPIO_Write(GPIOB,x<<8)的问题 5
x是uint8型,作者的注释里说,是让B口的高八位输出x,即比如x原来=0X80,左移后变成了0X8000,我觉得很奇怪啊,x定义的是uint8类型,左移8位不还是八位的...
x是uint8型,作者的注释里说,是让B口的高八位输出x,即比如x原来=0X80,左移后变成了0X8000,我觉得很奇怪啊,x定义的是uint8类型,左移8位不还是八位的数据吗,怎么会变成16位的
展开
1个回答
展开全部
GPIOB在这里是一个结构体指针,是指向GPIO_TypeDef这样的一个结构体,并且强制将该结构体指针指向的地址为GPIOB_BASE,一般情况下是不允许对绝对地址空间的操作,但是在这里可以。
下面的宏定义
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
((PERIPH) == GPIOB) || \
((PERIPH) == GPIOC) || \
((PERIPH) == GPIOD) || \
((PERIPH) == GPIOE) || \
((PERIPH) == GPIOF) || \
((PERIPH) == GPIOG))
也是合法的,后面的斜杠\标识连接着的意思,等效于:
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || ((PERIPH) == GPIOB) ...)
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));这句主要是判断传进函数中的参数GPIOx是否有效,因为GPIOx必须是GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG这几个当中的其中一个,否则会被认为是无效的参数。
assert_param(xxxxxxxx)就是判断参数是否有效,但在实际情况下并不使用,因为宏定义中:
#ifdef USE_FULL_ASSERT
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif
因为一般情况下USE_FULL_ASSERT是没有被定义的,assert_param(xxxxxxxx)就等于((void)0),什么也没有做。
追问:
先谢谢你,地址和断言先不说了,我想弄明白
GPIOx怎么和GPIOA联系上了,X只是个字符,又不是参数变量
追答:
哥们啊,函数的形参、实参、传参这些你要弄明白了。
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)是一个函数是吧,在我调用这个函数的时候,假设我这么调用:
GPIO_Init(GPIOA, GPIO_InitStructure),那本次调用该函数的时候,传进函数的参数GPIOx不就是GPIOA了吗,C语言的最最最最最基本的知识,你还是好好先学C语言。
就如我定义一个函数
void fun(int a)
{
printf("%d",a);
}
void main(void)
{
int b;
b = 100;
fun(b);
return;
}
在main中调用函数fun(b),那fun函数中的a不久是等于main中的b了吗。
下面的宏定义
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
((PERIPH) == GPIOB) || \
((PERIPH) == GPIOC) || \
((PERIPH) == GPIOD) || \
((PERIPH) == GPIOE) || \
((PERIPH) == GPIOF) || \
((PERIPH) == GPIOG))
也是合法的,后面的斜杠\标识连接着的意思,等效于:
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || ((PERIPH) == GPIOB) ...)
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));这句主要是判断传进函数中的参数GPIOx是否有效,因为GPIOx必须是GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG这几个当中的其中一个,否则会被认为是无效的参数。
assert_param(xxxxxxxx)就是判断参数是否有效,但在实际情况下并不使用,因为宏定义中:
#ifdef USE_FULL_ASSERT
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif
因为一般情况下USE_FULL_ASSERT是没有被定义的,assert_param(xxxxxxxx)就等于((void)0),什么也没有做。
追问:
先谢谢你,地址和断言先不说了,我想弄明白
GPIOx怎么和GPIOA联系上了,X只是个字符,又不是参数变量
追答:
哥们啊,函数的形参、实参、传参这些你要弄明白了。
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)是一个函数是吧,在我调用这个函数的时候,假设我这么调用:
GPIO_Init(GPIOA, GPIO_InitStructure),那本次调用该函数的时候,传进函数的参数GPIOx不就是GPIOA了吗,C语言的最最最最最基本的知识,你还是好好先学C语言。
就如我定义一个函数
void fun(int a)
{
printf("%d",a);
}
void main(void)
{
int b;
b = 100;
fun(b);
return;
}
在main中调用函数fun(b),那fun函数中的a不久是等于main中的b了吗。
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询