完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们正在尝试使用循环 DMA 将数据从 ADC1 传输到 MCU SRAM 中的缓冲区,使用 CubeMX 生成的代码来配置 ADC 和 DMA。DMA 流在传输第一项时遇到传输错误。我尝试在使用 HAL_ADC_Start_DMA 开始传输之前清除 DMA 错误标志,但这没有帮助。
该设备是在生产模式下运行的 STM32MP157C。ADC1 和 DMA2 分配给 M4 内核。 使用调试器可以看到外设地址和内存地址已为 DMA 流正确配置。然而,DMA2 的 DMA_HWCFGR1 寄存器显示,尽管流配置寄存器中的 DBM 位已被清除,但所有流都处于双缓冲区模式,这是否正常? CubeMX 生成的代码: 静态无效 MX_ADC1_Init(无效) { /* 用户代码开始 ADC1_Init 0 */ /* 用户代码结束 ADC1_Init 0 */ ADC_MultiModeTypeDef 多模 = {0}; ADC_ChannelConfTypeDef sConfig = {0}; /* 用户代码开始 ADC1_Init 1 */ /* 用户代码结束 ADC1_Init 1 */ /** 通用配置 */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc1.Init.LowPowerAutoWait = 禁用; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.NbrOfConversion = 8; hadc1.Init.DiscontinuousConvMode = 禁用; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR; hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; hadc1.Init.OversamplingMode = 禁用; 如果(HAL_ADC_Init(&hadc1)!= HAL_OK) { 错误处理程序(); } /** 配置ADC多模式 */ multimode.Mode = ADC_MODE_INDEPENDENT; 如果 (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { 错误处理程序(); } /** 配置常规频道 */ sConfig.Channel = ADC_CHANNEL_10; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; 如果 (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { 错误处理程序(); } /* 此处省略其他通道 */ } void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { GPIO_InitTypeDef GPIO_InitStruct = {0}; 如果(hadc->实例==ADC1) { /* 用户代码开始 ADC1_MspInit 0 */ /* 用户代码结束 ADC1_MspInit 0 */ /* 外设时钟使能 */ HAL_RCC_ADC12_CLK_ENABLED++; 如果(HAL_RCC_ADC12_CLK_ENABLED==1){ __HAL_RCC_ADC12_CLK_ENABLE(); } /* 此处省略 GPIO 初始化 */ /* ADC1 DMA 初始化 */ /* ADC1 初始化 */ hdma_adc1.Instance = DMA2_Stream0; hdma_adc1.Init.Request = DMA_REQUEST_ADC1; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc1.Init.Mode = DMA_CIRCULAR; hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH; hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; 如果(HAL_DMA_Init(&hdma_adc1)!= HAL_OK) { 错误处理程序(); } __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1); /* 用户代码开始 ADC1_MspInit 1 */ /* 用户代码结束 ADC1_MspInit 1 */ } 静态无效 MX_DMA_Init(无效) { /* DMA 控制器时钟使能 */ __HAL_RCC_DMAMUX_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA 中断初始化 */ /* DMA2_Stream0_IRQn 中断配置 */ HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); /* DMA2_Stream1_IRQn 中断配置 */ HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn); /* DMA2_Stream2_IRQn 中断配置 */ HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 4, 0); HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); /* DMA2_Stream3_IRQn 中断配置 */ HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 4, 1); HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); /* DMA2_Stream4_IRQn 中断配置 */ HAL_NVIC_SetPriority(DMA2_Stream4_IRQn, 4, 0); HAL_NVIC_EnableIRQ(DMA2_Stream4_IRQn); /* DMA2_Stream5_IRQn 中断配置 */ HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 4, 1); HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn); /* DMA2_Stream6_IRQn 中断配置 */ HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 5, 1); HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn); } 无效 DMA2_Stream0_IRQHandler(无效) { /* 用户代码开始 DMA2_Stream0_IRQn 0 */ /* 用户代码结束 DMA2_Stream0_IRQn 0 */ HAL_DMA_IRQHandler(&hdma_adc1); /* 用户代码开始 DMA2_Stream0_IRQn 1 */ /* 用户代码结束 DMA2_Stream0_IRQn 1 */ } |
|
相关推荐
1个回答
|
|
是的,ST 支持帮助我解决了这个问题。缺少的部分是将 DMA2 添加到 TF-A 设备树中的 MCU 隔离。
在 etzpc 节点中,添加: DECPROT(STM32MP1_ETZPC_DMA2_ID,DECPROT_MCU_ISOLATION,DECPROT_UNLOCK) |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2719 浏览 1 评论
3236 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1807 浏览 1 评论
3645 浏览 6 评论
6033 浏览 21 评论
1334浏览 4评论
208浏览 3评论
196浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
350浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
441浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 19:13 , Processed in 1.274886 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号