找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3220|回复: 1
收起左侧

ArduinoMega2560引脚操作底层库,能够提高操作效率和速度

[复制链接]
ID:282138 发表于 2018-12-11 10:39 | 显示全部楼层 |阅读模式
之前做项目的时候发现 digitalWrite() 耗时能达到30us,导致系统卡顿,一怒之下自行开发了底层引脚操作函数,开发了N个项目也没发现有什么问题

头文件在这里

  1. /*------------------------------

  2. [name]    Gpio.h

  3. [date]    2018.5.16 17:12

  4. [note]    Designed by TFD Studio

  5. ------------------------------*/

  6. #ifndef Gpio_h
  7. #define Gpio_h

  8. //---------------/* Headerfile */---------------//

  9. #include <Arduino.h>

  10. //---------------/* Debug */---------------//

  11.     /* Level */

  12. #define        HIGH    1
  13. #define        LOW        0
  14. #define        OUTPUT    1
  15. #define        INPUT    0

  16.     /* Analog pins */

  17. #define        A0   (54)
  18. #define        A1   (55)
  19. #define        A2   (56)
  20. #define        A3   (57)
  21. #define        A4   (58)
  22. #define        A5   (59)
  23. #define        A6   (60)
  24. #define        A7   (61)
  25. #define        A8   (62)
  26. #define        A9   (63)
  27. #define        A10  (64)
  28. #define        A11  (65)
  29. #define        A12  (66)
  30. #define        A13  (67)
  31. #define        A14  (68)
  32. #define        A15  (69)

  33.     /* PWM Defaults */

  34. #define        DEFAULT_PWM_FREQUENCY    50
  35. #define        DEFAULT_PWM_LEVEL        HIGH
  36. #define        DEFAULT_PWM_GRADE        100

  37. //---------------/* Class */---------------//

  38. class GPIO{

  39. private:

  40.         /* Normal */

  41.     uint8_t  _bit_;
  42.     volatile uint8_t* _mode_;
  43.     volatile uint8_t* _pin_;
  44.     volatile uint8_t* _port_;

  45.         /* SoftPWM */

  46.     unsigned int grade = DEFAULT_PWM_GRADE;
  47.     unsigned int dutycycle = 0;
  48.     unsigned int factor = 0;
  49.     unsigned int frequency = DEFAULT_PWM_FREQUENCY;
  50.     bool level = DEFAULT_PWM_LEVEL;
  51.     bool enable = false;
  52.     unsigned long int timemark, timecycle;

  53. public:

  54.     void setPin(unsigned char);

  55.         /* Normal */

  56.     void write(unsigned char);
  57.     void mode(unsigned char);

  58.     void high();
  59.     void low();

  60.     void input();
  61.     void output();

  62.     unsigned char read();

  63.         /* SoftPWM */

  64.     void pwmLevel(bool);
  65.     void pwmDuty(unsigned int);
  66.     void pwmGrade(unsigned int);
  67.     void pwmFreq(unsigned int);

  68.     void pwmStart();
  69.     void pwmStop();

  70.     bool pwmThread();

  71. };

  72. #endif
复制代码





实现在这里
  1. /*------------------------------

  2. [name]        Gpio.cpp

  3. [date]        2018.5.16 17:12

  4. [note]        Designed by TFD Studio

  5. ------------------------------*/

  6. #include "Gpio.h"

  7. //---------------/* Set */---------------//

  8. void GPIO::setPin(unsigned char _id)
  9. {
  10.         _bit_ = digitalPinToBitMask(_id);
  11.         _mode_ = portModeRegister(digitalPinToPort(_id));
  12.         _port_ = portOutputRegister(digitalPinToPort(_id));
  13.         _pin_ = portInputRegister(digitalPinToPort(_id));
  14. }

  15. //---------------/* Control */---------------//

  16. void GPIO::write( unsigned char _level)
  17. {
  18.         if (_level)
  19.                 *_port_ |= _bit_;
  20.         else
  21.                 *_port_ &= ~_bit_;
  22. }

  23. void GPIO::mode(unsigned char _mode)
  24. {
  25.         if (_mode)
  26.                 *_mode_ |= _bit_;
  27.         else
  28.                 *_mode_ &= ~_bit_;
  29. }

  30. void GPIO::high()
  31. {
  32.         *_port_ |= _bit_;
  33. }

  34. void GPIO::low()
  35. {
  36.         *_port_ &= ~_bit_;
  37. }

  38. void GPIO::input()
  39. {
  40.         *_mode_ &= ~_bit_;
  41. }

  42. void GPIO::output()
  43. {
  44.         *_mode_ |= _bit_;
  45. }

  46. unsigned char GPIO::read()
  47. {
  48.         if (*_pin_ & _bit_)
  49.                 return 1;
  50.         else
  51.                 return 0;
  52. }

  53. //---------------/* SoftPWM */---------------//

  54. void GPIO::pwmLevel(bool _level)
  55. {
  56.         level = _level;
  57. }

  58. void GPIO::pwmDuty(unsigned int _dutycycle)
  59. {
  60.         if (!level)
  61.                 dutycycle = grade - _dutycycle;
  62.         else
  63.                 dutycycle = _dutycycle;
  64. }

  65. void GPIO::pwmGrade(unsigned int _grade)
  66. {
  67.         grade = _grade;
  68. }

  69. void GPIO::pwmFreq(unsigned int _freq)
  70. {
  71.         frequency = _freq;
  72. }

  73. void GPIO::pwmStart()
  74. {
  75.         enable = true;
  76.         timecycle = 1000000 / (frequency * grade);
  77.         timemark = micros();
  78. }

  79. void GPIO::pwmStop()
  80. {
  81.         enable = false;
  82.         if (!level)
  83.                 *_port_ |= _bit_;
  84.         else
  85.                 *_port_ &= ~_bit_;
  86. }

  87. bool GPIO::pwmThread()
  88. {
  89.         if (enable && micros() - timemark >= timecycle)
  90.         {
  91.                 timemark += timecycle;

  92.                 factor++;
  93.                 if (factor > grade)
  94.                         factor = 1;
  95.                 if (factor <= dutycycle)
  96.                         *_port_ |= _bit_;
  97.                 else
  98.                         *_port_ &= ~_bit_;
  99.                 return true;
  100.         }
  101. }
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:137736 发表于 2018-12-15 15:12 | 显示全部楼层
高!发现Arduino确实慢,部分代码用c写就好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表