硬汉嵌入式论坛

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

[UART] STM32H7的低功耗串口支持HSI时钟,LSE时钟和D3PCLK时钟,最高速可达33Mbps

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2020-2-12 00:59:29 | 显示全部楼层 |阅读模式
LPUART可以选择HSI时钟,LSE时钟和D3PCLK1时钟:
1、LPUART时钟选择LSE(32768Hz),最高速度是10922bps,最低8bps。
2、LPUART时钟选择HSI(64MHz),最高值是21MHz,最小值15625bps。
3、LPUART时钟选择D3PCLK1(100MHz),最大值33Mbps,最小值24414bps。


  1. /* 使用LSE(32768Hz),最高速度是10922bps,最低8bps */       
  2. #if defined (LPUART_CLOCK_SOURCE_LSE)
  3.         {
  4.                 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  5.                 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
  6.                 RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  7.                 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

  8.                 if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
  9.                 {
  10.                         Error_Handler(__FILE__, __LINE__);               
  11.                 }
  12.                
  13.                 RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
  14.                 RCC_PeriphCLKInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_LSE;
  15.                 HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
  16.         }       
  17. /* LPUART时钟选择HSI(64MHz),最高值是21MHz,最小值15625bps */       
  18. #elif defined (LPUART_CLOCK_SOURCE_HSI)
  19.         {

  20.                 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  21.                   RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI;
  22.                   RCC_OscInitStruct.HSIState            = RCC_HSI_ON;
  23.                   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  24.                   RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_NONE;

  25.                 if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
  26.                 {
  27.                         Error_Handler(__FILE__, __LINE__);               
  28.                 }
  29.                
  30.                 RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
  31.                 RCC_PeriphCLKInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_HSI;
  32.                 HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
  33.         }
  34. /* LPUART时钟选择D3PCLK1(100MHz),最大值33Mbps,最小值24414bps */       
  35. #elif defined (LPUART_CLOCK_SOURCE_D3PCLK1)
  36.        
  37.         RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
  38.         RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPUART1CLKSOURCE_D3PCLK1;
  39.         HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
  40. #else
  41.         #error Please select the LPTIM Clock source inside the bsp_lpuart_fifo.c file
  42. #endif
复制代码




回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-2-28 15:14:27 | 显示全部楼层
本帖最后由 小飞侠凯凯 于 2023-2-28 16:06 编辑

硬汉老哥,我使用裸机历程中的“V7-013_RS485多机通讯”,把时钟改为HSI,代码如下(仅仅改了分频)        RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};      
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};      
  HAL_StatusTypeDef ret = HAL_OK;          /* 锁住SCU(Supply configuration update) */      
   MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);        
  /*        1、芯片内部的LDO稳压器输出的电压范围,可选VOS1,VOS2和VOS3,不同范围对应不同的Flash读速度,          详情看参考手册的Table 12的表格。       2、这里选择使用VOS1,电压范围1.15V - 1.26V。     */         __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);         
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
//        System Clock source            = PLL (HSE)
//        SYSCLK(Hz)                     = 400000000 (CPU Clock)
//        HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
//        AHB Prescaler                  = 2
//        D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
//        D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
//        D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
//        D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
//        HSE Frequency(Hz)              = 25000000
//        PLL_M                          = 5
//        PLL_N                          = 160
//        PLL_P                          = 2
//        PLL_Q                          = 4
//        PLL_R                          = 2
//        VDD(V)                         = 3.3
//        Flash Latency(WS)              = 4                        
  /* 使能HSE,并选择HSE作为PLL时钟源 */      
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;      
  RCC_OscInitStruct.HSEState = RCC_HSE_OFF;      
  RCC_OscInitStruct.HSIState = RCC_HSE_ON;      
   RCC_OscInitStruct.CSIState = RCC_CSI_OFF;      
   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;   
     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;      
      RCC_OscInitStruct.PLL.PLLM = 4;        
RCC_OscInitStruct.PLL.PLLN = 50;         
RCC_OscInitStruct.PLL.PLLP = 2;         
RCC_OscInitStruct.PLL.PLLR = 2;        
RCC_OscInitStruct.PLL.PLLQ = 2;                                    
      RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;     
    RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;            
    ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);     
    if(ret != HAL_OK)   
     {         Error_Handler(__FILE__, __LINE__);         }  
//        选择PLL的输出作为系统时钟
//        配置RCC_CLOCKTYPE_SYSCLK系统时钟
//        配置RCC_CLOCKTYPE_HCLK 时钟,对应AHB1,AHB2,AHB3和AHB4总线
//        配置RCC_CLOCKTYPE_PCLK1时钟,对应APB1总线
//        配置RCC_CLOCKTYPE_PCLK2时钟,对应APB2总线
//        配置RCC_CLOCKTYPE_D1PCLK1时钟,对应APB3总线
//        配置RCC_CLOCKTYPE_D3PCLK1时钟,对应APB4总线        
       RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \    CC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);          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;                   /* 此函数会更新SystemCoreClock,并重新配置HAL_InitTick */      
  ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);      
   if(ret != HAL_OK)      
  {         Error_Handler(__FILE__, __LINE__);         };
但是使用”V7-600_uCOS-III实验_程序移植模板(3.08.00)“这个例程时,也是只改了这些,串口打印就是乱码。是不是还有其他地方需要注意的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2023-3-1 16:21:53 | 显示全部楼层
小飞侠凯凯 发表于 2023-2-28 15:14
硬汉老哥,我使用裸机历程中的“V7-013_RS485多机通讯”,把时钟改为HSI,代码如下(仅仅改了分频)        ...

我一直没有使用过HSI, 你使用HSE正常吗,正常就没问题。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-3-2 22:48:57 | 显示全部楼层
HSE可以,HSI目前也可以了,对照cubemux配置重新改一下就行了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 23:45 , Processed in 0.161034 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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