求助, CH32V307 的 SW_Handler 只執(zhí)行了一次

剛剛購買了 307?的開發(fā)板.? 做了一些嘗試.?


下面的代碼比較簡單 ,? 請大家看看為什么 SW_Handler?只執(zhí)行一次 ???

/**********************************?(C)?COPYRIGHT?*******************************
*?File?Name??????????:?main.c
*?Author?????????????:?WCH
*?Version????????????:?V1.0.0
*?Date???????????????:?2021/06/06
*?Description????????:?Main?program?body.
*?Copyright?(c)?2021?Nanjing?Qinheng?Microelectronics?Co.,?Ltd.
*?SPDX-License-Identifier:?Apache-2.0
*******************************************************************************/

/*
?*@Note
?串口打印調(diào)試?yán)蹋?
?USART1_Tx(PA9)。
?本例程演示使用?USART1(PA9)?作打印調(diào)試口輸出。

*/

#include?"debug.h"

__IO?uint32_t?ST_Counter=0;

void?SysTick_Handler(void)?__attribute__((interrupt("WCH-Interrupt-fast")));

void?SysTick_Handler(void)
{
????SysTick->SR??=?0;
????ST_Counter?++;
}

__IO?uint32_t?SW_Counter=0;

void?SW_Handler()
{
??SW_Counter++;
??SysTick->CTLR?&=?~(1?<<?31);
}


int?gv=0;
void?CpuLoopDelay(){
????for(int?t=0;t<10300000;t++)
????????gv+=123+t*gv;
}

int?main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	SysTick->CTLR?=?0x00000000;?????????????//控制寄存器復(fù)位
????SysTick->SR?=?0x00000000;???????????????//狀態(tài)寄存器復(fù)位
????SysTick->CNT?=?0x00000000;??????????????//計數(shù)器復(fù)位,設(shè)置初始值為0
????SysTick->CMP?=?SystemCoreClock?/?8000;???????????????????//給重加載寄存器賦值
????NVIC_SetPriority(SysTicK_IRQn,?15);?????//設(shè)置SysTick中斷優(yōu)先級
????NVIC_EnableIRQ(SysTicK_IRQn);???????????//使能開啟Systick中斷
????NVIC_SetPriority(Software_IRQn,?0xf0);
????NVIC_EnableIRQ(Software_IRQn);
????SysTick->CTLR?|=?0x0000000B;????????????//啟動系統(tǒng)計數(shù)器STK(HCLK/8時基)


	USART_Printf_Init(115200);
	printf("SystemClk:%d\r\n",SystemCoreClock);

	printf("This?is?printf?example\r\n");

	while(1)
????{
	????CpuLoopDelay();
	????printf("ST=%d?,?SW=%d?,?CTLR=0x%x?\r\n",ST_Counter,SW_Counter,SysTick->CTLR);

????????SysTick->CTLR?|=?(1?<<?31)?;
	}
}

運(yùn)行的結(jié)果如圖

SysTick_Handler?正常,? ?SW_Handler?執(zhí)行了一次后,? 后面無法再觸發(fā)了.?

riscv_test1.png

自己結(jié)貼吧.?


看了某些RTOS的實(shí)現(xiàn),?都是在匯編里寫的代碼.? 最后需要用 mret?返回.?


查了一下.? riscv?對中斷返回有特定要求,? 不能用ja?ra返回.?


所以,?標(biāo)記為?

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

便可.? 否則返回方式不一致會導(dǎo)致堆?;靵y產(chǎn)生各種奇奇怪怪的現(xiàn)象.?



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

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