1.采用单线半双工无法发送数据问题
①用CubeMX配置好Single Wire(Half-Duplex)模式,其他的默认
②用CubeMX配置好Clock
③生成代码后需要将HAL_UART_MspInit函数中的GPIO_Mode改为GPIO_MODE_AF_PP模式,需要将Pull改为GPIO_PULLUP,需要将Speed改为GPIO_SPEED_FREQ_HIGH。
1 /**USART1 GPIO Configuration 2 PA9 ------> USART1_TX 3 */ 4 GPIO_InitStruct.Pin = GPIO_PIN_9; 5 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 6 GPIO_InitStruct.Pull = GPIO_PULLUP; 7 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; 8 GPIO_InitStruct.Alternate = GPIO_AF7_USART1; 9 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
④发送的时候需要启动HAL_HalfDuplex_EnableTransmitter
⑤接收的时候需要启动HAL_HalfDuplex_EnableReceiver
1 static uint8_t data = 0x55; 2 while (1) 3 { 4 HAL_HalfDuplex_EnableTransmitter(&huart1); 5 HAL_UART_Transmit(&huart1, &data, 1, 0xffff); 6 HAL_HalfDuplex_EnableReceiver(&huart1); 7 HAL_Delay(1000); 8 }
2.使用printf打印无输出问题
由于CubeIDE没有Keil的Use MicroLIB选项,而且CubeIDE默认采用的是GNUC编译,所以putchar的接口有所不同
1 #include <stdio.h> 2 #ifdef __GNUC__ 3 #define PUTCHAR_REDEFINE int __io_putchar(int ch) 4 #else 5 #define PUTCHAR_REDEINFE int fputc(int ch, FILE *f) 6 #endif 7 PUTCHAR_REDEFINE 8 { 9 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff); 10 return ch; 11 }
然后需要将项目设置中的这两个选项打开
配合以上代码重定义即可解决问题