总结:当单片机想要接收数据时,控制变为低电平并返回数据。 万用表测量检测到受控引脚始终处于高电平。 即使该函数写入多次,将引脚写入低电平,测量值仍然是高电平。
1. 问题:
问题症状:当我执行RS485操作时,我注意到有时接收中断,有时不中断:
当我连接RS485的AB输出引脚时485 直接连接到 TX。 和串口RX。 事实证明,串口可以周期性发送数据并发起中断,但是有点失控。
接下来测量MAX485引脚,你会看到MAX485 RE/DE引脚始终处于高电平我明白了。
根据RS485的工作原理:
p> 当单片机要发送数据时,控制CTRL为高电平将通过TXD发送数据。 如果单片机要接收数据,控制CTRL为低电平,通过RXD接收数据。
普通 485 电路。 然而,“RXD是用来连接485芯片的RO引脚的,TXD是用来连接485芯片的DI引脚的。”
检测:
控制 RE/DE 的引脚始终通过万用表 将会。 对于测量来说,即使主函数写入多个条带并将IO引脚设置为低电平,在测量过程中仍然会保持高电平。
2、解决办法
手动检查后发现I/O口无法正常输出。这通常是由于端口被重用造成的。 除了检查你的程序中是否有复用端口的程序外,有些端口在单片机上电时默认是复用的,比如与JTAG相关的PA13和PA14,这也是需要注意的。 、PA15、PB3、PB4 引脚可以通过禁用 JTAG 或 SWD 来部分释放。 见表:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//先重新映射需要启用AFIO GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//仅关闭JTAG,保留SWD
RS485控制收发器引脚正好是—A15
更改初始化函数。
void RS485_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* USART 时钟设置 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ GPIOA|RCC_APB2Periph_GPIOC, ENABLE) ; RCC_APB1PeriphClockCmd(RS485_USART_CLK, ENABLE); //复位问题处理 RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); /* TX GPIO */ GPIO_InitSstruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /*RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure .GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init ( GPIOC, &GPIO_InitStructure); /* 485 个收发器控制引脚*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; Init(GPIOA, &GPIO_InitS 结构);/* USART * / USART_InitStructure.USART_BaudRate = RS485_USART_BAUDRATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1;_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode_Rx | USART_Init(RS485_USART, &USART_InitStructure);#ifdef EN_UART4_RX //接收使能/*NVIC*/ NVIC_InitStructure .NVIC_IRQChannel = NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 。 NVIC_IRQChannelSubPriority = 2; NVIC_IRQChannelCmd = 启用; NVIC_Init(&NVIC_InitStructure);USART_ITConfig(RS485_USART, USART_IT_IDLE, ENABLE);#endif USART_Cmd(RS485_USART, ENABLE); ; USART_DMACmd(UART4, USART_DMAReq_Tx, 启用); USART_DMAReq_Rx, ENABLE); USART_GetITStatus(UART4, USART_FLAG_TC); RS485_TX_EN =0; // 设置 485 模式控制:0:RX,1:TX} 3. 总结
如果万用表的测量引脚变低,则测试成功。 !
参考:如何解决STM32 I/O口无法输出高电平的问题level Normal为低级_七霸猴的博客-CSDN博客
评论前必须登录!
注册