前面2章用的是推免输出,
推免输出:
输出端由两个晶体管构成:一个N沟道晶体管和一个P沟道晶体管。这两个晶体管一般不会同时导通,避免短路; 白话,就是输入高还是低,由你的GPIO 控制(GPIO 输出高就高,低就是低),电压由GPIO 提供高低电压 ,一般 VCC 70%↑的为高, 30%↓ 为低
开漏输出
I/O引脚仅有一个下拉晶体管。当输出低电平时,晶体管导通,引脚连接到地(GND)。当晶体管关闭时,并不直接提供高电平,而是处于高阻态,需要通过外部上拉电阻连接到高电平电源,以提供高电平;白话,GPIO可控制 I/O输出高阻态或低电平,高阻态时引脚对地电阻无穷,此时读引脚电平时可以读到真实的电平值。高阻态的重要作用就是I/O(输入/输出)口在输入时读入外部电平用
上拉就是将不确定的信号通过一个电阻嵌位在高电平,电阻同时起限流作用,下拉同理。上拉是对器件注入电流,下拉是输出电流,弱强只是上拉电阻的阻值不同
上拉电阻很大,提供的驱动电流很小,叫弱上拉;反之叫强上拉。
总之 开漏输出本身是不带高电平的,若想要输出为高,需要外接上拉电阻才能输出高电平。常用的I2C电路为典型的开漏输出电路。
1:环境
STM32F103C8T6
外部LED灯一个
电阻 10K 欧姆 (一般推荐 控制 10KΩ- 100KΩ ,通信1KΩ-10KΩ)
2:线路连接图
GPIO A2
下面2种都可以,方正都是串在一起
1>
2>
3:主要代码
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);/*Configure GPIO pin : PA2 */GPIO_InitStruct.Pin = GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}
/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); //高 //LED 亮delay_ms_func(1000);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); //低电平 //led 灭delay_ms_func(1000);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
4:运行结果
1OKΩ的,不怎么亮(不知道还是白天的)
换个4.7KΩ的 ,来张照片
5:DEMO工程
有需要再上传
如果觉得有用,麻烦点个赞,加个收藏