0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AS32X601驱动系列教程 PLIC_中断应用详解

安芯 来源:jf_29981791 作者:jf_29981791 2025-05-23 17:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

平台中断控制器(Platform Level Interrupt Controller,PLIC)是国科安芯AS32系列MCU芯片的中断控制器,主要对中断源进行采样,优先级仲裁和分发。各外设中断统一连到PLIC,PLIC统一管理并输出中断请求到内核。

硬件设计

本节硬件同USART章节一致。

软件设计

代码分析

在之前的按键章节我们已经对AS32的中断进行了简单实用,本节将用串口的接收中断实验进一步加深一下使用过程。

回顾之前的启动文件章节,有如下一段代码:
图片 1.png

RISCV指令集中,在机器模式下中断相关的寄存器有MSTATUS、MIE和MTVEC,其中前两个寄存器控制系统中断使能,具体内容颗翻看启动文件讲解,MTVEC用于保存中断入口地址,当中断发生时,程序指针会自动跳转到TrapEntry地址处开始执行,该段代码位于as32x601_trapentry.S文件中,用汇编文件编写,在这个函数下,我们会将RISCV内核所有相关寄存器,包括PC指针等全部进行保存,然后调用中断入口处理函数,完成后恢复现场寄存器值,从而实现中断功能。

中断处理函数位于as32x601_plic.c文件中,我们找到如下函数:

  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. }

在这个函数中,系统中断首先会读取MCAUSE寄存器的最高位,如果最高位为0,代表此事件为异常,RISCV定义了此类型,具体可直接查看MCAUSE寄存器定义;如果最高位为1,证明此事件为系统中断,此时可根据低位去选择处理的中断类型。

AS32除了系统定时中断和软件中断外,plic定义了64个plic中断,之前的的异常和中断均为向量类型,但进入plic中断后即为非向量模式,但可以软件支持嵌套,64个中断类型均已经在此文件中定义,所有定义均为弱函数,因此可以复制中断处理函数名写在自定义位置。接下来以串口中断为例介绍用法:

复制之前的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. }

在这个代码中,44行之前和串口章节完全一样,不再重复进行说明。第46行,调用串口的中断使能函数,使能串口接收中断,该处形参中的中断类型已经定义好,可以自行查询,之后需要开启PLIC的中断通道以及优先级配置,之后调用PLIC_Init函数进行初始化。

接下来,需要重写中断处理函数,该函数名已经在PLIC库文件中定义完成,直接复制过来即可,在这个函数中首先判断终端的来源,之后通过调用发送函数原路径发出,当然这只是一个实验,功能比较简单,实际使用过程中切忌这种用法。

最后主函数中对上述代码只需要做初始化即可,没有实际逻辑,因此在这不做展示。

下板验证

