想用ADC采集,采集的结果通过DMA传输,在主函数中调用下面这两个函数,然后就死机了,没有使用DMA中断,能帮看看配置出了啥问题吗,谢谢,单片机是STM32F412
#include "adc.h" #include "main.h" ADC_HandleTypeDef ADC1_Handler; //ADC¾ä±ú DMA_HandleTypeDef ADC1TxDMA_Handler; //DMA¾ä±ú //ch: ADC_channels //ͨµÀÖµ 0~16È¡Öµ·¶Î§Îª£ºADC_CHANNEL_0~ADC_CHANNEL_16 void MY_ADC_Init(void) { ADC1_Handler.Instance=ADC1; ADC1_Handler.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4·ÖƵ ADCʱÖÓΪ25M ADC1_Handler.Init.Resolution = ADC_RESOLUTION_12B; //12λģʽ ADC1_Handler.Init.DataAlign = ADC_DATAALIGN_RIGHT; //ÓÒ¶ÔÆë ADC1_Handler.Init.ScanConvMode = DISABLE; //·ÇɨÃèģʽ ADC1_Handler.Init.EOCSelection = DISABLE; //¹Ø±ÕEOCÖÐ¶Ï ADC1_Handler.Init.ContinuousConvMode = ENABLE; //¹Ø±ÕÁ¬Ðøת»» ADC1_Handler.Init.NbrOfConversion = 1; //1¸öת»»ÔÚ¹æÔòÐòÁÐÖÐ Ò²¾ÍÊÇֻת»»¹æÔòÐòÁÐ1 ADC1_Handler.Init.DiscontinuousConvMode = DISABLE; //½ûÖ¹²»Á¬Ðø²ÉÑùģʽ ADC1_Handler.Init.NbrOfDiscConversion = 0; //²»Á¬Ðø²ÉÑùͨµÀÊýΪ0 ADC1_Handler.Init.ExternalTrigConv = ADC_SOFTWARE_START; //Èí¼þ´¥·¢ ADC1_Handler.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//ÎÞÍⲿ´¥·¢×ª»» ADC1_Handler.Init.DMAContinuousRequests = ENABLE; //¹Ø±ÕDMAÇëÇó ADC1_Handler.Init.EOCSelection = DISABLE; HAL_ADC_Init(&ADC1_Handler); //³õʼ»¯ } //ADCµ×²ãÇý¶¯£¬Òý½ÅÅäÖã¬Ê±ÖÓʹÄÜ //´Ëº¯Êý»á±»HAL_ADC_Init()µ÷Óà //hadc:ADC¾ä±ú void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_ADC1_CLK_ENABLE(); //ʹÄÜADC1ʱÖÓ __HAL_RCC_GPIOC_CLK_ENABLE(); //¿ªÆôGPIOCʱÖÓ GPIO_Initure.Pin = GPIO_PIN_0; //PC0 GPIO_Initure.Mode = GPIO_MODE_ANALOG; //Ä£Äâ GPIO_Initure.Pull = GPIO_NOPULL; //²»´øÉÏÏÂÀ HAL_GPIO_Init(GPIOC,&GPIO_Initure); } void MY_DMA_Config(void) { __HAL_RCC_DMA2_CLK_ENABLE(); //DMA2ʱÖÓʹÄÜ __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1TxDMA_Handler); //½«DMAÓëADC1ÁªÏµÆðÀ´(·¢ËÍDMA) ADC1TxDMA_Handler.Instance = DMA2_Stream0; //Êý¾ÝÁ÷Ñ¡Ôñ ADC1TxDMA_Handler.Init.Channel = DMA_CHANNEL_0; //ͨµÀÑ¡Ôñ ADC1TxDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY; //ÍâÉèµ½´¢´æÆ÷ ADC1TxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE; //ÍâÉè·ÇÔöÁ¿Ä£Ê½ ADC1TxDMA_Handler.Init.MemInc = DMA_MINC_DISABLE; //´æ´¢Æ÷ÔöÁ¿Ä£Ê½ ADC1TxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //ÍâÉèÊý¾Ý³¤¶È:16λ ADC1TxDMA_Handler.Init.MemDataAlignment = DMA_PDATAALIGN_HALFWORD; //´æ´¢Æ÷Êý¾Ý³¤¶È:16λ ADC1TxDMA_Handler.Init.Mode = DMA_CIRCULAR; //Ñ»·Ä£Ê½ ADC1TxDMA_Handler.Init.Priority = DMA_PRIORITY_MEDIUM; //¸ßÓÅÏȼ¶ ADC1TxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE; ADC1TxDMA_Handler.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL; ADC1TxDMA_Handler.Init.MemBurst = DMA_MBURST_SINGLE; //´æ´¢Æ÷Í»·¢µ¥´Î´«Êä ADC1TxDMA_Handler.Init.PeriphBurst = DMA_PBURST_SINGLE; //ÍâÉèÍ»·¢µ¥´Î´« // HAL_DMA_DeInit(&ADC1TxDMA_Handler); HAL_DMA_Init(&ADC1TxDMA_Handler); }
你这里使能了中断,有可能是进了中断了吧。可以发一下中断函数看看。
你可以仿真一下,看看死机后是停在了哪里。
你是不是使用了cubemx?
cubemx里面要将中断打开,就是那个NVIC的设置那里
關鍵在於這一行
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 1, 1);
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 1);