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
前级保护单元在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>连续取反;当不同保护模式的同一种动作的不同触发事件不同时出现时,保护动作的开始与最早开始的动作事件对齐,保护动作的结束与最晚结束的动作事件对齐.举例:
OS模式和UNRES保护模式同时启动保护
后级保护PSTP
后级保护单元在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 通道间的描述.


