luat_pwm_rtt.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "luat_base.h"
  2. #include "luat_pwm.h"
  3. #include "rtthread.h"
  4. #include "rthw.h"
  5. #include "rtdevice.h"
  6. #define LUAT_LOG_TAG "rtt.pwm"
  7. #include "luat_log.h"
  8. #ifdef RT_USING_PWM
  9. //------------------------------------------------------
  10. // 这里初始化一下 pwm 设备,一般的来说 pwm0 ... pwm6 就够了
  11. // 某些时候,还有设备直接叫 "pwm"
  12. #define DEVICE_ID_MAX 6
  13. static struct rt_device_pwm *pwm_devs[DEVICE_ID_MAX];
  14. static int luat_pwm_rtt_init() {
  15. char name[8];
  16. name[0] = 'p';
  17. name[1] = 'w';
  18. name[2] = 'm';
  19. name[4] = 0x00;
  20. // 搜索pwm0,pwm1,pwm2 ....
  21. for (size_t i = 0; i < DEVICE_ID_MAX; i++)
  22. {
  23. name[3] = '0' + i;
  24. pwm_devs[i] = (struct rt_device_pwm *)rt_device_find(name);
  25. if (pwm_devs[i])
  26. LLOGD("found pwm name=%s ptr=0x%08X", name, pwm_devs[i]);
  27. }
  28. // 看看有没有pwm
  29. if (pwm_devs[0] == RT_NULL) {
  30. pwm_devs[0] = (struct rt_device_pwm *)rt_device_find("pwm");
  31. if (pwm_devs[0])
  32. LLOGD("found pwm name=%s ptr=0x%08X", "pwm", pwm_devs[0]);
  33. }
  34. return 0;
  35. }
  36. INIT_COMPONENT_EXPORT(luat_pwm_rtt_init);
  37. //#ifdef SOC_FAMILY_STM32
  38. #if 0
  39. //------------------------------------------------------
  40. // 在 RTT, rt_device_pwm 实际上是 stm32_pwm 结构的第一个属性
  41. // 因此,暗戳戳的转成 (stm32_pwm *) 即可得到 channel
  42. #else
  43. //------------------------------------------------------
  44. // 在 RTT, 用两个数字来确定 pwm 的 channel
  45. // {I}{N}
  46. // - I: 表示在 pwm_devs 中的下标
  47. // - N: 表示在该设备的 channel
  48. // 这两个数字通过 @channel 参数得到
  49. // - I: 十位
  50. // - N: 个位
  51. // @return -1 打开失败。 0 打开成功
  52. int luat_pwm_open(int channel, size_t period, size_t pulse,int pnum) {
  53. int i = channel / 10;
  54. int n = channel - (i * 10);
  55. if (i < 0 || i >= DEVICE_ID_MAX )
  56. return -1;
  57. if (period < 1 || period > 1000000)
  58. return -1;
  59. if (pulse > 100)
  60. pulse = 100;
  61. struct rt_device_pwm *dev = pwm_devs[i];
  62. if(RT_NULL == dev)
  63. return -1;
  64. // 与Luat的定义不同, rtt的period和pulse是按时长作为单位的,单位是ns,即1/1000000000秒
  65. // rt_period = 1000000000 / luat_period
  66. // rt_pulse = (1000000000 / luat_period) * pulse / 100
  67. rt_pwm_set(dev, n, 1000000000 / period, (1000000000 / period) * pulse / 100);
  68. rt_pwm_enable(dev, n);
  69. return 0;
  70. }
  71. int luat_pwm_setup(luat_pwm_conf_t* conf) {
  72. int channel = conf->channel;
  73. size_t period = conf->period;
  74. size_t pulse = conf->pulse;
  75. size_t pnum = conf->pnum;
  76. size_t precision = conf->precision;
  77. int i = channel / 10;
  78. int n = channel - (i * 10);
  79. if (i < 0 || i >= DEVICE_ID_MAX )
  80. return -1;
  81. if (period < 1 || period > 1000000)
  82. return -1;
  83. if (pulse > precision)
  84. pulse = precision;
  85. struct rt_device_pwm *dev = pwm_devs[i];
  86. if(RT_NULL == dev)
  87. return -1;
  88. // 与Luat的定义不同, rtt的period和pulse是按时长作为单位的,单位是ns,即1/1000000000秒
  89. // rt_period = 1000000000 / luat_period
  90. // rt_pulse = (1000000000 / luat_period) * pulse / 100
  91. rt_pwm_set(dev, n, 1000000000 / period, (1000000000 / period) * pulse / precision);
  92. rt_pwm_enable(dev, n);
  93. return 0;
  94. }
  95. int luat_pwm_capture(int channel,int freq) {
  96. return -1;
  97. }
  98. // @return -1 关闭失败。 0 关闭成功
  99. int luat_pwm_close(int channel) {
  100. int i = channel / 10;
  101. int n = channel - (i * 10);
  102. if (i < 0 || i >= DEVICE_ID_MAX )
  103. return -1;
  104. struct rt_device_pwm *dev = pwm_devs[i];
  105. if(RT_NULL == dev)
  106. return -1;
  107. rt_pwm_disable(dev, n);
  108. return 0;
  109. }
  110. #endif
  111. //------------------------------------------------------
  112. #endif