Skip to content

Commit

Permalink
#74 Support SoftwareSerial library
Browse files Browse the repository at this point in the history
 * Add a new API attachInterruptWithDebounce() that allows user to control debounce time setting
 * Revise `delayMicroseconds()` to use `hal_gpt` API instead.
 * Add new library `SoftwareSerial` that is modified from the Arduino SoftwareSerial library, replacing register writes to generic Arduino APIs, e.g. `digitalWrite`. LinkIt 7697 has a faster clock so the generic GPIO writes API is still fast enough for SoftwareSerial up to 115200 baud.
  • Loading branch information
pablosun committed Dec 8, 2017
1 parent 54a1cfb commit 6c77c7b
Show file tree
Hide file tree
Showing 10 changed files with 637 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "variant_delay.h"
#include "cmsis.h"
#include "delay.h"
#include <hal_gpt.h>


// Get current timestamp, unit: ms
Expand Down Expand Up @@ -41,12 +42,12 @@ uint32_t micros( void )

void delayMicroseconds(unsigned int us)
{
uint32_t timeout_micros = micros() + us;

while(!time_after(micros(), timeout_micros)) ;
hal_gpt_delay_us(us);
}

void yield(void) {}
void yield(void) {

}

void delay( uint32_t ms )
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

bool pin_has_eint(pin_desc_t *pin)
{
if (NULL == pin)
return false;

if (pin->pin_info_eint_num >= HAL_EINT_NUMBER_MAX)
return false;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@ static void default_hal_eint_callback(void *arduino_callback)
callback();
}

void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode) {
// by default we set the debounce time to 50 ms
return attachInterruptWithDebounce(pin, callback, mode, 50);
}

void attachInterruptWithDebounce(uint32_t pin, voidFuncPtr callback, uint32_t mode, uint32_t debounceTime)
{
static hal_eint_trigger_mode_t mode_to_eint_trigger[] = {
[LOW] = HAL_EINT_LEVEL_LOW,
Expand All @@ -41,8 +46,7 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
goto FAIL;

eint_config.trigger_mode = mode_to_eint_trigger[mode];
eint_config.debounce_time = 50; // debounce time unit: ms

eint_config.debounce_time = debounceTime; // debounce time unit: ms

ret = hal_eint_init(pin_get_eint_num(pin_desc), &eint_config);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ extern "C" {
typedef void (*voidFuncPtr)(void) ;

extern void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode);
extern void attachInterruptWithDebounce(uint32_t pin, voidFuncPtr callback, uint32_t mode, uint32_t debounceTime);
extern void detachInterrupt(uint32_t pin);

extern void interrupts(void);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
Software serial multple serial test
Receives from the hardware serial, sends to software serial.
Receives from software serial, sends to hardware serial.
The circuit:
* RX is digital pin 2 (connect to TX of other device)
* TX is digital pin 11 (connect to RX of other device)
Note:
Not all pins on LinkIt 7697 support change interrupts,
so only the following can be used for RX:
2, 3
created back in the mists of time
modified 25 May 2012
by Tom Igoe
based on Mikal Hart's example
modified Dec 2017
by MediaTek Labs
This example code is in the public domain.
*/
#include <SoftwareSerial.h>

// On LinkIt 7697, the RX pin must be one of the EINT pins, such as P2 and P3.
// There are no limitations on TX pin.
SoftwareSerial mySerial(2, 11); // RX, TX

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}


Serial.println("Goodnight moon!");

// set the data rate for the SoftwareSerial port
mySerial.begin(4800);
mySerial.println("Hello, world?");
}

void loop() { // run over and over
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/*
Software serial multple serial test
Receives from the two software serial ports,
sends to the hardware serial port.
In order to listen on a software port, you call port.listen().
When using two software serial ports, you have to switch ports
by listen()ing on each one in turn. Pick a logical time to switch
ports, like the end of an expected transmission, or when the
buffer is empty. This example switches ports when there is nothing
more to read from a port
The circuit:
Two devices which communicate serially are needed.
* First serial device's TX attached to digital pin 2(RX), RX to pin 11(TX)
* Second serial device's TX attached to digital pin 3(RX), RX to pin 9(TX)
Note:
Not all pins on LinkIt 7697 support change interrupts,
so only the following can be used for RX:
2, 3
created 18 Apr. 2011
modified 19 March 2016
by Tom Igoe
based on Mikal Hart's twoPortRXExample
modified Dec 2017
by MediaTek Labs
This example code is in the public domain.
*/

#include <SoftwareSerial.h>

// software serial #1: RX = digital pin 2, TX = digital pin 11
SoftwareSerial portOne(2, 11);

// software serial #2: RX = digital pin 3, TX = digital pin 9
SoftwareSerial portTwo(3, 9);

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}


// Start each software serial port
portOne.begin(9600);
portTwo.begin(9600);
}

void loop() {
// By default, the last intialized port is listening.
// when you want to listen on a port, explicitly select it:
portOne.listen();
Serial.println("Data from port one:");
// while there is data coming in, read it
// and send to the hardware serial port:
while (portOne.available() > 0) {
char inByte = portOne.read();
Serial.write(inByte);
}

// blank line to separate data from the two ports:
Serial.println();

// Now listen on the second port
portTwo.listen();
// while there is data coming in, read it
// and send to the hardware serial port:
Serial.println("Data from port two:");
while (portTwo.available() > 0) {
char inByte = portTwo.read();
Serial.write(inByte);
}

// blank line to separate data from the two ports:
Serial.println();
}






Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#######################################
# Syntax Coloring Map for SoftwareSerial
# (formerly NewSoftSerial)
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

SoftwareSerial KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

begin KEYWORD2
end KEYWORD2
read KEYWORD2
write KEYWORD2
available KEYWORD2
isListening KEYWORD2
overflow KEYWORD2
flush KEYWORD2
listen KEYWORD2
peek KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
name=SoftwareSerial
version=0.1
author=MediaTek Labs
maintainer=MediaTek Labs <http://labs.mediatek.com>
sentence=Enables serial communication on EINT pins.
paragraph=The SoftwareSerial library has been developed to allow serial (UART) transmission(TX) on any pin, and receiving(RX) on EINT pins such as P2 and P3 on LinkIt 7697 HDK.
category=Communication
url=https://github.com/MediaTek-Labs/Arduino-Add-On-for-LinkIt-SDK
architectures=linkit_rtos

Loading

0 comments on commit 6c77c7b

Please sign in to comment.