SWM341_pwm.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM341_pwm.c
  3. * 功能说明: SWM341单片机的PWM功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.0.0 2016年1月30日
  7. * 升级记录:
  8. *
  9. *
  10. *******************************************************************************************************************************************
  11. * @attention
  12. *
  13. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
  14. * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
  15. * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  16. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
  17. * -ECTION WITH THEIR PRODUCTS.
  18. *
  19. * COPYRIGHT 2012 Synwit Technology
  20. *******************************************************************************************************************************************/
  21. #include "SWM341.h"
  22. #include "SWM341_pwm.h"
  23. /******************************************************************************************************************************************
  24. * 函数名称: PWM_Init()
  25. * 功能说明: PWM初始化
  26. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  27. * PWM_InitStructure * initStruct 包含PWM相关设定值的结构体
  28. * 输 出: 无
  29. * 注意事项: 无
  30. ******************************************************************************************************************************************/
  31. void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct)
  32. {
  33. SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_PWM_Pos);
  34. PWMx->CR = (initStruct->Mode << PWM_CR_MODE_Pos) |
  35. (1 << PWM_CR_MULT_Pos) | // 多次计数模式(即非单次)
  36. (0 << PWM_CR_DIR_Pos) | // 向上计数
  37. (0 << PWM_CR_CLKSRC_Pos) | // 系统时钟
  38. ((initStruct->Clkdiv - 1) << PWM_CR_CLKDIV_Pos) |
  39. (0 << PWM_CR_RPTNUM_Pos); // 每次计数器溢出都执行寄存器重加载
  40. PWMx->OCR = ((initStruct->IdleLevelA ? 1 : 0) << PWM_OCR_IDLEA_Pos) |
  41. ((initStruct->IdleLevelB ? 1 : 0) << PWM_OCR_IDLEB_Pos) |
  42. ((initStruct->IdleLevelAN ? 1 : 0) << PWM_OCR_IDLEAN_Pos) |
  43. ((initStruct->IdleLevelBN ? 1 : 0) << PWM_OCR_IDLEBN_Pos) |
  44. ((initStruct->OutputInvA ? 1 : 0) << PWM_OCR_INVA_Pos) |
  45. ((initStruct->OutputInvB ? 1 : 0) << PWM_OCR_INVB_Pos) |
  46. ((initStruct->OutputInvAN ? 1 : 0) << PWM_OCR_INVAN_Pos) |
  47. ((initStruct->OutputInvBN ? 1 : 0) << PWM_OCR_INVBN_Pos);
  48. PWMx->PERIOD = initStruct->Period - 1;
  49. PWMx->CMPA = initStruct->HdutyA;
  50. PWMx->CMPA2 = initStruct->HdutyA2;
  51. PWMx->DZA = initStruct->DeadzoneA;
  52. PWMx->CMPB = initStruct->HdutyB;
  53. PWMx->CMPB2 = initStruct->HdutyB2;
  54. PWMx->DZB = initStruct->DeadzoneB;
  55. PWMG->RELOADEN = 0x3F;
  56. PWMx->IF = 0x3F;
  57. PWMx->IE = ((initStruct->UpOvfIE ? 1 : 0) << PWM_IE_UPOVF_Pos) |
  58. ((initStruct->DownOvfIE ? 1 : 0) << PWM_IE_DNOVF_Pos) |
  59. ((initStruct->UpCmpAIE ? 1 : 0) << PWM_IE_UPCMPA_Pos) |
  60. ((initStruct->DownCmpAIE ? 1 : 0) << PWM_IE_DNCMPA_Pos) |
  61. ((initStruct->UpCmpBIE ? 1 : 0) << PWM_IE_UPCMPB_Pos) |
  62. ((initStruct->DownCmpBIE ? 1 : 0) << PWM_IE_DNCMPB_Pos);
  63. if(initStruct->UpOvfIE || initStruct->DownOvfIE || initStruct->UpCmpAIE ||
  64. initStruct->DownCmpAIE || initStruct->UpCmpBIE || initStruct->DownCmpBIE)
  65. {
  66. switch((uint32_t)PWMx)
  67. {
  68. case((uint32_t)PWM0):
  69. NVIC_EnableIRQ(PWM0_IRQn);
  70. break;
  71. case((uint32_t)PWM1):
  72. NVIC_EnableIRQ(PWM1_IRQn);
  73. break;
  74. case((uint32_t)PWM2):
  75. NVIC_EnableIRQ(PWM2_IRQn);
  76. break;
  77. case((uint32_t)PWM3):
  78. NVIC_EnableIRQ(PWM3_IRQn);
  79. break;
  80. case((uint32_t)PWM4):
  81. NVIC_EnableIRQ(PWM4_IRQn);
  82. break;
  83. }
  84. }
  85. }
  86. /******************************************************************************************************************************************
  87. * 函数名称: PWM_Start()
  88. * 功能说明: 启动PWM,开始PWM输出
  89. * 输 入: uint32_t pwm PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
  90. * 输 出: 无
  91. * 注意事项: 无
  92. ******************************************************************************************************************************************/
  93. void PWM_Start(uint32_t pwm)
  94. {
  95. PWMG->START |= pwm;
  96. }
  97. /******************************************************************************************************************************************
  98. * 函数名称: PWM_Stop()
  99. * 功能说明: 关闭PWM,停止PWM输出
  100. * 输 入: uint32_t pwm PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
  101. * 输 出: 无
  102. * 注意事项: 无
  103. ******************************************************************************************************************************************/
  104. void PWM_Stop(uint32_t pwm)
  105. {
  106. PWMG->START &= ~pwm;
  107. }
  108. /******************************************************************************************************************************************
  109. * 函数名称: PWM_Restart()
  110. * 功能说明: 重启PWM,将PWM计数器清零,然后使用新的周期、高电平时长、死区时长设定值开始计数
  111. * 输 入: uint32_t pwm PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
  112. * 输 出: 无
  113. * 注意事项: 无
  114. ******************************************************************************************************************************************/
  115. void PWM_Restart(uint32_t pwm)
  116. {
  117. PWMG->RESTART = (pwm << PWMG_RESTART_PWM0_Pos);
  118. }
  119. /******************************************************************************************************************************************
  120. * 函数名称: PWM_ReloadEn()
  121. * 功能说明: 只有当 Reload Enable 时,写入 PERIOD、CMPA、CMPB、DZA、DZB 等寄存器的值才会(在计数器溢出时)加载到内部工作寄存器
  122. * 输 入: uint32_t pwm PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
  123. * 输 出: 无
  124. * 注意事项: 如果需要保证在写 PERIOD、CMPA、CMPB、DZA、DZB 等寄存器过程中,这些寄存器的值不会被加载到内部工作寄存器,可以如下操作:
  125. * 第一步、PWM_ReloadDis(PWM0_MSK | PWM1_MSK);
  126. * 第二步、写 PERIOD、CMPA、CMPB、DZA、DZB 等寄存器
  127. * 第三步、PWM_ReloadEn(PWM0_MSK | PWM1_MSK);
  128. ******************************************************************************************************************************************/
  129. void PWM_ReloadEn(uint32_t pwm)
  130. {
  131. PWMG->RELOADEN |= pwm;
  132. }
  133. /******************************************************************************************************************************************
  134. * 函数名称: PWM_ReloadDis()
  135. * 功能说明: 只有当 Reload Enable 时,写入 PERIOD、CMPA、CMPB、DZA、DZB 等寄存器的值才会(在计数器溢出时)加载到内部工作寄存器
  136. * 输 入: uint32_t pwm PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
  137. * 输 出: 无
  138. * 注意事项: 无
  139. ******************************************************************************************************************************************/
  140. void PWM_ReloadDis(uint32_t pwm)
  141. {
  142. PWMG->RELOADEN &= ~pwm;
  143. }
  144. /******************************************************************************************************************************************
  145. * 函数名称: PWM_BrkInPolarity()
  146. * 功能说明: 设置刹车输入有效极性
  147. * 输 入: uint32_t brk PWM_BRK0、PWM_BRK1、PWM_BRK2 及其“或”
  148. * uint32_t level 0 低电平刹车 1 高电平刹车
  149. * 输 出: 无
  150. * 注意事项: 无
  151. ******************************************************************************************************************************************/
  152. void PWM_BrkInPolarity(uint32_t brk, uint32_t level)
  153. {
  154. if(level)
  155. PWMG->BRKPOL |= brk;
  156. else
  157. PWMG->BRKPOL &= ~brk;
  158. }
  159. /******************************************************************************************************************************************
  160. * 函数名称: PWM_BrkConfig()
  161. * 功能说明: 刹车配置
  162. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  163. * uint32_t chn 指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
  164. * uint32_t brk 刹车输入,PWM_BRK0、PWM_BRK1、PWM_BRK2 及其“或”
  165. * uint32_t out 刹车过程中PWMxA/PWMxB输出电平
  166. * uint32_t outN 刹车过程中PWMxAN/PWMxBN输出电平
  167. * uint32_t outHold 刹车信号撤销后,0 输出立即恢复 1 输出保持到计数器溢出再恢复
  168. * uint32_t stpCount 刹车状态下是否停止计数,1 停止计数
  169. * 输 出: 无
  170. * 注意事项: 无
  171. ******************************************************************************************************************************************/
  172. void PWM_BrkConfig(PWM_TypeDef * PWMx, uint32_t chn, uint32_t brk, uint32_t out, uint32_t outN, uint32_t outHold, uint32_t stpCount)
  173. {
  174. if(chn == PWM_CH_A)
  175. {
  176. PWMx->BRKIN &= ~(0x7 << PWM_BRKIN_BRK0A_Pos);
  177. PWMx->BRKIN |= (brk << PWM_BRKIN_BRK0A_Pos);
  178. PWMx->BRKCR &= ~(PWM_BRKCR_OUTA_Msk | PWM_BRKCR_OUTAN_Msk | PWM_BRKCR_OFFA_Msk);
  179. PWMx->BRKCR |= (out << PWM_BRKCR_OUTA_Pos) |
  180. (outN << PWM_BRKCR_OUTAN_Pos) |
  181. (outHold << PWM_BRKCR_OFFA_Pos) |
  182. (stpCount << PWM_BRKCR_STPCNT_Pos);
  183. }
  184. else
  185. {
  186. PWMx->BRKIN &= ~(0x7 << PWM_BRKIN_BRK0B_Pos);
  187. PWMx->BRKIN |= (brk << PWM_BRKIN_BRK0B_Pos);
  188. PWMx->BRKCR &= ~(PWM_BRKCR_OUTB_Msk | PWM_BRKCR_OUTBN_Msk | PWM_BRKCR_OFFB_Msk);
  189. PWMx->BRKCR |= (out << PWM_BRKCR_OUTB_Pos) |
  190. (outN << PWM_BRKCR_OUTBN_Pos) |
  191. (outHold << PWM_BRKCR_OFFB_Pos) |
  192. (stpCount << PWM_BRKCR_STPCNT_Pos);
  193. }
  194. }
  195. /******************************************************************************************************************************************
  196. * 函数名称: PWM_OvfTrigger()
  197. * 功能说明: 计数器溢出时发出触发信号配置
  198. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  199. * uint32_t en_up 向上计数时,计数器溢出是否发出触发信号
  200. * uint32_t en_down 向下计数时,计数器溢出是否发出触发信号
  201. * uint32_t trig_chn 触发信号有8个通道,选择此触发信号输出到哪个通道,取值PWM_TRG_0、PWM_TRG_1、...、PWM_TRG_7
  202. * 输 出: 无
  203. * 注意事项: 无
  204. ******************************************************************************************************************************************/
  205. void PWM_OvfTrigger(PWM_TypeDef * PWMx, uint32_t en_up, uint32_t en_down, uint32_t trig_chn)
  206. {
  207. PWMx->OVFTRG = (en_up << PWM_OVFTRG_UPEN_Pos) |
  208. (en_down << PWM_OVFTRG_DNEN_Pos) |
  209. (trig_chn << PWM_OVFTRG_MUX_Pos);
  210. }
  211. /******************************************************************************************************************************************
  212. * 函数名称: PWM_CmpTrigger()
  213. * 功能说明: 计数器等于指定数值时发出触发信号配置
  214. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  215. * uint16_t match 计数值等于match时发出触发信号
  216. * uint32_t dir PWM_DIR_UP 向上计数时计数器与match值比较 PWM_DIR_DOWN 向下计数时计数器与match值比较
  217. * uint32_t width 发出的触发信号的宽度,0 无输出 1 4个时钟周期 2 8个时钟周期 ... 63 252个时钟周期
  218. * uint32_t trig_chn 触发信号有8个通道,选择此触发信号输出到哪个通道,,取值PWM_TRG_0、PWM_TRG_1、...、PWM_TRG_7
  219. * uint32_t adc_trig_pos 在发出指定宽度触发信号的同时,还会在该触发信号宽度的 adc_trig_pos/8 位置处发出adc触发信号,取值0--7
  220. * 输 出: 无
  221. * 注意事项: 无
  222. ******************************************************************************************************************************************/
  223. void PWM_CmpTrigger(PWM_TypeDef * PWMx, uint16_t match, uint32_t dir, uint32_t width, uint32_t trig_chn, uint32_t adc_trig_pos)
  224. {
  225. PWMx->CMPTRG = (1 << PWM_CMPTRG_EN_Pos) |
  226. (match << PWM_CMPTRG_CMP_Pos) |
  227. (dir << PWM_CMPTRG_DIR_Pos) |
  228. (width << PWM_CMPTRG_WIDTH_Pos) |
  229. (trig_chn << PWM_CMPTRG_MUX_Pos);
  230. PWM0->CMPTRG &= ~PWM_CMPTRG_ATP_Msk;
  231. PWM0->CMPTRG |= (adc_trig_pos << PWM_CMPTRG_ATP_Pos);
  232. }
  233. /******************************************************************************************************************************************
  234. * 函数名称: PWM_OutMask()
  235. * 功能说明: 输出屏蔽,当指定输入信号为高时,PWM输出固定电平
  236. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  237. * uint32_t chn 指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
  238. * uint32_t evt PWMxY 由哪路 event 输入信号屏蔽,取值PWM_EVT_DIS、PWM_EVT_0、PWM_EVT_1、...、PWM_EVT_6
  239. * uint32_t out PWMxY 输出被屏蔽时输出什么电平
  240. * uint32_t evt_n PWMxYN由哪路 event 输入信号屏蔽,取值PWM_EVT_DIS、PWM_EVT_0、PWM_EVT_1、...、PWM_EVT_6
  241. * uint32_t out_n PWMxYN输出被屏蔽时输出什么电平
  242. * 输 出: 无
  243. * 注意事项: 无
  244. ******************************************************************************************************************************************/
  245. void PWM_OutMask(PWM_TypeDef * PWMx, uint32_t chn, uint32_t evt, uint32_t out, uint32_t evt_n, uint32_t out_n)
  246. {
  247. if(chn == PWM_CH_A)
  248. {
  249. PWMx->EVMUX &= ~(PWM_EVMUX_MASKA_Msk | PWM_EVMUX_MASKAN_Msk);
  250. PWMx->EVMUX |= (evt << PWM_EVMUX_MASKA_Pos) |
  251. (evt_n << PWM_EVMUX_MASKAN_Pos);
  252. PWMx->EVMSK &= ~(PWM_EVMSK_OUTA_Msk | PWM_EVMSK_OUTAN_Msk);
  253. PWMx->EVMSK |= (out << PWM_EVMSK_OUTA_Pos) |
  254. (out_n << PWM_EVMSK_OUTAN_Pos) |
  255. (1 << PWM_EVMSK_IMME_Pos);
  256. }
  257. else
  258. {
  259. PWMx->EVMUX &= ~(PWM_EVMUX_MASKB_Msk | PWM_EVMUX_MASKBN_Msk);
  260. PWMx->EVMUX |= (evt << PWM_EVMUX_MASKB_Pos) |
  261. (evt_n << PWM_EVMUX_MASKBN_Pos);
  262. PWMx->EVMSK &= ~(PWM_EVMSK_OUTB_Msk | PWM_EVMSK_OUTBN_Msk);
  263. PWMx->EVMSK |= (out << PWM_EVMSK_OUTB_Pos) |
  264. (out_n << PWM_EVMSK_OUTBN_Pos) |
  265. (1 << PWM_EVMSK_IMME_Pos);
  266. }
  267. }
  268. /******************************************************************************************************************************************
  269. * 函数名称: PWM_SetPeriod()
  270. * 功能说明: 设置周期
  271. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  272. * uint16_t period 要设定的周期值
  273. * 输 出: 无
  274. * 注意事项: 无
  275. ******************************************************************************************************************************************/
  276. void PWM_SetPeriod(PWM_TypeDef * PWMx, uint16_t period)
  277. {
  278. PWMx->PERIOD = period - 1;
  279. }
  280. /******************************************************************************************************************************************
  281. * 函数名称: PWM_GetPeriod()
  282. * 功能说明: 获取周期
  283. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  284. * 输 出: uint16_t 获取到的周期值
  285. * 注意事项: 无
  286. ******************************************************************************************************************************************/
  287. uint16_t PWM_GetPeriod(PWM_TypeDef * PWMx)
  288. {
  289. return PWMx->PERIOD + 1;
  290. }
  291. /******************************************************************************************************************************************
  292. * 函数名称: PWM_SetHDuty()
  293. * 功能说明: 设置高电平时长
  294. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  295. * uint32_t chn 指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
  296. * uint16_t hduty 要设定的高电平时长
  297. * 输 出: 无
  298. * 注意事项: 无
  299. ******************************************************************************************************************************************/
  300. void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty)
  301. {
  302. if(chn == PWM_CH_A)
  303. PWMx->CMPA = hduty;
  304. else
  305. PWMx->CMPB = hduty;
  306. }
  307. /******************************************************************************************************************************************
  308. * 函数名称: PWM_GetHDuty()
  309. * 功能说明: 获取高电平时长
  310. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  311. * uint32_t chn 指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
  312. * 输 出: uint16_t 获取到的高电平时长
  313. * 注意事项: 无
  314. ******************************************************************************************************************************************/
  315. uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn)
  316. {
  317. if(chn == PWM_CH_A)
  318. return PWMx->CMPA;
  319. else
  320. return PWMx->CMPB;
  321. }
  322. /******************************************************************************************************************************************
  323. * 函数名称: PWM_SetHDuty2()
  324. * 功能说明: 设置高电平时长,用于非对称中心对齐模式
  325. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  326. * uint32_t chn 指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
  327. * uint16_t hduty 要设定的前半周期高电平时长
  328. * uint16_t hduty2 要设定的后半周期高电平时长
  329. * 输 出: 无
  330. * 注意事项: 无
  331. ******************************************************************************************************************************************/
  332. void PWM_SetHDuty2(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty, uint16_t hduty2)
  333. {
  334. if(chn == PWM_CH_A)
  335. {
  336. PWMx->CMPA = hduty;
  337. PWMx->CMPA2 = hduty2;
  338. }
  339. else
  340. {
  341. PWMx->CMPB = hduty;
  342. PWMx->CMPB2 = hduty2;
  343. }
  344. }
  345. /******************************************************************************************************************************************
  346. * 函数名称: PWM_GetHDuty2()
  347. * 功能说明: 获取高电平时长,用于非对称中心对齐模式
  348. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  349. * uint32_t chn 指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
  350. * 输 出: uint16_t *hduty 获取到的前半周期高电平时长
  351. * uint16_t *hduty2 获取到的后半周期高电平时长
  352. * 注意事项: 无
  353. ******************************************************************************************************************************************/
  354. void PWM_GetHDuty2(PWM_TypeDef * PWMx, uint32_t chn, uint16_t *hduty, uint16_t *hduty2)
  355. {
  356. if(chn == PWM_CH_A)
  357. {
  358. *hduty = PWMx->CMPA;
  359. *hduty2 = PWMx->CMPA2;
  360. }
  361. else
  362. {
  363. *hduty = PWMx->CMPB;
  364. *hduty2 = PWMx->CMPB2;
  365. }
  366. }
  367. /******************************************************************************************************************************************
  368. * 函数名称: PWM_SetDeadzone()
  369. * 功能说明: 设置死区时长
  370. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  371. * uint32_t chn 指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
  372. * uint16_t deadzone 要设定的死区时长,取值范围0--1023
  373. * 输 出: 无
  374. * 注意事项: 无
  375. ******************************************************************************************************************************************/
  376. void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint16_t deadzone)
  377. {
  378. if(chn == PWM_CH_A)
  379. PWMx->DZA = deadzone;
  380. else
  381. PWMx->DZB = deadzone;
  382. }
  383. /******************************************************************************************************************************************
  384. * 函数名称: PWM_GetDeadzone()
  385. * 功能说明: 获取死区时长
  386. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  387. * uint32_t chn 指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
  388. * 输 出: uint16_t 获取到的死区时长
  389. * 注意事项: 无
  390. ******************************************************************************************************************************************/
  391. uint16_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn)
  392. {
  393. if(chn == PWM_CH_A)
  394. return PWMx->DZA;
  395. else
  396. return PWMx->DZB;
  397. }
  398. /******************************************************************************************************************************************
  399. * 函数名称: PWM_IntEn()
  400. * 功能说明: 中断使能
  401. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  402. * uint32_t it interrupt type,有效值包括PWM_IT_OVF_UP、PWM_IT_OVF_DOWN、PWM_IT_CMPA_UP、PWM_IT_CMPB_UP、
  403. * PWM_IT_CMPA_DOWN、PWM_IT_CMPB_DOWN 及其“或”
  404. * 输 出: 无
  405. * 注意事项: 无
  406. ******************************************************************************************************************************************/
  407. void PWM_IntEn(PWM_TypeDef * PWMx, uint32_t it)
  408. {
  409. PWMx->IE |= it;
  410. }
  411. /******************************************************************************************************************************************
  412. * 函数名称: PWM_IntDis()
  413. * 功能说明: 中断禁能
  414. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  415. * uint32_t it interrupt type,有效值包括PWM_IT_OVF_UP、PWM_IT_OVF_DOWN、PWM_IT_CMPA_UP、PWM_IT_CMPB_UP、
  416. * PWM_IT_CMPA_DOWN、PWM_IT_CMPB_DOWN 及其“或”
  417. * 输 出: 无
  418. * 注意事项: 无
  419. ******************************************************************************************************************************************/
  420. void PWM_IntDis(PWM_TypeDef * PWMx, uint32_t it)
  421. {
  422. PWMx->IE &= ~it;
  423. }
  424. /******************************************************************************************************************************************
  425. * 函数名称: PWM_IntClr()
  426. * 功能说明:中断标志清除
  427. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  428. * uint32_t it interrupt type,有效值包括PWM_IT_OVF_UP、PWM_IT_OVF_DOWN、PWM_IT_CMPA_UP、PWM_IT_CMPB_UP、
  429. * PWM_IT_CMPA_DOWN、PWM_IT_CMPB_DOWN 及其“或”
  430. * 输 出: 无
  431. * 注意事项: 无
  432. ******************************************************************************************************************************************/
  433. void PWM_IntClr(PWM_TypeDef * PWMx, uint32_t it)
  434. {
  435. PWMx->IF = it;
  436. }
  437. /******************************************************************************************************************************************
  438. * 函数名称: PWM_IntStat()
  439. * 功能说明: 中断标志查询
  440. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
  441. * uint32_t it interrupt type,有效值包括PWM_IT_OVF_UP、PWM_IT_OVF_DOWN、PWM_IT_CMPA_UP、PWM_IT_CMPB_UP、
  442. * PWM_IT_CMPA_DOWN、PWM_IT_CMPB_DOWN 及其“或”
  443. * 输 出: uint32_t 0 中断标志未置起 非0 中断标志已置起
  444. * 注意事项: 无
  445. ******************************************************************************************************************************************/
  446. uint32_t PWM_IntStat(PWM_TypeDef * PWMx, uint32_t it)
  447. {
  448. return (PWMx->IF & it);
  449. }
  450. /******************************************************************************************************************************************
  451. * 函数名称: PWM_BrkIntEn()
  452. * 功能说明: 刹车中断使能
  453. * 输 入: uint32_t brkit brake interrupt type,有效值包括 PWM_BRKIT_BRK0、PWM_BRKIT_BRK0、PWM_BRKIT_BRK0 及其“或”
  454. * 输 出: 无
  455. * 注意事项: 无
  456. ******************************************************************************************************************************************/
  457. void PWM_BrkIntEn(uint32_t brkit)
  458. {
  459. PWMG->BRKIE |= brkit;
  460. }
  461. /******************************************************************************************************************************************
  462. * 函数名称: PWM_BrkIntDis()
  463. * 功能说明: 刹车中断禁能
  464. * 输 入: uint32_t brkit brake interrupt type,有效值包括 PWM_BRKIT_BRK0、PWM_BRKIT_BRK0、PWM_BRKIT_BRK0 及其“或”
  465. * 输 出: 无
  466. * 注意事项: 无
  467. ******************************************************************************************************************************************/
  468. void PWM_BrkIntDis(uint32_t brkit)
  469. {
  470. PWMG->BRKIE &= ~brkit;
  471. }
  472. /******************************************************************************************************************************************
  473. * 函数名称: PWM_BrkIntClr()
  474. * 功能说明:中断标志清除
  475. * 输 入: uint32_t brkit brake interrupt type,有效值包括 PWM_BRKIT_BRK0、PWM_BRKIT_BRK0、PWM_BRKIT_BRK0 及其“或”
  476. * 输 出: 无
  477. * 注意事项: 无
  478. ******************************************************************************************************************************************/
  479. void PWM_BrkIntClr(uint32_t brkit)
  480. {
  481. PWMG->BRKIF = brkit;
  482. }
  483. /******************************************************************************************************************************************
  484. * 函数名称: PWM_BrkIntStat()
  485. * 功能说明: 刹车中断标志查询
  486. * 输 入: uint32_t brkit brake interrupt type,有效值包括 PWM_BRKIT_BRK0、PWM_BRKIT_BRK0、PWM_BRKIT_BRK0 及其“或”
  487. * 输 出: uint32_t 0 中断标志未置起 非0 中断标志已置起
  488. * 注意事项: 无
  489. ******************************************************************************************************************************************/
  490. uint32_t PWM_BrkIntStat(uint32_t brkit)
  491. {
  492. return (PWMG->BRKIF & brkit);
  493. }