完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前使用的是STM32,单位采购替换了贵公司的CH32F103R8T6,使用HAL库配置DAC_CH2和DMA circle模式,如何正确修改?
原来的程序如下: 主函数中语句 HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_2,DAC1_Value,1,DAC_ALIGN_12B_R); dac.c中语句 void MX_DAC_Init(void) { DAC_ChannelConfTypeDef sConfig = {0}; hdac.Instance = DAC; if (HAL_DAC_Init(&hdac) != HAL_OK) { Error_Handler(); } sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_2) != HAL_OK) { Error_Handler(); } } void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(dacHandle->Instance==DAC) { __HAL_RCC_DAC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = DAC_Pin; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(DAC_GPIO_Port, &GPIO_InitStruct); hdma_dac_ch2.Instance = DMA2_Channel4; hdma_dac_ch2.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_dac_ch2.Init.PeriphInc = DMA_PINC_DISABLE; hdma_dac_ch2.Init.MemInc = DMA_MINC_ENABLE; hdma_dac_ch2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_dac_ch2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_dac_ch2.Init.Mode = DMA_CIRCULAR; hdma_dac_ch2.Init.Priority = DMA_PRIORITY_LOW; if (HAL_DMA_Init(&hdma_dac_ch2) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(dacHandle,DMA_Handle2,hdma_dac_ch2); } } 尝试将DMA2_Channel4修改为DMA1_Channel4,无输出;不使用DMA可以正常输出 |
|
相关推荐
2个回答
|
|
您好,关于DAC和DMA的问题,主要区别在于CH32F103只有一个DMA,其中DAC-CH2输出对应PA5引脚,对应DMA通道为DMA1通道4,在使用DMA的时候,注意要使能DMA时钟,在你附的代码中没有看到DMA时钟的使能,你可以检查一下代码中是否有遗漏。
|
|
|
|
void MX_DMA_Init(void)
{ /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); // __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ // HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); // HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); // /* DMA1_Channel2_IRQn interrupt configuration */ // HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); // HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); // /* DMA1_Channel3_IRQn interrupt configuration */ // HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0); // HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn); // /* DMA1_Channel6_IRQn interrupt configuration */ // HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0); // HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn); // /* DMA2_Channel4_5_IRQn interrupt configuration */ // HAL_NVIC_SetPriority(DMA2_Channel4_5_IRQn, 0, 0); // HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn); } DMA时钟使能了 |
|
|
|
只有小组成员才能发言,加入小组>>
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2569 浏览 2 评论
2118 浏览 1 评论
ch554g的板子准备烧录程序,用串口总是显示等待设备连接是为啥
970浏览 14评论
请问ch32v307用ch-link调试或者读写有什么特殊操作方法吗?
882浏览 13评论
Windows系统下如何确定COM口为CH340/CH341设备?
2151浏览 12评论
669浏览 12评论
CH32V307以太网接近满速后,几秒或几十秒后就死机怎么解决?
1917浏览 11评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-3-28 22:41 , Processed in 0.475990 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号