SRPWM前后级保护的应用指南

文档编号:AN0002

注意

非经本公司书面许可,任何单位和个人不得擅自摘抄/复制本文档内容的部分或全部,并不得以任何形式传播. 本文档仅供参考,具体内容以实际产品为准,本文档中所涉及的产品/技术/服务等信息可能会随时更新,恕不另行通知.

序号

版本

日期

修改说明

1

1.0

2023/09/15

初始发布

模块简介

SRPWM介绍

PWM脉宽调制是电力电子应用中非常重要的一种控制技术.SRPWM (Super Resolution PWM) 是高精度PWM模块,具备灵活的周期/相位以及死区调整;丰富的同步机制;具备高级的保护功能;支持高达ps级(156ps = 5ns/32)的高精度调制.

主要特性

  • 支持输出12个通道共24路PWM

  • 每个通道输出2路PWM

  • 每个通道的2路PWM可配置为独立或互补关系

  • 支持多个定时单元

  • 12个16位定时单元,可任意配置为独立或主从关系(通过2路同步信号同步)

  • 每个通道均支持输入2路同步信号和输出2路同步信号

  • 支持高精度功能

  • 每个通道的周期/占空比以及死区可独立进行高精度调整

  • 高精度调整功能可旁路

  • 高精度可达156 ps

  • 支持丰富的比较事件

  • 每个通道4个主比较器和4个从比较器

  • 可配置1个周期内单次比较或多次比较

  • 可配置大于等于,小于等于/等于

  • 可作为同步信号输出

  • 支持丰富的波形生成事件PG(PWM Generate)

  • 每个通道支持22种事件生成PWM

  • 每个通道的2路PWM可独立配置波形生成事件

  • 支持突发发波模式

  • 支持丰富的保护机制

  • 支持异常信号预处理

  • 统计

  • 滤波

  • Blanking功能

  • 支持前级保护

  • 每个通道4路异常信号输入.

  • 多种保护模式:CBC模式/One-shot模式/立即封波模式

  • 保护起始结束时机可配

  • 多种保护动作:置0/置1/高阻/取反

  • 支持后级保护

  • 每个通道2路异常信号输入

  • 多种保护动作:不动作/置0/置1/高阻

  • 通道内和通道间的互斥保护

  • 互斥保护条件可配

  • 支持4路DMA

  • 12个通道共用4路DMA

  • 支持12路中断

  • 每路中断支持14种中断源,其中事件中断源支持24种中断事件

  • 支持连接到片内模拟外设

  • 提供12路信号给每一个ADC

  • 提供1路信号给每一个DAC

  • 提供1路信号给每一个ACMP

  • 支持广播更新寄存器功能

  • 全部通道或者任意指定通道同时配置

  • 支持关键参数寄存器多种加载模式

  • 立即加载模式

  • 通道间同步加载模式

  • 通道内影子加载模式

  • 支持广播更新:全部通道或者任意指定通道同时配置

本文将着重对该模块的前后级保护机制进行应用说明.

保护机制

SRPWM模块包含了前级保护PREP(Pre-Protect)和后级保护PSTP(Post-Protect)两级的保护逻辑,可以在外部电路发生故障或芯片内部出现告警时将输出的PWM波信号设置为预置的安全状态.其中前级保护基于SRPWM模块工作时钟驱动,后级保护的保护行为无需时钟驱动,且后级保护相对于前级保护将会快3个CLK进行保护.

前级保护PREP

008

  1. 前级保护单元在SRPWM通道内的位置

从图中可以看到前级保护的保护信号来自于片内的XBAR模块.XBAR的输入信号可以来自于ACMP/SOC告警/GPIO输入的故障信号,XBAR输出6路异常信号到SRPWM通道,并由通道内异常预处理单元FPP(Fault Preprocess)输出给前级保护单元和后级保护单元.

其中前级保护单元接收来自FPP的前4路异常信号,前4路异常信号可分为:

  • 4路实时的异常信号

  • 4路锁存的异常信号

前级保护状态可分为:

  • 高阻状态

  • 置0状态

  • 置1状态

  • 连续取反状态

前级保护有3中保护模式:

  • CBC(逐周期)保护模式:异常信号到来时,PWM立即保护;异常信号消失时,需要等待结束信号到来后再恢复PWM保护前的输出状态.

  • OS(One-shot)保护模式:可配置保护的起始和结束时刻.若使能了保护的起始和结束功能,PWM进入保护和退出保护状态,需要根据起始和结束同步信号以及异常信号的到来和消失共同决定;若未使能保护的起始和结束功能,异常信号到来时,立即保护,异常信号消失时,立即退出保护;若仅使能保护的起始功能,异常信号 和起始信号均到来时,进入保护状态,异常信号消失时,立即退出保护;若仅使能保护的结束信号,异常信号到来时,立即保护,异常信号和结束信号均到来时,退出保护状态.

  • UNRES(无约束)立即保护模式:异常信号到来时,立即保护;异常信号消失时,立即退出保护.

针对上述三种保护模式,均可独立配置其对应的保护动作.每个通道的两路PWM(A路和B路)均可独立配置

备注

上述三种保护模式可同时开启.当不同保护模式的不同动作事件同时出现时,动作的优先级从高到低依次为:高阻>置0>置1>连续取反;当不同保护模式的同一种动作的不同触发事件不同时出现时,保护动作的开始与最早开始的动作事件对齐,保护动作的结束与最晚结束的动作事件对齐.举例:

