luat_pwm_rtt.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "luat_base.h"
  2. #include "luat_pwm.h"
  3. #include "luat_log.h"
  4. #include "rtthread.h"
  5. #include "rthw.h"
  6. #include "rtdevice.h"
  7. #define DBG_TAG "luat.pwm"
  8. #define DBG_LVL DBG_WARN
  9. #include <rtdbg.h>
  10. #ifdef RT_USING_PWM
  11. //------------------------------------------------------
  12. // 这里初始化一下 pwm 设备,一般的来说 pwm0 ... pwm6 就够了
  13. // 某些时候,还有设备直接叫 "pwm"
  14. #define DEVICE_ID_MAX 6
  15. static struct rt_device_pwm *pwm_devs[DEVICE_ID_MAX];
  16. static int luat_pwm_rtt_init() {
  17. char name[8];
  18. name[0] = 'p';
  19. name[1] = 'w';
  20. name[2] = 'm';
  21. name[4] = 0x00;
  22. // 搜索pwm0,pwm1,pwm2 ....
  23. for (size_t i = 0; i < DEVICE_ID_MAX; i++)
  24. {
  25. name[3] = '0' + i;
  26. pwm_devs[i] = (struct rt_device_pwm *)rt_device_find(name);
  27. LOG_D("search pwm name=%s ptr=0x%08X", name, pwm_devs[i]);
  28. }
  29. // 看看有没有pwm
  30. if (pwm_devs[0] == RT_NULL) {
  31. pwm_devs[0] = (struct rt_device_pwm *)rt_device_find("pwm");
  32. LOG_D("search 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) {
  53. int i = channel / 10;
  54. int n = channel - (i * 10);
  55. if (i < 0 || i >= DEVICE_ID_MAX )
  56. return -1;
  57. struct rt_device_pwm *dev = pwm_devs[i];
  58. if(RT_NULL == dev)
  59. return -1;
  60. rt_pwm_set(dev, n, period, pulse);
  61. rt_pwm_enable(dev, n);
  62. return 0;
  63. }
  64. // @return -1 关闭失败。 0 关闭成功
  65. int luat_pwm_close(int channel) {
  66. int i = channel / 10;
  67. int n = channel - (i * 10);
  68. if (i < 0 || i >= DEVICE_ID_MAX )
  69. return -1;
  70. struct rt_device_pwm *dev = pwm_devs[i];
  71. if(RT_NULL == dev)
  72. return -1;
  73. rt_pwm_disable(dev, n);
  74. return 0;
  75. }
  76. #endif
  77. //------------------------------------------------------
  78. #endif