標題:
STM32H750單片機LPUART+BDMA控制程序
[打印本頁]
作者:
輝耀石
時間:
2025-4-30 11:21
標題:
STM32H750單片機LPUART+BDMA控制程序
STM32H750 LPUART + BDMA 控制,認證 BDMA 使用
注意:BDMA 只能使用 SRAM4
#include "cspDwt.h"
#include <stdio.h>
#include "stm32h7xx_hal.h"
/* mdk 下載需要 勾選 Stop After Reset */
/* DWT 計時功能 */
typedef struct
{
unsigned char count;
unsigned int note[DWT_NOTE_MAX_NUMBER + 1];
}Ctrl_t;
static Ctrl_t s_ctrl = {0};
static Ctrl_t *p = &s_ctrl;
/* ----- DWT 延時 ----- */
#define DWT_CR *(volatile uint32_t *)0xE0001000
#define DWT_CYCCNT *(volatile uint32_t *)0xE0001004
#define DEM_CR *(volatile uint32_t *)0xE000EDFC
#define DEM_CR_TRCENA (1 << 24)
#define DWT_CR_CYCCNTENA (1 << 0)
/**
* @brief DWT 延時初始化
* @param void
* @return void
*/
void cDwt_Init(void)
{
DEM_CR |= DEM_CR_TRCENA;
DWT_CR |= DWT_CR_CYCCNTENA;
}
/**
* @brief DWT 微秒延時
* @param US 延時計數(shù)
* @return void
*/
void cDwt_DelayUs(unsigned int us)
{
unsigned int startTime = DWT_CYCCNT;
unsigned int time = us * (SystemCoreClock / (1000000));
unsigned int endTime = startTime + time;
if (endTime > startTime)
{
while ((DWT_CYCCNT > startTime) && (DWT_CYCCNT < endTime));
}
else
{
while ((DWT_CYCCNT > startTime) && (DWT_CYCCNT < endTime));
}
}
/**
* @brief DWT 毫秒延時
* @param MS 延時計數(shù)
* @return void
*/
void cDwt_DelayMs(unsigned int ms)
{
for(unsigned int i = 0; i < ms; i++)
{
cDwt_DelayUs(1000);
}
}
/* 計時結束清零 */
void cDwt_Start(void)
{
p->count = 1;
p->note[0] = DWT_CYCCNT;
}
/* 計時打點 */
void cDwt_Note(void)
{
if (p->count >= DWT_NOTE_MAX_NUMBER)
{
printf("%s 計時失敗 計時點不足\r\n", __func__);
}
p->note[p->count] = DWT_CYCCNT;
p->count++;
}
/* 計時結束 + 打印時間參數(shù) */
void cDwt_End(void)
{
unsigned int coreClock = HAL_RCC_GetSysClockFreq() / 1000000;
unsigned int realCount = 0;
unsigned int totalUs = 0;
unsigned int showUs = 0;
unsigned int showMs = 0;
unsigned int showS = 0;
for (int i = 0; i < p->count; i++)
{
/* 判斷時鐘是否重新計時 */
if (p->note[i] < p->note[0])
{
realCount = 0xFFFFFFFF - p->note[0] + p->note[i];
}
else
{
realCount = p->note[i] - p->note[0];
}
totalUs = realCount / coreClock;
showS = totalUs / 1000000;
showMs = (totalUs - showS * 1000000) / 1000;
showUs = (totalUs - showS * 1000000 - showMs * 1000);
printf("Time[%d]-[%d]s-[%d]ms-[%d]us\r\n", i, showS, showMs, showUs);
}
}
復制代碼
原理圖: 無
仿真: 無
代碼:
STM32H750VB_CubeMx_LPUART_BDMA.7z
(812.65 KB, 下載次數(shù): 0)
2025-5-1 14:47 上傳
點擊文件名下載附件
示例代碼
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1