使用STM32G030接收和发送RS485的数据,发送数据正常,接收数据时串口能进中断,但数据不正确(RXD和TXD外部都有上拉电阻10K)。使用USB转串口设备RXD脚接到MCU的RXD口(TTL电平),USB转串口设备能接收正确数据,看有没哪位高手帮忙分析下,代码如下: void USART1_IRQHandler(void) { u8 UartData; if( LL_USART_IsActiveFlag_RXNE(USART1) == RESET ) //未检测到串口中断 return; UartData=LL_USART_ReceiveData8(USART1); //读取数据 LL_USART_RequestRxDataFlush(USART1); USART1_SendByte(UartData); if( (UartData==0x88)||(UartData==0x99)||(UartData==0xAA)||(UartData==0xBB)||(UartData==0xCC)) LL_GPIO_TogglePin(MCU_RUN_LED_GPIO_Port,MCU_RUN_LED_Pin); } void MX_USART1_UART_Init(void) { LL_USART_InitTypeDef USART_InitStruct = {0}; LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; /* Peripheral clock enable */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); GPIO_InitStruct.Pin = RS485_CTRL_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(RS485_CTRL_GPIO_Port, &GPIO_InitStruct); LL_GPIO_ResetOutputPin(RS485_CTRL_GPIO_Port,RS485_CTRL_Pin); /***** USART1 GPIO Configuration ******************* PA9 ------> USART1_TX PA10 ------> USART1_RX ******************************************************/ LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); GPIO_InitStruct.Pin = Usart1_TXD_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_1; LL_GPIO_Init(Usart1_TXD_GPIO_Port, &GPIO_InitStruct); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); GPIO_InitStruct.Pin = Usart1_RXD_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_1; LL_GPIO_Init(Usart1_RXD_GPIO_Port, &GPIO_InitStruct); /* USART1 interrupt Init */ NVIC_SetPriority(USART1_IRQn, 1); NVIC_EnableIRQ(USART1_IRQn); USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; USART_InitStruct.BaudRate = BAUDRATE; USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; USART_InitStruct.StopBits = LL_USART_STOPBITS_1; USART_InitStruct.Parity = LL_USART_PARITY_NONE; USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; LL_USART_Init(USART1, &USART_InitStruct); LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); LL_USART_DisableFIFO(USART1); //LL_USART_EnableFIFO(USART1); LL_USART_ConfigAsyncMode(USART1); LL_USART_Enable(USART1); LL_USART_EnableIT_RXNE(USART1); LL_USART_EnableIT_PE(USART1); /* Polling USART1 initialisation */ while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))) { } } void USART1_SendByte(u8 newData) { LL_GPIO_SetOutputPin (RS485_CTRL_GPIO_Port,RS485_CTRL_Pin); while( LL_USART_IsActiveFlag_TC(USART1)==0 ); //等待串口旧数据发送完成 LL_USART_TransmitData8(USART1,newData); //数据从串口发送出去 while( LL_USART_IsActiveFlag_TC(USART1)==0 ); //等待串口旧数据发送完成 LL_GPIO_ResetOutputPin(RS485_CTRL_GPIO_Port,RS485_CTRL_Pin); } |
STM32F767IGx 使用串口模块正常运行串口不能接收,debug模式正常。
stm32G0B1RCT6在串口快速收发时导致中断服务函数无法进入
在FreeRTOS中串口重定向使用HAL库函数中断出现异常
stm32f407 开启两路(FS和HS) Custom HID,与上位机通信偶尔中断
usart奇偶校验问题
串口IDLE标识被自动清除
串联的总线舵机是不是只用一个UART接口就能控制呢
求助STM32L010F4P6的USART2使用DMA只能接收一个字节!
Flash Loader Demonstrator
Flash Loader Demonstrator
用USB转串口的设备能正常接收,波特率为57600,我把波特率调低到38400和9600就可以了,调高了配置的Speed也不行,目前没找到问题出在哪里。
485是半双工 不能同时收发 ,你要留意