009

  1. OS模式和UNRES保护模式同时启动保护

后级保护PSTP

010

  1. 后级保护单元在SRPWM通道内的位置

从图中可以看到后级保护的保护信号来自于片内的XBAR模块.XBAR的输入信号可以来自于ACMP/SOC告警/GPIO输入的故障信号,XBAR输出6路异常信号到SRPWM通道,并由通道内异常预处理单元FPP(Fault Preprocess)输出给前级保护单元和后级保护单元.

其中后级保护单元接收来自FPP的后2路异常信号.同时,后级保护单元还可以进行SRPWM通道间和通道内的互斥保护.且均支持保护状态的取反,和A/B路的输出状态Swap交换.

异常保护

来自FPP的后2路异常信号可分为:

  • 2路实时的异常信号

  • 2路锁存的异常信号

后级的异常保护状态可分为:

  • 不动作

  • 置1状态

  • 置0状态

  • 高阻状态

后级保护单元仅一种默认保护模式:

  • 立即保护

互斥保护

后级保护单元支持SRPWM通道间和通道内的互斥保护.

通道间

SRPWM COM公共管理模块将12个SRPWM通道输出的24路发波信号,根据软件配置,重新组合成12对信号(sig0和sig1),每一对信号根据互斥条件产生12组互斥结果.根据互斥屏蔽的选择,将未屏蔽的互斥结果做或运算,形成互斥标志送往后级保护单元.

支持的通道间互斥条件为:

  • 由SRPWM COM公共管理模块配置的互斥条件

支持的通道间互斥状态为:

  • 不动作

  • 置1状态

  • 置0状态

  • 高阻状态

通道内

支持的通道内A/B路互斥条件为:

  • A低B低

  • A低B高

  • A高B低

  • A高B高

后级的互斥保护状态可分为:

  • 不动作

  • 置1状态

  • 置0状态

  • 高阻状态

代码应用

从图2-1和图2-3可以看到,前后级保护需要借助XBAR模块,将异常信号送入SRPWM的前后级保护单元进行保护;而互斥保护仅后级保护单元支持,无需XBAR模块支持.

在配置XBAR时需要注意,XBAR可以送出18路异常信号给SRPWM,而每一个SRPWM仅支持6路来自XBAR的异常信号,所以XBAR将18路异常信号分为3组分别送往SRPWM.

对应关系如下:

  • PFXB_OUT[5:0]-> PWM_CH0~3

  • PFXB_OUT[11:6]-> PWM_CH4~7

  • PFXB_OUT[17:12]-> PWM_CH8~11

前级保护应用

CBC保护

通过GPIO作为保护信号,并输出给XBAR,再通过XBAR输出给SRPWM进行CBC封波保护.

代码分成3部分进行:GPIO配置/XBAR配置/SRPWM配置,需包含各自驱动的头文件.

  • GPIO配置 :

将GPIO0_15配置为输入,并作为XBAR的信号输入.

 1/**
 2* @brief 配置GPIO
 3*          将GPIO0_15配置为输入,作为XBAR的输入
 4*
 5* @return static
 6*/
 7static void GPIO_Config(void)
 8{
 9   IOC_Init_TypeDef Init;
10   IOC_ConfigStructInit(&Init);
11   Init.mode = IOC_AF_MODE_0;
12   Init.dir  = GPIO_DIR_IN_OUT;
13   IOC_Config(IOC_PIN_GPIO0_15, &Init);
14}
  • XBAR的配置 :

作为一个中转,将GPIO0_15状态送往SRPWM进行封波.

 1/**
 2* @brief 配置XBAR
 3*          GPIO0_15 作为XBAR的输入,并给到SRPWM 作为异常保护信号
 4*          高电平封波,需注意GPIO0_15上电后的默认电平
 5*
 6*/
 7static void XBAR_Config(void)
 8{
 9   XBAR_INXB_InCfg_TypeDef  inputCfg;
10   XBAR_PFSXB_InCfg_TypeDef pfxb_inputCfg;
11   XBAR_InChMsk_TypeDef     inputChMsk;
12
13   memset(&inputCfg, 0, sizeof(XBAR_INXB_InCfg_TypeDef));
14   memset(&pfxb_inputCfg, 0, sizeof(XBAR_PFSXB_InCfg_TypeDef));
15   memset(&inputChMsk, 0, sizeof(XBAR_InChMsk_TypeDef));
16
17   /* INXBAR初始化 */
18   inputCfg.inEdgeEn   = DISABLE;
19   inputCfg.inFilterEn = DISABLE;
20   inputCfg.inInvertEn = DISABLE;
21   inputCfg.inEdgeType = XBAR_IN_EDGE_RISING;
22   /* 选择INXBAR的输入源:GPIO0_15 */
23   XBAR_Input_Add_Source(&inputChMsk, INXB_SRC_GPIO0_GRP + 15);
24   XBAR_INXB_Input_Channel_Init(&inputCfg, &inputChMsk);
25   /* 选择INXBAR的输出通道:0 */
26   XBAR_INXB_Output_Mux_Config((uint16_t)BIT_MASK(0), &inputChMsk);
27   /* 失能INXBAR的latch和invert */
28   XBAR_INXB_Output_Latch_Disable((uint16_t)BIT_MASK(0));
29   XBAR_INXB_Output_Invert_Disable((uint16_t)BIT_MASK(0));
30   /* 使能INXBAR的输出功能 */
31   XBAR_INXB_Output_Enable((uint16_t)BIT_MASK(0));
32   /* FPXBAR初始化 */
33   pfxb_inputCfg.inEdgeEn   = DISABLE;
34   pfxb_inputCfg.inInvertEn = DISABLE;
35   pfxb_inputCfg.inEdgeType = XBAR_IN_EDGE_RISING;
36   /* 选择FPXBAR的输入源: PFSXB_SRC_INXB_OUT_FRP+0*/
37   memset(&inputChMsk, 0, sizeof(XBAR_InChMsk_TypeDef));
38   XBAR_Input_Add_Source(&inputChMsk, PFSXB_SRC_INXB_OUT_GRP + 0);
39   XBAR_PFXB_Input_Channel_Init(&pfxb_inputCfg, &inputChMsk);
40   /* 选择FPXBAR的输出通道:0 */
41   /* OUT:
42   PFXB_OUT[5:0]-> PWM_CH0~3
43   PFXB_OUT[11:6]-> PWM_CH4~7
44   PFXB_OUT[17:12]-> PWM_CH8~11
45   */
46   XBAR_PFXB_Output_Mux_Config((uint16_t)BIT_MASK(0), &inputChMsk);
47   /* 失能FPXBAR的latch和invert */
48   XBAR_PFXB_Output_Latch_Disable((uint16_t)BIT_MASK(0));
49   XBAR_PFXB_Output_Invert_Enable((uint16_t)BIT_MASK(0));
50   /* 使能FPXBAR的输出功能 */
51   XBAR_PFXB_Output_Enable((uint16_t)BIT_MASK(0));
52}
  • SRPWM的配置 :

