平臺(tái)中斷控制器(Platform Level Interrupt Controller,PLIC)是國(guó)科安芯AS32系列MCU芯片的中斷控制器,主要對(duì)中斷源進(jìn)行采樣,優(yōu)先級(jí)仲裁和分發(fā)。各外設(shè)中斷統(tǒng)一連到PLIC,PLIC統(tǒng)一管理并輸出中斷請(qǐng)求到內(nèi)核。
硬件設(shè)計(jì)
本節(jié)硬件同USART章節(jié)一致。
軟件設(shè)計(jì)
代碼分析
在之前的按鍵章節(jié)我們已經(jīng)對(duì)AS32的中斷進(jìn)行了簡(jiǎn)單實(shí)用,本節(jié)將用串口的接收中斷實(shí)驗(yàn)進(jìn)一步加深一下使用過(guò)程。
回顧之前的啟動(dòng)文件章節(jié),有如下一段代碼:
在RISCV指令集中,在機(jī)器模式下中斷相關(guān)的寄存器有MSTATUS、MIE和MTVEC,其中前兩個(gè)寄存器控制系統(tǒng)中斷使能,具體內(nèi)容顆翻看啟動(dòng)文件講解,MTVEC用于保存中斷入口地址,當(dāng)中斷發(fā)生時(shí),程序指針會(huì)自動(dòng)跳轉(zhuǎn)到TrapEntry地址處開始執(zhí)行,該段代碼位于as32x601_trapentry.S文件中,用匯編文件編寫,在這個(gè)函數(shù)下,我們會(huì)將RISCV內(nèi)核所有相關(guān)寄存器,包括PC指針等全部進(jìn)行保存,然后調(diào)用中斷入口處理函數(shù),完成后恢復(fù)現(xiàn)場(chǎng)寄存器值,從而實(shí)現(xiàn)中斷功能。
中斷處理函數(shù)位于as32x601_plic.c文件中,我們找到如下函數(shù):
- / *
- Function: PLIC_TrapHandler
- Description: Interrupt handler type selection.
- Param: Mcause: determine the type of exception or interrupt based on the value of the mcause register.
- Return: None
- */
- void PLIC_TrapHandler(uint32_t Mcause)
- {
*/* Initializes the external interrupt structure */*
PLIC_EXTITypeDef ExtInt = {{0}, 0};
11.
12. ```
if((Mcause & 0x80000000) != 0)
{
14. ```
switch (Mcause & 0x0fff)
{
16. ```
case 3: */* Machine software interrupt */*
MSoftWare_IRQ_Handler();
18. ```
break;
case 7: / Machine timer interrupt /
20. ```
MTimer_IRQ_Handler();
break;
22. ```
case 11: */* Machine external interrupt */*
PLIC_SwitchMEXTI(&ExtInt);
24. ```
break;
default:
26. ```
break;
}
28. ```
}
else
30. ```
{
switch (Mcause & 0xfff)
32. ```
{
case 0: / Instruction address misaligned /
34. ```
InstAddrMisalign_Handler();
break;
36. ```
case 1: */* Instruction access fault */*
InstAccessFault_Handler();
38. ```
break;
case 2: / Illegal instruction /
40. ```
IllegalInst_Handler();
break;
42. ```
case 3: */* Breakpoint */*
Breakpoint_Handler();
44. ```
break;
case 4: / Load address misaligned /
46. ```
LoadAddrMisalign_Handler();
break;
48. ```
case 5: */* Load access fault */*
LoadAccessFault_Handler();
50. ```
break;
case 6: / Store/AMO address misaligned /
52. ```
StoreAMOAddrMisalign_Handler();
break;
54. ```
case 7: */* Store/AMO access fault */*
StoreAMOAccessFault_Handler();
56. ```
break;
case 11: / Environment call from M-mode /
58. ```
ECall_Handler();
break;
60. ```
case 12: */* Instruction page fault */*
InstPageFault_Handler();
62. ```
break;
case 13: / Load page fault /
64. ```
LoadPageFault_Handler();
break;
66. ```
case 15: */* Store/AMO page fault */*
StoreAMOPageFalut_Handler();
68. ```
break;
default:
70. ```
break;
}
72. ```
}
- }
在這個(gè)函數(shù)中,系統(tǒng)中斷首先會(huì)讀取MCAUSE寄存器的最高位,如果最高位為0,代表此事件為異常,RISCV定義了此類型,具體可直接查看MCAUSE寄存器定義;如果最高位為1,證明此事件為系統(tǒng)中斷,此時(shí)可根據(jù)低位去選擇處理的中斷類型。
AS32除了系統(tǒng)定時(shí)中斷和軟件中斷外,plic定義了64個(gè)plic中斷,之前的的異常和中斷均為向量類型,但進(jìn)入plic中斷后即為非向量模式,但可以軟件支持嵌套,64個(gè)中斷類型均已經(jīng)在此文件中定義,所有定義均為弱函數(shù),因此可以復(fù)制中斷處理函數(shù)名寫在自定義位置。接下來(lái)以串口中斷為例介紹用法:
復(fù)制之前的usart工程,在print.c中修改初始化代碼如下:
- / *
- Function: User_Print_Init
- Description: Configure Print USART.
- Param: BaudRate: USART communication baud rate.
- Return: None.
- */
- void User_Print_Init(uint32_t BaudRate)
- {
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
11. ```
PLIC_InitTypeDef PLIC_InitStructure;
GPIOD_CLK_ENABLE();
14. ```
USART0_CLK_ENABLE();
/ Set GPIO multiplex mapping /
17. ```
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_USART0); */* USART0_TX */*
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_USART0); / USART0_RX /
19. ```
*/* GPIO Configure */*
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
21. ```
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_Out_PP;
23. ```
GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_4_5mA;
GPIO_Init(GPIOD, &GPIO_InitStructure);
25. ```
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
27. ```
GPIO_InitStructure.GPIO_IType = GPIO_IN_FLOATING;
GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_4_5mA;
29. ```
GPIO_Init(GPIOD, &GPIO_InitStructure);
USART_DeInit(USART0);
32.
33. ```
USART_StructInit(&USART_InitStructure);
/ Initializes the USART0 /
36. ```
USART_InitStructure.USART_BaudRate = BaudRate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
38. ```
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
40. ```
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_OverSampling = USART_OverSampling_16;
42. ```
USART_Init(USART0, &USART_InitStructure);
USART_Cmd(USART0, ENABLE);
45.
46. ```
USART_ITConfig(USART0, USART_IT_RXNE, ENABLE);
/ Configer the USART0 interrupt /
49. ```
PLIC_InitStructure.PLIC_IRQChannel = USART0_IRQn;
PLIC_InitStructure.PLIC_IRQPriority = 1;
51. ```
PLIC_InitStructure.PLIC_IRQChannelCmd = ENABLE;
PLIC_Init(&PLIC_InitStructure);
53. }
54.
55. */* *
56. * Function: USART0_IRQ_Handler
57. * Description: USART0 interrupt handler function.
58. * Param: None.
59. * Return: None.
60. */
61.
62. void USART0_IRQ_Handler()
63. {
64.
65. ```
if(USART_GetFlagStatus(USART0, USART_FLAG_RXNE) != RESET)
{
67. ```
*/* Clear the interrupt pending bits */*
USART_SendData(USART0,USART_ReceiveData(USART0));
69. ```
}
- }
在這個(gè)代碼中,44行之前和串口章節(jié)完全一樣,不再重復(fù)進(jìn)行說(shuō)明。第46行,調(diào)用串口的中斷使能函數(shù),使能串口接收中斷,該處形參中的中斷類型已經(jīng)定義好,可以自行查詢,之后需要開啟PLIC的中斷通道以及優(yōu)先級(jí)配置,之后調(diào)用PLIC_Init函數(shù)進(jìn)行初始化。
接下來(lái),需要重寫中斷處理函數(shù),該函數(shù)名已經(jīng)在PLIC庫(kù)文件中定義完成,直接復(fù)制過(guò)來(lái)即可,在這個(gè)函數(shù)中首先判斷終端的來(lái)源,之后通過(guò)調(diào)用發(fā)送函數(shù)原路徑發(fā)出,當(dāng)然這只是一個(gè)實(shí)驗(yàn),功能比較簡(jiǎn)單,實(shí)際使用過(guò)程中切忌這種用法。
最后主函數(shù)中對(duì)上述代碼只需要做初始化即可,沒(méi)有實(shí)際邏輯,因此在這不做展示。
下板驗(yàn)證
將上述代碼編譯燒錄完成,連接串口線與上位機(jī),觀察現(xiàn)象。
審核編輯 黃宇
-
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1925瀏覽量
88025 -
中斷控制器
+關(guān)注
關(guān)注
0文章
61瀏覽量
9767
發(fā)布評(píng)論請(qǐng)先 登錄
利用蜂鳥E203搭建SoC【2】——外部中斷擴(kuò)展與驗(yàn)證
DDR200T運(yùn)行plic中斷例程LED無(wú)反應(yīng)的解決辦法
蜂鳥E203內(nèi)核中斷管理模塊sirv_plic_man代碼分析
瑞薩RA系列MCU的外部引腳中斷詳解
基于 AS32X601 微控制器的定時(shí)器模塊(TIM)技術(shù)研究與應(yīng)用實(shí)踐
AS32X601芯片F(xiàn)lash擦寫調(diào)試技術(shù)解析
AS32X601系列MCU硬件最小系統(tǒng)設(shè)計(jì)與調(diào)試方案探析
AS32X601驅(qū)動(dòng)系列教程 USART_串口通訊詳解
AS32X601驅(qū)動(dòng)系列教程 GPIO_按鍵檢測(cè)詳解
AS32X601驅(qū)動(dòng)系列教程 GPIO_點(diǎn)亮LED詳解
AS32X601驅(qū)動(dòng)系列教程 SMU_系統(tǒng)時(shí)鐘詳解
面向工業(yè)與汽車領(lǐng)域的高安全可靠MCU——AS32X601系列芯片解析
AS32X601芯片技術(shù)剖析
AS32X601雙核鎖步MCU技術(shù)優(yōu)勢(shì)分析
EE-188:使用C語(yǔ)言在ADSP-219x DSP上實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng)

AS32X601驅(qū)動(dòng)系列教程 PLIC_中斷應(yīng)用詳解
評(píng)論