新手入门
积分 11
金钱 11
注册时间 2020-5-1
在线时间 3 小时
1 金钱
我先是仿照stm32h743阿波罗开发板的例程写了一下dma传输adc数据,dma是normal模式,且dma中断配置被我注释了,然后发现清除完成标志位后只能传输一次。后面数据就完全不变了,然后我把dma改成circular模式,不管是否注释掉中断配置,还是只能发送一次,后面使能了都没用。要是没有if(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TCIF0_4))这一句,circular模式下就根本不会停下来,即使写了HAL_ADC_Stop_DMA(&hadc1); 也没有用,就好像HAL_ADC_Stop_DMA(&hadc1); 这句话完全没有任何用处,如果不停下来我也没法处理adc数据,有没有大佬知道咋弄的。急求。我为此两天两夜没睡觉了死活想不明白。
int main(void)
{
/* USER CODE BEGIN 1 */
__attribute__((at(0x24000000))) uint16_t AD_Value[100]={0};
uint32_t AD_IN3;
uint32_t AD_IN7;
/* USER CODE END 1 */
/* Enable I-Cache---------------------------------------------------------*/
SCB_EnableICache();
/* Enable D-Cache---------------------------------------------------------*/
SCB_EnableDCache();
/* 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_TIM3_Init();
/* USER CODE BEGIN 2 */
LED_Init();
Lcd_Init();//1.8'液晶屏初始化配置
Lcd_Clear(GRAY0);
HAL_Delay(1000);
Gui_DrawFont_GBK16(0,0,BLUE,GRAY0,"***ADC DMA***");
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD_Value, 100);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Gui_DrawFont_GBK16(0,0,BLUE,GRAY0,"ADC start !");
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD_Value, 100);
while(1)//等待100次adc转换完成
{
if(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TCIF0_4))//等待DMA2_Steam7传输完成
{
__HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TCIF0_4);//清除DMA2_Steam7传输完成标志
HAL_ADC_Stop_DMA(&hadc1); //传输完成以后关闭串口DMA
break;
}
}
AD_IN3 = 0;
AD_IN7 = 0;
for(uint16_t i = 0; i < 100;)
{
AD_IN3 = AD_IN3 + AD_Value[i++];
// AD_IN7 = AD_IN7 + AD_Value[i++];
}
AD_IN3 = AD_IN3 / 100;
// AD_IN7 = AD_IN7 / 50;
sprintf(tbuf,"ADC1 IN3=%3.3f", AD_IN3/65535.0*3.3);
Gui_DrawFont_GBK16(0,16,RED,GRAY0,tbuf); //显示ADvalue
// sprintf(tbuf,"ADC1 IN7=%3.3f", AD_IN7/65535.0*3.3);
// Gui_DrawFont_GBK16(0,32,RED,GRAY0,tbuf); //显示ADvalue
HAL_DMA_DeInit(&hdma_adc1);
MX_DMA_Init();
MX_ADC1_Init();
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD_Value, 100);
LED2_Toggle;
}
/* USER CODE END 3 */
}
我来回答