F7串口3波特率115200,串口软件用38400才能正确收发

2019-07-20 09:47发布

本帖最后由 吹水唔抹嘴 于 2017-12-20 11:03 编辑

系统时钟源如下图。
     时钟源为HSE,串口3时钟54MHz,串口三采样为默认,即16倍过采样。但是在串口波特率设为115200时,串口工具也是115200,无法正常收发,如果将串口上位机软件的波特率设为38400(115200/3)就能正常收发。
BRR = USARTDIV = 54000000/115200=468d = 0x01D4,通过在线调试,串口3 初始化后,BRR的值为0x01D5,好像也对啊。 1513736987(1).png
//HSE作为时钟源
[mw_shl_code=c,true]//外部晶振为25M的时候,推荐值:plln=432,pllm=25,pllp=2,pllq=9.
//得到:Fvco=25*(432/25)=432Mhz
//     Fsys=432/2=216Mhz
//     Fusb=432/9=48Mhz
//返回值:0,成功;1,失败
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)//    Stm32_Clock_Init(432,25,2,9);
{
    HAL_StatusTypeDef ret = HAL_OK;
    RCC_OscInitTypeDef RCC_OscInitStructure;
    RCC_ClkInitTypeDef RCC_ClkInitStructure;
       
    __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟

    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别,以便在器件未以最大频率工作
      
    RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;    //时钟源为HSE
    RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE
    RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;                                   //打开PLL
    RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;          //PLL时钟源选择HSE
    RCC_OscInitStructure.PLL.PLLM=25;        //主PLL和音频PLL分频系数(PLL之前的分频)
    RCC_OscInitStructure.PLL.PLLN=432; //主PLL倍频系数(PLL倍频)
    RCC_OscInitStructure.PLL.PLLP=2; //系统时钟的主PLL分频系数(PLL之后的分频)
    RCC_OscInitStructure.PLL.PLLQ=2; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频)
    ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
    if(ret!=HAL_OK) while(1);
   
    ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能
    if(ret!=HAL_OK) while(1);
   
    //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
    RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
    RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
    RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
    RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4;//APB1分频系数为4
    RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2;//APB2分频系数为2
   
    ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_7);//同时设置FLASH延时周期为7WS,也就是8个CPU周期。
    if(ret!=HAL_OK) while(1);
}
//串口3初始化
//bound:波特率
void uart_init(u32 bound)
{       
        //UART 初始化设置
        UART3_Handler.Instance=USART3;                                            //USART1
        UART3_Handler.Init.BaudRate=bound;                                    //波特率
        UART3_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式
        UART3_Handler.Init.StopBits=UART_STOPBITS_1;            //一个停止位
        UART3_Handler.Init.Parity=UART_PARITY_NONE;                    //无奇偶校验位
        UART3_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控
        UART3_Handler.Init.Mode=UART_MODE_TX_RX;                    //收发模式
        HAL_UART_Init(&UART3_Handler);                                            //HAL_UART_Init()会使能UART1
       
        HAL_UART_Receive_IT(&UART3_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
//  HAL_UART_MspInit(&UART3_Handler);
}[/mw_shl_code]


但是如果时钟源用HSI,波特率就是F7软件设置的

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。