将SRPWM0的A路配置为前级保护,CBC保护状态为置0;将B路配置为观测路,不进行保护.

 1static void SRPWM_Config(void)
 2{
 3   SRPWM_TBInitTypeDef stTBInit;
 4   SRPWM_CMPInitTypeDef stCMPInit;
 5   SRPWM_PREPInitTypeDef stPREPInit;
 6   IOC_Init_TypeDef Init;
 7
 8   /* 复位SRPWM0,并开启SRPWM0的时钟 */
 9   CRG_PeriphReset(CRG_SRST_SRPWM0);
10   /* IO mux配置 */
11   IOC_ConfigStructInit(&Init);
12   Init.mode = IOC_AF_MODE_1;
13   IOC_Config(IOC_PIN_GPIO0_1, &Init); //pwm0b
14   /* TB初始化 */
15   SRPWM_TBStructInit(&stTBInit);
16   stTBInit.period    = 0xC350;
17   stTBInit.countMode = SRPWM_COUNTMODE_UP;
18   SRPWM_TBInit(SRPWM0, &stTBInit);
19   /* CMP初始化 */
20   SRPWM_CMPStructInit(&stCMPInit);
21   stCMPInit.cmpA = 0xC350 / 4;
22   SRPWM_CMPInit(SRPWM0, &stCMPInit);
23   /* PG初始化 */
24   SRPWM_SetPG(SRPWM0, SRPWM_PWMB, SRPWM_PG_EVT_CMPA_UP, SRPWM_PG_CLEAR);
25   SRPWM_SetPG(SRPWM0, SRPWM_PWMB, SRPWM_PG_EVT_ZERO, SRPWM_PG_SET);
26   /* PREP前级保护功能初始化 */
27   SRPWM_PREPStructInit(&stPREPInit);
28   stPREPInit.b.unresFaultProtectSig   = SRPWM_PREP_SIG_FAULT_REAL0;
29   stPREPInit.b.unresFaultProtectState = SRPWM_PREP_STATE_CLR;
30   SRPWM_PREPInit(SRPWM0, &stPREPInit);
31   /* 使能高精度旁路 */
32   SRPWM_HRPWMBypassEnable(SRPWM0);
33   /* 使能指定模块 */
34   SRPWMCOM_Enable(SRPWM_CHANNEL_0);
35}

可以预见,当GPIO0_15输入高电平时,SRPWM0的B路将会正常输出PWM波;而A路将会先输出PWM,当异常信号(输入变低)到来时封波,且不恢复波形,除非软件事件到来和异常信号消失.

OS保护

通过GPIO作为保护信号,并输出给XBAR,再通过XBAR输出给SRPWM进行One-shot封波保护.

代码分成3部分进行:GPIO配置/XBAR配置/SRPWM配置,需包含各自驱动的头文件.

  • GPIO配置 :

将GPIO0_15配置为输入,并作为XBAR的信号输入.

 1/**
 2* @brief 配置GPIO
 3*          将GPIO0_15配置为输入,作为XBAR的输入
 4*
 5* @return static
 6*/
 7static void GPIO_Config(void)
 8{
 9   IOC_Init_TypeDef Init;
10   IOC_ConfigStructInit(&Init);
11   Init.mode = IOC_AF_MODE_0;
12   Init.dir  = GPIO_DIR_IN_OUT;
13   IOC_Config(IOC_PIN_GPIO0_15, &Init);
14}
  • XBAR的配置 :

