亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

安芯 ? 來(lái)源:jf_29981791 ? 作者:jf_29981791 ? 2025-05-23 17:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

平臺(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é),有如下一段代碼:
圖片 1.png

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ù):

  1. / *
    • 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
  2. */
  3. void PLIC_TrapHandler(uint32_t Mcause)
  4. {
  5. */* Initializes the external interrupt structure */*
    
  6. 
    

PLIC_EXTITypeDef ExtInt = {{0}, 0};

11. 
12. ```
if((Mcause & 0x80000000) != 0)
  1. 
    

{

14. ```
switch (Mcause & 0x0fff)
  1. 
    

{

16. ```
case 3: */* Machine software interrupt */*
  1. 
    

MSoftWare_IRQ_Handler();

18. ```
break;
  1. 
    

case 7: / Machine timer interrupt /

20. ```
MTimer_IRQ_Handler();
  1. 
    

break;

22. ```
case 11: */* Machine external interrupt */*
  1. 
    

PLIC_SwitchMEXTI(&ExtInt);

24. ```
break;
  1. 
    

default:

26. ```
break;
  1. 
    

}

28. ```
}
  1. 
    

else

30. ```
{
  1. 
    

switch (Mcause & 0xfff)

32. ```
{
  1. 
    

case 0: / Instruction address misaligned /

34. ```
InstAddrMisalign_Handler();
  1. 
    

break;

36. ```
case 1: */* Instruction access fault */*
  1. 
    

InstAccessFault_Handler();

38. ```
break;
  1. 
    

case 2: / Illegal instruction /

40. ```
IllegalInst_Handler();
  1. 
    

break;

42. ```
case 3: */* Breakpoint */*
  1. 
    

Breakpoint_Handler();

44. ```
break;
  1. 
    

case 4: / Load address misaligned /

46. ```
LoadAddrMisalign_Handler();
  1. 
    

break;

48. ```
case 5: */* Load access fault */*
  1. 
    

LoadAccessFault_Handler();

50. ```
break;
  1. 
    

case 6: / Store/AMO address misaligned /

52. ```
StoreAMOAddrMisalign_Handler();
  1. 
    

break;

54. ```
case 7: */* Store/AMO access fault */*
  1. 
    

StoreAMOAccessFault_Handler();

56. ```
break;
  1. 
    

case 11: / Environment call from M-mode /

58. ```
ECall_Handler();
  1. 
    

break;

60. ```
case 12: */* Instruction page fault */*
  1. 
    

InstPageFault_Handler();

62. ```
break;
  1. 
    

case 13: / Load page fault /

64. ```
LoadPageFault_Handler();
  1. 
    

break;

66. ```
case 15: */* Store/AMO page fault */*
  1. 
    

StoreAMOPageFalut_Handler();

68. ```
break;
  1. 
    

default:

70. ```
break;
  1. 
    

}

72. ```
}
  1. }

在這個(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中修改初始化代碼如下:

  1. / *
    • Function: User_Print_Init
    • Description: Configure Print USART.
    • Param: BaudRate: USART communication baud rate.
    • Return: None.
  2. */
  3. void User_Print_Init(uint32_t BaudRate)
  4. {
  5. USART_InitTypeDef USART_InitStructure;
    
  6. 
    

GPIO_InitTypeDef GPIO_InitStructure;

11. ```
PLIC_InitTypeDef PLIC_InitStructure;
  1. 
    

GPIOD_CLK_ENABLE();

14. ```
USART0_CLK_ENABLE();
  1. 
    

/ Set GPIO multiplex mapping /

17. ```
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_USART0);       */* USART0_TX */*
  1. 
    

GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_USART0); / USART0_RX /

19. ```
*/* GPIO Configure */*
  1. 
    

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

21. ```
GPIO_InitStructure.GPIO_Mode      = GPIO_Mode_OUT;
  1. 
    

GPIO_InitStructure.GPIO_OType = GPIO_Out_PP;