将上述代码编译烧录完成,连接串口线与上位机,观察现象。
图片 2.png

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1928

    浏览量

    88206
  • 中断控制器
    +关注

    关注

    0

    文章

    62

    浏览量

    9774
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    串口中断触发卡死怎么解决?

    ;IIR; break;} } /* 到这儿 IIR bit0 为 1(无挂起中断) */ return 0;}/* UART0 PLIC 中断服务函数 */void
    发表于 11-11 06:17

    e203添加中断源,中断源无法使能怎么解决?

    大家好: 硬件平台为arty a7,我们给E203添加了一个以太网外设,按照顺序把中断源设置为53号,可是发现外设的确产生了中断信号(边沿),可是plic模块的plic_ext_ir
    发表于 11-10 07:45

    浅析riscv中的plic与eclic

    1.PLIC中断处理 在RISC V体系架构中,对中断有着一些定义,下面来分析一下这种定义的实现策略。 在riscv中一共定义了三种状态中断,对于hart层面,hart包含local
    发表于 10-31 07:23

    蜂鸟E203内核中断管理模块sirv_plic_man代码分析

    这段代码是一个 System-level Interrupt Request (PLIC) 控制器的 Verilog HDL 模块,它用于管理来自多个源的中断请求并将它们分派给处理器的中断请求线
    发表于 10-23 06:05

    基于 AS32X601 微控制器的定时器模块(TIM)技术研究与应用实践

    摘要: 本文全面介绍了国科安芯推出的AS32X601系列微控制器的定时器模块(TIM),包括其系统架构、功能特性、应用场景以及工程实践要点。通过对芯片的详细分析,揭示了其高性能运行的基础。本文详细
    的头像 发表于 08-19 16:44 602次阅读

    AS32X601芯片Flash擦写调试技术解析

    本文聚焦于 国科安芯推出的AS32X601 芯片的 Flash 擦写调试工作,深入剖析其片内 Flash 存储器架构,详述 Flash 控制器功能与运作机制。通过对 Flash 指令集的解读,梳理
    的头像 发表于 07-22 13:47 522次阅读
    <b class='flag-5'>AS32X601</b>芯片Flash擦写调试技术解析

    AS32X601系列MCU硬件最小系统设计与调试方案探析

    推出的AS32X601 系列 MCU 为例,深入探讨硬件最小系统设计要点以及硬件调试方案,旨在为相关领域的研究人员和技术人员提供有价值的参考。
    的头像 发表于 07-22 13:46 413次阅读

    AS32X601驱动系列教程 USART_串口通讯详解

    国科安芯的AS32系列MCU芯片集成7路USART,能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求。USART 通过小数波特率发生器实现了多种波特率
    的头像 发表于 05-23 16:54 687次阅读
    <b class='flag-5'>AS32X601</b><b class='flag-5'>驱动</b><b class='flag-5'>系列</b>教程 USART_串口通讯<b class='flag-5'>详解</b>

    AS32X601驱动系列教程 GPIO_按键检测详解

    在嵌入式系统开发中,GPIO(通用输入输出端口)是实现硬件与软件交互的关键组件。本节主要利用的时GPIO的输入采集功能,本节的主要功能为,读取板载按键,当按键按下时,对应led亮起,抬起按键,对应led熄灭。 硬件设计 评估板板载三个机械按键,分别接入MCU的PE10、PB4、PB3,当按键按下时,控制引脚通过按键接地,表现为低电平,当按键抬起时,io通过电阻连接到VCC,此时表现为高电平。 软件设计 代码分析 本节主要验证GPIO的输入功能,所不同的是
    的头像 发表于 05-23 16:44 652次阅读
    <b class='flag-5'>AS32X601</b><b class='flag-5'>驱动</b><b class='flag-5'>系列</b>教程 GPIO_按键检测<b class='flag-5'>详解</b>

    AS32X601驱动系列教程 GPIO_点亮LED详解

    的大门。自本章开始,正式开始用代码控制AS32x601各外设完成功能配置。 需要注意的是,AS32X601提供了8组GPIO,其中GPIOA~GPIOG寄存器操作完全一致,但在使用GPIOH的时候,寄存器列表中间少了一个32位寄存器,因此在使用过程中容易造成误操作,我们在
    的头像 发表于 05-23 16:14 557次阅读
    <b class='flag-5'>AS32X601</b><b class='flag-5'>驱动</b><b class='flag-5'>系列</b>教程 GPIO_点亮LED<b class='flag-5'>详解</b>

    AS32X601驱动系列教程 SMU_系统时钟详解

    时钟和复位的管理。在默认状态下SMU工作在IDLE状态。只有接收到PMU的使能信号后才开始工作。SMU模块会根据PMU的指令自动配置COR、AXIBUS0/1/2等总线的时钟和复位。 需要注意的是,MCU芯片AS32X601可通过BOOT选择从外部QSPI Flash启动和内部PFlash启动,
    的头像 发表于 05-23 16:01 592次阅读
    <b class='flag-5'>AS32X601</b><b class='flag-5'>驱动</b><b class='flag-5'>系列</b>教程 SMU_系统时钟<b class='flag-5'>详解</b>

    面向工业与汽车领域的高安全可靠MCU——AS32X601系列芯片解析

    AS32X601系列是国科安芯研发的32位RISC-V架构MCU,专为高安全性、高可靠性场景设计,覆盖工业控制、汽车电子等关键领域。其核心优势在于通过硬件级安全机制、多重冗余设计及功能安全认证,满足
    的头像 发表于 03-14 16:40 846次阅读

    AS32X601芯片技术剖析

    芯片简介 AS32X601系列MCU是国产高可靠嵌入式处理器的重要突破,其企业宇航级型号AS32S601针对空间辐射环境与极端温度条件优化,满足卫星载荷控制、航天器运动控制等场景需求。该芯片采用
    的头像 发表于 03-14 16:17 868次阅读

    AS32X601双核锁步MCU技术优势分析

    AS32X601是国科安芯公司研制的一系列基于32位RISC-V指令集车规级MCU处理器芯片。主频高达180MHz,支持双核锁步架构,基于软错误防护技术加持,显著提高芯片安全性能。产品具有高安全、低
    的头像 发表于 03-07 16:12 744次阅读

    EE-188:使用C语言在ADSP-219x DSP上实现中断驱动系统

    电子发烧友网站提供《EE-188:使用C语言在ADSP-219x DSP上实现中断驱动系统.pdf》资料免费下载
    发表于 01-15 16:06 0次下载
    EE-188:使用C语言在ADSP-219<b class='flag-5'>x</b> DSP上实现<b class='flag-5'>中断</b><b class='flag-5'>驱动</b>系统