[DemoCode下载] M0518 PWM输出随捕获信号变化的例子

[复制链接]
2887|11
 楼主| Nu_Micro 发表于 2014-12-3 15:54 | 显示全部楼层 |阅读模式
PWM0.0(PA12), PWM0.1(PA13)作为输出
  PWM1.0(PA2),PWM1.1(PA3)一组 , PWM1.2(PA10),PWM1.3(PA11)一组  ,作为捕获输入
  输出随捕获信号联动 M0518BSP_CMSIS_v3.00.001.rar (337.87 KB, 下载次数: 107)


gaoyang9992006 发表于 2014-12-3 15:59 | 显示全部楼层
收了,多看,多想,多练习,早日成为新唐MCU应用高手。
mintspring 发表于 2014-12-3 21:01 | 显示全部楼层
例子不错,大家都用官方库函数解决,通读性就很强了,移植能力大大提高。
mintspring 发表于 2014-12-7 19:06 来自手机 | 显示全部楼层
gaoyang9992006 发表于 2014-12-3 15:59
收了,多看,多想,多练习,早日成为新唐MCU应用高手。

你说的太对了,现在就是没心情看下去
tcy65 发表于 2017-2-11 21:58 | 显示全部楼层
多谢楼主分享,刚接触m051,谢谢!
734774645 发表于 2017-2-12 11:02 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 5 $
  5. * $Date: 14/06/30 4:51p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to use PWM0 Channel 0 to capture the PWM1 Channel 0 waveform.
  7. * @note
  8. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  9. *
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "M0518.h"

  13. /*---------------------------------------------------------------------------------------------------------*/
  14. /* Macro, type and constant definitions                                                                    */
  15. /*---------------------------------------------------------------------------------------------------------*/

  16. #define PLLCON_SETTING      CLK_PLLCON_50MHz_HXT
  17. #define PLL_CLOCK           50000000

  18. /*---------------------------------------------------------------------------------------------------------*/
  19. /* Global variables                                                                                        */
  20. /*---------------------------------------------------------------------------------------------------------*/

  21. /**
  22. * @brief       PWM0 IRQ Handler
  23. *
  24. * @param       None
  25. *
  26. * [url=home.php?mod=space&uid=266161]@return[/url]      None
  27. *
  28. * [url=home.php?mod=space&uid=1543424]@Details[/url]     ISR to handle PWM0 interrupt event
  29. */

  30. void PWM1_IRQHandler(void)
  31. {
  32.         uint32_t        FlagTemp;
  33.         uint16_t        DutyTemp,PeriodTemp,DutyTemp1,PeriodTemp1;
  34.         FlagTemp=PWM1->INTSTS0;
  35.         PWM1->INTSTS0=FlagTemp;        //clear all no usefull flag

  36.        
  37.         if(PWM_GetCaptureIntFlag(PWM1, 0) & 2)
  38.         {
  39.                 PWM_ClearCaptureIntFlag(PWM1, 0, PWM_CAPTURE_INT_FALLING_LATCH);               
  40.                 DutyTemp=PWM_GET_CAPTURE_FALLING_DATA(PWM1, 0);                //change PWM0 channel 0 duty
  41.                 PWM0->CMPDAT0=0x10000-DutyTemp;
  42.         }
  43.         if(PWM_GetCaptureIntFlag(PWM1, 0) & 1)
  44.         {
  45.                 PWM_ClearCaptureIntFlag(PWM1, 0, PWM_CAPTURE_INT_RISING_LATCH);               
  46. //                PeriodTemp=PWM_GET_CAPTURE_RISING_DATA(PWM1,0);
  47. //                PWM0->PERIOD0=0x10000-PeriodTemp;
  48.         }

  49.         if(PWM_GetCaptureIntFlag(PWM1, 1) & 2)
  50.         {
  51.                 PWM_ClearCaptureIntFlag(PWM1, 1, PWM_CAPTURE_INT_FALLING_LATCH);               
  52.                 DutyTemp1=PWM_GET_CAPTURE_FALLING_DATA(PWM1, 1);                //change PWM0 channel 1 duty
  53.                 PWM0->CMPDAT1=0x10000-DutyTemp1;
  54.         }
  55.         if(PWM_GetCaptureIntFlag(PWM1, 1) & 1)
  56.         {
  57.                 PWM_ClearCaptureIntFlag(PWM1, 1, PWM_CAPTURE_INT_RISING_LATCH);               
  58.         }
  59. //--------------------------------------------------------------------------------
  60.         if(PWM_GetCaptureIntFlag(PWM1, 2) & 2)
  61.         {
  62.                 PWM_ClearCaptureIntFlag(PWM1, 2, PWM_CAPTURE_INT_FALLING_LATCH);               
  63.                 DutyTemp=PWM_GET_CAPTURE_FALLING_DATA(PWM1, 2);
  64.                 PWM0->CMPDAT0=0x10000-DutyTemp;
  65.         }
  66.         if(PWM_GetCaptureIntFlag(PWM1, 2) & 1)
  67.         {
  68.                 PWM_ClearCaptureIntFlag(PWM1, 2, PWM_CAPTURE_INT_RISING_LATCH);               
  69. //                PeriodTemp=PWM_GET_CAPTURE_RISING_DATA(PWM1,2);
  70. //                PWM0->PERIOD0=0x10000-PeriodTemp;
  71.         }

  72.         if(PWM_GetCaptureIntFlag(PWM1, 3) & 2)
  73.         {
  74.                 PWM_ClearCaptureIntFlag(PWM1, 3, PWM_CAPTURE_INT_FALLING_LATCH);               
  75.                 DutyTemp1=PWM_GET_CAPTURE_FALLING_DATA(PWM1, 3);
  76.                 PWM0->CMPDAT1=0x10000-DutyTemp1;
  77.         }
  78.         if(PWM_GetCaptureIntFlag(PWM1, 3) & 1)
  79.         {
  80.                 PWM_ClearCaptureIntFlag(PWM1, 3, PWM_CAPTURE_INT_RISING_LATCH);               
  81.         }
  82.         FlagTemp=PWM1->CAPIF;                //clear all useless flag for safe
  83.         PWM1->CAPIF=FlagTemp;
  84.                
  85. }


  86. void SYS_Init(void)
  87. {
  88.     /*---------------------------------------------------------------------------------------------------------*/
  89.     /* Init System Clock                                                                                       */
  90.     /*---------------------------------------------------------------------------------------------------------*/

  91.     /* Enable Internal RC clock */
  92.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  93.     /* Waiting for IRC22M clock ready */
  94.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  95.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  96.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  97.     /* Enable external 12MHz XTAL, internal 22.1184MHz */
  98.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC22M_EN_Msk);

  99.     /* Enable PLL and Set PLL frequency */
  100.     CLK_SetCoreClock(PLL_CLOCK);

  101.     /* Enable UART module clock */
  102.     CLK_EnableModuleClock(UART0_MODULE);

  103.     /* Enable PWM module clock */
  104.     CLK_EnableModuleClock(PWM0_MODULE);
  105.     CLK_EnableModuleClock(PWM1_MODULE);

  106.     /* Select UART module clock source */
  107.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  108.     /* Select PWM module clock source */
  109.     CLK_SetModuleClock(PWM0_MODULE, CLK_CLKSEL3_PWM0_S_PLL, 0);
  110.     CLK_SetModuleClock(PWM1_MODULE, CLK_CLKSEL3_PWM1_S_PLL, 0);
  111. //        CLK->CLKSEL3=0;
  112.     /* Reset PWM0 and PWM1 */
  113.     SYS_ResetModule(PWM0_RST);
  114.     SYS_ResetModule(PWM1_RST);

  115.     /* Update System Core Clock */
  116.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  117.     //SystemCoreClockUpdate();
  118.     PllClock        = PLL_CLOCK;            // PLL
  119.     SystemCoreClock = PLL_CLOCK / 1;        // HCLK
  120.     CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

  121.     /*---------------------------------------------------------------------------------------------------------*/
  122.     /* Init I/O Multi-function                                                                                 */
  123.     /*---------------------------------------------------------------------------------------------------------*/
  124.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  125.     SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
  126.     SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD);

  127. //enable PWM0 channel 0,1 on PA12, PA13
  128.     SYS->GPA_MFP = (SYS->GPA_MFP & (~(SYS_GPA_MFP_PA12_Msk|SYS_GPA_MFP_PA13_Msk)));               
  129.     SYS->GPA_MFP |= SYS_GPA_MFP_PA12_PWM0_CH0|SYS_GPA_MFP_PA13_PWM0_CH1;
  130.         SYS->ALT_MFP4= (SYS->ALT_MFP4&(~(SYS_ALT_MFP4_PA12_Msk|SYS_ALT_MFP4_PA13_Msk)));
  131. //enable PWM1 channel 0,1,2,3 on PA 2,3,10,11
  132.     SYS->GPA_MFP = (SYS->GPA_MFP & (~(SYS_GPA_MFP_PA2_Msk|SYS_GPA_MFP_PA3_Msk|SYS_GPA_MFP_PA10_Msk|SYS_GPA_MFP_PA11_Msk)));
  133.     SYS->GPA_MFP |= SYS_GPA_MFP_PA2_PWM1_CH0|SYS_GPA_MFP_PA3_PWM1_CH1|SYS_GPA_MFP_PA10_PWM1_CH2|SYS_GPA_MFP_PA11_PWM1_CH3;
  134.     SYS->ALT_MFP3 &= ~(SYS_ALT_MFP3_PA2_Msk|SYS_ALT_MFP3_PA3_Msk|SYS_ALT_MFP3_PA10_Msk|SYS_ALT_MFP3_PA11_Msk);
  135.     SYS->ALT_MFP3 |= SYS_ALT_MFP3_PA2_PWM1_CH0|SYS_ALT_MFP3_PA3_PWM1_CH1|SYS_ALT_MFP3_PA10_PWM1_CH2|SYS_ALT_MFP3_PA11_PWM1_CH3;
  136.         SYS->ALT_MFP4= (SYS->ALT_MFP4&(~(SYS_ALT_MFP4_PA2_Msk|SYS_ALT_MFP4_PA3_Msk)));


  137.        
  138. }

  139. void UART0_Init()
  140. {
  141.     /*---------------------------------------------------------------------------------------------------------*/
  142.     /* Init UART                                                                                               */
  143.     /*---------------------------------------------------------------------------------------------------------*/
  144.     /* Reset IP */
  145.     SYS_ResetModule(UART0_RST);

  146.     /* Configure UART0 and set UART0 Baudrate */
  147.     UART_Open(UART0, 115200);
  148. }

  149. /*---------------------------------------------------------------------------------------------------------*/
  150. /*  Main Function                                                                                          */
  151. /*---------------------------------------------------------------------------------------------------------*/
  152. int32_t main(void)
  153. {
  154.     /* Unlock protected registers */
  155.     SYS_UnlockReg();

  156.     /* Init System, IP clock and multi-function I/O */
  157.     SYS_Init();

  158.     /* Lock protected registers */
  159.     SYS_LockReg();

  160.     /* Init UART0 for printf */
  161.     UART0_Init();

  162.      while(1)
  163.     {

  164.         /* set PWM0  output configuration */
  165.         PWM_ConfigOutputChannel(PWM0, 0, 16100, 5);                //initial PWM0 channel 0 period, duty default 5%
  166.         PWM_ConfigOutputChannel(PWM0, 1, 16100, 5);                //initial PWM0 channel 0 period, duty default 5%
  167.         /* Enable PWM Output path for PWM0 channel 0,1 */
  168.         PWM_EnableOutput(PWM0, PWM_CH_0_MASK|PWM_CH_1_MASK);
  169.         /* Enable Timer for PWM0 channel 0,1 */
  170.         PWM_Start(PWM0, PWM_CH_0_MASK|PWM_CH_1_MASK);
  171.          PWM0->POLCTL|=3;                //inverse PWM 0 channel 0,1 out put


  172.         /* set PWM1 channel 0,1,2,3 capture configuration */
  173.         PWM_ConfigCaptureChannel(PWM1, 0, 1, 0);
  174.         PWM_ConfigCaptureChannel(PWM1, 1, 1, 0);
  175.         PWM_ConfigCaptureChannel(PWM1, 2, 1, 0);
  176.         PWM_ConfigCaptureChannel(PWM1, 3, 1, 0);
  177.         /* Enable capture falling edge interrupt for PWM1 channel 0,1,2,3 */
  178.         PWM_EnableCaptureInt(PWM1, 0, PWM_CAPTURE_INT_FALLING_LATCH);
  179.         PWM_EnableCaptureInt(PWM1, 1, PWM_CAPTURE_INT_FALLING_LATCH);
  180.         PWM_EnableCaptureInt(PWM1, 2, PWM_CAPTURE_INT_FALLING_LATCH);
  181.         PWM_EnableCaptureInt(PWM1, 3, PWM_CAPTURE_INT_FALLING_LATCH);
  182.         /* Enable Capture Function for PWM1 channel 0,1,2,3 */
  183.         PWM_EnableCapture(PWM1, PWM_CH_0_MASK|PWM_CH_1_MASK|PWM_CH_2_MASK|PWM_CH_3_MASK);
  184.         /* Enable falling capture reload for channel 0,1,2,3 */
  185.         PWM1->CAPCTL |= PWM_CAPCTL_RCRLDEN0_Msk|PWM_CAPCTL_RCRLDEN2_Msk;
  186.         /* Enable PWM1 NVIC interrupt */
  187.         NVIC_EnableIRQ(PWM1_IRQn);
  188.         /* Enable Timer for PWM0 channel 0,1,2,3 */
  189.         PWM_Start(PWM1, PWM_CH_0_MASK|PWM_CH_1_MASK|PWM_CH_2_MASK|PWM_CH_3_MASK);
  190.         /* Wait until PWM1 channel 0 Timer start to count */
  191.         while((PWM1->CNT0) == 0);


  192.         while(1);

  193.     }
  194. }



dianbeng007 发表于 2017-9-28 08:54 | 显示全部楼层
yiyigirl2014 发表于 2017-9-28 15:21 | 显示全部楼层
这种应用还是第一次见,学习一下。
zfeng0123 发表于 2022-11-5 12:08 | 显示全部楼层
学习下。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部