WIC(wake-up interrupt controller)介绍

cortex-m处理器处于sleep mode或deep sleep mode时,处理器需要外部中断信号来唤醒,才能继续执行指令,在deep sleep mode下,处理器可能没有时钟,甚至已经被断电(具体行为取决于芯片设计者,arm并没有明确规定),并不能接收到外部中断信号,因此为了能够正确唤醒处理器,需要一个电路来接收外部中断信号,并通知片上PMU(Power Management Unit)给处理器提供时钟或电源,并在处理器可以接收中断后,将收到的中断信号送回给处理器,但这一功能是可选的。WIC就是实现这一功能的电路。下图是WIC在芯片中位置的一个示意图。
在这里插入图片描述
WIC在处理器休眠前,需要接收来自NVIC的中断屏蔽信息并加以保存,并在处理器处于休眠状态时不能断电,但是它不需要可编程寄存器,甚至可以在处理器休眠时不需要时钟,只要能根据中断屏蔽信息和收到的外部中断信号,及时通知PMU即可。下图是使用WIC时,处理器进入并退出休眠状态的工作流程图。
在这里插入图片描述
在某些芯片设计或某些处理器版本中可能并没有WIC,那么WIC的功能就取决于芯片设计者,一个可行的方案是直接把这一功能的子模块集成到PMU中。

下图是power on/off的典型sequence示意图,图中给出了时钟,ISO,RETAIN/RESTORE, power on/off的流程示意图。在power on sequence中,复位应该在power up到restore之间从低变高。
在这里插入图片描述
下图是一个详细的power sequence波形图。在这里插入图片描述参考资料:The Definitive Guide to Arm Cortex-M3 and Cortex-M4 ProcessorsSystem-on-Chip Design with Arm® Cortex®-M Processors
Low Power Methodology Manual for Soc Design

// --------------------------------------------------------------------------- // WIC instantiation // --------------------------------------------------------------------------- // Remove filler bits from WicMask to fit WIC port assign wic_mask = {wic_mask_isr, wic_mask_mon, wic_mask_nmi, wic_mask_rxev}; assign int_wic_mask = wic_mask[WIC_LINES-1:0]; // Select incoming IRQs/EDBGRQ/NMI/RXEV used by WIC assign int_wic_int = {INTISR, EDBGRQ, INTNMI, RXEV}; assign wic_int = int_wic_int[WIC_LINES-1:0]; cm4_wic #(WIC_PRESENT, WIC_LINES) u_cm4_wic (// Inputs .FCLK (FCLK), .RESETn (int_sysreset_n), .WICLOAD (wic_load), .WICCLEAR (wic_clear), .WICINT (wic_int), .WICMASK (int_wic_mask), .WICENREQ (WICENREQ), .WICDSACKn (wic_ds_ack_n), // Outputs .WAKEUP (int_wake_up), .WICSENSE (wic_sense), .WICPEND (wic_pend), .WICDSREQn (wic_ds_req_n), .WICENACK (int_wic_en_ack) ); // add dummy MSB to WicPend to facilitate indexing assign int_wic_pend = {1'b0, wic_pend}; assign int_wic_sense = {1'b0, wic_sense}; // Split WicPend into component IRQs/NMI/RXEV assign int_wic_irq_pend = {{244-WIC_LINES{1'b0}},int_wic_pend[WIC_LINES:3]}; assign wic_irq_pend = mst_wic_en ? int_wic_irq_pend[239:0] : {240{1'b0}}; assign wic_mon_pend = mst_wic_en ? int_wic_pend[2] : 1'b0; assign wic_nmi_pend = mst_wic_en ? int_wic_pend[1] : 1'b0; assign wic_rxev_pend = mst_wic_en ? int_wic_pend[0] : 1'b0; assign int_int_isr = INTISR | wic_irq_pend; assign int_int_nmi = INTNMI | wic_nmi_pend; assign int_rxev = (RXEV & ~wic_sense[0]) | wic_rxev_pend; assign int_ext_dbg_req = EDBGRQ | wic_mon_pend; assign combined_dbg_req = int_ext_dbg_req | etm_dbg_req; //---------------------------------------------------------------------------- // WIC not present logic removal terms //---------------------------------------------------------------------------- assign WAKEUP = (WIC_PRESENT != 0) ? int_wake_up : 1'b0; assign WICENACK = (WIC_PRESENT != 0) ? int_wic_en_ack : 1'b0; assign mst_wic_en = (WIC_PRESENT != 0) ? 1'b1 : 1'b0; 想我解释这段代码 详细解释
最新发布
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值