作为一个中转,将GPIO0_15状态送往SRPWM进行封波.

 1/**
 2* @brief 配置XBAR
 3*          GPIO0_15 作为XBAR的输入,并给到SRPWM 作为异常保护信号
 4*          高电平封波,需注意GPIO0_15上电后的默认电平
 5*
 6*/
 7static void XBAR_Config(void)
 8{
 9   XBAR_INXB_InCfg_TypeDef  inputCfg;
10   XBAR_PFSXB_InCfg_TypeDef pfxb_inputCfg;
11   XBAR_InChMsk_TypeDef     inputChMsk;
12
13   memset(&inputCfg, 0, sizeof(XBAR_INXB_InCfg_TypeDef));
14   memset(&pfxb_inputCfg, 0, sizeof(XBAR_PFSXB_InCfg_TypeDef));
15   memset(&inputChMsk, 0, sizeof(XBAR_InChMsk_TypeDef));
16
17   /* INXBAR初始化 */
18   inputCfg.inEdgeEn   = DISABLE;
19   inputCfg.inFilterEn = DISABLE;
20   inputCfg.inInvertEn = DISABLE;
21   inputCfg.inEdgeType = XBAR_IN_EDGE_RISING;
22   /* 选择INXBAR的输入源:GPIO0_15 */
23   XBAR_Input_Add_Source(&inputChMsk, INXB_SRC_GPIO0_GRP + 15);
24   XBAR_INXB_Input_Channel_Init(&inputCfg, &inputChMsk);
25   /* 选择INXBAR的输出通道:0 */
26   XBAR_INXB_Output_Mux_Config((uint16_t)BIT_MASK(0), &inputChMsk);
27   /* 失能INXBAR的latch和invert */
28   XBAR_INXB_Output_Latch_Disable((uint16_t)BIT_MASK(0));
29   XBAR_INXB_Output_Invert_Disable((uint16_t)BIT_MASK(0));
30   /* 使能INXBAR的输出功能 */
31   XBAR_INXB_Output_Enable((uint16_t)BIT_MASK(0));
32   /* FPXBAR初始化 */
33   pfxb_inputCfg.inEdgeEn   = DISABLE;
34   pfxb_inputCfg.inInvertEn = DISABLE;
35   pfxb_inputCfg.inEdgeType = XBAR_IN_EDGE_RISING;
36   /* 选择FPXBAR的输入源: PFSXB_SRC_INXB_OUT_FRP+0*/
37   memset(&inputChMsk, 0, sizeof(XBAR_InChMsk_TypeDef));
38   XBAR_Input_Add_Source(&inputChMsk, PFSXB_SRC_INXB_OUT_GRP + 0);
39   XBAR_PFXB_Input_Channel_Init(&pfxb_inputCfg, &inputChMsk);
40   /* 选择FPXBAR的输出通道:0 */
41   /* OUT:
42   PFXB_OUT[5:0]-> PWM_CH0~3
43   PFXB_OUT[11:6]-> PWM_CH4~7
44   PFXB_OUT[17:12]-> PWM_CH8~11
45   */
46   XBAR_PFXB_Output_Mux_Config((uint16_t)BIT_MASK(0), &inputChMsk);
47   /* 失能FPXBAR的latch和invert */
48   XBAR_PFXB_Output_Latch_Disable((uint16_t)BIT_MASK(0));
49   XBAR_PFXB_Output_Invert_Enable((uint16_t)BIT_MASK(0));
50   /* 使能FPXBAR的输出功能 */
51   XBAR_PFXB_Output_Enable((uint16_t)BIT_MASK(0));
52}
  • SRPWM的配置 :

将SRPWM0的A路配置为前级保护,OS保护状态为置0.

 1static void SRPWM_Config(void)
 2{
 3   SRPWM_TBInitTypeDef stTBInit;
 4   SRPWM_CMPInitTypeDef stCMPInit;
 5   SRPWM_PREPInitTypeDef stPREPInit;
 6   IOC_Init_TypeDef Init;
 7
 8   /* 复位SRPWM0,并开启SRPWM0的时钟 */
 9   CRG_PeriphReset(CRG_SRST_SRPWM0);
10   /* IO mux配置 */
11   IOC_ConfigStructInit(&Init);
12   Init.mode = IOC_AF_MODE_1;
13   IOC_Config(IOC_PIN_GPIO0_0, &Init); //pwm0a
14   /* TB初始化 */
15   SRPWM_TBStructInit(&stTBInit);
16   stTBInit.period    = 0xC350;
17   stTBInit.countMode = SRPWM_COUNTMODE_UP;
18   SRPWM_TBInit(SRPWM0, &stTBInit);
19   /* CMP初始化 */
20   SRPWM_CMPStructInit(&stCMPInit);
21   stCMPInit.cmpA = 0xC350 / 4;
22   SRPWM_CMPInit(SRPWM0, &stCMPInit);
23   /* PG初始化 */
24   SRPWM_SetPG(SRPWM0, SRPWM_PWMA, SRPWM_PG_EVT_CMPA_UP, SRPWM_PG_CLEAR);
25   SRPWM_SetPG(SRPWM0, SRPWM_PWMA, SRPWM_PG_EVT_ZERO, SRPWM_PG_SET);
26   /* PREP前级保护功能初始化 */
27   SRPWM_PREPStructInit(&stPREPInit);
28   stPREPInit.a.osFaultProtectSig      = SRPWM_PREP_SIG_FAULT_REAL0;
29   stPREPInit.a.osFaultProtectState    = SRPWM_PREP_STATE_CLR;
30   stPREPInit.a.osStartSyncSel         = SRPWM_ALLEVT_ZERO_EVT;
31   stPREPInit.a.osStartSyncEn          = ENABLE;
32   stPREPInit.a.osEndSyncSel           = SRPWM_ALLEVT_SW_EVT;
33   stPREPInit.a.osEndSyncEn            = ENABLE;
34   SRPWM_PREPInit(SRPWM0, &stPREPInit);
35   /* 使能高精度旁路 */
36   SRPWM_HRPWMBypassEnable(SRPWM0);
37   /* 使能指定模块 */
38   SRPWMCOM_Enable(SRPWM_CHANNEL_0);
39}

