完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
Cube配置
代码 uint16_t AD_Value[20]; //main.c文件 HAL_ADC_Start_DMA(&hadc1,(uint32_t *)AD_Value,20); 上面配置如果是word,则更改一下定义就好了,cube生成的代码会随着变: uint32_t AD_Value[20]; //main.c文件 HAL_ADC_Start_DMA(&hadc1,(uint32_t *)AD_Value,20); 分析一下函数原型 HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32 有网友就简单看到原型是uint32_t就认为必须是32位了,其实ad只有12位,数据定义成16位才是物尽其用。产生这个试验想法是基于std库用过一次就是16位的,另外uint16_t AD_Value[20]也可以换成二维数组uint16_t AD_Value[10][2],二者本质没什么区别,好处是通道更多了就只需要改变第二个下标就行了,再其他地方处理AD数据的时候也很方便。 采样的数据: 再来看看normal模式吧(调试遇到问题了) 代码如下 /* USER CODE BEGIN 0 */ uint16_t AD_Value[20]; uint8_t Rec_Flag; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { Rec_Flag=1; } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_ADC_Start_DMA(&hadc1,(uint32_t *)AD_Value,20); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(Rec_Flag==1) { Rec_Flag=0; HAL_ADC_Start_DMA(&hadc1,(uint32_t *)AD_Value,20); } HAL_Delay(500); } /* USER CODE END 3 */ } 补贴: Normal模式下,结果多次尝试,最终解决了 讨论一下单次传输的好处:DMA传输的时候如果读取内存片段,会有仲裁器的问题,在以前做过FFT的例子中,需要获取一个连续间隔的AD,如取1024点,假设前面的500个点是DMA刚传输的,而后面的点是上个时刻的数据,电压数据导出到excel显示波形就有断点,采集直流信号二者无差别,如果做FFT的话可能就会有错! 加了一句关闭DMA的语句,更改后代码如下 /* USER CODE BEGIN 0 */ uint16_t AD_Value[20]; uint8_t Rec_Flag; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { Rec_Flag=1; } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_ADC_Start_DMA(&hadc1,(uint32_t *)AD_Value,20); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(Rec_Flag==1) { Rec_Flag=0; HAL_ADC_Stop_DMA(&hadc1); HAL_ADC_Start_DMA(&hadc1,(uint32_t *)AD_Value,20); } HAL_Delay(500); } /* USER CODE END 3 */ } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1621 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1546 浏览 1 评论
980 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
686 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1599 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
534浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 20:26 , Processed in 0.654090 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号