硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3854|回复: 2
收起左侧

[UART] 【求助】STM32H750串口的波特率只能到115200,再提高后数据就错误

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2020-8-12 17:21:02 | 显示全部楼层 |阅读模式
各位大佬,小弟初接触H7系列的HAL库,测试串口时,默认波特率采用的115200,收发都正常,后来跟上位机通讯时候要求460800,修改后发现数据就完全不正常了,下面是串口部分代码,请帮忙看看,谢谢!

==================
SystemClock_Config部分

void SystemClock_Config(void)
{
        RCC_OscInitTypeDef RCC_OscInitStruct = {0};
        RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

        /* 启用电源配置更新 */
        HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
       
        /* 配置主内稳压器输出电压 */
        __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

        while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
               
        /* 初始化CPU、AHB和APB总线时钟 */
        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 = 5;
        RCC_OscInitStruct.PLL.PLLN = 192;
        RCC_OscInitStruct.PLL.PLLP = 2;
        RCC_OscInitStruct.PLL.PLLQ = 2;
        RCC_OscInitStruct.PLL.PLLR = 2;
        RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
        RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
        RCC_OscInitStruct.PLL.PLLFRACN = 0;
        if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
        {
                while(1);
        }

        /* 初始化CPU、AHB和APB总线时钟 */
        RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                                                                 |RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2
                                                                 |RCC_CLOCKTYPE_D3PCLK1 | RCC_CLOCKTYPE_D1PCLK1;
        RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
        RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
        RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
        RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
        RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
        RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
        RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

        if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
        {
                while(1);
        }
}


==================================
串口部分:
void USART1_Config(uint32_t baudrate)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;

    __HAL_RCC_GPIOA_CLK_ENABLE();

    /* 配置串口1时钟源*/
        RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
        RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
        HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
       
    /* 使能串口1时钟 */
    __USART1_CLK_ENABLE();
//        __HAL_RCC_USART1_CLK_ENABLE();

    /* 配置引脚为复用功能  */
    GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
       
    /* 配置 USART 模式 */
    USART1_Handle.Instance = USART1;
    USART1_Handle.Init.BaudRate = baudrate;
    USART1_Handle.Init.WordLength = UART_WORDLENGTH_8B;
    USART1_Handle.Init.StopBits = UART_STOPBITS_1;
    USART1_Handle.Init.Parity = UART_PARITY_NONE;
    USART1_Handle.Init.Mode = UART_MODE_TX_RX;
    USART1_Handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    USART1_Handle.Init.OverSampling = UART_OVERSAMPLING_16;
    USART1_Handle.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
    USART1_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    HAL_UART_Init(&USART1_Handle);

    /* 串口1中断初始化 */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);

        __HAL_UART_CLEAR_IDLEFLAG(&USART1_Handle);
       
        /* 开启串口接收中断 */
//    __HAL_UART_ENABLE_IT(&USART1_Handle, UART_IT_RXNE);
       
        /* 开启串口空闲中断 */
        __HAL_UART_ENABLE_IT(&USART1_Handle, UART_IT_IDLE);
}


=============================
使用空闲中断来接收数据:
void USART1_IRQHandler(void)
{
        if(__HAL_UART_GET_IT(&USART1_Handle, UART_IT_RXNE) != RESET){
                HAL_UART_Receive(&USART1_Handle, (uint8_t *)&USART1_RxBuffer[USART1_RxCount++], 1, 1000);
                __HAL_UART_CLEAR_FLAG(&USART1_Handle, UART_FLAG_RXNE);
        }else if(__HAL_UART_GET_IT(&USART1_Handle, UART_IT_IDLE) != RESET){
                USART1_RxFlag = true;
                __HAL_UART_CLEAR_FLAG(&USART1_Handle, UART_FLAG_IDLE);
        }
        HAL_UART_IRQHandler(&USART1_Handle);
}


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2020-8-12 18:25:40 | 显示全部楼层
有个类似的问题:

STM32H7 串口支持921600波特率问题
http://www.armbbs.cn/forum.php?m ... 6933&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2020-8-13 16:25:55 | 显示全部楼层
eric2013 发表于 2020-8-12 18:25
有个类似的问题:

STM32H7 串口支持921600波特率问题

感谢您的回复!

今天跟硬件研发碰头研究了一下,发现是使用的422芯片有问题,波特率一高,通讯就会异常,换了MAX490后就一切正常了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 21:24 , Processed in 0.251311 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表