可以预见,SRPWM0的A路将会先输出PWM,当GPIO0_15输入高低电平,异常信号到来时封波,且不恢复波形,除非软件事件到来和异常信号消失.

UNRES无约束立即保护

通过GPIO作为保护信号,并输出给XBAR,再通过XBAR输出给SRPWM进行UNRES无约束封波保护.

代码分成3部分进行:GPIO配置/XBAR配置/SRPWM配置,需包含各自驱动的头文件.

  • GPIO配置 :

将GPIO0_15配置为输入,并作为XBAR的信号输入.

 1/**
 2* @brief 配置GPIO
 3*          将GPIO0_15配置为输入,作为XBAR的输入
 4*
 5* @return static
 6*/
 7static void GPIO_Config(void)
 8{
 9   IOC_Init_TypeDef Init;
10   IOC_ConfigStructInit(&Init);
11   Init.mode = IOC_AF_MODE_0;
12   Init.dir  = GPIO_DIR_IN_OUT;
13   IOC_Config(IOC_PIN_GPIO0_15, &Init);
14}
  • XBAR的配置:作为一个中转,将GPIO0_15状态送往SRPWM进行封波.

 1/**
 2* @brief 配置XBAR
 3*          GPIO0_15 作为XBAR的输入,并给到SRPWM 作为异常保护信号
 4*          高电平封波,需注意GPIO0_15上电后的默认电平
 5*
 6*/
 7static void XBAR_Config(void)
 8{
 9   XBAR_INXB_InCfg_TypeDef  inputCfg;
10   XBAR_PFSXB_InCfg_TypeDef pfxb_inputCfg;
11   XBAR_InChMsk_TypeDef     inputChMsk;
12
13   memset(&inputCfg, 0, sizeof(XBAR_INXB_InCfg_TypeDef));
14   memset(&pfxb_inputCfg, 0, sizeof(XBAR_PFSXB_InCfg_TypeDef));
15   memset(&inputChMsk, 0, sizeof(XBAR_InChMsk_TypeDef));
16
17   /* INXBAR初始化 */
18   inputCfg.inEdgeEn   = DISABLE;
19   inputCfg.inFilterEn = DISABLE;
20   inputCfg.inInvertEn = DISABLE;
21   inputCfg.inEdgeType = XBAR_IN_EDGE_RISING;
22   /* 选择INXBAR的输入源:GPIO0_15 */
23   XBAR_Input_Add_Source(&inputChMsk, INXB_SRC_GPIO0_GRP + 15);
24   XBAR_INXB_Input_Channel_Init(&inputCfg, &inputChMsk);
25   /* 选择INXBAR的输出通道:0 */
26   XBAR_INXB_Output_Mux_Config((uint16_t)BIT_MASK(0), &inputChMsk);
27   /* 失能INXBAR的latch和invert */
28   XBAR_INXB_Output_Latch_Disable((uint16_t)BIT_MASK(0));
29   XBAR_INXB_Output_Invert_Disable((uint16_t)BIT_MASK(0));
30   /* 使能INXBAR的输出功能 */
31   XBAR_INXB_Output_Enable((uint16_t)BIT_MASK(0));
32   /* FPXBAR初始化 */
33   pfxb_inputCfg.inEdgeEn   = DISABLE;
34   pfxb_inputCfg.inInvertEn = DISABLE;
35   pfxb_inputCfg.inEdgeType = XBAR_IN_EDGE_RISING;
36   /* 选择FPXBAR的输入源: PFSXB_SRC_INXB_OUT_FRP+0*/
37   memset(&inputChMsk, 0, sizeof(XBAR_InChMsk_TypeDef));
38   XBAR_Input_Add_Source(&inputChMsk, PFSXB_SRC_INXB_OUT_GRP + 0);
39   XBAR_PFXB_Input_Channel_Init(&pfxb_inputCfg, &inputChMsk);
40   /* 选择FPXBAR的输出通道:0 */
41   /* OUT:
42   PFXB_OUT[5:0]-> PWM_CH0~3
43   PFXB_OUT[11:6]-> PWM_CH4~7
44   PFXB_OUT[17:12]-> PWM_CH8~11
45   */
46   XBAR_PFXB_Output_Mux_Config((uint16_t)BIT_MASK(0), &inputChMsk);
47   /* 失能FPXBAR的latch和invert */
48   XBAR_PFXB_Output_Latch_Disable((uint16_t)BIT_MASK(0));
49   XBAR_PFXB_Output_Invert_Enable((uint16_t)BIT_MASK(0));
50   /* 使能FPXBAR的输出功能 */
51   XBAR_PFXB_Output_Enable((uint16_t)BIT_MASK(0));
52}
  • SRPWM的配置 :将SRPWM0的B路配置为前级保护,UNRES保护状态为置0.

 1static void SRPWM_Config(void)
 2{
 3   SRPWM_TBInitTypeDef stTBInit;
 4   SRPWM_CMPInitTypeDef stCMPInit;
 5   SRPWM_PREPInitTypeDef stPREPInit;
 6   IOC_Init_TypeDef Init;
 7
 8   /* 复位SRPWM0,并开启SRPWM0的时钟 */
 9   CRG_PeriphReset(CRG_SRST_SRPWM0);
10   /* IO mux配置 */
11   IOC_ConfigStructInit(&Init);
12   Init.mode = IOC_AF_MODE_1;
13   IOC_Config(IOC_PIN_GPIO0_1, &Init); //pwm0b
14   /* TB初始化 */
15   SRPWM_TBStructInit(&stTBInit);
16   stTBInit.period    = 0xC350;
17   stTBInit.countMode = SRPWM_COUNTMODE_UP;
18   SRPWM_TBInit(SRPWM0, &stTBInit);
19   /* CMP初始化 */
20   SRPWM_CMPStructInit(&stCMPInit);
21   stCMPInit.cmpA = 0xC350 / 4;
22   SRPWM_CMPInit(SRPWM0, &stCMPInit);
23   /* PG初始化 */
24   SRPWM_SetPG(SRPWM0, SRPWM_PWMB, SRPWM_PG_EVT_CMPA_UP, SRPWM_PG_CLEAR);
25   SRPWM_SetPG(SRPWM0, SRPWM_PWMB, SRPWM_PG_EVT_ZERO, SRPWM_PG_SET);
26   /* PREP前级保护功能初始化 */
27   SRPWM_PREPStructInit(&stPREPInit);
28   stPREPInit.b.unresFaultProtectSig   = SRPWM_PREP_SIG_FAULT_REAL0;
29   stPREPInit.b.unresFaultProtectState = SRPWM_PREP_STATE_CLR;
30   SRPWM_PREPInit(SRPWM0, &stPREPInit);
31   /* 使能高精度旁路 */
32   SRPWM_HRPWMBypassEnable(SRPWM0);
33   /* 使能指定模块 */
34   SRPWMCOM_Enable(SRPWM_CHANNEL_0);
35}

