CH32X035 ADC-DMA連續(xù)循環(huán)采樣,DMA中斷進(jìn)入HardFault_Handler

能夠進(jìn)入DMA1_Channel1_IRQHandler,然后就死了。


核心代碼:

void DMA1_Channel1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void DMA1_Channel1_IRQHandler(void)

{

? ? if(DMA_GetITStatus(DMA1_IT_TC1))

? ? {

? ? ? ? //ControlTask(NULL);

? ? ? ? DMA_ClearITPendingBit(DMA1_IT_TC1);

? ? }

? ? //DMA_ClearFlag(DMA1_FLAG_TC1);

}


void ADC_Config()

{

? ? ADC_InitTypeDef? ADC_InitStructure = {0};

? ? GPIO_InitTypeDef GPIO_InitStructure = {0};


? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOA, &GPIO_InitStructure);


? ? ADC_DeInit(ADC1);


? ? ADC_CLKConfig(ADC1, ADC_CLK_Div6);


? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

? ? ADC_InitStructure.ADC_ScanConvMode = ENABLE;? ? ? ? ? ? //AAAA,從disable改的

? ? ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

? ? ADC_InitStructure.ADC_NbrOfChannel = PW_ADC_CHANNEL_NO;

? ? ADC_Init(ADC1, &ADC_InitStructure);


? ? ADC_DMACmd(ADC1, ENABLE);

? ? ADC_Cmd(ADC1, ENABLE);


? ? DMA_InitTypeDef DMA_InitStructure = {0};


? ? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);


? ? DMA_DeInit(DMA1_Channel1);

? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->RDATAR;

? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)power_ADC.channel[0];

? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

? ? DMA_InitStructure.DMA_BufferSize = PW_ADC_CHANNEL_NO;

? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

? ? DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

? ? DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? ? ? ? //AAA

? ? DMA_Init(DMA1_Channel1, &DMA_InitStructure);


? ? NVIC_InitTypeDef NVIC_InitStructure;

? ? DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);? ? ? //使能傳輸完成中斷

? ? NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;

? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

? ? NVIC_Init(&NVIC_InitStructure);



? ? DMA_Cmd(DMA1_Channel1, ENABLE);



? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_11Cycles);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_11Cycles);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_11Cycles);

? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_11Cycles);

? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);

? ? Delay_Ms(50);

? ? ADC_SoftwareStartConvCmd(ADC1, DISABLE);

}


您好,附件為CH32X035 ADC多通道DMA中斷的例程,可以參考一下

icon_rar.gifCH32X035 ADC_DMA多通道.zip



原樣代碼,單獨(dú)無系統(tǒng)跑是正常的。 包括把DMA中斷的Delay100去掉,在主循環(huán)中delay都是OK的。


但是加入FreeRTOS以后, OS的任務(wù)就沒法運(yùn)行了。? RTOS本身沒問題的,注釋掉ADC功能,ROTS任務(wù)正常切換。




您好,若方便可將工程發(fā)至我的郵箱(lzs@wch.cn),這邊具體看一下。


你好,請問問題解決了嗎?我這邊也遇到了同樣的問題,我把rtos代碼加進(jìn)去,不運(yùn)行rtos也會出現(xiàn)這種情況


您好,當(dāng)工程中帶有RTOS時,注意中斷函數(shù)的聲明方式要改為軟件壓棧聲明方式,如下圖,此外若中斷函數(shù)一直在運(yùn)行,會影響任務(wù)的運(yùn)行的。后續(xù)問題可郵箱(lzs@wch.cn)溝通,若方便可將你復(fù)現(xiàn)問題的工程發(fā)過來看一下。

image.png


根據(jù)6樓沁恒工程師的方法,我的問題已解決,感謝


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频