23. ```
GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_4_5mA;
  1. 
    

GPIO_Init(GPIOD, &GPIO_InitStructure);

25. ```
GPIO_InitStructure.GPIO_Pin       = GPIO_Pin_9;
  1. 
    

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

27. ```
GPIO_InitStructure.GPIO_IType     = GPIO_IN_FLOATING;
  1. 
    

GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_4_5mA;

29. ```
GPIO_Init(GPIOD, &GPIO_InitStructure);
  1. 
    

USART_DeInit(USART0);

32. 
33. ```
USART_StructInit(&USART_InitStructure);
  1. 
    

/ Initializes the USART0 /

36. ```
USART_InitStructure.USART_BaudRate     = BaudRate;
  1. 
    

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

38. ```
USART_InitStructure.USART_StopBits     = USART_StopBits_1;
  1. 
    

USART_InitStructure.USART_Parity = USART_Parity_No;

40. ```
USART_InitStructure.USART_Mode         = USART_Mode_Rx | USART_Mode_Tx;
  1. 
    

USART_InitStructure.USART_OverSampling = USART_OverSampling_16;

42. ```
USART_Init(USART0, &USART_InitStructure);
  1. 
    

USART_Cmd(USART0, ENABLE);

45. 
46. ```
USART_ITConfig(USART0, USART_IT_RXNE, ENABLE);
  1. 
    

/ Configer the USART0 interrupt /

49. ```
PLIC_InitStructure.PLIC_IRQChannel = USART0_IRQn;
  1. 
    

PLIC_InitStructure.PLIC_IRQPriority = 1;

51. ```
PLIC_InitStructure.PLIC_IRQChannelCmd = ENABLE;
  1. 
    

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)
  1. 
    

{

67. ```
*/* Clear the interrupt pending bits */*
  1. 
    

USART_SendData(USART0,USART_ReceiveData(USART0));

69. ```
}
  1. }