可以预见,SRPWM0的B路将会输出PWM.当GPIO0_15输入高低电平,异常信号到来时封波,异常信号消失时,恢复波形.

后级保护应用

异常保护

通过GPIO作为保护信号,并输出给XBAR,再通过XBAR输出给SRPWM进行封波保护.

代码分成3部分进行:GPIO配置/XBAR配置/SRPWM配置,需包含各自驱动的头文件.

  • GPIO配置 :

将GPIO0_15配置为输入,并作为XBAR的信号输入.

 1/**
 2* @brief 配置GPIO
 3*          将GPIO0_15配置为输入,作为XBAR的输入
 4*
 5* @return static
 6*/
 7static void GPIO_Config(void)
 8{
 9   IOC_Init_TypeDef Init;
10   IOC_ConfigStructInit(&Init);
11   Init.mode = IOC_AF_MODE_0;
12   Init.dir  = GPIO_DIR_IN_OUT;
13   IOC_Config(IOC_PIN_GPIO0_15, &Init);
14}
  • XBAR的配置 :

作为一个中转,将GPIO0_15状态送往SRPWM进行封波.

 1/**
 2* @brief 配置XBAR
 3*          GPIO0_15 作为XBAR的输入,并给到SRPWM 作为异常保护信号
 4*          高电平封波,需注意GPIO0_15上电后的默认电平
 5*
 6*/
 7static void XBAR_Config(void)
 8{
 9   XBAR_INXB_InCfg_TypeDef  inputCfg;
10   XBAR_PFSXB_InCfg_TypeDef pfxb_inputCfg;
11   XBAR_InChMsk_TypeDef     inputChMsk;
12
13   memset(&inputCfg, 0, sizeof(XBAR_INXB_InCfg_TypeDef));
14   memset(&pfxb_inputCfg, 0, sizeof(XBAR_PFSXB_InCfg_TypeDef));
15   memset(&inputChMsk, 0, sizeof(XBAR_InChMsk_TypeDef));
16
17   /* INXBAR初始化 */
18   inputCfg.inEdgeEn   = DISABLE;
19   inputCfg.inFilterEn = DISABLE;
20   inputCfg.inInvertEn = DISABLE;
21   inputCfg.inEdgeType = XBAR_IN_EDGE_RISING;
22   /* 选择INXBAR的输入源:GPIO0_15 */
23   XBAR_Input_Add_Source(&inputChMsk, INXB_SRC_GPIO0_GRP + 15);
24   XBAR_INXB_Input_Channel_Init(&inputCfg, &inputChMsk);
25   /* 选择INXBAR的输出通道:0 */
26   XBAR_INXB_Output_Mux_Config((uint16_t)BIT_MASK(0), &inputChMsk);
27   /* 失能INXBAR的latch和invert */
28   XBAR_INXB_Output_Latch_Disable((uint16_t)BIT_MASK(0));
29   XBAR_INXB_Output_Invert_Disable((uint16_t)BIT_MASK(0));
30   /* 使能INXBAR的输出功能 */
31   XBAR_INXB_Output_Enable((uint16_t)BIT_MASK(0));
32   /* FPXBAR初始化 */
33   pfxb_inputCfg.inEdgeEn   = DISABLE;
34   pfxb_inputCfg.inInvertEn = DISABLE;
35   pfxb_inputCfg.inEdgeType = XBAR_IN_EDGE_RISING;
36   /* 选择FPXBAR的输入源: PFSXB_SRC_INXB_OUT_FRP+0*/
37   memset(&inputChMsk, 0, sizeof(XBAR_InChMsk_TypeDef));
38   XBAR_Input_Add_Source(&inputChMsk, PFSXB_SRC_INXB_OUT_GRP + 0);
39   XBAR_PFXB_Input_Channel_Init(&pfxb_inputCfg, &inputChMsk);
40   /* 选择FPXBAR的输出通道:0 */
41      /* OUT:
42      PFXB_OUT[5:0]-> PWM_CH0~3
43      PFXB_OUT[11:6]-> PWM_CH4~7
44      PFXB_OUT[17:12]-> PWM_CH8~11
45      */
46   XBAR_PFXB_Output_Mux_Config((uint16_t)BIT_MASK(4), &inputChMsk);
47   /* 失能FPXBAR的latch和invert */
48   XBAR_PFXB_Output_Latch_Disable((uint16_t)BIT_MASK(4));
49   XBAR_PFXB_Output_Invert_Disable((uint16_t)BIT_MASK(4));
50   /* 使能FPXBAR的输出功能 */
51   XBAR_PFXB_Output_Enable((uint16_t)BIT_MASK(4));
52}
  • SRPWM的配置 :

