濛Johnny 发表于 2023-5-18 14:30:43

STM32F407ZGT6,AD转换时无法接受数据

我用cubeMX写STM32F407ZGT6,想通过串口转蓝牙(串口3)控制单片机采集发送数据,同时上位机处理完的数据发给下位机。
但是此时下位机的串口3,接收到的数据不正常(有时对,有时完全收不到,有时只能接受到一部分)。

我重新建了一个程序后发现,加上AD采集后,就会出现上述的问题。求求各位大佬解答{:34:}
图中是中断优先级的配置

eric2013 发表于 2023-5-18 14:48:38

做个回环测试,最快速度的回环测试,看看你的这个环境能正常运行不。

濛Johnny 发表于 2023-5-18 14:53:31

eric2013 发表于 2023-5-18 14:48
做个回环测试,最快速度的回环测试,看看你的这个环境能正常运行不。

直接收发没问题,但是加了单片机的AD,串口就没法收数据了,但发数据不受影响

eric2013 发表于 2023-5-18 17:07:16

濛Johnny 发表于 2023-5-18 14:53
直接收发没问题,但是加了单片机的AD,串口就没法收数据了,但发数据不受影响

收发测试是批量测试不,比如最快速度测试10MB的数据量。

如果没问题了,再逐步开启新外设功能。还是不行的话,得需要你贴下代码了

濛Johnny 发表于 2023-5-18 18:48:03

eric2013 发表于 2023-5-18 17:07
收发测试是批量测试不,比如最快速度测试10MB的数据量。

如果没问题了,再逐步开启新外设功能。还是不 ...

       主程序就这样,您有时间的话帮忙看一下,谢谢{:34:}
      __IO float AD8232_Volt;
        uint32_t AdcValue1;
        uint8_t rx_buffer;
        uint8_t rx_Data="A1234B";       
        uint8_t All_Buffer="AA1.45670.012345C0BB";
       
        uint8_t ECG_widcnt = 0;
       
        uint32_t Re_cnt = 0;
        float ECG_4Wid = {0};
       
        _Bool StartOpenFlag = 0;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
float Moving_Mean(float* Data);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
* @briefThe application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_USART3_UART_Init();
MX_TIM3_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */




               
                        if(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE)!=RESET && StartOpenFlag ==0)
                        {
                                HAL_UART_Receive_IT(&huart3,rx_buffer,20);
                               
                        }

                        if(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE)!=RESET && StartOpenFlag ==1)
                        {

                                HAL_UART_Receive_IT(&huart3,rx_Data,6);

                        }
}
/* USER CODE END 3 */
}

/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 4;
RCC_OscInitStruct.PLL.PLLN = 100;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
    Error_Handler();
}

/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
{
    Error_Handler();
}
}

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        Re_cnt ++;
        if (huart == &huart3)
        {
                if(rx_buffer=='A'&&rx_buffer=='A'&&rx_buffer!='B')
                {
                        StartOpenFlag = 1;
                        HAL_TIM_Base_Start_IT(&htim3); //采样频率

                }

                        HAL_UART_Transmit(&huart1,(uint8_t *)rx_Data,6,0xffff);
       

        }

}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        if(htim==&htim3)
        {
                HAL_ADC_Start_DMA(&hadc1,&AdcValue1,1);//开启ADC终端转换
               
                AD8232_Volt = AdcValue1*3.3/4096;//心电采集的电压值
                sprintf(&All_Buffer, "%.4f", AD8232_Volt);
                sprintf(&All_Buffer, "%.6f", AD8232_Volt);
                All_Buffer = 'C';
                HAL_UART_Transmit(&huart3,(uint8_t *)All_Buffer,20,0xffff);
               
                HAL_ADC_Stop_DMA(&hadc1);
        }
       
}

eric2013 发表于 2023-5-19 10:51:19

濛Johnny 发表于 2023-5-18 18:48
主程序就这样,您有时间的话帮忙看一下,谢谢
      __IO float AD8232_Volt;
        uint32_t...

while大循环里面设计不合理。

如果你已经开启了中断,HAL库的中断里面会处理标志 UART_FLAG_RXNE

你的主程序仅仅是判断你的StartOpenFlag即可,另外你的帖的程序里面仅看到StartOpenFlag设置为1,没看到复位为0.

页: [1]
查看完整版本: STM32F407ZGT6,AD转换时无法接受数据