STM32外部上拉实现5V输出(详细实现)

简述

stm32的IO口默认电平为0-3.3V输出,想要实现5V输出,需要借助外部上拉5V来实现,设置引脚模式为开漏输出或复用开漏输出。

外部上拉电路

主要就是一个电阻参数选择的问题,其实这个电阻主要就是其一个限流作用,5k到10K左右都可以,大一点小一点影响都不大,选用10K,亲测可行。
外部上拉电路

IO口引脚配置

主要就是一个设置io口输出模式为开漏输出或复用开漏输出。

	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);//使能io口时钟
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
 	//使能AFIO复用功能模块时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_15; //G8和G15
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; 
	 //设置为开漏输出 外接上拉电阻5v
 	//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
	//设置复用开漏输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化GPIO
	GPIO_SetBits(GPIOG,GPIO_Pin_8);	//拉高输出5V  IN1
    GPIO_ResetBits(GPIOG,GPIO_Pin_15);	 //拉低	  IN2

注意事项

想要实现外部上拉5v输出,除了需要设置开漏输出外,还有一个要求,那就是该IO口必须能兼容5V才行,不然也无法输出5v,只能输出3.3V。
如何判断是否兼容5V?
查看手册芯片手册IO口号是否带有FT标识
必须带有这个标识才能通过开漏输出加外部上拉输出5V电平。

FT标识
ZET6带FT标识的引脚有:

PF0~PF5 
PA8~PA15
PB2、PB2、PB4
PB6~PB15
PC6~PC12
PD0 ~PD15
PE0~PE15
PF11~PF15
PG0~PG15

详情请见stm32f103ZET6 芯片手册

下载链接:

链接:https://pan.baidu.com/s/1Zf8Ssnz0IsrA8rMUI7BSUA
提取码:kafo

开漏输出内部实现

内部电路
这个开关的状态由引脚电平决定
当设置为高电平时,开关打开,此时io口处于悬浮状态,输出电平由外部上拉电路决定。
当设置为低电平时,开关闭合,外部上拉5v接地,输出为0V。

以上就是stm32IO口设置外部上拉5v输出的实现,有问题欢迎评论区留言,觉得还行,不吝赐赞。

  • 34
    点赞
  • 208
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
实现DAC输出0-5V电压,需要使用STM32内部的DAC模块,以下是实现步骤: 1. 配置GPIO口为模拟输出模式。 2. 配置DAC模块的时钟和参考电压值。 3. 配置DAC输出数据缓存区。 4. 启动DAC转换并设置输出电压值。 具体实现步骤如下: 1. 配置GPIO口为模拟输出模式。 使用CubeMX或手动配置寄存器,将需要输出的引脚配置为模拟输出模式,例如PA4引脚。 2. 配置DAC模块的时钟和参考电压值。 DAC模块的时钟和参考电压值需要根据实际情况进行配置,例如使用STM32F429的DAC模块,可以设置时钟为APB1时钟的1/4,参考电压值为3.3V。 3. 配置DAC输出数据缓存区。 DAC模块的输出数据缓存区可以使用DMA或者中断方式进行配置。如果使用DMA方式,需要先配置DMA通道和缓存区地址,然后启动DMA传输。如果使用中断方式,需要先开启DAC中断,然后在DAC中断处理函数中更新DAC输出值。 4. 启动DAC转换并设置输出电压值。 启动DAC转换可以使用软件触发或者硬件触发方式。使用软件触发方式,需要在DAC转换开始前调用DAC软件触发函数。使用硬件触发方式,需要配置外部触发源,并将DAC触发方式设置为外部触发。 设置DAC输出电压值可以使用DAC输出数据缓存区或者直接设置DAC数据寄存器的方式。例如,设置输出电压为2.5V,可以将DAC数据寄存器设置为0x7FF。 完整的代码示例如下(使用STM32CubeIDE): ``` #include "stm32f4xx.h" DAC_HandleTypeDef hdac; void DAC_Config(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin : PA4 */ GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* DAC1 clock enable */ __HAL_RCC_DAC_CLK_ENABLE(); /* DAC1 DMA Init */ /* DAC1_CH1 Init */ hdma_dac1.Instance = DMA1_Stream5; hdma_dac1.Init.Channel = DMA_CHANNEL_7; hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_dac1.Init.MemInc = DMA_MINC_ENABLE; hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_dac1.Init.Mode = DMA_CIRCULAR; hdma_dac1.Init.Priority = DMA_PRIORITY_LOW; hdma_dac1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_dac1) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&hdac, DMA_Handle1, hdma_dac1); /* DAC1 interrupt Init */ HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); /* DAC1 init */ hdac.Instance = DAC; HAL_DAC_Init(&hdac); HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)DAC_Buffer, DAC_Buffer_Size, DAC_ALIGN_12B_R); } void TIM6_DAC_IRQHandler(void) { HAL_DAC_IRQHandler(&hdac); } int main(void) { HAL_Init(); DAC_Config(); while (1) { HAL_Delay(1000); /* Set DAC output voltage to 2.5V */ DAC_Buffer[0] = 0x7FF; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值