将SRPWM0的A路配置为后级保护,保护状态为置0.

 1static void SRPWM_Config(void)
 2{
 3   SRPWM_TBInitTypeDef stTBInit;
 4   SRPWM_CMPInitTypeDef stCMPInit;
 5   SRPWM_PSTPInitTypeDef stPSTPInit;
 6   IOC_Init_TypeDef Init;
 7
 8   /* 复位SRPWM0,并开启SRPWM0的时钟 */
 9   CRG_PeriphReset(CRG_SRST_SRPWM0);
10   /* IO mux配置 */
11   IOC_ConfigStructInit(&Init);
12   Init.mode = IOC_AF_MODE_1;
13   IOC_Config(IOC_PIN_GPIO0_0, &Init); //pwm0a
14   /* TB初始化 */
15   SRPWM_TBStructInit(&stTBInit);
16   stTBInit.period    = 0xC350;
17   stTBInit.countMode = SRPWM_COUNTMODE_UP;
18   SRPWM_TBInit(SRPWM0, &stTBInit);
19   /* CMP初始化 */
20   SRPWM_CMPStructInit(&stCMPInit);
21   stCMPInit.cmpA = 0xC350 / 4;
22   SRPWM_CMPInit(SRPWM0, &stCMPInit);
23   /* PG初始化 */
24   SRPWM_SetPG(SRPWM0, SRPWM_PWMA, SRPWM_PG_EVT_CMPA_UP, SRPWM_PG_CLEAR);
25   SRPWM_SetPG(SRPWM0, SRPWM_PWMA, SRPWM_PG_EVT_ZERO, SRPWM_PG_SET);
26   /* PSTP后级保护功能初始化 */
27   stPSTPInit.a.faultSig      = SRPWM_PSTP_FAULT_SIG_FAULT_REAL4;
28   stPSTPInit.a.faultOutState = SRPWM_PSTP_MUTEX_OUTSTATE_CLEAR;
29   SRPWM_PSTPInit(SRPWM0, &stPSTPInit);
30   /* 使能高精度旁路 */
31   SRPWM_HRPWMBypassEnable(SRPWM0);
32   /* 使能指定模块 */
33   SRPWMCOM_Enable(SRPWM_CHANNEL_0);
34}

可以预见,SRPWM0的A路将会输出PWM.当GPIO0_15输入高低电平,异常信号到来时封波,异常信号消失时,恢复波形.

互斥保护

通道内互斥保护

通过配置通道内SRPWM不同的互斥条件,进行封波保护.

代码分成1部分进行:SRPWM配置,需包含各自驱动的头文件.

  • SRPWM的配置 :将SRPWM0的A路配置为常高电平,B路配置为PWM波形.

 1static void SRPWM_Config(void)
 2{
 3   SRPWM_TBInitTypeDef stTBInit;
 4   SRPWM_CMPInitTypeDef stCMPInit;
 5   SRPWM_PSTPInitTypeDef stPSTPInit;
 6   IOC_Init_TypeDef Init;
 7
 8   /* 复位SRPWM0,并开启SRPWM0的时钟 */
 9   CRG_PeriphReset(CRG_SRST_SRPWM0);
10   /* IO mux配置 */
11   IOC_ConfigStructInit(&Init);
12   Init.mode = IOC_AF_MODE_1;
13   IOC_Config(IOC_PIN_GPIO0_0, &Init); //pwm0a
14   IOC_Config(IOC_PIN_GPIO0_1, &Init); //pwm0b
15   /* TB初始化 */
16   SRPWM_TBStructInit(&stTBInit);
17   stTBInit.period    = 0xC350;
18   stTBInit.countMode = SRPWM_COUNTMODE_UP;
19   SRPWM_TBInit(SRPWM0, &stTBInit);
20   /* CMP初始化 */
21   SRPWM_CMPStructInit(&stCMPInit);
22   stCMPInit.cmpA = 0xC350 / 4;
23   SRPWM_CMPInit(SRPWM0, &stCMPInit);
24   /* PG初始化 */
25   SRPWM_SetPG(SRPWM0, SRPWM_PWMA, SRPWM_PG_EVT_ZERO, SRPWM_PG_SET);
26   SRPWM_SetPG(SRPWM0, SRPWM_PWMB, SRPWM_PG_EVT_CMPA_UP, SRPWM_PG_SET);
27   SRPWM_SetPG(SRPWM0, SRPWM_PWMB, SRPWM_PG_EVT_ZERO, SRPWM_PG_CLEAR);
28   /* PSTP后级保护功能初始化 */
29   SRPWM_PSTPStructInit(&stPSTPInit);
30   stPSTPInit.mutexCondition  = SRPWMCOM_A_HIGH_B_HIGH;
31   stPSTPInit.mutexEn         = ENABLE;
32   stPSTPInit.b.mutexOutState = SRPWM_PSTP_MUTEX_OUTSTATE_CLEAR;
33   SRPWM_PSTPInit(SRPWM0, &stPSTPInit);
34   /* 使能高精度旁路 */
35   SRPWM_HRPWMBypassEnable(SRPWM0);
36   /* 使能指定模块 */
37   SRPWMCOM_Enable(SRPWM_CHANNEL_0);
38}

