RT-THREAD,CH32V208W串口接收DMA中斷一直出現(xiàn)HARDFAULT

代碼是社區(qū)里面找的類似拷貝過來的,看著沒毛病的樣子,

接收幾次之后,就出現(xiàn)HARDFAULT

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

void USART2_IRQHandler(void)

{

? ?uint16_t Count = 0;

? ?if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //中斷產(chǎn)生

? ?{

? ? ? ?USART_ClearITPendingBit(USART2,USART_IT_RXNE);

? ?}

? ?if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)

? ?{

? ? ? ?USART2->STATR;

? ? ? ?USART2->DATAR;

? ? ? ?rx_int_flag2 = 1;

? ? ? ?/* 獲取剩余 DMA緩存大小 */

? ? ? ?Count = DMA_GetCurrDataCounter(DMA1_Channel6);

? ? ? ?//本幀數(shù)據(jù)長度 = DMA緩存的大小 - 剩余 DMA緩存大小

? ? ? ?rx_recvLen2 = 1024 - Count;

? ? ? ?/* DMA接收復(fù)位 */

? ? ? ?DMA_Cmd(DMA1_Channel6,DISABLE);

? ? ? ?DMA_SetCurrDataCounter(DMA1_Channel6,1024);

? ? ? ?DMA_Cmd(DMA1_Channel6,ENABLE);

? ?}

}

/* 線程2入口 */

static void thread2_entry(void *param)

{

? ? uint16_t len = 0;

? ? rt_kprintf("%s22\r\n",__func__);


? ? for(;;)

? ? {

? ? ? ? if(rx_int_flag2)

? ? ? ? {

? ? ? ? ? ? rx_int_flag2 = 0;

? ? ? ? ? ? rt_kprintf("receiveLen = %d\r\n",len);

? ? ? ? }

? ? ? ? rt_thread_mdelay(2);

? ? }

}


你好,208是V4C內(nèi)核,在跑rtt的時候,只能用軟件壓棧,啟動文件中關(guān)閉軟件壓棧,并設(shè)置為機(jī)器模式,函數(shù)聲明改為軟件壓棧。

image.png

image.png


改成這樣好像就不會出現(xiàn)HARDFAULT,不知道這樣有沒有問題;

用調(diào)試工具自動發(fā)送測試了幾分鐘好像都沒HARDFAULT

void USART2_IRQHandler(void) __attribute__((interrupt()));

void USART2_IRQHandler(void)

{

? ? u16 count = 0;

? ? GET_INT_SP();

? ? /* enter interrupt */

? ? rt_interrupt_enter();

? ? if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)

? ? {

? ? ? ? USART_ClearITPendingBit(USART2, USART_IT_RXNE);

? ? }

? ? if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)

? ? {

? ? ? ? //CLEAR IDLE IT FLAG

? ? ? ? USART2->STATR;

? ? ? ? USART2->DATAR;


? ? ? ? count = DMA_GetCurrDataCounter(OMG_USART2_DMA);

//? ? ? ? rt_kprintf("count= %d\r\n",count);

? ? ? ? rx_recvLen2 = OMG_DMA_LEN - count;

? ? ? ? rx_int_flag2 = 1;

? ? ? ? DMA_Cmd(OMG_USART2_DMA, DISABLE);

? ? ? ? DMA_SetCurrDataCounter(OMG_USART2_DMA, OMG_DMA_LEN);

? ? ? ? DMA_Cmd(OMG_USART2_DMA, ENABLE);

? ? }


? ? /* leave interrupt */

? ? rt_interrupt_leave();


? ? FREE_INT_SP();

}



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

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