[DemoCode下载] 新唐M051 pwm使用程序

[复制链接]
 楼主| ccw1986 发表于 2015-9-18 22:01 | 显示全部楼层 |阅读模式
  1. #include "PWM.h"
  2. #define EN_EXT_OSC       0
  3. #define COMPLEMENT_MODE         0x00000020
  4. #define DEAD_ZONE_INTERVAL      0xC8FF0000
  5. #define PWM_ENABLE              0x01010101

  6. #if     EN_EXT_OSC
  7. #define PWM_CLOCK_SOURCE        0x00000000  //使用外部振荡12MHz
  8. #else
  9. #define PWM_CLOCK_SOURCE        0xF0000000  //使用内部RC振荡22.1184MHz
  10. #endif
  11. #define PWM_PRESCALAE           0x0000C731  //PWM01预分频0x31(49),PWM23预分频0xC7(199)
  12. #define PWM_CLOCK_DIVIDER       0x00004444  //输入时钟分频1
  13. #define PWM_OUTPUT_INVERT       0x00040000
  14. #define PWM_OUTPUT_ENABLE       0x0000000F   //PWM0、1、2、3输出使能
  15. #define PWM_CMR_VALUE   0x0
  16. #define PWM_CNR_VALUE       0x1000      //4096
  17. /*
  18. PWM频率=PWMxy_CLK/(prescale+1)*(clock divider)/(CNR+1)
  19. (1)使用外部晶振12MHz
  20. PWM频率=12000000/(49+1)*4097 =58.57Hz
  21. (2)使用内部RC振荡22.1184MHz
  22. PWM频率=22118400/(49+1)*4097 =107.97Hz
  23. */
  24. #define LED_DARKING             0
  25. #define LED_BRIGHTING   1
  26. STATIC UINT32 g_unPWMCMRValue=PWM_CNR_VALUE;
  27. STATIC UINT32 g_unLedStat=LED_DARKING;
  28. /****************************************
  29. *函数名称:PWMInit
  30. *输    入:无
  31. *输    出:无
  32. *功    能:PWM初始化
  33. ******************************************/
  34. VOID PWMInit(VOID)
  35. {
  36.     P2_MFP |= ~(P20_AD8_PWM0 | P21_AD9_PWM1 | P22_AD10_PWM2 | P23_AD11_PWM3);
  37. P2_MFP |= (PWM0 | PWM1 | PWM2 | PWM3);   //使能P2.0~P2.3为PWM输出  
  38.     P2_PMD &= ~Px0_PMD;                       //配置P2.0~P2.3为推挽输出
  39. P2_PMD |= Px0_OUT;
  40. P2_PMD &= ~Px1_PMD;
  41. P2_PMD |= Px1_OUT;
  42. P2_PMD &= ~Px2_PMD;
  43. P2_PMD |= Px2_OUT;
  44. P2_PMD &= ~Px3_PMD;
  45. P2_PMD |= Px3_OUT;
  46.     APBCLK |= PWM01_CLKEN | PWM23_CLKEN;                        //使能PWM0~3时钟
  47. CLKSEL1 = PWM_CLOCK_SOURCE;                 //选择PWM0~3时钟源
  48.    
  49. PPRA = PWM_PRESCALAE | DEAD_ZONE_INTERVAL;                  //选择PWM0~3时钟预分频和死区间隔
  50.     CSRA = PWM_CLOCK_DIVIDER;                                   //选择PWM0~3时钟分频
  51.     PCRA = 0x08080808 | PWM_OUTPUT_INVERT | COMPLEMENT_MODE;    //PWM0~3自动重装载
  52.     CNR0A = CNR1A = CNR2A = CNR3A = PWM_CNR_VALUE;              //PWM0~3计数值
  53.     CMR0A = CMR1A = CMR2A = CMR3A = PWM_CMR_VALUE;              //PWM0~3比较值
  54.     PIERA  |= PWMIE3 | PWMIE2 | PWMIE1 | PWMIE0 ;    //使能PWM0~3中断
  55.     NVIC_ISER |= PWMA_INT;                                      //使能PWM0~3中断
  56.     POEA = PWM_OUTPUT_ENABLE;                                   //PWM输出使能
  57.     PCRA |= PWM_ENABLE;                                         //PWM使能,启动
  58. }
  59. /****************************************
  60. *函数名称:PWMA_IRQHandler
  61. *输    入:无
  62. *输    出:无
  63. *功    能:中断服务函数-PWMA
  64. ******************************************/
  65. VOID PWMA_IRQHandler(VOID)
  66. {
  67.   switch(g_unLedStat)            //检查LED状态
  68.   {
  69.    case  LED_DARKING:         //LED状态渐暗
  70.   {
  71.     if(g_unPWMCMRValue < PWM_CNR_VALUE)
  72.     {
  73.      g_unPWMCMRValue+=50;
  74.     }
  75.     else
  76.     {
  77.        g_unLedStat = LED_BRIGHTING;
  78.      g_unPWMCMRValue=PWM_CNR_VALUE;
  79.     }  
  80.   }break;
  81.   case  LED_BRIGHTING:         //LED状态渐亮
  82.   {
  83.     if(g_unPWMCMRValue>=50)
  84.     {
  85.      g_unPWMCMRValue-=50;
  86.     }
  87.     else
  88.     {
  89.        g_unLedStat = LED_DARKING;
  90.      g_unPWMCMRValue=PWM_CMR_VALUE;   
  91.     }
  92.   }break;
  93.   default:break;
  94.   }
  95.   CMR0A = CMR1A = CMR2A = CMR3A = g_unPWMCMRValue;  //设置PWM0~3比较值
  96.      PIIRA = PIIRA;                          
  97. }
  98. /****************************************
  99. *函数名称:main
  100. *输    入:无
  101. *输    出:无
  102. *功    能:函数主体
  103. ******************************************/
  104. INT32 main(VOID)
  105. {
  106.    PROTECT_REG                         //ISP下载时保护FLASH存储器
  107.   (
  108.    PWRCON |= XTL12M_EN;                   //默认时钟源为外部晶振
  109.    while((CLKSTATUS & XTL12M_STB) == 0);                //等待12MHz时钟稳定  
  110.    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;              //设置外部晶振为系统时钟
  111.    PWMInit();              //PWM初始化
  112.   )
  113.      while(1);
  114. }


