stm32 IO采用上拉的方式输出,为什么一但输出高电平,等一会控制寄存器输出低电平无效
时间: 2023-03-13 22:35:42 浏览: 134
STM32 IO采用上拉方式输出,是因为上拉可以保持输出的稳定性,以及达到较高的精准度。但这也会造成一些问题,比如一但输出高电平,等一会控制寄存器输出低电平无效。要解决这个问题,需要使用快速改变的输出值来控制IO,这样才能有效控制IO的输出。
相关问题
stm32f103输出高电平和低电平的代码有什么区别吗
输出高电平和低电平的代码区别主要在于控制寄存器的设置不同。
在STM32F103中,每个IO口都有一个控制寄存器,可以通过设置控制寄存器来控制IO口的输出状态。具体来说,当要输出高电平时,需要将控制寄存器中的输出状态位设置为1;当要输出低电平时,需要将输出状态位设置为0。
因此,输出高电平和低电平的代码区别在于设置控制寄存器中的输出状态位的值不同。例如,以下代码实现了将PA0口输出高电平和低电平的功能:
输出高电平的代码:
```
GPIOA->BSRR = GPIO_BSRR_BS0; // 设置PA0口输出高电平
```
输出低电平的代码:
```
GPIOA->BSRR = GPIO_BSRR_BR0; // 设置PA0口输出低电平
```
可以看到,输出高电平的代码将控制寄存器中的输出状态位设置为1,而输出低电平的代码将输出状态位设置为0,这是两者的区别所在。
STM32 直接控制IO寄存器引脚代码
以下是STM32直接控制IO寄存器引脚代码的一个示例:
#include "stm32f10x.h"
int main()
{
// 使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 设置PB10引脚为输出模式
GPIO_InitTypeDef gpio_init = {0};
gpio_init.GPIO_Pin = GPIO_Pin_10;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &gpio_init);
while(1) {
// 将PB10引脚设置为高电平
GPIOB->BSRR = GPIO_Pin_10;
// 延时
for(int i = 0; i < 100000; ++i);
// 将PB10引脚设置为低电平
GPIOB->BRR = GPIO_Pin_10;
// 延时
for(int i = 0; i < 100000; ++i);
}
return 0;
}
该代码使用了STM32F10x标准外设库和GPIO的位带操作,实现了对PB10引脚的控制。在代码中,首先使能了GPIOB的时钟,并设置PB10引脚为输出模式。然后在while循环中,通过GPIO的位带操作将PB10引脚的电平切换为高或低,并延时一段时间。
阅读全文