在這個(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)象。
圖片 2.png

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1925

    瀏覽量

    88025
  • 中斷控制器
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    9767
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    利用蜂鳥E203搭建SoC【2】——外部中斷擴(kuò)展與驗(yàn)證

    在SoC設(shè)計(jì)中一個(gè)重要通信方式就是中斷,中斷可以避免輪詢方式造成的cpu空轉(zhuǎn)消耗,可以更好利用cpu資源。蜂鳥e203中提供了plic外部中斷總線進(jìn)行
    發(fā)表于 10-29 07:14

    DDR200T運(yùn)行plic中斷例程LED無(wú)反應(yīng)的解決辦法

    ,但是按下那五個(gè)中斷按鍵UDLRC,LED沒(méi)反應(yīng),始終處于熄滅狀態(tài)。我也試驗(yàn)了Gitee下載了開源的demo_plic程序,反應(yīng)一樣。 解決方法: 使用NucleiStudio_IDE_202102
    發(fā)表于 10-27 06:00

    蜂鳥E203內(nèi)核中斷管理模塊sirv_plic_man代碼分析

    這段代碼是一個(gè) System-level Interrupt Request (PLIC) 控制器的 Verilog HDL 模塊,它用于管理來(lái)自多個(gè)源的中斷請(qǐng)求并將它們分派給處理器的中斷請(qǐng)求線
    發(fā)表于 10-23 06:05

    瑞薩RA系列MCU的外部引腳中斷詳解

    上一章節(jié)我們已經(jīng)詳細(xì)介紹了NVIC、ICU、ELC、NMI并對(duì)RA系列MCU的中斷管理系統(tǒng)有個(gè)全局的了解,我們這一章節(jié)的內(nèi)容是如何控制外部中斷,也是內(nèi)核里的NVIC的實(shí)例應(yīng)用,這也是RA系列
    的頭像 發(fā)表于 09-23 09:38 ?1080次閱讀
    瑞薩RA<b class='flag-5'>系列</b>MCU的外部引腳<b class='flag-5'>中斷</b><b class='flag-5'>詳解</b>

    基于 AS32X601 微控制器的定時(shí)器模塊(TIM)技術(shù)研究與應(yīng)用實(shí)踐

    摘要: 本文全面介紹了國(guó)科安芯推出的AS32X601系列微控制器的定時(shí)器模塊(TIM),包括其系統(tǒng)架構(gòu)、功能特性、應(yīng)用場(chǎng)景以及工程實(shí)踐要點(diǎn)。通過(guò)對(duì)芯片的詳細(xì)分析,揭示了其高性能運(yùn)行的基礎(chǔ)。本文詳細(xì)
    的頭像 發(fā)表于 08-19 16:44 ?499次閱讀

    AS32X601芯片F(xiàn)lash擦寫調(diào)試技術(shù)解析

    本文聚焦于 國(guó)科安芯推出的AS32X601 芯片的 Flash 擦寫調(diào)試工作,深入剖析其片內(nèi) Flash 存儲(chǔ)器架構(gòu),詳述 Flash 控制器功能與運(yùn)作機(jī)制。通過(guò)對(duì) Flash 指令集的解讀,梳理
    的頭像 發(fā)表于 07-22 13:47 ?407次閱讀
    <b class='flag-5'>AS32X601</b>芯片F(xiàn)lash擦寫調(diào)試技術(shù)解析

    AS32X601系列MCU硬件最小系統(tǒng)設(shè)計(jì)與調(diào)試方案探析

    推出的AS32X601 系列 MCU 為例,深入探討硬件最小系統(tǒng)設(shè)計(jì)要點(diǎn)以及硬件調(diào)試方案,旨在為相關(guān)領(lǐng)域的研究人員和技術(shù)人員提供有價(jià)值的參考。
    的頭像 發(fā)表于 07-22 13:46 ?324次閱讀

    AS32X601驅(qū)動(dòng)系列教程 USART_串口通訊詳解

    國(guó)科安芯的AS32系列MCU芯片集成7路USART,能夠靈活地與外部設(shè)備進(jìn)行全雙工數(shù)據(jù)交換,滿足外部設(shè)備對(duì)工業(yè)標(biāo)準(zhǔn) NRZ 異步串行數(shù)據(jù)格式的要求。USART 通過(guò)小數(shù)波特率發(fā)生器實(shí)現(xiàn)了多種波特率
    的頭像 發(fā)表于 05-23 16:54 ?585次閱讀
    <b class='flag-5'>AS32X601</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>系列</b>教程 USART_串口通訊<b class='flag-5'>詳解</b>

    AS32X601驅(qū)動(dòng)系列教程 GPIO_按鍵檢測(cè)詳解

    在嵌入式系統(tǒng)開發(fā)中,GPIO(通用輸入輸出端口)是實(shí)現(xiàn)硬件與軟件交互的關(guān)鍵組件。本節(jié)主要利用的時(shí)GPIO的輸入采集功能,本節(jié)的主要功能為,讀取板載按鍵,當(dāng)按鍵按下時(shí),對(duì)應(yīng)led亮起,抬起按鍵,對(duì)應(yīng)led熄滅。 硬件設(shè)計(jì) 評(píng)估板板載三個(gè)機(jī)械按鍵,分別接入MCU的PE10、PB4、PB3,當(dāng)按鍵按下時(shí),控制引腳通過(guò)按鍵接地,表現(xiàn)為低電平,當(dāng)按鍵抬起時(shí),io通過(guò)電阻連接到VCC,此時(shí)表現(xiàn)為高電平。 軟件設(shè)計(jì) 代碼分析 本節(jié)主要驗(yàn)證GPIO的輸入功能,所不同的是
    的頭像 發(fā)表于 05-23 16:44 ?513次閱讀
    <b class='flag-5'>AS32X601</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>系列</b>教程 GPIO_按鍵檢測(cè)<b class='flag-5'>詳解</b>

    AS32X601驅(qū)動(dòng)系列教程 GPIO_點(diǎn)亮LED詳解

    的大門。自本章開始,正式開始用代碼控制AS32x601各外設(shè)完成功能配置。 需要注意的是,AS32X601提供了8組GPIO,其中GPIOA~GPIOG寄存器操作完全一致,但在使用GPIOH的時(shí)候,寄存器列表中間少了一個(gè)32位寄存器,因此在使用過(guò)程中容易造成誤操作,我們?cè)?/div>
    的頭像 發(fā)表于 05-23 16:14 ?450次閱讀
    <b class='flag-5'>AS32X601</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>系列</b>教程 GPIO_點(diǎn)亮LED<b class='flag-5'>詳解</b>

    AS32X601驅(qū)動(dòng)系列教程 SMU_系統(tǒng)時(shí)鐘詳解

    時(shí)鐘和復(fù)位的管理。在默認(rèn)狀態(tài)下SMU工作在IDLE狀態(tài)。只有接收到PMU的使能信號(hào)后才開始工作。SMU模塊會(huì)根據(jù)PMU的指令自動(dòng)配置COR、AXIBUS0/1/2等總線的時(shí)鐘和復(fù)位。 需要注意的是,MCU芯片AS32X601可通過(guò)BOOT選擇從外部QSPI Flash啟動(dòng)和內(nèi)部PFlash啟動(dòng),
    的頭像 發(fā)表于 05-23 16:01 ?507次閱讀
    <b class='flag-5'>AS32X601</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>系列</b>教程 SMU_系統(tǒng)時(shí)鐘<b class='flag-5'>詳解</b>

    面向工業(yè)與汽車領(lǐng)域的高安全可靠MCU——AS32X601系列芯片解析

    AS32X601系列是國(guó)科安芯研發(fā)的32位RISC-V架構(gòu)MCU,專為高安全性、高可靠性場(chǎng)景設(shè)計(jì),覆蓋工業(yè)控制、汽車電子等關(guān)鍵領(lǐng)域。其核心優(yōu)勢(shì)在于通過(guò)硬件級(jí)安全機(jī)制、多重冗余設(shè)計(jì)及功能安全認(rèn)證,滿足
    的頭像 發(fā)表于 03-14 16:40 ?734次閱讀

    AS32X601芯片技術(shù)剖析

    芯片簡(jiǎn)介 AS32X601系列MCU是國(guó)產(chǎn)高可靠嵌入式處理器的重要突破,其企業(yè)宇航級(jí)型號(hào)AS32S601針對(duì)空間輻射環(huán)境與極端溫度條件優(yōu)化,滿足衛(wèi)星載荷控制、航天器運(yùn)動(dòng)控制等場(chǎng)景需求。該芯片采用
    的頭像 發(fā)表于 03-14 16:17 ?783次閱讀

    AS32X601雙核鎖步MCU技術(shù)優(yōu)勢(shì)分析

    AS32X601是國(guó)科安芯公司研制的一系列基于32位RISC-V指令集車規(guī)級(jí)MCU處理器芯片。主頻高達(dá)180MHz,支持雙核鎖步架構(gòu),基于軟錯(cuò)誤防護(hù)技術(shù)加持,顯著提高芯片安全性能。產(chǎn)品具有高安全、低
    的頭像 發(fā)表于 03-07 16:12 ?648次閱讀

    EE-188:使用C語(yǔ)言在ADSP-219x DSP上實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng)

    電子發(fā)燒友網(wǎng)站提供《EE-188:使用C語(yǔ)言在ADSP-219x DSP上實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng).pdf》資料免費(fèi)下載
    發(fā)表于 01-15 16:06 ?0次下載
    EE-188:使用C語(yǔ)言在ADSP-219<b class='flag-5'>x</b> DSP上實(shí)現(xiàn)<b class='flag-5'>中斷</b><b class='flag-5'>驅(qū)動(dòng)</b>系統(tǒng)