598330983 发表于 2015-9-18 22:04 | 显示全部楼层
楼主分享的程序,很不错,结构性,易读性很强。
Roderman_z 发表于 2015-9-18 22:16 | 显示全部楼层
新唐的代码原来也是这么好用啊
wahahaheihei 发表于 2015-9-18 23:16 | 显示全部楼层
新唐的代码比ST的好用多了。
598330983 发表于 2015-9-20 16:32 | 显示全部楼层
  • VOID PWMInit(VOID)
  • {
  •     P2_MFP |= ~(P20_AD8_PWM0 | P21_AD9_PWM1 | P22_AD10_PWM2 | P23_AD11_PWM3);
  • P2_MFP |= (PWM0 | PWM1 | PWM2 | PWM3);   //使能P2.0~P2.3为PWM输出
  •     P2_PMD &= ~Px0_PMD;                       //配置P2.0~P2.3为推挽输出
  • P2_PMD |= Px0_OUT;
  • P2_PMD &= ~Px1_PMD;
  • P2_PMD |= Px1_OUT;
  • P2_PMD &= ~Px2_PMD;
  • P2_PMD |= Px2_OUT;
  • P2_PMD &= ~Px3_PMD;
  • P2_PMD |= Px3_OUT;
  •     APBCLK |= PWM01_CLKEN | PWM23_CLKEN;                        //使能PWM0~3时钟
  • CLKSEL1 = PWM_CLOCK_SOURCE;                 //选择PWM0~3时钟源
  • PPRA = PWM_PRESCALAE | DEAD_ZONE_INTERVAL;                  //选择PWM0~3时钟预分频和死区间隔
  •     CSRA = PWM_CLOCK_DIVIDER;                                   //选择PWM0~3时钟分频
  •     PCRA = 0x08080808 | PWM_OUTPUT_INVERT | COMPLEMENT_MODE;    //PWM0~3自动重装载
  •     CNR0A = CNR1A = CNR2A = CNR3A = PWM_CNR_VALUE;              //PWM0~3计数值
  •     CMR0A = CMR1A = CMR2A = CMR3A = PWM_CMR_VALUE;              //PWM0~3比较值
  •     PIERA  |= PWMIE3 | PWMIE2 | PWMIE1 | PWMIE0 ;    //使能PWM0~3中断
  •     NVIC_ISER |= PWMA_INT;                                      //使能PWM0~3中断
  •     POEA = PWM_OUTPUT_ENABLE;                                   //PWM输出使能
  •     PCRA |= PWM_ENABLE;                                         //PWM使能,启动
  • }
配置起来还是很复杂的。多亏有了例程。

cowboy2014 发表于 2015-9-20 20:37 | 显示全部楼层
  1. VOID PWMInit(VOID)
  2. {
  3.     P2_MFP |= ~(P20_AD8_PWM0 | P21_AD9_PWM1 | P22_AD10_PWM2 | P23_AD11_PWM3);
  4. P2_MFP |= (PWM0 | PWM1 | PWM2 | PWM3);   //使能P2.0~P2.3为PWM输出
  5.     P2_PMD &= ~Px0_PMD;                       //配置P2.0~P2.3为推挽输出
  6. P2_PMD |= Px0_OUT;
  7. P2_PMD &= ~Px1_PMD;
  8. P2_PMD |= Px1_OUT;
  9. P2_PMD &= ~Px2_PMD;
  10. P2_PMD |= Px2_OUT;
  11. P2_PMD &= ~Px3_PMD;
  12. P2_PMD |= Px3_OUT;
  13.     APBCLK |= PWM01_CLKEN | PWM23_CLKEN;                        //使能PWM0~3时钟
  14. CLKSEL1 = PWM_CLOCK_SOURCE;                 //选择PWM0~3时钟源
  15. PPRA = PWM_PRESCALAE | DEAD_ZONE_INTERVAL;                  //选择PWM0~3时钟预分频和死区间隔
  16.     CSRA = PWM_CLOCK_DIVIDER;                                   //选择PWM0~3时钟分频
  17.     PCRA = 0x08080808 | PWM_OUTPUT_INVERT | COMPLEMENT_MODE;    //PWM0~3自动重装载
  18.     CNR0A = CNR1A = CNR2A = CNR3A = PWM_CNR_VALUE;              //PWM0~3计数值
  19.     CMR0A = CMR1A = CMR2A = CMR3A = PWM_CMR_VALUE;              //PWM0~3比较值
  20.     PIERA  |= PWMIE3 | PWMIE2 | PWMIE1 | PWMIE0 ;    //使能PWM0~3中断
  21.     NVIC_ISER |= PWMA_INT;                                      //使能PWM0~3中断
  22.     POEA = PWM_OUTPUT_ENABLE;                                   //PWM输出使能
  23.     PCRA |= PWM_ENABLE;                                         //PWM使能,启动
  24. }

程序很严谨啊
rejoice818 发表于 2015-9-20 21:45 | 显示全部楼层
跟smartmcu家的代码结构一样
Harvard 发表于 2015-9-21 13:58 | 显示全部楼层
推荐用官方bsp版本库 直接寄存器 .. 看个人喜好吧
734774645 发表于 2015-9-28 13:30 来自手机 | 显示全部楼层
貌似就是他们做的代码吧,库函数改的
wahahaheihei 发表于 2015-9-28 22:20 来自手机 | 显示全部楼层
库函数可以方便隔离底层寄存器
gejigeji521 发表于 2020-2-19 14:58 | 显示全部楼层
最新版的库函数的如何使用
antusheng 发表于 2020-2-20 12:57 | 显示全部楼层
基于寄存器操作的,要非常熟悉手粗
antusheng 发表于 2020-2-20 12:57 | 显示全部楼层
非常熟悉手册才能看懂。人生苦短,我用库函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

925

帖子

6

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