本帖最后由 289466080 于 2019-5-23 14:34 编辑
最近调试一个串口通讯刚开始固定接收8字节没问题,实际应用时偶尔会接收16字节不规律,后来网上找不定长接收,(因只会用cube配置的所以很多方式都行不通只有DMA+IDLE可行)但是问题有来了如果接收超过设定最大值也无法再正常接收,后来再当产生闲时中断时定时器计时超过10ms重置DMA。下面是我配置的配置
超过最大值10ms重置,实测20ms间隔发送接收正常STM32F030。
1.cube配置图
debug
debug
tim1
uart1
时钟
uart1
uart1
uart1
tim1
tim1
2.main.h 添加串口接收最大值- /* USER CODE BEGIN Private defines */
- typedef unsigned char u8;
- typedef unsigned short int u16;
- typedef unsigned long u32;
- #define RECEIVELEN 16
- /* USER CODE END Private defines */
复制代码 3.1 main.c添加- /* USER CODE BEGIN Includes */
- #include "string.h"
- /* USER CODE END Includes */
- /* Private variables ---------------------------------------------------------*/
- /* USER CODE BEGIN PV */
- /* Private variables ---------------------------------------------------------*/
- //uatr1
- u8 uart1_Rx_flag; //接收空閒標誌位
- u8 uart1_Rx_Err; //接收異常標誌位
- u8 uart1_Rx_Tem; //接收異常計時重置接收
- u8 uart1_RxBuff[RECEIVELEN]; //接收缓冲
- u16 uart1_Rx_Len; //接收长度
- /* USER CODE END PV */
复制代码 3.2 main.c添加
- /* USER CODE BEGIN 2 */
- //tim1
- HAL_TIM_Base_Start_IT(&htim1); //启用TIM1并使能其中断
- //uart1
- HAL_UART_Receive_DMA(&huart1, uart1_RxBuff, RECEIVELEN);
- __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
- /* USER CODE END 2 */
复制代码 3.3 main.c添加接收处理
- /* USER CODE BEGIN 3 */
- if(uart1_Rx_flag==1)
- {
- uart1_Rx_flag = 0;
- uart1_Rx_Err = 1;
- if(uart1_RxBuff[0] == 0 && uart1_RxBuff[1] == 1)
- {
- uart1_Rx_Err = 0;
- uart1_Rx_Tem = 0;
-
- HAL_UART_Transmit(&huart1, (uint8_t *)&uart1_RxBuff, uart1_Rx_Len,0xFFFF);
- memset(uart1_RxBuff,0x00,sizeof(uart1_RxBuff)); //清空数组
- }
- }
- }
- /* USER CODE END 3 */
复制代码 3.4 main.c添加溢出DMA重置
- /* USER CODE BEGIN 4 */
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- if (htim->Instance == htim1.Instance)
- {
- if(uart1_Rx_Err==1)
- {
- if(uart1_Rx_Tem++ >=10)
- {
- uart1_Rx_Tem = 0;
- uart1_Rx_Err = 0;
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);
- HAL_UART_DMAStop(&huart1);
- HAL_UART_Receive_DMA(&huart1,uart1_RxBuff,RECEIVELEN);
- }
- }
- }
- }
- /* USER CODE END 4 */
复制代码 4.1 stm32f0xx_it.c添加
- /* USER CODE BEGIN 0 */
- extern u8 uart1_Rx_flag; //接收空閒標誌位
- extern u8 uart1_RxBuff[RECEIVELEN]; //接收缓冲
- extern u16 uart1_Rx_Len; //接收长度
- /* USER CODE END 0 */
复制代码 4.2 stm32f0xx_it.c添加
- void USART1_IRQHandler(void)
- {
- /* USER CODE BEGIN USART1_IRQn 0 */
- uint32_t temp;
- if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
- {
- uart1_Rx_flag = 1;
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);
- HAL_UART_DMAStop(&huart1);
- temp = huart1.hdmarx->Instance->CNDTR;
- uart1_Rx_Len = RECEIVELEN - temp;
- HAL_UART_Receive_DMA(&huart1,uart1_RxBuff,RECEIVELEN);
- }
- /* USER CODE END USART1_IRQn 0 */
- HAL_UART_IRQHandler(&huart1);
- /* USER CODE BEGIN USART1_IRQn 1 */
- /* USER CODE END USART1_IRQn 1 */
- }
复制代码
测试代码
UATR.rar
(832.17 KB, 下载次数: 46)
|