可以预见,SRPWM0的A路输出常高电平,B路输出PWM波形.当使能后级保护单元的互斥功能后,B将会输出常低电平.

通道间互斥保护

通过配置通道间SRPWM不同的互斥条件,进行封波保护.

代码分成1部分进行:SRPWM配置,需包含各自驱动的头文件.

  • SRPWM的配置 :

将SRPWM0的A路配置为常高电平,B路配置为PWM波形.

 1static void SRPWM_Config(void)
 2{
 3   SRPWM_TBInitTypeDef stTBInit;
 4   SRPWM_CMPInitTypeDef stCMPInit;
 5   SRPWM_PSTPInitTypeDef stPSTPInit;
 6   SRPWMCOM_MutexInitTypeDef stComMutexInit;
 7   IOC_Init_TypeDef Init;
 8
 9   /* 复位SRPWM0,并开启SRPWM0的时钟 */
10   CRG_PeriphReset(CRG_SRST_SRPWM0);
11   /* IO mux配置 */
12   IOC_ConfigStructInit(&Init);
13   Init.mode = IOC_AF_MODE_1;
14   IOC_Config(IOC_PIN_GPIO0_0, &Init); //pwm0a
15   IOC_Config(IOC_PIN_GPIO0_2, &Init); //pwm1a
16   /* TB初始化 */
17   SRPWM_TBStructInit(&stTBInit);
18   stTBInit.period    = 0xC350;
19   stTBInit.countMode = SRPWM_COUNTMODE_UP;
20   SRPWM_TBInit(SRPWM0, &stTBInit);
21   SRPWM_TBInit(SRPWM1, &stTBInit);
22   /* CMP初始化 */
23   SRPWM_CMPStructInit(&stCMPInit);
24   stCMPInit.cmpA = 0xC350 / 4;
25   SRPWM_CMPInit(SRPWM0, &stCMPInit);
26   SRPWM_CMPInit(SRPWM1, &stCMPInit);
27   /* PG初始化 */
28   SRPWM_SetPG(SRPWM0, SRPWM_PWMA, SRPWM_PG_EVT_ZERO, SRPWM_PG_SET);
29   SRPWM_SetPG(SRPWM0, SRPWM_PWMA, SRPWM_PG_EVT_ZERO, SRPWM_PG_CLEAR);
30   SRPWM_SetPG(SRPWM1, SRPWM_PWMA, SRPWM_PG_EVT_CMPA_UP, SRPWM_PG_SET);
31   SRPWM_SetPG(SRPWM1, SRPWM_PWMA, SRPWM_PG_EVT_ZERO, SRPWM_PG_CLEAR);
32   /* PSTP后级保护功能初始化 */
33   SRPWM_PSTPStructInit(&stPSTPInit);
34   stPSTPInit.mutexEn         = ENABLE;
35   stPSTPInit.b.mutexOutState = SRPWM_PSTP_MUTEX_OUTSTATE_CLEAR;
36   SRPWM_PSTPInit(SRPWM0, &stPSTPInit);
37   /* COM模块互斥初始化 */
38   SRPWMCOM_MutexStructInit(&stComMutexInit);
39   stComMutexInit.mutexResultGroupMask = SRPWM_MUTEX_RESULT_GRP_5;
40   stComMutexInit.mutexSig0 = SRPWMCOM_MUTEX_SIG_SRPWM0_A;
41   stComMutexInit.mutexSig1 = SRPWMCOM_MUTEX_SIG_SRPWM1_A;
42   stComMutexInit.mutexCondition = SRPWMCOM_A_HIGH_B_HIGH;
43   SRPWMCOM_MutexInit(&stComMutexInit);
44   /* 使能高精度旁路 */
45   SRPWM_HRPWMBypassEnable(SRPWM0);
46   /* 使能指定模块 */
47   SRPWMCOM_Enable(SRPWM_CHANNEL_0);
48   /* 使能COM公共管理模块的互斥功能,取消结果标志的屏蔽 */
49   SRPWMCOM_MutexMskDisable(SRPWM_CHANNEL_1, SRPWM_MUTEX_RESULT_GRP_5);
50   SRPWMCOM_MutexEnable(SRPWM_MUTEX_RESULT_GRP_5);
51}

可以预见,SRPWM0和SRPMW1的A路输出PWM波形.当SRPWM COM公共管理模块选择互斥条件送往SRPWM0并使能时,SRPWM0的A路将会输出常低电平.

重要

代码中的SRPWM_MUTEX_RESULT_GRP_5表示的是12组互斥结果中的第5组互斥结果.参考2.2.2.1 通道间的描述.