标题:
ArduinoMega2560引脚操作底层库,能够提高操作效率和速度
[打印本页]
作者:
aikeaida
时间:
2018-12-11 10:39
标题:
ArduinoMega2560引脚操作底层库,能够提高操作效率和速度
之前做项目的时候发现 digitalWrite() 耗时能达到30us,导致系统卡顿,一怒之下自行开发了底层引脚操作函数,开发了N个项目也没发现有什么问题
头文件在这里
/*------------------------------
[name] Gpio.h
[date] 2018.5.16 17:12
[note] Designed by TFD Studio
------------------------------*/
#ifndef Gpio_h
#define Gpio_h
//---------------/* Headerfile */---------------//
#include <Arduino.h>
//---------------/* Debug */---------------//
/* Level */
#define HIGH 1
#define LOW 0
#define OUTPUT 1
#define INPUT 0
/* Analog pins */
#define A0 (54)
#define A1 (55)
#define A2 (56)
#define A3 (57)
#define A4 (58)
#define A5 (59)
#define A6 (60)
#define A7 (61)
#define A8 (62)
#define A9 (63)
#define A10 (64)
#define A11 (65)
#define A12 (66)
#define A13 (67)
#define A14 (68)
#define A15 (69)
/* PWM Defaults */
#define DEFAULT_PWM_FREQUENCY 50
#define DEFAULT_PWM_LEVEL HIGH
#define DEFAULT_PWM_GRADE 100
//---------------/* Class */---------------//
class GPIO{
private:
/* Normal */
uint8_t _bit_;
volatile uint8_t* _mode_;
volatile uint8_t* _pin_;
volatile uint8_t* _port_;
/* SoftPWM */
unsigned int grade = DEFAULT_PWM_GRADE;
unsigned int dutycycle = 0;
unsigned int factor = 0;
unsigned int frequency = DEFAULT_PWM_FREQUENCY;
bool level = DEFAULT_PWM_LEVEL;
bool enable = false;
unsigned long int timemark, timecycle;
public:
void setPin(unsigned char);
/* Normal */
void write(unsigned char);
void mode(unsigned char);
void high();
void low();
void input();
void output();
unsigned char read();
/* SoftPWM */
void pwmLevel(bool);
void pwmDuty(unsigned int);
void pwmGrade(unsigned int);
void pwmFreq(unsigned int);
void pwmStart();
void pwmStop();
bool pwmThread();
};
#endif
复制代码
实现在这里
/*------------------------------
[name] Gpio.cpp
[date] 2018.5.16 17:12
[note] Designed by TFD Studio
------------------------------*/
#include "Gpio.h"
//---------------/* Set */---------------//
void GPIO::setPin(unsigned char _id)
{
_bit_ = digitalPinToBitMask(_id);
_mode_ = portModeRegister(digitalPinToPort(_id));
_port_ = portOutputRegister(digitalPinToPort(_id));
_pin_ = portInputRegister(digitalPinToPort(_id));
}
//---------------/* Control */---------------//
void GPIO::write( unsigned char _level)
{
if (_level)
*_port_ |= _bit_;
else
*_port_ &= ~_bit_;
}
void GPIO::mode(unsigned char _mode)
{
if (_mode)
*_mode_ |= _bit_;
else
*_mode_ &= ~_bit_;
}
void GPIO::high()
{
*_port_ |= _bit_;
}
void GPIO::low()
{
*_port_ &= ~_bit_;
}
void GPIO::input()
{
*_mode_ &= ~_bit_;
}
void GPIO::output()
{
*_mode_ |= _bit_;
}
unsigned char GPIO::read()
{
if (*_pin_ & _bit_)
return 1;
else
return 0;
}
//---------------/* SoftPWM */---------------//
void GPIO::pwmLevel(bool _level)
{
level = _level;
}
void GPIO::pwmDuty(unsigned int _dutycycle)
{
if (!level)
dutycycle = grade - _dutycycle;
else
dutycycle = _dutycycle;
}
void GPIO::pwmGrade(unsigned int _grade)
{
grade = _grade;
}
void GPIO::pwmFreq(unsigned int _freq)
{
frequency = _freq;
}
void GPIO::pwmStart()
{
enable = true;
timecycle = 1000000 / (frequency * grade);
timemark = micros();
}
void GPIO::pwmStop()
{
enable = false;
if (!level)
*_port_ |= _bit_;
else
*_port_ &= ~_bit_;
}
bool GPIO::pwmThread()
{
if (enable && micros() - timemark >= timecycle)
{
timemark += timecycle;
factor++;
if (factor > grade)
factor = 1;
if (factor <= dutycycle)
*_port_ |= _bit_;
else
*_port_ &= ~_bit_;
return true;
}
}
复制代码
作者:
zmc419
时间:
2018-12-15 15:12
高!发现Arduino确实慢,部分代码用c写就好了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1