用STM32F030做串口通讯,发送端经常未知长度,后不能再次接收研究了好久,參考网上有DMA接收但是超过最大值也会出错需重置DMA。 UART DMA https://www.stmcu.org.cn/module/forum/thread-620624-1-1.html
因 STM32F030F4P6 FLASH 太小用DMA会多增加500字节。
1.在usart.c /* USER CODE BEGIN 1 */处增加代码方便后续cube配置不会被清除。
- /* USER CODE BEGIN 1 */
- void UsartReceive_IDLE(UART_HandleTypeDef *huart)
- {
- uint32_t isrflags = READ_REG(huart->Instance->ISR);
- uint32_t cr1its = READ_REG(huart->Instance->CR1);
- /* UART Idle interrupt occurred --------------------------------------------*/
- if (((isrflags & USART_ISR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
- {
- __HAL_UART_CLEAR_IDLEFLAG(huart);
- __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
- HAL_UART_RxIdleCallback(huart);
- return;
- }
- }
- /**
- * @brief Rx Idle callbacks.
- * @param huart: Pointer to a UART_HandleTypeDef structure that contains
- * the configuration information for the specified UART module.
- * @retval None
- */
- __weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
- {
- /* Prevent unused argument(s) compilation warning */
- UNUSED(huart);
- /* NOTE: This function should not be modified, when the callback is needed,
- the HAL_UART_RxIdleCallback can be implemented in the user file
- */
- }
- /* USER CODE END 1 */
复制代码 2.在usart.h /* USER CODE BEGIN Prototypes */ 新增
- /* USER CODE BEGIN Prototypes */
- void UsartReceive_IDLE(UART_HandleTypeDef *huart);
- void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);
- /* USER CODE END Prototypes */
复制代码 3.在stm32f0xx_it.c /* USER CODE BEGIN 0 */ 新增
- /* USER CODE BEGIN 0 */
- #include "usart.h"
- /* USER CODE END 0 */
复制代码 4.在stm32f0xx_it.c void USART1_IRQHandler(void) 新增
- void USART1_IRQHandler(void)
- {
- /* USER CODE BEGIN USART1_IRQn 0 */
- UsartReceive_IDLE(&huart1); //新增
- /* USER CODE END USART1_IRQn 0 */
- HAL_UART_IRQHandler(&huart1);
- /* USER CODE BEGIN USART1_IRQn 1 */
- /* USER CODE END USART1_IRQn 1 */
- }
复制代码 5.1在main.c /* USER CODE BEGIN Includes */ 新增
- /* USER CODE BEGIN Includes */
- #include "string.h"
- /* USER CODE END Includes */
复制代码 5.2在main.c /* USER CODE BEGIN PV */ 新增
- /* USER CODE BEGIN PV */
- /* Private variables ---------------------------------------------------------*/
- #define RECEIVELEN 16
- u8 uart1_Rx_Temp; //接收缓冲
- u8 uart1_RxBuff[RECEIVELEN]; //接收缓冲
- u16 uart1_Rx_Count; //接收长度
- /* USER CODE END PV */
复制代码 5.3在main.c /* USER CODE BEGIN 2 */ //新增
- /* USER CODE BEGIN 2 */
- HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart1_Rx_Temp, 1);
- /* USER CODE END 2 */
复制代码 5.4在main.c /* USER CODE BEGIN 4 */ 新增
- /* USER CODE BEGIN 4 */
- //UART1
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- if (huart->Instance == USART1)
- {
- uart1_RxBuff[uart1_Rx_Count] = uart1_Rx_Temp;
- HAL_UART_Receive_IT(huart, (uint8_t *)&uart1_Rx_Temp, 1);
- if (++uart1_Rx_Count >= RECEIVELEN)
- {
- uart1_Rx_Count--;
- }
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);
- __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
- }
- }
- void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
- {
- if (huart->Instance == USART1)
- {
- __HAL_UART_CLEAR_IDLEFLAG(huart);
- __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
- HAL_UART_Transmit(&huart1, (uint8_t *)&uart1_RxBuff, RECEIVELEN,0xFFFF);
- memset(uart1_RxBuff,0x00,sizeof(uart1_RxBuff)); //清空数组
- uart1_Rx_Count = 0;
- }
- }
- /* USER CODE END 4 */
复制代码
參考 https://www.stmcu.org.cn/module/forum/thread-620532-1-1.html?or5
|