123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744 |
- /******************************************************************************************************************************************
- * 文件名称: SWM320_pwm.c
- * 功能说明: SWM320单片机的PWM功能驱动库
- * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
- * 注意事项:
- * 版本日期: V1.1.0 2017年10月25日
- * 升级记录:
- *
- *
- *******************************************************************************************************************************************
- * @attention
- *
- * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
- * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
- * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
- * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
- * -ECTION WITH THEIR PRODUCTS.
- *
- * COPYRIGHT 2012 Synwit Technology
- *******************************************************************************************************************************************/
- #include "SWM320.h"
- #include "SWM320_pwm.h"
- /******************************************************************************************************************************************
- * 函数名称: PWM_Init()
- * 功能说明: PWM初始化
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * PWM_InitStructure * initStruct 包含PWM相关设定值的结构体
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct)
- {
- uint32_t bit_offset = 0;
- SYS->CLKEN |= (0x01 << SYS_CLKEN_PWM_Pos);
- SYS->CLKDIV &= ~SYS_CLKDIV_PWM_Msk;
- SYS->CLKDIV |= (initStruct->clk_div << SYS_CLKDIV_PWM_Pos);
- PWM_Stop(PWMx, 1, 1); //一些关键寄存器只能在PWM停止时设置
- PWMx->MODE = initStruct->mode;
- PWMx->PERA = initStruct->cycleA;
- PWMx->HIGHA = initStruct->hdutyA;
- PWMx->DZA = initStruct->deadzoneA;
- PWMx->PERB = initStruct->cycleB;
- PWMx->HIGHB = initStruct->hdutyB;
- PWMx->DZB = initStruct->deadzoneB;
- PWMx->INIOUT &= ~(PWM_INIOUT_PWMA_Msk | PWM_INIOUT_PWMB_Msk);
- PWMx->INIOUT |= (initStruct->initLevelA << PWM_INIOUT_PWMA_Pos) |
- (initStruct->initLevelB << PWM_INIOUT_PWMB_Pos);
- PWMG->IM = 0x00000000;
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- bit_offset = 0;
- break;
- case ((uint32_t)PWM1):
- bit_offset = 2;
- break;
- case ((uint32_t)PWM2):
- bit_offset = 4;
- break;
- case ((uint32_t)PWM3):
- bit_offset = 6;
- break;
- case ((uint32_t)PWM4):
- bit_offset = 8;
- break;
- case ((uint32_t)PWM5):
- bit_offset = 10;
- break;
- }
- PWMG->IRS = ((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))); //清除中断标志
- PWMG->IE &= ~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13)));
- PWMG->IE |= (initStruct->NCycleAIEn << bit_offset) | (initStruct->NCycleBIEn << (bit_offset + 1)) |
- (initStruct->HEndAIEn << (bit_offset + 12)) | (initStruct->HEndBIEn << (bit_offset + 13));
- if (initStruct->NCycleAIEn | initStruct->NCycleBIEn | initStruct->HEndAIEn | initStruct->HEndBIEn)
- {
- NVIC_EnableIRQ(PWM_IRQn);
- }
- else if ((PWMG->IE & (~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))))) == 0)
- {
- NVIC_DisableIRQ(PWM_IRQn);
- }
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_Start()
- * 功能说明: 启动PWM,开始PWM输出
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chA 0 通道A不启动 1 通道A启动
- * uint32_t chB 0 通道B不启动 1 通道B启动
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
- {
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos);
- break;
- case ((uint32_t)PWM1):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos);
- break;
- case ((uint32_t)PWM2):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos);
- break;
- case ((uint32_t)PWM3):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos);
- break;
- case ((uint32_t)PWM4):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos);
- break;
- case ((uint32_t)PWM5):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos);
- break;
- }
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_Stop()
- * 功能说明: 关闭PWM,停止PWM输出
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chA 0 通道A不关闭 1 通道A关闭
- * uint32_t chB 0 通道B不关闭 1 通道B关闭
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
- {
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos));
- break;
- case ((uint32_t)PWM1):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos));
- break;
- case ((uint32_t)PWM2):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos));
- break;
- case ((uint32_t)PWM3):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos));
- break;
- case ((uint32_t)PWM4):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos));
- break;
- case ((uint32_t)PWM5):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos));
- break;
- }
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_SetCycle()
- * 功能说明: 设置周期
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * uint16_t cycle 要设定的周期值
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle)
- {
- if (chn == PWM_CH_A)
- PWMx->PERA = cycle;
- else if (chn == PWM_CH_B)
- PWMx->PERB = cycle;
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_GetCycle()
- * 功能说明: 获取周期
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: uint16_t 获取到的周期值
- * 注意事项: 无
- ******************************************************************************************************************************************/
- uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
- {
- uint16_t cycle = 0;
- if (chn == PWM_CH_A)
- cycle = PWMx->PERA;
- else if (chn == PWM_CH_B)
- cycle = PWMx->PERB;
- return cycle;
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_SetHDuty()
- * 功能说明: 设置高电平时长
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * uint16_t hduty 要设定的高电平时长
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty)
- {
- if (chn == PWM_CH_A)
- PWMx->HIGHA = hduty;
- else if (chn == PWM_CH_B)
- PWMx->HIGHB = hduty;
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_GetHDuty()
- * 功能说明: 获取高电平时长
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: uint16_t 获取到的高电平时长
- * 注意事项: 无
- ******************************************************************************************************************************************/
- uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
- {
- uint16_t hduty = 0;
- if (chn == PWM_CH_A)
- hduty = PWMx->HIGHA;
- else if (chn == PWM_CH_B)
- hduty = PWMx->HIGHB;
- return hduty;
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_SetDeadzone()
- * 功能说明: 设置死区时长
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * uint8_t deadzone 要设定的死区时长
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone)
- {
- if (chn == PWM_CH_A)
- PWMx->DZA = deadzone;
- else if (chn == PWM_CH_B)
- PWMx->DZB = deadzone;
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_GetDeadzone()
- * 功能说明: 获取死区时长
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: uint8_t 获取到的死区时长
- * 注意事项: 无
- ******************************************************************************************************************************************/
- uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
- {
- uint8_t deadzone = 0;
- if (chn == PWM_CH_A)
- deadzone = PWMx->DZA;
- else if (chn == PWM_CH_B)
- deadzone = PWMx->DZB;
- return deadzone;
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_IntNCycleEn()
- * 功能说明: 新周期开始中断使能
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn)
- {
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
- break;
- case ((uint32_t)PWM1):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
- break;
- case ((uint32_t)PWM2):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
- break;
- case ((uint32_t)PWM3):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
- break;
- case ((uint32_t)PWM4):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
- break;
- case ((uint32_t)PWM5):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
- break;
- }
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_IntNCycleDis()
- * 功能说明: 新周期开始中断禁能
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn)
- {
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
- break;
- case ((uint32_t)PWM1):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
- break;
- case ((uint32_t)PWM2):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
- break;
- case ((uint32_t)PWM3):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
- break;
- case ((uint32_t)PWM4):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
- break;
- case ((uint32_t)PWM5):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
- break;
- }
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_IntNCycleClr()
- * 功能说明: 新周期开始中断标志清除
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn)
- {
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
- break;
- case ((uint32_t)PWM1):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
- break;
- case ((uint32_t)PWM2):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
- break;
- case ((uint32_t)PWM3):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
- break;
- case ((uint32_t)PWM4):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
- break;
- case ((uint32_t)PWM5):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
- break;
- }
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_IntNCycleStat()
- * 功能说明: 新周期开始中断是否发生
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: uint32_t 1 新周期开始中断已发生 0 新周期开始中断未发生
- * 注意事项: 无
- ******************************************************************************************************************************************/
- uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
- {
- uint32_t int_stat = 0;
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
- break;
- case ((uint32_t)PWM1):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
- break;
- case ((uint32_t)PWM2):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
- break;
- case ((uint32_t)PWM3):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
- break;
- case ((uint32_t)PWM4):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
- break;
- case ((uint32_t)PWM5):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
- break;
- }
- return int_stat;
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_IntHEndEn()
- * 功能说明: 高电平结束中断使能
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn)
- {
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
- break;
- case ((uint32_t)PWM1):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
- break;
- case ((uint32_t)PWM2):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
- break;
- case ((uint32_t)PWM3):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
- break;
- case ((uint32_t)PWM4):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
- break;
- case ((uint32_t)PWM5):
- if (chn == PWM_CH_A)
- PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
- else
- PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
- break;
- }
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_IntHEndDis()
- * 功能说明: 高电平结束中断禁能
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_IntHEndDis(PWM_TypeDef *PWMx, uint32_t chn)
- {
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
- break;
- case ((uint32_t)PWM1):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
- break;
- case ((uint32_t)PWM2):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
- break;
- case ((uint32_t)PWM3):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
- break;
- case ((uint32_t)PWM4):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
- break;
- case ((uint32_t)PWM5):
- if (chn == PWM_CH_A)
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
- else
- PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
- break;
- }
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_IntHEndClr()
- * 功能说明: 高电平结束中断标志清除
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: 无
- * 注意事项: 无
- ******************************************************************************************************************************************/
- void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn)
- {
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
- break;
- case ((uint32_t)PWM1):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
- break;
- case ((uint32_t)PWM2):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
- break;
- case ((uint32_t)PWM3):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
- break;
- case ((uint32_t)PWM4):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
- break;
- case ((uint32_t)PWM5):
- if (chn == PWM_CH_A)
- PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
- else
- PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
- break;
- }
- }
- /******************************************************************************************************************************************
- * 函数名称: PWM_IntHEndStat()
- * 功能说明: 高电平结束中断是否发生
- * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
- * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
- * 输 出: uint32_t 1 高电平结束中断已发生 0 高电平结束中断未发生
- * 注意事项: 无
- ******************************************************************************************************************************************/
- uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn)
- {
- uint32_t int_stat = 0;
- switch ((uint32_t)PWMx)
- {
- case ((uint32_t)PWM0):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
- break;
- case ((uint32_t)PWM1):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
- break;
- case ((uint32_t)PWM2):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
- break;
- case ((uint32_t)PWM3):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
- break;
- case ((uint32_t)PWM4):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
- break;
- case ((uint32_t)PWM5):
- if (chn == PWM_CH_A)
- int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
- else
- int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
- break;
- }
- return int_stat;
- }
|