GPIOx->BRR和GPIOx->ODR
时间: 2024-06-12 20:08:53 浏览: 19
GPIOx->BRR是一个寄存器,用于将对应的IO口置为低电平。GPIOx->ODR是一个寄存器,用于读取或设置对应IO口的电平状态。GPIOx_BSRR寄存器的高16位用于设置对应IO口为高电平,低16位用于将对应IO口置为低电平。因此,GPIOx_BRR和GPIOx_ODR都是用于控制IO口电平状态的寄存器,但是使用的方式略有不同。
相关问题
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; } }逐行解释这段代码
这段代码是 STM32 的 GPIO 初始化函数中的一部分,用于配置一个 GPIOx 的高 8 位引脚的模式和输出类型。以下是逐行解释:
- `if (GPIO_InitStruct->GPIO_Pin > 0x00FF)`:如果 GPIO_Pin 大于 0x00FF(即要配置的引脚在高 8 位),则执行下面的代码。
- `tmpreg = GPIOx->CRH;`:将 GPIOx 的高控制寄存器的值读取到 tmpreg 变量中。
- `for (pinpos = 0x00; pinpos < 0x08; pinpos++)`:遍历高 8 位引脚的每个位置。
- `pos = (((uint32_t)0x01) << (pinpos + 0x08));`:计算出当前位置的掩码。
- `currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);`:将 GPIO_InitStruct 中对应的引脚与当前位置掩码进行按位与运算,以确定当前位置是否需要进行配置。
- `if (currentpin == pos)`:如果当前位置需要进行配置,则执行以下代码。
- `pos = pinpos << 2;`:计算出当前位置对应的寄存器位偏移量。
- `pinmask = ((uint32_t)0x0F) << pos;`:计算出当前位置对应的寄存器位需要进行清零的掩码。
- `tmpreg &= ~pinmask;`:将 tmpreg 中对应的寄存器位清零。
- `tmpreg |= (currentmode << pos);`:将当前位置的模式配置写入到 tmpreg 中对应的寄存器位中。
- `if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)`:如果当前位置的模式是输入下拉,则执行以下代码。
- `GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));`:将 GPIOx 的高 8 位引脚的相应位清零,以启用下拉电阻。
- `if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)`:如果当前位置的模式是输入上拉,则执行以下代码。
- `GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));`:将 GPIOx 的高 8 位引脚的相应位置为 1,以启用上拉电阻。
- `GPIOx->CRH = tmpreg;`:将 tmpreg 中的值写入到 GPIOx 的高控制寄存器中,完成 GPIOx 高 8 位引脚的模式和输出类型配置。
Stm32F1如何访问引脚
在STM32F1系列的微控制器中,可以通过寄存器来访问引脚。具体来说,可以使用GPIO寄存器来配置和控制引脚的状态。以下是一些常用的寄存器:
1. GPIOx_CRL和GPIOx_CRH:这两个寄存器用于配置引脚的输入/输出模式、输出类型、输出速度和上拉/下拉电阻。每个引脚对应一个4位的寄存器位,因此需要将相应的位设置为相应的值。
2. GPIOx_IDR和GPIOx_ODR:这两个寄存器用于读取和写入引脚的状态。GPIOx_IDR用于读取输入引脚的状态,GPIOx_ODR用于写入输出引脚的状态。
3. GPIOx_BSRR和GPIOx_BRR:这两个寄存器用于设置和清除引脚的状态。GPIOx_BSRR用于设置引脚的状态,GPIOx_BRR用于清除引脚的状态。
例如,要将引脚PA0设置为输出模式、推挽输出、速度为50MHz和无上拉/下拉电阻,可以使用以下代码:
```
GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0); //清除原来的模式和配置
GPIOA->CRL |= GPIO_CRL_MODE0_1 | GPIO_CRL_MODE0_0; //设置为输出模式、推挽输出、速度为50MHz
```
请注意,以上代码中的GPIOA是指向GPIOA的指针。为了使用这些寄存器,需要先将相应的GPIO端口设置为时钟使能。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![ppt](https://img-home.csdnimg.cn/images/20210720083527.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![apk](https://img-home.csdnimg.cn/images/20210720083646.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)