找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 313|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32H750單片機LPUART+BDMA控制程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:480543 發(fā)表于 2025-4-30 11:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32H750 LPUART + BDMA 控制,認(rèn)證 BDMA 使用
注意:BDMA 只能使用 SRAM4

  1. #include "cspDwt.h"

  2. #include <stdio.h>

  3. #include "stm32h7xx_hal.h"

  4. /* mdk 下載需要 勾選 Stop After Reset */

  5. /* DWT 計時功能 */
  6. typedef struct
  7. {
  8.     unsigned char count;
  9.     unsigned int note[DWT_NOTE_MAX_NUMBER + 1];
  10.    
  11. }Ctrl_t;

  12. static Ctrl_t s_ctrl = {0};
  13. static Ctrl_t *p = &s_ctrl;

  14. /* ----- DWT 延時 -----        */
  15. #define  DWT_CR             *(volatile uint32_t *)0xE0001000
  16. #define  DWT_CYCCNT         *(volatile uint32_t *)0xE0001004
  17. #define  DEM_CR             *(volatile uint32_t *)0xE000EDFC
  18. #define  DEM_CR_TRCENA      (1 << 24)
  19. #define  DWT_CR_CYCCNTENA   (1 <<  0)

  20. /**
  21. * @brief  DWT 延時初始化
  22. * @param  void
  23. * @return void
  24. */
  25. void cDwt_Init(void)
  26. {
  27.     DEM_CR |= DEM_CR_TRCENA;
  28.     DWT_CR |= DWT_CR_CYCCNTENA;
  29. }

  30. /**
  31. * @brief  DWT 微秒延時
  32. * @param  US 延時計數(shù)
  33. * @return void
  34. */
  35. void cDwt_DelayUs(unsigned int us)
  36. {
  37.     unsigned int startTime = DWT_CYCCNT;
  38.     unsigned int time =  us * (SystemCoreClock / (1000000));
  39.     unsigned int endTime = startTime + time;
  40.    
  41.     if (endTime > startTime)
  42.     {
  43.         while ((DWT_CYCCNT > startTime) && (DWT_CYCCNT < endTime));
  44.     }
  45.     else
  46.     {
  47.         while ((DWT_CYCCNT > startTime) && (DWT_CYCCNT < endTime));
  48.     }
  49. }

  50. /**
  51. * @brief  DWT 毫秒延時
  52. * @param  MS 延時計數(shù)
  53. * @return void
  54. */
  55. void cDwt_DelayMs(unsigned int ms)
  56. {
  57.     for(unsigned int i = 0; i < ms; i++)
  58.     {
  59.         cDwt_DelayUs(1000);
  60.     }
  61. }

  62. /* 計時結(jié)束清零 */
  63. void cDwt_Start(void)
  64. {
  65.     p->count = 1;
  66.     p->note[0] = DWT_CYCCNT;
  67. }

  68. /* 計時打點 */
  69. void cDwt_Note(void)
  70. {
  71.     if (p->count >= DWT_NOTE_MAX_NUMBER)
  72.     {
  73.         printf("%s 計時失敗 計時點不足\r\n", __func__);
  74.     }
  75.    
  76.     p->note[p->count] = DWT_CYCCNT;
  77.     p->count++;
  78. }

  79. /* 計時結(jié)束 + 打印時間參數(shù) */
  80. void cDwt_End(void)
  81. {
  82.     unsigned int coreClock = HAL_RCC_GetSysClockFreq() / 1000000;
  83.     unsigned int realCount = 0;
  84.     unsigned int totalUs = 0;
  85.     unsigned int showUs = 0;
  86.     unsigned int showMs = 0;
  87.     unsigned int showS = 0;
  88.     for (int i = 0; i < p->count; i++)
  89.     {
  90.         /* 判斷時鐘是否重新計時 */
  91.         if (p->note[i] < p->note[0])
  92.         {
  93.             realCount = 0xFFFFFFFF - p->note[0] + p->note[i];
  94.         }
  95.         else
  96.         {
  97.             realCount = p->note[i] - p->note[0];
  98.         }
  99.         
  100.         totalUs = realCount / coreClock;
  101.         showS = totalUs / 1000000;
  102.         showMs = (totalUs - showS * 1000000) / 1000;
  103.         showUs = (totalUs - showS * 1000000 - showMs * 1000);
  104.         printf("Time[%d]-[%d]s-[%d]ms-[%d]us\r\n", i, showS, showMs, showUs);
  105.     }
  106. }



復(fù)制代碼
原理圖: 無
仿真: 無
代碼: STM32H750VB_CubeMx_LPUART_BDMA.7z (812.65 KB, 下載次數(shù): 0)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表