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 }
然后需要將項目設置中的這兩個選項打開
配合以上代碼重定義即可解決問題