Merge branch 'stevstrong-patch-7'
This commit is contained in:
commit
9fcd06e879
|
@ -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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue