[LOOK] LOOK_Key_PWM(Flag)

[复制链接]
 楼主| wang0225 发表于 2011-8-5 09:15 | 显示全部楼层 |阅读模式

  1. /*
  2. 这是我学习Flag的一个例程,参考论坛上的相关例程,在此感谢相关的作者。
  3. 因为我的串口有点问题,故通过助学板上的按键来发Flag。
  4. 初始化设置:  时钟配置为 XTL12M_EN
  5.               CPU时钟频率为12MHz
  6.      外设时钟配置为PWM01_S : 外部 4~24MHz 晶振使能
  7.      外设时钟配置为PWM01_EN : 选上
  8.      GPIOB的多功能管教选择:PB.14 INT0,PB.15 INT1
  9.       端口模式:PB.14 输入,PB.15 输入
  10.       去抖使能:PB.14 和PB.15 选上
  11.         PA.12选择多功能管脚选择PWM0
  12.             
  13. 主要完成功能:产生1000Hz的波形
  14.      按按键Key1可以把波形的占空比减小
  15.      按按键Key2可以把波形的占空比加大
  16. */
  17. #include "LOOK_Key_PWM.h"
  18. #define LOOK_H 0
  19. #if LOOK_H == 0
  20. #include "NUC1xx.h"
  21. #include "NUC1xxM051Seriescfg.h"
  22. #else
  23. #define __HAVE_GPIO
  24. #include <nuc120re3an.h>
  25. using namespace nuvoton;
  26. #endif
  27. flag_t Flag(0);
  28. class Keyboard_t : public interrupt_t {
  29. public:
  30. __INLINE__ Keyboard_t();
  31. protected:
  32. bool isr(int vector);
  33. void dsr(int vector, uintptr_t count);
  34. };
  35. // Keyboard_t 构造函数
  36. __INLINE__  Keyboard_t::Keyboard_t()
  37. {
  38. attach(EINT0_IRQn);
  39. attach(EINT1_IRQn);
  40. #if LOOK_H == 0
  41. GPIOBs.IEN.Regs = (1 << Pin15) | (1 << Pin14);   // 开启中断
  42. #else
  43. GPIOB.IEN(0)
  44.       .IF_EN15(1)
  45.    .IF_EN14(1); // 开启中断
  46. #endif
  47. vector_t::enable(EINT0_IRQn);
  48. vector_t::enable(EINT1_IRQn);
  49. }
  50. // Keyboard_t 中断服务例程
  51. bool Keyboard_t::isr(int vector)
  52. {
  53. #if LOOK_H == 0
  54. GPIOBs.ISRC.Regs = GPIOBs.ISRC.Regs;   // 清中断 flag
  55. #else
  56. //注意:下句被优化了
  57. // GPIOB.ISRC = GPIOB.ISRC;   // 清中断 flag
  58. //注意:下句不能被优化,特别注意()是建立缓存
  59. GPIOB.ISRC = GPIOB.ISRC();   // 清中断 flag
  60. #endif
  61. return true;
  62. }
  63. // Keyboard_t 中断滞后服务例程
  64. void Keyboard_t::dsr(int vector, uintptr_t count)
  65. {
  66. if (vector == EINT0_IRQn)//Key2
  67. {
  68.   Flag.do_set_bits(0b01);
  69. }
  70. else if (vector == EINT1_IRQn)//Key1
  71. {
  72.   Flag.do_set_bits(0b10);
  73. }
  74. }
  75. Keyboard_t Key;         // 创建Key对象
  76. // 任务类 task_LOOK_Key_PWM_t 的例程
  77. void task_LOOK_Key_PWM_t::routine()
  78. {
  79. // TODO: 在此编写 task_LOOK_PWM_t 例程的内容
  80. uint8_t PWM0_Duty_Cycle = 50;   //PWM初始化占空比为50
  81. //Enable PWM engine clock and reset PWM
  82. #if LOOK_H == 0
  83. SYSCLKs.CLKSEL1.Bits.TMR0_S = 0b000; //外部12M晶振
  84. PWM0s.PCR.Bits.CH0INV = 0;    //反向关闭
  85. PWM0s.PCR.Bits.CH0MOD = 1;    //自动重载
  86. PWM0s.PPR.Bits.CP01 = 1;    //预分频  1
  87. PWM0s.CSR.Bits.CSR0 = 0b100;   //分频系数 1
  88. uint16_t u16Duty = 12000000/((1+1)*1*1000);//PWM 频率 1000HZ
  89. PWM0s.CNR0.Regs = u16Duty-1;     //PWM 频率 = PWMxy_CLK/(prescale+1)*(clock divider)/(CNR+1);
  90. PWM0s.CMR0.Regs = u16Duty*PWM0_Duty_Cycle/100-1; //占空比 = (CMR+1)/(CNR+1).
  91. PWM0s.POE.Bits.PWM0 = 1;    //PWM0输出使能
  92. //PA.12作为PWM0   使用LOOK进行配置
  93. PWM0s.PCR.Bits.CH0EN = 1;    // 使能PWM功能
  94. #else
  95. SYSCLK.CLKSEL1().TMR0_S = tmrs_t::XTL12M; //外部12M晶振
  96. PWMA.PCR()
  97.        .CH0INV(0)    //反向关闭
  98.        .CH0MOD(1);    //自动重载
  99. PWMA.PPR().CP01 = 1;    //预分频  1
  100. PWMA.CSR().CSR0 = 0b100;   //分频系数 1
  101. uint16_t u16Duty = 12000000/((1+1)*1*1000);//PWM 频率 1000HZ
  102. PWMA.CNR0 = u16Duty-1;     //PWM 频率 = PWMxy_CLK/(prescale+1)*(clock divider)/(CNR+1);
  103. PWMA.CMR0 = u16Duty*PWM0_Duty_Cycle/100-1; //占空比 = (CMR+1)/(CNR+1).
  104. PWMA.POE().PWM0 = 1;    //PWM0输出使能
  105. //PA.12作为PWM0   使用LOOK进行配置
  106. PWMA.PCR().CH0EN = 1;    // 使能PWM功能
  107. #endif
  108. while (true) {
  109.   // TODO: 在此编写 task_LOOK_PWM_t 例程的内容
  110.   int flag = Flag.wait(0b011, flag_t::ANY_CONSUME);
  111.      switch (flag)
  112.      {
  113.       case 0x01:
  114.     //占空比增加10%
  115.     if (PWM0_Duty_Cycle!=100)
  116.     {
  117.      PWM0_Duty_Cycle +=5;
  118. #if LOOK_H == 0
  119.      PWM0s.CMR0.Regs = u16Duty*PWM0_Duty_Cycle/100-1;  //更新占空比
  120. #else
  121.      PWMA.CMR0 = u16Duty*PWM0_Duty_Cycle/100-1;  //更新占空比
  122. #endif
  123.     }
  124.     break;
  125.    case 0x02:
  126.     //占空比减少10%
  127.     if (PWM0_Duty_Cycle!=0)
  128.     {
  129.      PWM0_Duty_Cycle -=5;
  130. #if LOOK_H == 0
  131.      if (PWM0_Duty_Cycle!=0)
  132.       PWM0s.CMR0.Regs = u16Duty*PWM0_Duty_Cycle/100-1;  //更新占空比
  133.      else PWM0s.CMR0.Regs = 0;
  134. #else
  135.      if (PWM0_Duty_Cycle!=0)
  136.       PWMA.CMR0 = u16Duty*PWM0_Duty_Cycle/100-1;  //更新占空比
  137.      else PWMA.CMR0 = 0;
  138. #endif
  139.     }
  140.     break;
  141.   }
  142. }
  143. }
  144. #ifdef LOOK_SCHEDULING_PRIORITY
  145. instantiate::task<task_LOOK_Key_PWM_t, LOOK_STACK_SIZE> task_LOOK_Key_PWM(0);
  146. #else
  147. instantiate::task<task_LOOK_Key_PWM_t, LOOK_STACK_SIZE> task_LOOK_Key_PWM;
  148. #endif

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| wang0225 发表于 2011-8-5 09:16 | 显示全部楼层
自己先顶啦,哈哈。。。
john_lee 发表于 2011-8-5 09:29 | 显示全部楼层
顶浪子。不错。
Swallow_0322 发表于 2011-8-5 09:32 | 显示全部楼层
顶一个!
Swallow_0322 发表于 2011-8-5 09:32 | 显示全部楼层
同顶浪子!
加油!:victory:
hotpower 发表于 2011-8-5 09:48 | 显示全部楼层
浪子的LOOK处女作?
这个要顶!
 楼主| wang0225 发表于 2011-8-5 13:09 | 显示全部楼层
谢谢大家给予的帮助!
hotpower 发表于 2011-8-8 02:10 | 显示全部楼层
忙了一天,躺在床上才发现此贴没发裤子,罪过!
 楼主| wang0225 发表于 2011-8-8 08:40 | 显示全部楼层
没事,大叔!啊哈哈。今天的出差到佛山啊,忙晕啦......
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

185

帖子

1

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

0

主题

185

帖子

1

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