Merge branch 'stevstrong-patch-7'

This commit is contained in:
Roger Clark 2018-04-01 15:48:28 +10:00
commit 9fcd06e879
2 changed files with 77 additions and 116 deletions

View File

@ -4,9 +4,9 @@
based on https://github.com/rogerclarkmelbourne/Arduino_STM32
1. Blink on PC13 per 4s or 7s by attachAlarmInterrupt for 10 times
2. Second counter by attachSecondsInterrpt
2. Second counter by attachSecondsInterrupt
3. Serial output on(41s) or off(21s) by creatAlarm
4. change to your timezone in the sketch; .
4. change to your timezone in the sketch;
3. get Unix epoch time from https://www.epochconverter.com/ ;
4. last step input the 10 digit number( example: 1503945555) to Serialport ;
5. the clock will be reset to you wanted.
@ -28,70 +28,110 @@
RTClock rtclock (RTCSEL_LSE); // initialise
int timezone = 8; // change to your timezone
time_t tt;
time_t tt1;
tm_t mtt = { 47, 9, 13, 3, 11, 22, 30, 30 }; // init time 47+1970 = 2017 Unix epoch Time counted from 00:00:00 1 Jan 1970
char weekday1[][7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // 0,1,2,3,4,5,6
time_t tt, tt1;
tm_t mtt;
uint8_t dateread[11];
int globAlmCount = 0;
int lastGlobAlmCount;
int SPECAlmCount = 0;
int lastSPECAlmCount;
int i = 0;
int alarmcount = 3;
uint8_t AlarmExchange = 0;
bool dispflag = true;
#define LED_PIN PC13
// This function is called in the attachSecondsInterrpt
//-----------------------------------------------------------------------------
const char * weekdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
const char * months[] = {"Dummy", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
//-----------------------------------------------------------------------------
uint8_t str2month(const char * d)
{
uint8_t i = 13;
while ( (--i) && strcmp(months[i], d)!=0 );
return i;
}
//-----------------------------------------------------------------------------
const char * delim = " :";
char s[128]; // for sprintf
//-----------------------------------------------------------------------------
void ParseBuildTimestamp(tm_t & mt)
{
// Timestamp format: "Dec 8 2017, 22:57:54"
sprintf(s, "Timestamp: %s, %s\n", __DATE__, __TIME__);
//Serial.print(s);
char * token = strtok(s, delim); // get first token
// walk through tokens
while( token != NULL ) {
uint8_t m = str2month((const char*)token);
if ( m>0 ) {
mt.month = m;
//Serial.print(" month: "); Serial.println(mt.month);
token = strtok(NULL, delim); // get next token
mt.day = atoi(token);
//Serial.print(" day: "); Serial.println(mt.day);
token = strtok(NULL, delim); // get next token
mt.year = atoi(token) - 1970;
//Serial.print(" year: "); Serial.println(mt.year);
token = strtok(NULL, delim); // get next token
mt.hour = atoi(token);
//Serial.print(" hour: "); Serial.println(mt.hour);
token = strtok(NULL, delim); // get next token
mt.minute = atoi(token);
//Serial.print(" minute: "); Serial.println(mt.minute);
token = strtok(NULL, delim); // get next token
mt.second = atoi(token);
//Serial.print(" second: "); Serial.println(mt.second);
}
token = strtok(NULL, delim);
}
}
//-----------------------------------------------------------------------------
// This function is called in the attachSecondsInterrupt
//-----------------------------------------------------------------------------
void SecondCount ()
{
tt++;
}
// This function is called in the attachAlarmInterrpt
//-----------------------------------------------------------------------------
// This function is called in the attachAlarmInterrupt
//-----------------------------------------------------------------------------
void blink ()
{
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
globAlmCount++;
//tt++;
}
//-----------------------------------------------------------------------------
void OnOffSerial ()
{
dispflag = !dispflag;
SPECAlmCount++;
}
//-----------------------------------------------------------------------------
void setup()
{
lastGlobAlmCount = ~globAlmCount;
lastSPECAlmCount = ~SPECAlmCount;
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
tt = rtclock.makeTime(mtt);
rtclock.setTime(tt);
pinMode(LED_BUILTIN, OUTPUT);
//while (!Serial); delay(1000);
ParseBuildTimestamp(mtt); // get the Unix epoch Time counted from 00:00:00 1 Jan 1970
tt = rtclock.makeTime(mtt) + 25; // additional seconds to compensate build and upload delay
rtclock.setTime(tt);
tt1 = tt;
rtclock.attachAlarmInterrupt(blink);// Call blink
rtclock.attachSecondsInterrupt(SecondCount);// Call SecondCount
}
//-----------------------------------------------------------------------------
void loop()
{
while (Serial.available())
{ dateread[i] = Serial.read();
if (i < 11) {
i++;
}
else {
i = 0;
tt = (dateread[0] - '0') * 1000000000 + (dateread[1] - '0') * 100000000 + (dateread[2] - '0') * 10000000 + (dateread[3] - '0') * 1000000 + (dateread[4] - '0') * 100000;
tt += (dateread[5] - '0') * 10000 + (dateread[6] - '0') * 1000 + (dateread[7] - '0') * 100 + (dateread[8] - '0') * 10 + (dateread[9] - '0');
rtclock.TimeZone(tt, timezone); //adjust to your local date
rtclock.setTime(rtclock.TimeZone(tt, timezone));
if ( Serial.available()>10 ) {
for (uint8_t i = 0; i<11; i++) {
dateread[i] = Serial.read();
}
Serial.flush();
tt = atol((char*)dateread);
rtclock.setTime(rtclock.TimeZone(tt, timezone)); //adjust to your local date
}
if (lastGlobAlmCount != globAlmCount | lastSPECAlmCount != SPECAlmCount ) {
if (lastGlobAlmCount != globAlmCount || lastSPECAlmCount != SPECAlmCount ) {
if (globAlmCount == 10) { // to detachAlarmInterrupt and start creatAlarm after 10 times about 110s
rtclock.detachAlarmInterrupt();
globAlmCount = 0;
@ -117,23 +157,13 @@ void loop()
}
}
}
if (tt1 != tt & dispflag == true )
if (tt1 != tt && dispflag == true )
{
tt1 = tt;
//rtclock.breakTime(tt, mtt);
Serial.print("Date: ");
Serial.print(rtclock.day());
Serial.print("- ");
Serial.print(rtclock.month());
Serial.print(" ");
Serial.print(rtclock.year() + 1970);
Serial.print(" ");
Serial.print(weekday1[rtclock.weekday()]);
Serial.print(" Time: ");
Serial.print(rtclock.hour());
Serial.print(" : ");
Serial.print(rtclock.minute());
Serial.print(" : ");
Serial.println(rtclock.second());
// get and print actual RTC timestamp
rtclock.breakTime(rtclock.now(), mtt);
sprintf(s, "RTC timestamp: %s %u %u, %s, %02u:%02u:%02u\n",
months[mtt.month], mtt.day, mtt.year+1970, weekdays[mtt.weekday], mtt.hour, mtt.minute, mtt.second);
Serial.print(s);
}
}

View File

@ -1,69 +0,0 @@
/*
* This is port of Dean Camera's ATOMIC_BLOCK macros for AVR to ARM Cortex M3
* v1.0
* Mark Pendrith, Nov 27, 2012.
*
* From Mark:
* >When I ported the macros I emailed Dean to ask what attribution would be
* >appropriate, and here is his response:
* >
* >>Mark,
* >>I think it's great that you've ported the macros; consider them
* >>public domain, to do with whatever you wish. I hope you find them useful.
* >>
* >>Cheers!
* >>- Dean
*/
#ifndef _CORTEX_M3_ATOMIC_H_
#define _CORTEX_M3_ATOMIC_H_
static __inline__ uint32_t __get_primask(void) \
{ uint32_t primask = 0; \
__asm__ volatile ("MRS %[result], PRIMASK\n\t":[result]"=r"(primask)::); \
return primask; } // returns 0 if interrupts enabled, 1 if disabled
static __inline__ void __set_primask(uint32_t setval) \
{ __asm__ volatile ("MSR PRIMASK, %[value]\n\t""dmb\n\t""dsb\n\t""isb\n\t"::[value]"r"(setval):); \
__asm__ volatile ("" ::: "memory");}
static __inline__ uint32_t __iSeiRetVal(void) \
{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); return 1; }
static __inline__ uint32_t __iCliRetVal(void) \
{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); return 1; }
static __inline__ void __iSeiParam(const uint32_t *__s) \
{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); (void)__s; }
static __inline__ void __iCliParam(const uint32_t *__s) \
{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); (void)__s; }
static __inline__ void __iRestore(const uint32_t *__s) \
{ __set_primask(*__s); __asm__ volatile ("dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); }
#define ATOMIC_BLOCK(type) \
for ( type, __ToDo = __iCliRetVal(); __ToDo ; __ToDo = 0 )
#define ATOMIC_RESTORESTATE \
uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask()
#define ATOMIC_FORCEON \
uint32_t primask_save __attribute__((__cleanup__(__iSeiParam))) = 0
#define NONATOMIC_BLOCK(type) \
for ( type, __ToDo = __iSeiRetVal(); __ToDo ; __ToDo = 0 )
#define NONATOMIC_RESTORESTATE \
uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask()
#define NONATOMIC_FORCEOFF \
uint32_t primask_save __attribute__((__cleanup__(__iCliParam))) = 0
#endif