完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
有人可以协助并阐明如何为 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.PeriphClockSelection = 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 */ ///////////////////////////////////////// |
|
相关推荐
1个回答
|
|
是的。
问题出在 HAL 驱动程序 (stm32u5xx_hal_dac.c) 上。 在文件 stm32u5xx_hal_dac.c 的第 869 行,我们有函数 HAL_delay(1); 我们需要从代码中排除 HAL_delay(1),回调开始工作并且 SysTick_Handler() 不会卡住。 我认为这是驱动程序的错误,开发人员会修复它。 ****************************************************** ********************* ****************************************************** ********************* /* 进程解锁 */ __HAL_UNLOCK(hdac); 如果(状态 == HAL_OK) { /* 启用外设 */ __HAL_DAC_ENABLE(hdac,通道); /* 启用外围设备后确保在使用外围设备之前等待最少 */ HAL_延迟(1); } 别的 { hdac->ErrorCode |= HAL_DAC_ERROR_DMA; } /* 返回函数状态 */ 返回状态; } |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2711 浏览 1 评论
3235 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1807 浏览 1 评论
3643 浏览 6 评论
6030 浏览 21 评论
1332浏览 4评论
206浏览 3评论
194浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
348浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
440浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 23:36 , Processed in 1.059247 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号