有人可以协助并阐明如何为 DAC 配置 GPDMA 以将回调函数 HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac) 与
STM32U575CGU6 一起使用。
我抓住:
/* 数据传输错误中断管理 */
如果 ((__HAL_DMA_GET_FLAG(hdma, DMA_FLAG_DTE) != 0U))
/* 更新 DMA 通道错误代码 */
hdma->ErrorCode |= HAL_DMA_ERROR_DTE;
我的目标是捕捉回调函数:
HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac) 和 HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef* hdac)
并将mp3播放器与STM32U575CGU6集成。
在 STM32U575CGU6 之前,我使用 STM32F413 并且我的代码有效。
请协助。
谢谢!
请参阅代码的某些部分进行解释。
//////////////////////////////////////////////// ////////这是DMA的配置 /////////////
/* 包括-------------------------------------------- ------------------*/
#include "gpdma.h"
/* GPDMA1 初始化函数 */
void MX_GPDMA1_Init(void)
{
/* 外设时钟使能 */
__HAL_RCC_GPDMA1_CLK_ENABLE();
/* GPDMA1 中断初始化 */
HAL_NVIC_SetPriority(GPDMA1_Channel10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(GPDMA1_Channel10_IRQn)
}
//////////////////////////////////////////////// //////
//////////////////////////////////////////////// ////这是DAC的配置/////////////
/* 用户代码结束头 */
/* 包括-------------------------------------------- ------------------*/
#include "dac.h"
/* 用户代码从 0 开始 */
/* 用户代码结束 0 */
DAC_HandleTypeDef hdac1;
DMA_HandleTypeDef handle_GPDMA1_Channel10;
/* DAC1 初始化函数 */
void MX_DAC1_Init(void)
{
DAC_ChannelConfTypeDef sConfig = {0};
DAC_AutonomousModeConfTypeDef sAutonomousMode = {0};
/** DAC初始化
*/
hdac1.Instance = DAC1;
如果(HAL_DAC_Init(&hdac1)!= HAL_OK)
{
错误处理程序();
}
/** DAC 通道 OUT1 配置
*/
sConfig.DAC_HighFrequency = DAC_HIGH_FREQUENCY_INTERFACE_MODE_ABOVE_80MHZ;
sConfig.DAC_DMADoubleDataMode = 禁用;
sConfig.DAC_SignedFormat = 禁用;
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
sConfig.DAC_Trigger = DAC_TRIGGER_T2_TRGO;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_EXTERNAL;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
如果 (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{
错误处理程序();
}
/** 配置自主模式
*/
sAutonomousMode.AutonomousModeState = DAC_AUTONOMOUS_MODE_DISABLE;
如果 (HAL_DACEx_SetConfigAutonomousMode(&hdac1, &sAutonomousMode) != HAL_OK)
{
错误处理程序();
}
}
void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
如果(dacHandle->Instance==DAC1)
{
/* 用户代码开始 DAC1_MspInit 0 */
/* 用户代码结束 DAC1_MspInit 0 */
/** 初始化外设时钟
*/
PeriphClkInit.PeriphClockSelec
tion = RCC_PERIPHCLK_ADCDAC|RCC_PERIPHCLK_DAC1;
PeriphClkInit.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HSI;
PeriphClkInit.Dac1ClockSelection = RCC_DAC1CLKSOURCE_LSI;
如果(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit)!= HAL_OK)
{
错误处理程序();
}
/* DAC1 时钟使能 */
__HAL_RCC_DAC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**DAC1 GPIO 配置
PA4 ------> DAC1_OUT1
*/
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* DAC1 DMA 初始化 */
/* GPDMA1_REQUEST_DAC1_CH1 初始化 */
handle_GPDMA1_Channel10.Instance = GPDMA1_Channel10;
handle_GPDMA1_Channel10.Init.Request = GPDMA1_REQUEST_DAC1_CH1;
handle_GPDMA1_Channel10.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
handle_GPDMA1_Channel10.Init.Direction = DMA_MEMORY_TO_PERIPH;
handle_GPDMA1_Channel10.Init.SrcInc = DMA_SINC_INCREMENTED;
handle_GPDMA1_Channel10.Init.DestInc = DMA_DINC_FIXED;
handle_GPDMA1_Channel10.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_HALFWORD;
handle_GPDMA1_Channel10.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
handle_GPDMA1_Channel10.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
handle_GPDMA1_Channel10.Init.SrcBurstLength = 1;
handle_GPDMA1_Channel10.Init.DestBurstLength = 1;
handle_GPDMA1_Channel10.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT1|DMA_DEST_ALLOCATED_PORT0;
handle_GPDMA1_Channel10.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
handle_GPDMA1_Channel10.Init.Mode = DMA_NORMAL;
如果 (HAL_DMA_Init(&handle_GPDMA1_Channel10) != HAL_OK)
{
错误处理程序();
}
/**DAC1 GPIO 配置
PA4 ------> DAC1_OUT1
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4);
/////////////////////////////////////////
//////////////////////////////////////////////// ////这是定时器的配置 /////////////
TIM_HandleTypeDef htim2;
/* TIM2 初始化函数 */
void MX_TIM2_Init(void)
{
/* 用户代码开始 TIM2_Init 0 */
/* 用户代码结束 TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* 用户代码开始 TIM2_Init 1 */
/* 用户代码结束 TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 2999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
如果(HAL_TIM_Base_Init(&htim2)!= HAL_OK)
{
错误处理程序();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
如果 (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
错误处理程序();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
如果(HAL_TIMEx_MasterConfigSynchronization(&htim2,&sMasterConfig)!= HAL_OK)
{
错误处理程序();
}
/* 用户代码开始 TIM2_Init 2 */
/* 用户代码结束 TIM2_Init 2 */
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
如果(tim_baseHandle->Instance==TIM2)
{
/* 用户代码开始 TIM2_MspInit 0 */
/* 用户代码结束 TIM2_MspInit 0 */
/* TIM2 时钟使能 */
__HAL_RCC_TIM2_CLK_ENABLE();
/* TIM2 中断初始化 */
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
/* 用户代码开始 TIM2_MspInit 1 */
/* 用户代码结束 TIM2_MspInit 1 */
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
如果(tim_baseHandle->Instance==TIM2)
{
/* 用户代码开始 TIM2_MspDeInit 0 */
/* 用户代码结束 TIM2_MspDeInit 0 */
/* 外围时钟禁用 */
__HAL_RCC_TIM2_CLK_DISABLE();
/* TIM2 中断解除 */
HAL_NVIC_DisableIRQ(TIM2_IRQn);
/* 用户代码开始 TIM2_MspDeInit 1 */
/* 用户代码结束 TIM2_MspDeInit 1 */
}
}
/* 用户代码开始 1 */
/* 用户代码结束 1 */
/////////////////////////////////////////
0