stm32这两种初始化有啥不同 GPIO_Init,GPIO_StructInit,各位路过的看一下,困惑呀,谢谢啦

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32这两种初始化有啥不同 GPIO_Init,GPIO_StructInit,各位路过的看一下,困惑呀,谢谢啦相关的知识,希望对你有一定的参考价值。

/**
* @brief Initializes the GPIOx peripheral according to the specified
* parameters in the GPIO_InitStruct.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that
* contains the configuration information for the specified GPIO peripheral.
* @retval None
*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));

/*---------------------------- GPIO Mode Configuration -----------------------*/
currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)

/* Check the parameters */
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
/* Output mode */
currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;

/*---------------------------- GPIO CRL Configuration ------------------------*/
/* Configure the eight low port pins */
if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)

tmpreg = GPIOx->CRL;
for (pinpos = 0x00; pinpos < 0x08; pinpos++)

pos = ((uint32_t)0x01) << pinpos;
/* Get the port pins position */
currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
if (currentpin == pos)

pos = pinpos << 2;
/* Clear the corresponding low control register bits */
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
/* Write the mode configuration in the corresponding bits */
tmpreg |= (currentmode << pos);
/* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

GPIOx->BRR = (((uint32_t)0x01) << pinpos);

else

/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

GPIOx->BSRR = (((uint32_t)0x01) << pinpos);




GPIOx->CRL = tmpreg;

/*---------------------------- GPIO CRH Configuration ------------------------*/
/* Configure the eight high port pins */
if (GPIO_InitStruct->GPIO_Pin > 0x00FF)

tmpreg = GPIOx->CRH;
for (pinpos = 0x00; pinpos < 0x08; pinpos++)

pos = (((uint32_t)0x01) << (pinpos + 0x08));
/* Get the port pins position */
currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
if (currentpin == pos)

pos = pinpos << 2;
/* Clear the corresponding high control register bits */
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
/* Write the mode configuration in the corresponding bits */
tmpreg |= (currentmode << pos);
/* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));

/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));



GPIOx->CRH = tmpreg;



/**
* @brief Fills each GPIO_InitStruct member with its default value.
* @param GPIO_InitStruct : pointer to a GPIO_InitTypeDef structure which will
* be initialized.
* @retval None
*/
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)

/* Reset GPIO init structure parameters values */
GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING;
追问

刚接触stm32不久,能不能用中文描述一下,谢谢呀

追答

上面粘贴的是自带库的里面的函数,我在给你看看中文固件库使用手册中的解释,

还有你可以下载一份中文固件库使用手册来看,我也是刚自学,如果回答有什么错误,请指出

参考技术A GPIO_DeInit 也就是缺省值 就等于 先GPIO_StructInit 缺省值装入 GPIO_InitTypeDef
GPIO_Init在把GPIO_StructInit的缺省值装入
参考技术B

5年前的题。

看上面函数,就是将缺省值填入结构体中,并没有进行初始化

这两种符号有啥区别?

【中文标题】这两种符号有啥区别?【英文标题】:What is the difference between this two notations?这两种符号有什么区别? 【发布时间】:2021-01-08 10:26:13 【问题描述】:

所以,基本上我想知道这两种符号之间有什么区别(如果有的话):

第一个例子:

struct Node
int data;
Node* next;
;
Node* head;

第二个例子:

struct Node
int data;
struct Node* next;

struct Node* head;

我只是想知道这两种记法有什么区别,哪一种更好用?

【问题讨论】:

在 C++ 中,没有区别。这两个示例的作用完全相同,变量上的额外struct 关键字是可选的。使用第一种方式,打字更短。但是,在 C 中,还是有区别的。 好的,谢谢。您更喜欢或推荐使用哪种表示法? 第一个在C是非法的。 我明白了,谢谢! :) @MarekR true,但问题被标记为 C++,第一种方式是合法的,在 C+= 中是首选 【参考方案1】:

我想知道这两种符号有什么区别(如果有的话)

Node 是类的类型名称。仅当已声明类时才能使用它。示例:

Node* ptr; // won't work without prior declaration
struct Node;

struct Node;
Node* ptr; // works because of prior declaration

struct Node 是使用详细类型说明符的相同类型名称。它本身就是类的声明。示例:

struct Node* ptr; // works without prior declaration

当函数和类同名时,可以使用详细的类型说明符来消除歧义:

struct Node;

void Node();

void foo() 
    Node* ptr;        // this won't work
    struct Node* ptr; // this works
    Node();           // this is a function call

鉴于在您的示例中已经声明了类,并且没有模棱两可的函数,除了struct Node 的输入时间长了大约 64% 之外,没有其他区别。

两次使用哪个更好?

你喜欢哪个。你喜欢多打字还是少打字?


关于 C 语言的注意事项:在 C 中,结构不会自动获得类型名称,因此只能使用详细的类型说明符来引用它们,除非使用 typedef 显式地为结构指定了类型名称。这就是为什么您可能会看到在 C 中比在 C++ 中更常用的详细类型说明符,以及在 C++ 中多余的 typedef。

【讨论】:

以上是关于stm32这两种初始化有啥不同 GPIO_Init,GPIO_StructInit,各位路过的看一下,困惑呀,谢谢啦的主要内容,如果未能解决你的问题,请参考以下文章

STM32STM32串口配置的一般步骤(库函数)

STM32 端口复用配置

STM32Cube库和standard peripheral library有啥区别

[STM32F103]PWM输入捕获配置

下位机部分-水下管道智能巡检-方案STM32+树梅派+python+opencv—水下机器人

下位机部分-水下管道智能巡检-方案STM32+树梅派+python+opencv—水下机器人