From: Andrea Manni Date: Mon, 2 Mar 2015 14:21:42 +0000 (+0100) Subject: first commit X-Git-Url: http://git.piffa.net/web?a=commitdiff_plain;h=4f52f1fde0e01460db3f143901317de4e40dde11;p=arduino first commit --- 4f52f1fde0e01460db3f143901317de4e40dde11 diff --git a/ATtiny b/ATtiny new file mode 100644 index 0000000..bcc8bd2 --- /dev/null +++ b/ATtiny @@ -0,0 +1,11 @@ + +La versione dell'IDLE ARduino modificata: +- http://digistump.com/wiki/digispark/tutorials/connecting#software + + +Installare il pacchetto: apt-get install libusb-0.1-4:i386 + + +HINT: prima fare upload _poi_ collegare la ATtiny. + + diff --git a/TODO b/TODO new file mode 100644 index 0000000..3c1d606 --- /dev/null +++ b/TODO @@ -0,0 +1,69 @@ + + + +done - mettere due arduino in connessione seriale: tipo un blink innescato dall'altra + +- testare quanti amper fa passare quel micro-switch voltage modify +done Infrarossi con telecomando + +- Lavorare ulteriormente su Processing: fare un paio di moduli standard per bottone e analog read. Guardare Arduino for dummies. Cercare di fare un piccolo oscilloscopio per dimostrare PWM. + +Mettere a posto la lista +x accessori +x testi consigliati e risorse online + + +Riordino +========== + +x Preparare materiali prime lezioni +done scegliere cosa va pubblicato e cosa no da /root/arduino, mettere a posto la sfinge online, preparare un archivio git pubblico. +done Al momento direi pubblicare solo lo sketch book, eventualmente un cartella doc con gli html di alcuni materiali. + +Server +======== + +done - guardare il server git che non sembra funzionare +done- Valutare se usare Mailman o mettere su un phpbb + + +x sistemare sketches e metterli in git +x copiare tutto arduino da conny a time, fare un backup +x assicurarsi di poter fare un push da time a kim per gli sketch +x sfinge: link a forum e mailing list +x mettere su mailing list +- controllare esercizi per prima lezione +X guardare se sul portatile c'e' arduino per Attiny + + + +Mostrsa e dimostra: +x arduino rpi attiny (cavo HDMI + rete + alimentatore + USB per rpi) +x preparare kit con cavi breadboards resistenze led e balle varie +x preparare resistenze per studenti: 320_O_ 1k +x cercare usrobotics o preparare TP + + +x stampare argomenti prima lezione + +-------- + +x Correggere intro informatica apici per hertz khertz... +x Controllare mini vnc su time +Sketches per prima lezione bottone. +Fondamenti di programmazione - Arduino dummies - elettronica per circuiti / led +Take a stand about language for comments in sketches +git - mettere gli scripts in read only +mettere in git la cartella arduino +Controllare gli sketch dello stato del bottone: sono in pullup? Funzionano? + + +Server +------- +Testare LDAP - inserimento nuovi utenti +Automount + +Always +========= +- aggiornare git su lab.piffa.net in http +- aggiornare i git su portatile e tablet diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/filter_test/filter_test.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/filter_test/filter_test.ino new file mode 100644 index 0000000..e18d14f --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/filter_test/filter_test.ino @@ -0,0 +1,53 @@ + + +// 300 to 3000 band stop filter +// 100 kHz sample rate +// http://www.schwietering.com/jayduino/filtuino/index.php?characteristic=bu&passmode=bs&order=2&usesr=usesr&sr=100000&frequencyLow=300¬eLow=&frequencyHigh=3000¬eHigh=&pw=pw&calctype=float&run=Send + +//Band stop butterworth filter order=2 alpha1=0.003 alpha2=0.03 +class filter +{ + public: + filter() + { + for(int i=0; i <= 4; i++) + v[i]=0.0; + } + private: + float v[5]; + public: + float step(float x) + { + v[0] = v[1]; + v[1] = v[2]; + v[2] = v[3]; + v[3] = v[4]; + v[4] = (8.869368704884e-1 * x) + + ( -0.7866981284 * v[0]) + + ( 3.3285093824 * v[1]) + + ( -5.2961761521 * v[2]) + + ( 3.7543536539 * v[3]); + return + 1.000000 * v[0] + +v[4] + - 3.992879 * (v[1] + v[3]) + +5.985770 * v[2]; + } +}; + +filter f; + +void setup() +{ + Serial.begin(9600); +} + +void loop() +{ + int r = analogRead(A0); + float filtered = f.step(r); + Serial.print(r); Serial.print(","); Serial.println((int)filtered); + delay(100); +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_01_blink_10/sketch_01_01_blink_10.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_01_blink_10/sketch_01_01_blink_10.ino new file mode 100644 index 0000000..632db5d --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_01_blink_10/sketch_01_01_blink_10.ino @@ -0,0 +1,18 @@ +// sketch 01_01_blink_10 +int ledPin = 13; +int delayPeriod = 200; +void setup() +{ + pinMode(ledPin, OUTPUT); +} +void loop() +{ + for (int i = 0; i < 10; i++) + { + digitalWrite(ledPin, HIGH); + delay(delayPeriod); + digitalWrite(ledPin, LOW); + delay(delayPeriod); + } +} + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_02_blink_fast_slow/sketch_01_02_blink_fast_slow.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_02_blink_fast_slow/sketch_01_02_blink_fast_slow.ino new file mode 100644 index 0000000..5837c90 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_02_blink_fast_slow/sketch_01_02_blink_fast_slow.ino @@ -0,0 +1,24 @@ +// sketch 01_02_blink_fast_slow +int ledPin = 13; + +void setup() +{ + pinMode(ledPin, OUTPUT); + flash(10, 100); +} + +void loop() +{ + flash(1, 500); +} + +void flash(int n, int delayPeriod) +{ + for (int i = 0; i < n; i++) + { + digitalWrite(ledPin, HIGH); + delay(delayPeriod); + digitalWrite(ledPin, LOW); + delay(delayPeriod); + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_03_paperclip/sketch_01_03_paperclip.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_03_paperclip/sketch_01_03_paperclip.ino new file mode 100644 index 0000000..8e39967 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_03_paperclip/sketch_01_03_paperclip.ino @@ -0,0 +1,29 @@ +// sketch 01_03_paperclip +int ledPin = 13; +int switchPin = 7; + +void setup() +{ + pinMode(ledPin, OUTPUT); + pinMode(switchPin, INPUT_PULLUP); +} + +void loop() +{ + if (digitalRead(switchPin) == LOW) + { + flash(100); + } + else + { + flash(500); + } +} + +void flash(int delayPeriod) +{ + digitalWrite(ledPin, HIGH); + delay(delayPeriod); + digitalWrite(ledPin, LOW); + delay(delayPeriod); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_04_serial/sketch_01_04_serial.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_04_serial/sketch_01_04_serial.ino new file mode 100644 index 0000000..94d8d29 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_04_serial/sketch_01_04_serial.ino @@ -0,0 +1,22 @@ +// sketch 01_04_serial +int switchPin = 7; + +void setup() +{ + pinMode(switchPin, INPUT_PULLUP); + Serial.begin(9600); +} + +void loop() +{ + if (digitalRead(switchPin) == LOW) + { + Serial.println("Paperclip connected"); + } + else + { + Serial.println("Paperclip NOT connected"); + } + delay(1000); +} + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_05_gibberish/sketch_01_05_gibberish.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_05_gibberish/sketch_01_05_gibberish.ino new file mode 100644 index 0000000..e770b1a --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_05_gibberish/sketch_01_05_gibberish.ino @@ -0,0 +1,20 @@ +// sketch 01_05_gibberish + +char* messages[] = { + "My name is Arduino", + "Buy books by Simon Monk", + "Make something cool with me", + "Raspberry Pis are fruity"}; + +void setup() +{ + Serial.begin(9600); +} + +void loop() +{ + int delayPeriod = random(2000, 8000); + delay(delayPeriod); + int messageIndex = random(4); + Serial.println(messages[messageIndex]); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_06_analog/sketch_01_06_analog.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_06_analog/sketch_01_06_analog.ino new file mode 100644 index 0000000..460e7ae --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_06_analog/sketch_01_06_analog.ino @@ -0,0 +1,16 @@ +// sketch 01_06_analog +int analogPin = A0; + +void setup() +{ + Serial.begin(9600); +} + +void loop() +{ + int rawReading = analogRead(analogPin); + float volts = rawReading / 204.6; + Serial.println(volts); + delay(1000); +} + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_07_pwm/sketch_01_07_pwm.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_07_pwm/sketch_01_07_pwm.ino new file mode 100644 index 0000000..212a936 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_01_07_pwm/sketch_01_07_pwm.ino @@ -0,0 +1,18 @@ +// sketch 01_07_pwm +int pwmPin = 6; + +void setup() +{ + pinMode(pwmPin, OUTPUT); + Serial.begin(9600); +} + +void loop() +{ + if (Serial.available()) + { + int dutyCycle = Serial.parseInt(); + analogWrite(pwmPin, dutyCycle); + } +} + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_01_interrupt/sketch_03_01_interrupt.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_01_interrupt/sketch_03_01_interrupt.ino new file mode 100644 index 0000000..975d465 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_01_interrupt/sketch_03_01_interrupt.ino @@ -0,0 +1,18 @@ +// sketch 03_01_interrupts + +int ledPin = 13; + +void setup() +{ + pinMode(ledPin, OUTPUT); + attachInterrupt(0, stuffHapenned, FALLING); +} + +void loop() +{ +} + +void stuffHapenned() +{ + digitalWrite(ledPin, HIGH); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_02_interrupt_flash/sketch_03_02_interrupt_flash.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_02_interrupt_flash/sketch_03_02_interrupt_flash.ino new file mode 100644 index 0000000..17aa4e2 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_02_interrupt_flash/sketch_03_02_interrupt_flash.ino @@ -0,0 +1,25 @@ +// sketch 03_02_interrupt_flash + +int ledPin = 13; +volatile boolean flashFast = false; + +void setup() +{ + pinMode(ledPin, OUTPUT); + attachInterrupt(0, stuffHapenned, FALLING); +} + +void loop() +{ + int period = 1000; + if (flashFast) period = 100; + digitalWrite(ledPin, HIGH); + delay(period); + digitalWrite(ledPin, LOW); + delay(period); +} + +void stuffHapenned() +{ + flashFast = ! flashFast; +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_03_1kHz/sketch_03_03_1kHz.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_03_1kHz/sketch_03_03_1kHz.ino new file mode 100644 index 0000000..64599a0 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_03_1kHz/sketch_03_03_1kHz.ino @@ -0,0 +1,23 @@ +// sketch_03_03_1kHz + +#include + +int outputPin = 12; +volatile int output = LOW; + +void setup() +{ + pinMode(12, OUTPUT); + Timer1.initialize(500); + Timer1.attachInterrupt(toggleOutput); +} + +void loop() +{ +} + +void toggleOutput() +{ + digitalWrite(outputPin, output); + output = ! output; +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_04_pwm/sketch_03_04_pwm.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_04_pwm/sketch_03_04_pwm.ino new file mode 100644 index 0000000..172f4bb --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_03_04_pwm/sketch_03_04_pwm.ino @@ -0,0 +1,19 @@ +// sketch_03_04_pwm + +#include + + +void setup() +{ + pinMode(9, OUTPUT); + pinMode(10, OUTPUT); + Timer1.initialize(1000); + Timer1.pwm(9, 512); + Timer1.pwm(10, 255); +} + +void loop() +{ +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_01_benchmark/sketch_04_01_benchmark.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_01_benchmark/sketch_04_01_benchmark.ino new file mode 100644 index 0000000..91dae1c --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_01_benchmark/sketch_04_01_benchmark.ino @@ -0,0 +1,30 @@ +// sketch 04_01_benchmark + +void setup() +{ + Serial.begin(9600); + while (! Serial) {}; + Serial.println("Starting Test"); + long startTime = millis(); + + // test code here + long i = 0; + long j = 0; + for (i = 0; i < 20000000; i ++) + { + j = i + i * 10; + if (j > 10) j = 0; + } + // end of test code + long endTime = millis(); + + Serial.println(j); // prevent loop being optimized out + Serial.println("Finished Test"); + Serial.print("Seconds taken: "); + Serial.println((endTime - startTime) / 1000l); +} + +void loop() +{ + +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_02_benchmark_float/sketch_04_02_benchmark_float.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_02_benchmark_float/sketch_04_02_benchmark_float.ino new file mode 100644 index 0000000..b855b1b --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_02_benchmark_float/sketch_04_02_benchmark_float.ino @@ -0,0 +1,30 @@ +// sketch 04_02_benchmark_float + +void setup() +{ + Serial.begin(9600); + while (! Serial) {}; + Serial.println("Starting Test"); + long startTime = millis(); + + // test code here + long i = 0; + float j = 0.0; + for (i = 0; i < 20000000; i ++) + { + j = i + i * 10.0; + if (j > 10) j = 0.0; + } + // end of test code + long endTime = millis(); + + Serial.println(j); // prevent loop being optimized out + Serial.println("Finished Test"); + Serial.print("Seconds taken: "); + Serial.println((endTime - startTime) / 1000l); +} + +void loop() +{ + +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_03_sin/sketch_04_03_sin.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_03_sin/sketch_04_03_sin.ino new file mode 100644 index 0000000..8aa7104 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_03_sin/sketch_04_03_sin.ino @@ -0,0 +1,20 @@ +// sketch_-4_03_sin + +void setup() +{ + +} + +float angle = 0.0; +float angleStep = PI / 32.0; + +void loop() +{ + int x = (int)(sin(angle) * 127) + 127; + analogWrite(DAC0, x); + angle += angleStep; + if (angle > 2 * PI) + { + angle = 0.0; + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_04_lookup/sketch_04_04_lookup.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_04_lookup/sketch_04_04_lookup.ino new file mode 100644 index 0000000..bc13a07 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_04_lookup/sketch_04_04_lookup.ino @@ -0,0 +1,18 @@ +// sketch_04_04_lookup + +byte sin64[] = {127, 139, 151, 163, 175, 186, 197, 207, 216, 225, 232, 239, 244, 248, 251, 253, 254, 253, 251, 248, +244, 239, 232, 225, 216, 207, 197, 186, 175, 163, 151, 139, 126, 114, 102, 90, 78, 67, 56, 46, 37, 28, 21, 14, +9, 5, 2, 0, 0, 0, 2, 5, 9, 14, 21, 28, 37, 46, 56, 67, 78, 90, 102, 114, 126}; + +void setup() +{ + +} + +void loop() +{ + for (byte i = 0; i < 64; i++) + { + analogWrite(DAC0, sin64[i]); + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_05_sin_print/sketch_04_05_sin_print.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_05_sin_print/sketch_04_05_sin_print.ino new file mode 100644 index 0000000..4c953ca --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_05_sin_print/sketch_04_05_sin_print.ino @@ -0,0 +1,25 @@ +// sketch_-4_05_sin_print + +float angle = 0.0; +float angleStep = PI / 32.0; + +void setup() +{ + Serial.begin(9600); + Serial.print("byte sin64[] = {"); + while (angle < 2 * PI) + { + int x = (int)(sin(angle) * 127) + 127; + Serial.print(x); + angle += angleStep; + if (angle < 2 * PI) + { + Serial.print(", "); + } + } + Serial.println("};"); +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_05_square/sketch_04_05_square.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_05_square/sketch_04_05_square.ino new file mode 100644 index 0000000..c60e103 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_05_square/sketch_04_05_square.ino @@ -0,0 +1,17 @@ +// sketch_04_05_square + +int outPin = 10; +int state = 0; + +void setup() +{ + pinMode(outPin, OUTPUT); +} + +void loop() +{ + digitalWrite(outPin, state); + state = ! state; +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_06_bytes/sketch_04_06_bytes.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_06_bytes/sketch_04_06_bytes.ino new file mode 100644 index 0000000..a21739d --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_06_bytes/sketch_04_06_bytes.ino @@ -0,0 +1,17 @@ +// sketch_04_06_bytes + +byte outPin = 10; +byte state = 0; + +void setup() +{ + pinMode(outPin, OUTPUT); +} + +void loop() +{ + digitalWrite(outPin, state); + state = ! state; +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_07_const/sketch_04_07_const.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_07_const/sketch_04_07_const.ino new file mode 100644 index 0000000..697535e --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_07_const/sketch_04_07_const.ino @@ -0,0 +1,17 @@ +// sketch_04_07_const + +const byte outPin = 10; +byte state = 0; + +void setup() +{ + pinMode(outPin, OUTPUT); +} + +void loop() +{ + digitalWrite(outPin, state); + state = ! state; +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_08_no_loop/sketch_04_08_no_loop.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_08_no_loop/sketch_04_08_no_loop.ino new file mode 100644 index 0000000..b103dca --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_08_no_loop/sketch_04_08_no_loop.ino @@ -0,0 +1,20 @@ +// sketch_04_08_no_loop + +const byte outPin = 10; +byte state = 0; + +void setup() +{ + pinMode(outPin, OUTPUT); + while (true) + { + digitalWrite(outPin, state); + state = ! state; + } +} + +void loop() +{ +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_09_square_ports/sketch_04_09_square_ports.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_09_square_ports/sketch_04_09_square_ports.ino new file mode 100644 index 0000000..ad59818 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_09_square_ports/sketch_04_09_square_ports.ino @@ -0,0 +1,19 @@ +// sketch_04_09_square_ports + +byte state = 0; + +void setup() +{ + DDRB = B00000100; + while (true) + { + PORTB = B00000100; + PORTB = B00000000; + } +} + +void loop() +{ +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_10_direct_read/sketch_04_10_direct_read.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_10_direct_read/sketch_04_10_direct_read.ino new file mode 100644 index 0000000..a4bf412 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_10_direct_read/sketch_04_10_direct_read.ino @@ -0,0 +1,17 @@ +// sketch_04_010_direct_read + +byte state = 0; + +void setup() +{ + DDRB = B00000000; // all inputs + Serial.begin(9600); +} + +void loop() +{ + Serial.println(PINB, 2); + delay(1000); +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_11_analog/sketch_04_11_analog.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_11_analog/sketch_04_11_analog.ino new file mode 100644 index 0000000..7ce52aa --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_11_analog/sketch_04_11_analog.ino @@ -0,0 +1,27 @@ +// sketch 04_11_analog + +void setup() +{ + Serial.begin(9600); + while (! Serial) {}; + Serial.println("Starting Test"); + long startTime = millis(); + + // test code here + long i = 0; + for (i = 0; i < 1000000; i ++) + { + analogRead(A0); + } + // end of test code + long endTime = millis(); + + Serial.println("Finished Test"); + Serial.print("Seconds taken: "); + Serial.println((endTime - startTime) / 1000l); +} + +void loop() +{ + +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_12_analog_fast/sketch_04_12_analog_fast.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_12_analog_fast/sketch_04_12_analog_fast.ino new file mode 100644 index 0000000..f517864 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_04_12_analog_fast/sketch_04_12_analog_fast.ino @@ -0,0 +1,33 @@ +// sketch 04_11_analog + +const byte PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); +const byte PS_16 = (1 << ADPS2); + +void setup() +{ + ADCSRA &= ~PS_128; // remove prescale of 128 + ADCSRA |= PS_16; // add prescale of 16 (1MHz) + Serial.begin(9600); + while (! Serial) {}; + Serial.println(PS_128, 2); + Serial.println(PS_16, 2); + Serial.println("Starting Test"); + long startTime = millis(); + + // test code here + long i = 0; + for (i = 0; i < 1000000; i ++) + { + analogRead(A0); + } + // end of test code + long endTime = millis(); + + Serial.println("Finished Test"); + Serial.print("Seconds taken: "); + Serial.println((endTime - startTime) / 1000l); +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_01_prescale/sketch_05_01_prescale.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_01_prescale/sketch_05_01_prescale.ino new file mode 100644 index 0000000..02703cc --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_01_prescale/sketch_05_01_prescale.ino @@ -0,0 +1,17 @@ +// sketch_05_01_prescale + +#include + +void setup() +{ + pinMode(13, OUTPUT); + setClockPrescaler(CLOCK_PRESCALER_256); +} + +void loop() +{ + digitalWrite(13, HIGH); + trueDelay(1000); + digitalWrite(13, LOW); + trueDelay(5000); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_02_powering_off/sketch_05_02_powering_off.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_02_powering_off/sketch_05_02_powering_off.ino new file mode 100644 index 0000000..36d1761 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_02_powering_off/sketch_05_02_powering_off.ino @@ -0,0 +1,20 @@ +// sketch_05_02_powering_off + +#include + +void setup() +{ + pinMode(13, OUTPUT); +// power_adc_disable(); + power_spi_disable(); +// power_twi_disable(); +// power_usart0_disable(); +// power_timer0_disable(); +// power_timer1_disable(); +// power_timer2_disable(); +// power_all_disable(); +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_03_blink_standard/sketch_05_03_blink_standard.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_03_blink_standard/sketch_05_03_blink_standard.ino new file mode 100644 index 0000000..0ee70dd --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_03_blink_standard/sketch_05_03_blink_standard.ino @@ -0,0 +1,14 @@ +// sketch_05_03_blink_standard + +void setup() +{ + pinMode(13, OUTPUT); +} + +void loop() +{ + digitalWrite(13, HIGH); + delay(1000); + digitalWrite(13, LOW); + delay(10000); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_04_narcoleptic_blink/sketch_05_04_narcoleptic_blink.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_04_narcoleptic_blink/sketch_05_04_narcoleptic_blink.ino new file mode 100644 index 0000000..6021c00 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_04_narcoleptic_blink/sketch_05_04_narcoleptic_blink.ino @@ -0,0 +1,15 @@ +// sketch_05_04_narcoleptic_blink +#include + +void setup() +{ + pinMode(13, OUTPUT); +} + +void loop() +{ + digitalWrite(13, HIGH); + Narcoleptic.delay(1000); + digitalWrite(13, LOW); + Narcoleptic.delay(10000); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_05_narcoleptic_input/sketch_05_05_narcoleptic_input.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_05_narcoleptic_input/sketch_05_05_narcoleptic_input.ino new file mode 100644 index 0000000..10c8742 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_05_narcoleptic_input/sketch_05_05_narcoleptic_input.ino @@ -0,0 +1,31 @@ +// sketch_05_05_narcoleptic_input +#include + +const int ledPin = 13; +const int inputPin = 2; + +void setup() +{ + pinMode(ledPin, OUTPUT); + pinMode(inputPin, INPUT_PULLUP); +} + +void loop() +{ + if (digitalRead(inputPin) == LOW) + { + doSomething(); + } + Narcoleptic.delay(100); +} + +void doSomething() +{ + for (int i = 0; i < 20; i++) + { + digitalWrite(ledPin, HIGH); + Narcoleptic.delay(200); + digitalWrite(ledPin, LOW); + Narcoleptic.delay(200); + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_06_sleep_external_wake/sketch_05_06_sleep_external_wake.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_06_sleep_external_wake/sketch_05_06_sleep_external_wake.ino new file mode 100644 index 0000000..3ac71ef --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_06_sleep_external_wake/sketch_05_06_sleep_external_wake.ino @@ -0,0 +1,51 @@ +// sketch_05_06_sleep_external_wake +#include + +const int ledPin = 13; +const int inputPin = 2; + +volatile boolean flag; + +void setup() +{ + pinMode(ledPin, OUTPUT); + pinMode(inputPin, INPUT_PULLUP); + goToSleep(); +} + +void loop() +{ + if (flag) + { + doSomething(); + flag = false; + goToSleep(); + } +} + +void setFlag() +{ + flag = true; +} + +void goToSleep() +{ + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + sleep_enable(); + attachInterrupt(0, setFlag, LOW); // pin D2 + sleep_mode(); // sleep now + // Now asllep until LOW interrupt, then.. + sleep_disable(); + detachInterrupt(0); +} + +void doSomething() +{ + for (int i = 0; i < 20; i++) + { + digitalWrite(ledPin, HIGH); + delay(200); + digitalWrite(ledPin, LOW); + delay(200); + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_07_light_sensing/sketch_05_07_light_sensing.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_07_light_sensing/sketch_05_07_light_sensing.ino new file mode 100644 index 0000000..0f6f523 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_07_light_sensing/sketch_05_07_light_sensing.ino @@ -0,0 +1,25 @@ +// sketch_05_07_light_sensing + +const int inputPin = A0; +const int powerPin = 12; + +void setup() +{ + pinMode(powerPin, OUTPUT); + Serial.begin(9600); +} + +void loop() +{ + Serial.println(takeReading()); + delay(500); +} + +int takeReading() +{ + digitalWrite(powerPin, HIGH); + delay(10); // photoresistors are slow to respond + int reading = analogRead(inputPin); + digitalWrite(powerPin, LOW); + return reading; +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_null/sketch_05_null.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_null/sketch_05_null.ino new file mode 100644 index 0000000..145a6e5 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_05_null/sketch_05_null.ino @@ -0,0 +1,10 @@ +void setup() { + // put your setup code here, to run once: + pinMode(13, OUTPUT); + digitalWrite(13, LOW); +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_01_byte_const/sketch_06_01_byte_const.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_01_byte_const/sketch_06_01_byte_const.ino new file mode 100644 index 0000000..cdd718a --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_01_byte_const/sketch_06_01_byte_const.ino @@ -0,0 +1,24 @@ +// sketch_06_01_int +const byte ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; + +void setup() +{ + for (int i = 0; i < 12; i++) + { + pinMode(ledPins[i], OUTPUT); + digitalWrite(ledPins[i], HIGH); + } + Serial.begin(9600); + Serial.println(freeRam()); +} + +void loop() +{ +} + +int freeRam () +{ + extern int __heap_start, *__brkval; + int v; + return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_01_int/sketch_06_01_int.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_01_int/sketch_06_01_int.ino new file mode 100644 index 0000000..d2bcdd1 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_01_int/sketch_06_01_int.ino @@ -0,0 +1,24 @@ +// sketch_06_01_int +int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; + +void setup() +{ + for (int i = 0; i < 12; i++) + { + pinMode(ledPins[i], OUTPUT); + digitalWrite(ledPins[i], HIGH); + } + Serial.begin(9600); + Serial.println(freeRam()); +} + +void loop() +{ +} + +int freeRam () +{ + extern int __heap_start, *__brkval; + int v; + return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_02_factorial/sketch_06_02_factorial.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_02_factorial/sketch_06_02_factorial.ino new file mode 100644 index 0000000..04ed886 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_02_factorial/sketch_06_02_factorial.ino @@ -0,0 +1,23 @@ +// sketch_06_02_factorial + +void setup() +{ + Serial.begin(9600); + Serial.println(factorial(15)); +} + +void loop() +{ +} + +long factorial(long n) +{ + if (n == 0) + { + return 1; + } + else + { + return n * factorial(n - 1); + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_03_factorial_non_recur/sketch_06_03_factorial_non_recur.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_03_factorial_non_recur/sketch_06_03_factorial_non_recur.ino new file mode 100644 index 0000000..b6569d1 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_03_factorial_non_recur/sketch_06_03_factorial_non_recur.ino @@ -0,0 +1,22 @@ +// sketch_06_02_factorial + +void setup() +{ + Serial.begin(9600); + Serial.println(factorial(15)); +} + +void loop() +{ +} + +long factorial(long n) +{ + long result = 1; + while (n > 0) + { + result = result * n; + n--; + } + return result; +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_04_static/sketch_06_04_static.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_04_static/sketch_06_04_static.ino new file mode 100644 index 0000000..a52bac7 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_04_static/sketch_06_04_static.ino @@ -0,0 +1,17 @@ +// sketch_06_02_static + +int array[100]; + +void setup() +{ + array[0] = 1; + array[50] = 2; + Serial.begin(9600); + Serial.println(array[50]); +} + +void loop() +{ +} + +// 2368 bytes diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_05_dynamic/sketch_06_05_dynamic.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_05_dynamic/sketch_06_05_dynamic.ino new file mode 100644 index 0000000..bb467aa --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_05_dynamic/sketch_06_05_dynamic.ino @@ -0,0 +1,18 @@ +// sketch_06_03_dynamic + +int *array; + +void setup() +{ + array = (int *)malloc(sizeof(int) * 100); + array[0] = 1; + array[50] = 2; + Serial.begin(9600); + Serial.println(array[50]); +} + +void loop() +{ +} + +// 2664 bytes diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_06_EEPROM_example/sketch_06_06_EEPROM_example.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_06_EEPROM_example/sketch_06_06_EEPROM_example.ino new file mode 100644 index 0000000..516536a --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_06_EEPROM_example/sketch_06_06_EEPROM_example.ino @@ -0,0 +1,110 @@ +// sketch_06_EEPROM_example + +#include + +const int lockPin = 13; +const byte codeSetMarkerValue = 123; +const int defaultCode = 1234; + +int code; +boolean locked = true; + +void setup() +{ + pinMode(lockPin, OUTPUT); + Serial.begin(9600); + while (! Serial) {}; // Wait for Serial to start (Leonardo only) + lock(); + Serial.println("Enter the command U followed by code to unlock"); + Serial.println("and L to lock again."); + Serial.println("Use the command C followed by a new code to change the code"); + initializeCode(); +} + +void loop() +{ + if (Serial.available()) + { + char command = Serial.read(); + if (command == 'U') + { + attemptUnlock(); + } + else if (command == 'L') + { + lock(); + } + else if (command == 'C') + { + if (locked) + { + Serial.println("Can only set new code when unlocked"); + } + else + { + changeCode(); + } + } + } +} + +void initializeCode() +{ + byte codeSetMarker = EEPROM.read(0); + if (codeSetMarker == codeSetMarkerValue) + { + code = readSecretCodeFromEEPROM(); + } + else + { + code = defaultCode; + } +} + +int readSecretCodeFromEEPROM() +{ + byte high = EEPROM.read(1); + byte low = EEPROM.read(2); + return (high << 8) + low; +} + +void saveSecretCodeToEEPROM() +{ + EEPROM.write(0, codeSetMarkerValue); + EEPROM.write(1, highByte(code)); + EEPROM.write(2, lowByte(code)); +} + +void attemptUnlock() +{ + if (code == Serial.parseInt()) + { + unlock(); + } + else + { + Serial.println("Incorrect code"); + } +} + +void lock() +{ + locked = true; + Serial.println("LOCKED"); + digitalWrite(lockPin, LOW); +} + +void unlock() +{ + locked = false; + Serial.println("UN-LOCKED"); + digitalWrite(lockPin, HIGH); +} + +void changeCode() +{ + code = Serial.parseInt(); + saveSecretCodeToEEPROM(); + Serial.print("Code Changed to:"); + Serial.println(code); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_07_avr_eeprom_int/sketch_06_07_avr_eeprom_int.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_07_avr_eeprom_int/sketch_06_07_avr_eeprom_int.ino new file mode 100644 index 0000000..9c626c4 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_07_avr_eeprom_int/sketch_06_07_avr_eeprom_int.ino @@ -0,0 +1,16 @@ +// sketch_06_07_avr_eeprom_int + +#include + +void setup() +{ + int i = eeprom_read_word((uint16_t*)10); + i++; + eeprom_write_word((uint16_t*)10, i); + Serial.begin(9600); + Serial.println(i); +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_08_avr_eeprom_string/sketch_06_08_avr_eeprom_string.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_08_avr_eeprom_string/sketch_06_08_avr_eeprom_string.ino new file mode 100644 index 0000000..46316f6 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_08_avr_eeprom_string/sketch_06_08_avr_eeprom_string.ino @@ -0,0 +1,13 @@ +// sketch_06_07_avr_eeprom_string + +#include + +void setup() +{ + char message[] = "I am written in EEPROM"; + eeprom_write_block(message, (void *)100, strlen(message) + 1); +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_09_avr_eeprom_string_read/sketch_06_09_avr_eeprom_string_read.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_09_avr_eeprom_string_read/sketch_06_09_avr_eeprom_string_read.ino new file mode 100644 index 0000000..96f9abc --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_09_avr_eeprom_string_read/sketch_06_09_avr_eeprom_string_read.ino @@ -0,0 +1,16 @@ +// sketch_06_07_avr_eeprom_string_read + +#include + +void setup() +{ + char message[50]; // big enough + eeprom_read_block(&message, (void *)100, 50); + Serial.begin(9600); + Serial.println(message); + Serial.println(strlen(message)); +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_09_avr_eeprom_string_read/sketch_06_strings_in_flash_example/sketch_06_strings_in_flash_example.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_09_avr_eeprom_string_read/sketch_06_strings_in_flash_example/sketch_06_strings_in_flash_example.ino new file mode 100644 index 0000000..599c817 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_09_avr_eeprom_string_read/sketch_06_strings_in_flash_example/sketch_06_strings_in_flash_example.ino @@ -0,0 +1,12 @@ + + +void setup() +{ + Serial.begin(9600); +} + +void loop() +{ + Serial.println(F("Program Started")); + delay(1000); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_10_PROGMEM_array/sketch_06_10_PROGMEM_array.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_10_PROGMEM_array/sketch_06_10_PROGMEM_array.ino new file mode 100644 index 0000000..895cd2c --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_10_PROGMEM_array/sketch_06_10_PROGMEM_array.ino @@ -0,0 +1,19 @@ +// sketch_06_10_PROGMEM_array + +#include + +PROGMEM int value[] = {10, 20, 25, 25, 20, 10}; + +void setup() +{ + Serial.begin(9600); + for (int i = 0; i < 6; i++) + { + int x = pgm_read_word(&value[i]); + Serial.println(x); + } +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_free_memory_fn_test/sketch_06_free_memory_fn_test.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_free_memory_fn_test/sketch_06_free_memory_fn_test.ino new file mode 100644 index 0000000..d9edaba --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_free_memory_fn_test/sketch_06_free_memory_fn_test.ino @@ -0,0 +1,13 @@ +#include + +void setup() +{ + Serial.begin(115200); +} + +void loop() +{ + Serial.print("freeMemory()="); + Serial.println(freeMemory()); + delay(1000); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_xx_EEPROM_byte/sketch_06_xx_EEPROM_byte.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_xx_EEPROM_byte/sketch_06_xx_EEPROM_byte.ino new file mode 100644 index 0000000..0313cd8 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_06_xx_EEPROM_byte/sketch_06_xx_EEPROM_byte.ino @@ -0,0 +1,13 @@ +// sketch_06_0todo_EEPRROM_byte + +#include + +void setup() +{ + byte valueToSave = 123; + EEPROM.write(0, valueToSave); +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_07_01_I2C_TEA5767/sketch_07_01_I2C_TEA5767.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_07_01_I2C_TEA5767/sketch_07_01_I2C_TEA5767.ino new file mode 100644 index 0000000..c0e9747 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_07_01_I2C_TEA5767/sketch_07_01_I2C_TEA5767.ino @@ -0,0 +1,30 @@ +// sketch_07_01_I2C_TEA5767 + +#include + +void setup() +{ + Wire.begin(); + setFrequency(93.0); // MHz +} + +void loop() +{ +} + +void setFrequency(float frequency) +{ + unsigned int frequencyB = 4 * (frequency * 1000000 + 225000) / 32768; + byte frequencyH = frequencyB >> 8; + byte frequencyL = frequencyB & 0XFF; + + Wire.beginTransmission(0x60); + Wire.write(frequencyH); + Wire.write(frequencyL); + Wire.write(0xB0); + Wire.write(0x10); + Wire.write(0x00); + Wire.endTransmission(); + delay(100); +} + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_08_01_OneWire_List/sketch_08_01_OneWire_List.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_08_01_OneWire_List/sketch_08_01_OneWire_List.ino new file mode 100644 index 0000000..4acdcf7 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_08_01_OneWire_List/sketch_08_01_OneWire_List.ino @@ -0,0 +1,32 @@ +// sketch_08_01_OneWire_List + +#include + +OneWire bus(10); + +void setup() +{ + Serial.begin(9600); + byte address[8]; // 64 bits + while (bus.search(address)) + { + for(int i = 0; i < 7; i++) + { + Serial.print(address[i], HEX); + Serial.print(" "); + } + // checksum OK or Fail + if (OneWire::crc8(address, 7) == address[7]) + { + Serial.println(" CRC OK"); + } + else + { + Serial.println(" CRC FAIL"); + } + } +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_08_02_OneWire_DS18B20/sketch_08_02_OneWire_DS18B20.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_08_02_OneWire_DS18B20/sketch_08_02_OneWire_DS18B20.ino new file mode 100644 index 0000000..f6f2b53 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_08_02_OneWire_DS18B20/sketch_08_02_OneWire_DS18B20.ino @@ -0,0 +1,28 @@ +// sketch_08_02_OneWire_DS18B20 + +#include +#include + +const int busPin = 10; + +OneWire bus(busPin); +DallasTemperature sensors(&bus); +DeviceAddress sensor; + +void setup() +{ + Serial.begin(9600); + sensors.begin(); + if (!sensors.getAddress(sensor, 0)) + { + Serial.println("NO DS18B20 FOUND!"); + } +} + +void loop() +{ + sensors.requestTemperatures(); + float tempC = sensors.getTempC(sensor); + Serial.println(tempC); + delay(1000); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_08_03_OneWire_DS18B20_2/sketch_08_03_OneWire_DS18B20_2.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_08_03_OneWire_DS18B20_2/sketch_08_03_OneWire_DS18B20_2.ino new file mode 100644 index 0000000..bbacec5 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_08_03_OneWire_DS18B20_2/sketch_08_03_OneWire_DS18B20_2.ino @@ -0,0 +1,36 @@ +// sketch_08_03_OneWire_DS18B20_2 + +#include +#include + +const int busPin = 10; + +OneWire bus(busPin); +DallasTemperature sensors(&bus); +DeviceAddress sensor1; +DeviceAddress sensor2; + +void setup() +{ + Serial.begin(9600); + sensors.begin(); + if (!sensors.getAddress(sensor1, 0)) + { + Serial.println("DS18B20 NUMBER 1 NOT FOUND!"); + } + if (!sensors.getAddress(sensor2, 1)) + { + Serial.println("DS18B20 NUMBER 2 NOT FOUND!"); + } +} + +void loop() +{ + sensors.requestTemperatures(); + float tempC1 = sensors.getTempC(sensor1); + float tempC2 = sensors.getTempC(sensor2); + Serial.print(tempC1); + Serial.print(" "); + Serial.println(tempC2); + delay(1000); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_09_01_SPI_ADC/sketch_09_01_SPI_ADC.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_09_01_SPI_ADC/sketch_09_01_SPI_ADC.ino new file mode 100644 index 0000000..ddf5d98 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_09_01_SPI_ADC/sketch_09_01_SPI_ADC.ino @@ -0,0 +1,49 @@ +// sketch_09_01_SPI_ADC + +#include + +const int chipSelectPin = 10; + +void setup() +{ + Serial.begin(9600); + SPI.begin(); + pinMode(chipSelectPin, OUTPUT); + digitalWrite(chipSelectPin, HIGH); +} + +void loop() +{ + int reading = readADC(0); + Serial.println(reading); + delay(1000); +} + +int readADC(byte channel) +{ + unsigned int configWord = 0b11000 | channel; + byte configByteA = (configWord >> 1); + byte configByteB = ((configWord & 1) << 7); + digitalWrite(chipSelectPin, LOW); + SPI.transfer(configByteA); + byte readingH = SPI.transfer(configByteB); + byte readingL = SPI.transfer(0); + digitalWrite(chipSelectPin, HIGH); + + printByte(readingH); + printByte(readingL); + + int reading = ((readingH & 0b00011111) << 5) + ((readingL & 0b11111000) >> 3); + + return reading; +} + +void printByte(byte b) +{ + for (int i = 7; i >= 0; i--) + { + Serial.print(bitRead(b, i)); + } + Serial.print(" "); +} + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_01_PC_to_Arduino/sketch_10_01_PC_to_Arduino.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_01_PC_to_Arduino/sketch_10_01_PC_to_Arduino.ino new file mode 100644 index 0000000..e80dc7d --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_01_PC_to_Arduino/sketch_10_01_PC_to_Arduino.ino @@ -0,0 +1,33 @@ +// sketch_10_01_PC_to_Arduino + +const int readingPin = A0; + +boolean sendReadings = true; + +void setup() +{ + Serial.begin(9600); +} + +void loop() +{ + if (Serial.available()) + { + char ch = Serial.read(); + if (ch == 'g') + { + sendReadings = true; + } + else if (ch == 's') + { + sendReadings = false; + } + } + if (sendReadings) + { + int reading = analogRead(readingPin); + Serial.println(reading); + delay(1000); + } +} + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_02_Arduino_Sender/sketch_10_02_Arduino_Sender.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_02_Arduino_Sender/sketch_10_02_Arduino_Sender.ino new file mode 100644 index 0000000..a29fb70 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_02_Arduino_Sender/sketch_10_02_Arduino_Sender.ino @@ -0,0 +1,27 @@ +// sketch_10_02_Adruino_Sender + +#include "SoftwareSerial.h" + +const int readingPin = A1; +const int plusPin = A2; +const int gndPin = A0; + +SoftwareSerial sender(8, 9); // RX, TX + +void setup() +{ + pinMode(gndPin, OUTPUT); + pinMode(plusPin, OUTPUT); + digitalWrite(plusPin, HIGH); + sender.begin(9600); +} + +void loop() +{ + int reading = analogRead(readingPin); + byte h = highByte(reading); + byte l = lowByte(reading); + sender.write(h); + sender.write(l); + delay(1000); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_03_Arduino_Receiver/sketch_10_03_Arduino_Receiver.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_03_Arduino_Receiver/sketch_10_03_Arduino_Receiver.ino new file mode 100644 index 0000000..a86868e --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_03_Arduino_Receiver/sketch_10_03_Arduino_Receiver.ino @@ -0,0 +1,34 @@ +// sketch_10_03_Adruino_Receiver + +#include "SoftwareSerial.h" + +const int ledPin = 13; +int reading = 0; +SoftwareSerial receiver(8, 9); // RX, TX + +void setup() +{ + pinMode(ledPin, OUTPUT); + receiver.begin(9600); +} + +void loop() +{ + if (receiver.available() > 1) + { + byte h = receiver.read(); + byte l = receiver.read(); + reading = (h << 8) + l; + } + flash(reading); +} + +void flash(int rate) +{ + // 0 slow 1023 very fast + int period = (50 + (1023 - rate) / 4); + digitalWrite(ledPin, HIGH); + delay(period); + digitalWrite(ledPin, LOW); + delay(period); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_04_GPS/sketch_10_04_GPS.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_04_GPS/sketch_10_04_GPS.ino new file mode 100644 index 0000000..28cb26c --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_10_04_GPS/sketch_10_04_GPS.ino @@ -0,0 +1,75 @@ +#include + +SoftwareSerial gpsSerial(10, 11); // RX, TX (TX not used) +const int sentenceSize = 80; + +char sentence[sentenceSize]; + +void setup() +{ + Serial.begin(9600); + gpsSerial.begin(9600); +} + +void loop() +{ + static int i = 0; + if (gpsSerial.available()) + { + char ch = gpsSerial.read(); + if (ch != '\n' && i < sentenceSize) + { + sentence[i] = ch; + i++; + } + else + { + sentence[i] = '\0'; + i = 0; + Serial.println(sentence); + //displayGPS(); + } + } +} + +void displayGPS() +{ + char field[20]; + getField(field, 0); + if (strcmp(field, "$GPRMC") == 0) + { + Serial.print("Lat: "); + getField(field, 3); // number + Serial.print(field); + getField(field, 4); // N/S + Serial.print(field); + + Serial.print(" Long: "); + getField(field, 5); // number + Serial.print(field); + getField(field, 6); // E/W + Serial.println(field); + } +} + +void getField(char* buffer, int index) +{ + int sentencePos = 0; + int fieldPos = 0; + int commaCount = 0; + while (sentencePos < sentenceSize) + { + if (sentence[sentencePos] == ',') + { + commaCount ++; + sentencePos ++; + } + if (commaCount == index) + { + buffer[fieldPos] = sentence[sentencePos]; + fieldPos ++; + } + sentencePos ++; + } + buffer[fieldPos] = '\0'; +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_01_keyboard/sketch_11_01_keyboard.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_01_keyboard/sketch_11_01_keyboard.ino new file mode 100644 index 0000000..428b224 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_01_keyboard/sketch_11_01_keyboard.ino @@ -0,0 +1,16 @@ +// sketch_11_01_keyboard + +// Leonardo, Micro or Due required. + +char phrase[] = "secretpassword"; + +void setup() +{ + Keyboard.begin(); + delay(5000); + Keyboard.println(phrase); +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_02_mouse/sketch_11_02_mouse.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_02_mouse/sketch_11_02_mouse.ino new file mode 100644 index 0000000..8e50171 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_02_mouse/sketch_11_02_mouse.ino @@ -0,0 +1,16 @@ +// sketch_11_02_mouse + +// Leonardo, Micro or Due required. + +void setup() +{ + Mouse.begin(); +} + +void loop() +{ + int x = random(61) - 30; + int y = random(61) - 30; + Mouse.move(x, y); + delay(50); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_03_host_keyboard/sketch_11_03_host_keyboard.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_03_host_keyboard/sketch_11_03_host_keyboard.ino new file mode 100644 index 0000000..2fa2259 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_03_host_keyboard/sketch_11_03_host_keyboard.ino @@ -0,0 +1,322 @@ +// sketch_11_03_host_keyboard + +// This sketch is based on the LCDlbd example sketch from the USB_Host_Shield library + +#include +#include +#include + + +/* keyboard data taken from configuration descriptor */ +#define KBD_ADDR 1 +#define KBD_EP 1 +#define KBD_IF 0 +#define EP_MAXPKTSIZE 8 +#define EP_POLL 0x0a +/**/ +//****************************************************************************** +// macros to identify special charaters(other than Digits and Alphabets) +//****************************************************************************** +#define BANG (0x1E) +#define AT (0x1F) +#define POUND (0x20) +#define DOLLAR (0x21) +#define PERCENT (0x22) +#define CAP (0x23) +#define AND (0x24) +#define STAR (0x25) +#define OPENBKT (0x26) +#define CLOSEBKT (0x27) + +#define RETURN (0x28) +#define ESCAPE (0x29) +#define BACKSPACE (0x2A) +#define TAB (0x2B) +#define SPACE (0x2C) +#define HYPHEN (0x2D) +#define EQUAL (0x2E) +#define SQBKTOPEN (0x2F) +#define SQBKTCLOSE (0x30) +#define BACKSLASH (0x31) +#define SEMICOLON (0x33) +#define INVCOMMA (0x34) +#define TILDE (0x35) +#define COMMA (0x36) +#define PERIOD (0x37) +#define FRONTSLASH (0x38) +#define DELETE (0x4c) +/**/ +/* Modifier masks. One for both modifiers */ +#define SHIFT 0x22 +#define CTRL 0x11 +#define ALT 0x44 +#define GUI 0x88 +/**/ +/* "Sticky keys */ +#define CAPSLOCK (0x39) +#define NUMLOCK (0x53) +#define SCROLLLOCK (0x47) +/* Sticky keys output report bitmasks */ +#define bmNUMLOCK 0x01 +#define bmCAPSLOCK 0x02 +#define bmSCROLLLOCK 0x04 +/**/ +EP_RECORD ep_record[ 2 ]; //endpoint record structure for the keyboard + +char buf[ 8 ] = { 0 }; //keyboard buffer +char old_buf[ 8 ] = { 0 }; //last poll +/* Sticky key state */ +bool numLock = false; +bool capsLock = false; +bool scrollLock = false; + +MAX3421E Max; +USB Usb; + +void setup() { + // set up the LCD's number of rows and columns: + Serial.begin( 9600 ); + Serial.println("Start"); + Max.powerOn(); + delay( 200 ); +} + +void loop() { + Max.Task(); + Usb.Task(); + if( Usb.getUsbTaskState() == USB_STATE_CONFIGURING ) { //wait for addressing state + kbd_init(); + Usb.setUsbTaskState( USB_STATE_RUNNING ); + } + if( Usb.getUsbTaskState() == USB_STATE_RUNNING ) { //poll the keyboard + kbd_poll(); + } +} +/* Initialize keyboard */ +void kbd_init( void ) +{ + byte rcode = 0; //return code +/**/ + /* Initialize data structures */ + ep_record[ 0 ] = *( Usb.getDevTableEntry( 0,0 )); //copy endpoint 0 parameters + ep_record[ 1 ].MaxPktSize = EP_MAXPKTSIZE; + ep_record[ 1 ].Interval = EP_POLL; + ep_record[ 1 ].sndToggle = bmSNDTOG0; + ep_record[ 1 ].rcvToggle = bmRCVTOG0; + Usb.setDevTableEntry( 1, ep_record ); //plug kbd.endpoint parameters to devtable + /* Configure device */ + rcode = Usb.setConf( KBD_ADDR, 0, 1 ); + if( rcode ) { + Serial.print("Error attempting to configure keyboard. Return code :"); + Serial.println( rcode, HEX ); + while(1); //stop + } + /* Set boot protocol */ + rcode = Usb.setProto( KBD_ADDR, 0, 0, 0 ); + if( rcode ) { + Serial.print("Error attempting to configure boot protocol. Return code :"); + Serial.println( rcode, HEX ); + while( 1 ); //stop + } + Serial.println("Keyboard initialized"); + delay(2000); +} + +/* Poll keyboard and print result */ +/* buffer starts at position 2, 0 is modifier key state and 1 is irrelevant */ +void kbd_poll( void ) +{ + char i; + static char leds = 0; + byte rcode = 0; //return code + /* poll keyboard */ + rcode = Usb.inTransfer( KBD_ADDR, KBD_EP, 8, buf ); + if( rcode != 0 ) { + return; + }//if ( rcode.. + for( i = 2; i < 8; i++ ) { + if( buf[ i ] == 0 ) { //end of non-empty space + break; + } + if( buf_compare( buf[ i ] ) == false ) { //if new key + switch( buf[ i ] ) { + case CAPSLOCK: + capsLock =! capsLock; + leds = ( capsLock ) ? leds |= bmCAPSLOCK : leds &= ~bmCAPSLOCK; // set or clear bit 1 of LED report byte + break; + case NUMLOCK: + numLock =! numLock; + leds = ( numLock ) ? leds |= bmNUMLOCK : leds &= ~bmNUMLOCK; // set or clear bit 0 of LED report byte + break; + case SCROLLLOCK: + scrollLock =! scrollLock; + leds = ( scrollLock ) ? leds |= bmSCROLLLOCK : leds &= ~bmSCROLLLOCK; // set or clear bit 2 of LED report byte + break; + case DELETE: + break; + case RETURN: + Serial.println(); + break; + default: + Serial.write(HIDtoA( buf[ i ], buf[ 0 ] )); + break; + }//switch( buf[ i ... + rcode = Usb.setReport( KBD_ADDR, 0, 1, KBD_IF, 0x02, 0, &leds ); + if( rcode ) { + Serial.print("Set report error: "); + Serial.println( rcode, HEX ); + }//if( rcode ... + }//if( buf_compare( buf[ i ] ) == false ... + }//for( i = 2... + for( i = 2; i < 8; i++ ) { //copy new buffer to old + old_buf[ i ] = buf[ i ]; + } +} +/* compare byte against bytes in old buffer */ +bool buf_compare( byte data ) +{ + char i; + for( i = 2; i < 8; i++ ) { + if( old_buf[ i ] == data ) { + return( true ); + } + } + return( false ); +} + +/* HID to ASCII converter. Takes HID keyboard scancode, returns ASCII code */ +byte HIDtoA( byte HIDbyte, byte mod ) +{ + /* upper row of the keyboard, numbers and special symbols */ + if( HIDbyte >= 0x1e && HIDbyte <= 0x27 ) { + if(( mod & SHIFT ) || numLock ) { //shift key pressed + switch( HIDbyte ) { + case BANG: return( 0x21 ); + case AT: return( 0x40 ); + case POUND: return( 0x23 ); + case DOLLAR: return( 0x24 ); + case PERCENT: return( 0x25 ); + case CAP: return( 0x5e ); + case AND: return( 0x26 ); + case STAR: return( 0x2a ); + case OPENBKT: return( 0x28 ); + case CLOSEBKT: return( 0x29 ); + }//switch( HIDbyte... + } + else { //numbers + if( HIDbyte == 0x27 ) { //zero + return( 0x30 ); + } + else { + return( HIDbyte + 0x13 ); + } + }//numbers + }//if( HIDbyte >= 0x1e && HIDbyte <= 0x27 + /**/ + /* number pad. Arrows are not supported */ + if(( HIDbyte >= 0x59 && HIDbyte <= 0x61 ) && ( numLock == true )) { // numbers 1-9 + return( HIDbyte - 0x28 ); + } + if(( HIDbyte == 0x62 ) && ( numLock == true )) { //zero + return( 0x30 ); + } + /* Letters a-z */ + if( HIDbyte >= 0x04 && HIDbyte <= 0x1d ) { + if((( capsLock == true ) && ( mod & SHIFT ) == 0 ) || (( capsLock == false ) && ( mod & SHIFT ))) { //upper case + return( HIDbyte + 0x3d ); + } + else { //lower case + return( HIDbyte + 0x5d ); + } + }//if( HIDbyte >= 0x04 && HIDbyte <= 0x1d... + /* Other special symbols */ + if( HIDbyte >= 0x2c && HIDbyte <= 0x38 ) { + switch( HIDbyte ) { + case SPACE: return( 0x20 ); + case HYPHEN: + if(( mod & SHIFT ) == false ) { + return( 0x2d ); + } + else { + return( 0x5f ); + } + case EQUAL: + if(( mod & SHIFT ) == false ) { + return( 0x3d ); + } + else { + return( 0x2b ); + } + case SQBKTOPEN: + if(( mod & SHIFT ) == false ) { + return( 0x5b ); + } + else { + return( 0x7b ); + } + case SQBKTCLOSE: + if(( mod & SHIFT ) == false ) { + return( 0x5d ); + } + else { + return( 0x7d ); + } + case BACKSLASH: + if(( mod & SHIFT ) == false ) { + return( 0x5c ); + } + else { + return( 0x7c ); + } + case SEMICOLON: + if(( mod & SHIFT ) == false ) { + return( 0x3b ); + } + else { + return( 0x3a ); + } + case INVCOMMA: + if(( mod & SHIFT ) == false ) { + return( 0x27 ); + } + else { + return( 0x22 ); + } + case TILDE: + if(( mod & SHIFT ) == false ) { + return( 0x60 ); + } + else { + return( 0x7e ); + } + case COMMA: + if(( mod & SHIFT ) == false ) { + return( 0x2c ); + } + else { + return( 0x3c ); + } + case PERIOD: + if(( mod & SHIFT ) == false ) { + return( 0x2e ); + } + else { + return( 0x3e ); + } + case FRONTSLASH: + if(( mod & SHIFT ) == false ) { + return( 0x2f ); + } + else { + return( 0x3f ); + } + default: + break; + }//switch( HIDbyte.. + }//if( HIDbye >= 0x2d && HIDbyte <= 0x38.. + return( 0 ); +} + + + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_04_host_scroll_lock/sketch_11_04_host_scroll_lock.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_04_host_scroll_lock/sketch_11_04_host_scroll_lock.ino new file mode 100644 index 0000000..fc40e1f --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_04_host_scroll_lock/sketch_11_04_host_scroll_lock.ino @@ -0,0 +1,90 @@ +// sketch_11_04_host_scroll_lock + +// This sketch is based on the LCDlbd example sketch from the USB_Host_Shield library + +#include +#include +#include + + +/* keyboard data taken from configuration descriptor */ +#define KBD_ADDR 1 +#define KBD_EP 1 +#define KBD_IF 0 +#define EP_MAXPKTSIZE 8 +#define EP_POLL 0x0a + +/**/ +EP_RECORD ep_record[ 2 ]; //endpoint record structure for the keyboard + +char buf[ 8 ] = { 0 }; //keyboard buffer +char old_buf[ 8 ] = { 0 }; //last poll + +char leds = 0; + + +MAX3421E Max; +USB Usb; + +void setup() { + // set up the LCD's number of rows and columns: + Serial.begin( 9600 ); + Serial.println("Start"); + Max.powerOn(); + delay( 200 ); +} + +void loop() { + Max.Task(); + Usb.Task(); + if( Usb.getUsbTaskState() == USB_STATE_CONFIGURING ) { //wait for addressing state + kbd_init(); + Usb.setUsbTaskState( USB_STATE_RUNNING ); + } + if( Usb.getUsbTaskState() == USB_STATE_RUNNING ) { //poll the keyboard + toggleLEDs(); + delay(500); + } +} +/* Initialize keyboard */ +void kbd_init( void ) +{ + byte rcode = 0; //return code + ep_record[ 0 ] = *( Usb.getDevTableEntry( 0,0 )); //copy endpoint 0 parameters + ep_record[ 1 ].MaxPktSize = EP_MAXPKTSIZE; + ep_record[ 1 ].Interval = EP_POLL; + ep_record[ 1 ].sndToggle = bmSNDTOG0; + ep_record[ 1 ].rcvToggle = bmRCVTOG0; + Usb.setDevTableEntry( 1, ep_record ); //plug kbd.endpoint parameters to devtable + /* Configure device */ + rcode = Usb.setConf( KBD_ADDR, 0, 1 ); + if( rcode ) { + Serial.print("Error attempting to configure keyboard. Return code :"); + Serial.println( rcode, HEX ); + while(1); //stop + } + /* Set boot protocol */ + rcode = Usb.setProto( KBD_ADDR, 0, 0, 0 ); + if( rcode ) { + Serial.print("Error attempting to configure boot protocol. Return code :"); + Serial.println( rcode, HEX ); + while( 1 ); //stop + } + Serial.println("Keyboard initialized"); + delay(2000); +} + + +void toggleLEDs( void ) +{ + if (leds == 0) { + leds = 0b00000111; + } + else { + leds = 0; + } + Usb.setReport( KBD_ADDR, 0, 1, KBD_IF, 0x02, 0, &leds ); +} + + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_05_keyboard_due/sketch_11_05_keyboard_due.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_05_keyboard_due/sketch_11_05_keyboard_due.ino new file mode 100644 index 0000000..bfb14e9 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_05_keyboard_due/sketch_11_05_keyboard_due.ino @@ -0,0 +1,25 @@ +// sketch_11_05_keyboard_due + +#include + +USBHost usb; +KeyboardController keyboard(usb); + +void setup() +{ + Serial.begin(9600); + Serial.println("Program started"); + delay(200); +} + +void loop() +{ + usb.Task(); +} + +// This function intercepts key press +void keyPressed() +{ + char key = keyboard.getKey(); + Serial.write(key); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_06_mouse_due/sketch_11_06_mouse_due.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_06_mouse_due/sketch_11_06_mouse_due.ino new file mode 100644 index 0000000..ea3ac01 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_11_06_mouse_due/sketch_11_06_mouse_due.ino @@ -0,0 +1,29 @@ +// sketch_11_06_mouse_due + +#include + +USBHost usb; +MouseController mouse(usb); + +void setup() +{ + Serial.begin(9600); + Serial.println("Program started"); + delay(200); +} + +void loop() +{ + usb.Task(); +} + +// This function intercepts mouse movements +void mouseMoved() +{ + int x = mouse.getXChange(); + int y = mouse.getYChange(); + if (x > 50) Serial.print("R"); + if (x < -50) Serial.print("L"); + if (y > 50) Serial.print("D"); + if (y < -50) Serial.print("U"); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_01_dhcp/sketch_12_01_dhcp.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_01_dhcp/sketch_12_01_dhcp.ino new file mode 100644 index 0000000..8a19120 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_01_dhcp/sketch_12_01_dhcp.ino @@ -0,0 +1,28 @@ +// sketch_12_01_dhcp + +#include +#include + + +byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; + +void setup() +{ + Serial.begin(9600); + while (!Serial){}; + + if (Ethernet.begin(mac)) + { + Serial.println(Ethernet.localIP()); + } + else + { + Serial.println("Could not connect to network"); + } +} + +void loop() +{ +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_02_server/sketch_12_02_server.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_02_server/sketch_12_02_server.ino new file mode 100644 index 0000000..fe9417a --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_02_server/sketch_12_02_server.ino @@ -0,0 +1,181 @@ +// sketch_12_02_server + +#include +#include + +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +EthernetServer server(80); +EthernetClient client; + +const int numPins = 5; +int pins[] = {3, 4, 5, 6, 7}; +int pinState[] = {0, 0, 0, 0, 0}; +char line1[100]; +char buffer[100]; + +void setup() +{ + Serial.begin(9600); + while (!Serial){}; // Leonardo needs this + for (int i = 0; i < numPins; i++) + { + pinMode(pins[i], OUTPUT); + } + if (Ethernet.begin(mac)) + { + Serial.print(F("Point your Browser at: http://")); + Serial.println(Ethernet.localIP()); + } + else + { + Serial.println(F("Could not connect to network")); + } + server.begin(); +} + +void loop() +{ + client = server.available(); + if (client) + { + if (client.connected()) + { + readHeader(); + if (! pageNameIs("/")) + { + client.stop(); + return; + } + client.println(F("HTTP/1.1 200 OK")); + client.println(F("Content-Type: text/html")); + client.println(); + + sendBody(); + client.stop(); + } + } +} + +void sendBody() +{ + client.println(F("")); + sendAnalogReadings(); + client.println(F("

Output Pins

")); + client.println(F("
")); + setValuesFromParams(); + setPinStates(); + sendHTMLforPins(); + client.println(F("")); + client.println(F("
")); + client.println(F("")); +} + +void sendAnalogReadings() +{ + client.println(F("

Analog Inputs

")); + client.println(F("")); + for (int i = 0; i < 5; i++) + { + int reading = analogRead(i); + client.print(F("")); + } + client.println("
A")); client.print(i); + client.print(F("")); client.print((float) reading / 205.0); + client.println(F(" V
"); +} + +void sendHTMLforPins() +{ + for (int i = 0; i < numPins; i++) + { + client.print(F("

Pin ")); + client.print(pins[i]); + client.print(F("

")); + } +} + +void setPinStates() +{ + for (int i = 0; i < numPins; i++) + { + digitalWrite(pins[i], pinState[i]); + } +} + +void setValuesFromParams() +{ + for (int i = 0; i < numPins; i++) + { + pinState[i] = valueOfParam(i + '0'); + } +} + +void readHeader() +{ + readRequestLine(line1); + while (readRequestLine(buffer) > 1 && buffer[0] != '\n') {} +} + +int readRequestLine(char *line) +{ + char ch; + int i = 0; + while (ch != '\n' && i < 100 && client.available()) + { + if (client.available()) + { + ch = client.read(); + line[i] = ch; + i ++; + } + } + line[i] = '\0'; + return i; +} + +boolean pageNameIs(char* name) +{ + // page name starts at char pos 4 + // ends with space + int i = 4; + char ch = line1[i]; + while (ch != ' ' && ch != '\n' && ch != '?') + { + if (name[i-4] != line1[i]) + { + return false; + } + i++; + ch = line1[i]; + } + return true; +} + +int valueOfParam(char param) +{ + for (int i = 0; i < strlen(line1); i++) + { + if (line1[i] == param && line1[i+1] == '=') + { + return (line1[i+2] - '0'); + } + } + return 0; +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_03_web_request/sketch_12_03_web_request.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_03_web_request/sketch_12_03_web_request.ino new file mode 100644 index 0000000..f0db0e1 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_03_web_request/sketch_12_03_web_request.ino @@ -0,0 +1,45 @@ + +// sketch_12_03_web_request + +#include +#include + +byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; + +EthernetClient client; + +void setup() +{ + Serial.begin(9600); + while (!Serial){}; // for Leonardo compatability + + if (! Ethernet.begin(mac)) + { + Serial.println("Could not connect to network"); + } + delay(1000); + hitWebPage(); +} + +void loop() +{ +} + +void hitWebPage() +{ + if (client.connect("api.openweathermap.org", 80)) + { + client.println("GET /data/2.5/weather?q=Manchester,uk HTTP/1.0"); + client.println(); + while (client.connected()) + { + if (client.available()) + { + client.findUntil("description\":\"", "\0"); + String description = client.readStringUntil('\"'); + Serial.println(description); + } + } + client.stop(); + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_04_server_wifi/sketch_12_04_server_wifi.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_04_server_wifi/sketch_12_04_server_wifi.ino new file mode 100644 index 0000000..6e95dca --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_04_server_wifi/sketch_12_04_server_wifi.ino @@ -0,0 +1,175 @@ +// sketch_12_04_server_wifi + +#include +#include + +char ssid[] = "My network name"; // your network SSID (name) +char pass[] = "mypassword"; // your network password + +WiFiServer server(80); +WiFiClient client; + +const int numPins = 5; +int pins[] = {3, 8, 5, 6, 9}; +int pinState[] = {0, 0, 0, 0, 0}; +char line1[100]; +char buffer[100]; + +void setup() +{ + Serial.begin(9600); + while (!Serial){}; // Leonardo needs this + for (int i = 0; i < numPins; i++) + { + pinMode(pins[i], OUTPUT); + } + if (WiFi.begin(ssid, pass)) + { + Serial.print(F("Point your Browser at: http://")); + Serial.println(WiFi.localIP()); + } + else + { + Serial.println(F("Could not connect to network")); + } + server.begin(); +} + +void loop() +{ + client = server.available(); + if (client) + { + if (client.connected()) + { + readHeader(); + if (! pageNameIs("/")) + { + client.stop(); + return; + } + client.println(F("HTTP/1.1 200 OK\nContent-Type: text/html\n")); + sendBody(); + delay(1); + client.stop(); + } + } +} + +void sendBody() +{ + client.println(F("")); + sendAnalogReadings(); + client.println(F("

Output Pins

\n
")); + setValuesFromParams(); + setPinStates(); + sendHTMLforPins(); + client.println(F("\n
\n")); +} + +void sendAnalogReadings() +{ + client.println(F("

Analog Inputs

\n")); + for (int i = 0; i < 5; i++) + { + int reading = analogRead(i); + client.print(F("")); + } + client.println("
A")); client.print(i); + client.print(F("")); client.print((float) reading / 205.0); + client.println(F(" V
"); +} + +void sendHTMLforPins() +{ + for (int i = 0; i < numPins; i++) + { + client.print(F("

Pin ")); + client.print(pins[i]); + client.print(F("

")); + } +} + +void setPinStates() +{ + for (int i = 0; i < numPins; i++) + { + digitalWrite(pins[i], pinState[i]); + } +} + +void setValuesFromParams() +{ + for (int i = 0; i < numPins; i++) + { + pinState[i] = valueOfParam(i + '0'); + } +} + +void readHeader() +{ + readRequestLine(line1); + while (readRequestLine(buffer) > 1 && buffer[0] != '\n') {} +} + +int readRequestLine(char *line) +{ + char ch; + int i = 0; + while (ch != '\n' && i < 100 && client.available()) + { + if (client.available()) + { + ch = client.read(); + line[i] = ch; + i ++; + } + } + line[i] = '\0'; + return i; +} + +boolean pageNameIs(char* name) +{ + // page name starts at char pos 4 + // ends with space + int i = 4; + char ch = line1[i]; + while (ch != ' ' && ch != '\n' && ch != '?') + { + if (name[i-4] != line1[i]) + { + return false; + } + i++; + ch = line1[i]; + } + return true; +} + +int valueOfParam(char param) +{ + for (int i = 0; i < strlen(line1); i++) + { + if (line1[i] == param && line1[i+1] == '=') + { + return (line1[i+2] - '0'); + } + } + return 0; +} + + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_04_server_wifi_experimental/sketch_12_04_server_wifi_experimental.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_04_server_wifi_experimental/sketch_12_04_server_wifi_experimental.ino new file mode 100644 index 0000000..8f9cb64 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_12_04_server_wifi_experimental/sketch_12_04_server_wifi_experimental.ino @@ -0,0 +1,226 @@ +// sketch_12_04_server_wifi + +#include +#include + +char ssid[] = "Linda-and-Simon"; // your network SSID (name) +char pass[] = "myroomistidy"; // your network password + +WiFiServer server(80); +WiFiClient client; + +const int numPins = 5; +int pins[] = {3, 4, 5, 6, 7}; +int pinState[] = {0, 0, 0, 0, 0}; +char line1[100]; + +void setup() +{ + Serial.begin(9600); + while (!Serial){}; // Leonardo needs this + for (int i = 0; i < numPins; i++) + { + pinMode(pins[i], OUTPUT); + } + if (WiFi.begin(ssid, pass)) + { + Serial.print(F("Point your Browser at: http://")); + Serial.println(WiFi.localIP()); + delay(3000); + } + else + { + Serial.println(F("Could not connect to network")); + } + server.begin(); + Serial.println("started the server"); +} + +void loop() +{ + client = server.available(); + if (client && client.connected()) + { + readRequest(); + sendResponse(); + } +} + +void readRequest() +{ + waitForClient(); + readHeader(); + Serial.print("Line1="); + Serial.println(line1); + + if (! pageNameIs("/")) + { + Serial.println("Wrong Page"); + client.stop(); + return; + } + Serial.println("Right Page"); +} + +void sendResponse() +{ + client = server.available(); + if (client && client.connected()) + { + sendHeader(); + Serial.println("Sent Header"); + sendBody(); + Serial.println("Sent Body"); + delay(1); + client.stop(); + } +} + +void waitForClient() +{ + while (! client.available()) {}; +} + + +void sendHeader() +{ + client.println(F("HTTP/1.1 200 OK")); + client.println(F("Content-Type: text/html")); + client.println(); +} + +void sendBody() +{ + client.println(F("")); + sendAnalogReadings(); + client.println(F("

Output Pins

")); + client.println(F("
")); +// setValuesFromParams(); +// setPinStates(); +// sendHTMLforPins(); + client.println(F("")); + client.println(F("
")); + client.println(F("")); +} + +void sendAnalogReadings() +{ + client.println(F("

Analog Inputs

")); + client.println(F("")); + for (int i = 0; i < 5; i++) + { + int reading = analogRead(i); + client.print(F("")); + } + client.println("
A")); client.print(i); + client.print(F("")); client.print((float) reading / 205.0); + client.println(F(" V
"); +} + +void sendHTMLforPins() +{ + for (int i = 0; i < numPins; i++) + { + client.print(F("

Pin ")); + client.print(pins[i]); + client.print(F("

")); + } +} + +void setPinStates() +{ + for (int i = 0; i < numPins; i++) + { + digitalWrite(pins[i], pinState[i]); + } +} + +void setValuesFromParams() +{ + for (int i = 0; i < numPins; i++) + { + pinState[i] = valueOfParam(i + '0'); + } +} + +void readHeader() +{ + readRequestLine(line1); + char buffer[100]; + while (readRequestLine(buffer) > 1 && buffer[0] != '\n') + { + Serial.println("read another line"); + } + Serial.println("Finished Reading Request"); +} + +int readRequestLine(char *line) +{ + char ch; + int i = 0; + while (ch != '\n' && i < 100 && client.available()) + { + if (client.available()) + { + ch = client.read(); + line[i] = ch; + i ++; + } + } + line[i] = '\0'; + Serial.print("Header Line:"); + Serial.print(line); + Serial.print(" len="); + Serial.print(i); + Serial.print(" ch0="); + Serial.println((int)line[0]); + return i; +} + + +boolean pageNameIs(char* name) +{ + // page name starts at char pos 4 + // ends with space + int i = 4; + char ch = line1[i]; + while (ch != ' ' && ch != '\n' && ch != '?') + { + if (name[i-4] != line1[i]) + { + return false; + } + i++; + ch = line1[i]; + } + return true; +} + +int valueOfParam(char param) +{ + for (int i = 0; i < strlen(line1); i++) + { + if (line1[i] == param && line1[i+1] == '=') + { + return (line1[i+2] - '0'); + } + } + return 0; +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_01_averaging/sketch_13_01_averaging.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_01_averaging/sketch_13_01_averaging.ino new file mode 100644 index 0000000..f3be873 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_01_averaging/sketch_13_01_averaging.ino @@ -0,0 +1,37 @@ +// sketch_13_01_averaging + +const int samplePin = A1; + +const int bufferSize = 10; +int buffer[bufferSize]; +int index; + +void setup() +{ + Serial.begin(9600); +} + +void loop() +{ + int reading = analogRead(samplePin); + addReading(reading); + Serial.println(average()); + delay(1000); +} + +void addReading(int reading) +{ + buffer[index] = reading; + index++; + if (index >= bufferSize) index = 0; +} + +int average() +{ + long sum = 0; + for (int i = 0; i < bufferSize; i++) + { + sum += buffer[i]; + } + return (int)(sum / bufferSize); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_02_simple_smoothing/sketch_13_02_simple_smoothing.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_02_simple_smoothing/sketch_13_02_simple_smoothing.ino new file mode 100644 index 0000000..c663bc2 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_02_simple_smoothing/sketch_13_02_simple_smoothing.ino @@ -0,0 +1,19 @@ +// sketch_13_02_simple_smoothing +const int samplePin = A1; +const float alpha = 0.9; + +void setup() +{ + Serial.begin(9600); +} + +void loop() +{ + static float smoothedValue = 0.0; + float newReading = (float)analogRead(samplePin); + smoothedValue = (alpha * smoothedValue) + ((1 - alpha) * newReading); + Serial.print(newReading); Serial.print(","); + Serial.println(smoothedValue); + delay(1000); +} + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_03_60Hz_band_stop/sketch_13_03_60Hz_band_stop.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_03_60Hz_band_stop/sketch_13_03_60Hz_band_stop.ino new file mode 100644 index 0000000..7f75c00 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_03_60Hz_band_stop/sketch_13_03_60Hz_band_stop.ino @@ -0,0 +1,57 @@ +#include + +//http://www.schwietering.com/jayduino/filtuino/index.php?characteristic=bu&passmode=bs&order=2&usesr=usesr&sr=200&frequencyLow=49¬eLow=&frequencyHigh=51¬eHigh=&pw=pw&calctype=float&run=Send + +const int analogInPin = A0; +const int analogOutPin = 9; + +const byte PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); +const byte PS_16 = (1 << ADPS2); + + +float v[5]; + +void setup() +{ + ADCSRA &= ~PS_128; // remove prescale of 128 + ADCSRA |= PS_16; // add prescale of 16 (1MHz) + + for(int i=0; i <= 6; i++) + { + v[i]=0.0; + } +// Timer1.initialize(10000); // uS + Timer1.attachInterrupt(sample); + Timer1.pwm(analogOutPin, 0, 100); + Serial.begin(115200); +} + +void loop() +{ +} + +void sample() +{ + int raw = analogRead(analogInPin); + int smoothed = (int)(step(raw)); + // Serial.print(raw); Serial.print(","); Serial.println(smoothed); + Timer1.setPwmDuty(analogOutPin, raw); +} + +float step(float x) +{ + v[0] = v[1]; + v[1] = v[2]; + v[2] = v[3]; + v[3] = v[4]; + v[4] = (9.991118180304e-1 * x) + + ( -0.9982244250 * v[0]) + + ( 3.9918341618 * v[1]) + + ( -5.9889945425 * v[2]) + + ( 3.9953827892 * v[3]); + return + (v[0] + v[4]) + - 3.997159 * v[1] + - 3.997159 * v[3] + +5.994319 * v[2]; +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_03_null_filter_uno/sketch_13_03_null_filter_uno.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_03_null_filter_uno/sketch_13_03_null_filter_uno.ino new file mode 100644 index 0000000..9a4151f --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_03_null_filter_uno/sketch_13_03_null_filter_uno.ino @@ -0,0 +1,22 @@ +// sketch_13_03_null_filter_uno + +#include + +const int analogInPin = A0; +const int analogOutPin = 9; + +void setup() +{ + Timer1.attachInterrupt(sample); + Timer1.pwm(analogOutPin, 0, 100); +} + +void loop() +{ +} + +void sample() +{ + int raw = analogRead(analogInPin); + Timer1.setPwmDuty(analogOutPin, raw); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_04_null_filter_due/sketch_13_04_null_filter_due.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_04_null_filter_due/sketch_13_04_null_filter_due.ino new file mode 100644 index 0000000..84ad330 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_04_null_filter_due/sketch_13_04_null_filter_due.ino @@ -0,0 +1,27 @@ +// sketch_13_04_null_filter_due + +const long samplePeriod = 10L; // micro seconds + +const int analogInPin = A0; +const int analogOutPin = DAC0; + +void setup() +{ + // http://www.djerickson.com/arduino/ + REG_ADC_MR = (REG_ADC_MR & 0xFFF0FFFF) | 0x00020000; + analogWriteResolution(8); + analogReadResolution(8); +} + +void loop() +{ + static long lastSampleTime = 0; + long timeNow = micros(); + if (timeNow > lastSampleTime + samplePeriod) + { + int raw = analogRead(analogInPin); + analogWrite(analogOutPin, raw); + lastSampleTime = timeNow; + } +} + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_05_band_stop_due/sketch_13_05_band_stop_due.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_05_band_stop_due/sketch_13_05_band_stop_due.ino new file mode 100644 index 0000000..3abb71b --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_05_band_stop_due/sketch_13_05_band_stop_due.ino @@ -0,0 +1,62 @@ +// sketch_13_05_band_stop_due + +const long samplePeriod = 23L; // micro seconds + +const int analogInPin = A0; +const int analogOutPin = DAC0; + +// 1000 to 1500 band stop filter +// 44100 Hz sample rate +// http://www.schwietering.com/jayduino/filtuino/index.php?characteristic=bu&passmode=bs&order=1&usesr=usesr&sr=44100&frequencyLow=1000¬eLow=&frequencyHigh=1500¬eHigh=&pw=pw&calctype=float&run=Send + +//Band stop butterworth filter order=1 alpha1=0.022675736961451 alpha2=0.034013605442177 +class filter +{ + public: + filter() + { + v[0]=0.0; + v[1]=0.0; + } + private: + float v[3]; + public: + float step(float x) + { + v[0] = v[1]; + v[1] = v[2]; + v[2] = (9.655920584452e-1 * x) + + ( -0.9311841169 * v[0]) + + ( 1.9018448769 * v[1]); + return + (v[0] + v[2]) + - 1.969615 * v[1]; + } +}; + + +filter f; + + +void setup() +{ + // http://www.djerickson.com/arduino/ + REG_ADC_MR = (REG_ADC_MR & 0xFFF0FFFF) | 0x00020000; + analogWriteResolution(8); + analogReadResolution(8); +} + +void loop() +{ + static long lastSampleTime = 0; + long timeNow = micros(); + if (timeNow > lastSampleTime + samplePeriod) + { + int raw = analogRead(analogInPin); + + float filtered = f.step(raw); + + analogWrite(analogOutPin, (int)filtered); + lastSampleTime = timeNow; + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_06_FFT_Spectrum/fix_fft.cpp b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_06_FFT_Spectrum/fix_fft.cpp new file mode 100644 index 0000000..f98b117 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_06_FFT_Spectrum/fix_fft.cpp @@ -0,0 +1,268 @@ +#include +#include "fix_fft.h" +#include + +/* fix_fft.c - Fixed-point in-place Fast Fourier Transform */ +/* + All data are fixed-point short integers, in which -32768 + to +32768 represent -1.0 to +1.0 respectively. Integer + arithmetic is used for speed, instead of the more natural + floating-point. + + For the forward FFT (time -> freq), fixed scaling is + performed to prevent arithmetic overflow, and to map a 0dB + sine/cosine wave (i.e. amplitude = 32767) to two -6dB freq + coefficients. The return value is always 0. + + For the inverse FFT (freq -> time), fixed scaling cannot be + done, as two 0dB coefficients would sum to a peak amplitude + of 64K, overflowing the 32k range of the fixed-point integers. + Thus, the fix_fft() routine performs variable scaling, and + returns a value which is the number of bits LEFT by which + the output must be shifted to get the actual amplitude + (i.e. if fix_fft() returns 3, each value of fr[] and fi[] + must be multiplied by 8 (2**3) for proper scaling. + Clearly, this cannot be done within fixed-point short + integers. In practice, if the result is to be used as a + filter, the scale_shift can usually be ignored, as the + result will be approximately correctly normalized as is. + + Written by: Tom Roberts 11/8/89 + Made portable: Malcolm Slaney 12/15/94 malcolm@interval.com + Enhanced: Dimitrios P. Bouras 14 Jun 2006 dbouras@ieee.org + Modified for 8bit values David Keller 10.10.2010 +*/ + + +#define N_WAVE 256 /* full length of Sinewave[] */ +#define LOG2_N_WAVE 8 /* log2(N_WAVE) */ + + + + +/* + Since we only use 3/4 of N_WAVE, we define only + this many samples, in order to conserve data space. +*/ + + + +const prog_int8_t Sinewave[N_WAVE-N_WAVE/4] PROGMEM = { +0, 3, 6, 9, 12, 15, 18, 21, +24, 28, 31, 34, 37, 40, 43, 46, +48, 51, 54, 57, 60, 63, 65, 68, +71, 73, 76, 78, 81, 83, 85, 88, +90, 92, 94, 96, 98, 100, 102, 104, +106, 108, 109, 111, 112, 114, 115, 117, +118, 119, 120, 121, 122, 123, 124, 124, +125, 126, 126, 127, 127, 127, 127, 127, + +127, 127, 127, 127, 127, 127, 126, 126, +125, 124, 124, 123, 122, 121, 120, 119, +118, 117, 115, 114, 112, 111, 109, 108, +106, 104, 102, 100, 98, 96, 94, 92, +90, 88, 85, 83, 81, 78, 76, 73, +71, 68, 65, 63, 60, 57, 54, 51, +48, 46, 43, 40, 37, 34, 31, 28, +24, 21, 18, 15, 12, 9, 6, 3, + +0, -3, -6, -9, -12, -15, -18, -21, +-24, -28, -31, -34, -37, -40, -43, -46, +-48, -51, -54, -57, -60, -63, -65, -68, +-71, -73, -76, -78, -81, -83, -85, -88, +-90, -92, -94, -96, -98, -100, -102, -104, +-106, -108, -109, -111, -112, -114, -115, -117, +-118, -119, -120, -121, -122, -123, -124, -124, +-125, -126, -126, -127, -127, -127, -127, -127, + +/*-127, -127, -127, -127, -127, -127, -126, -126, +-125, -124, -124, -123, -122, -121, -120, -119, +-118, -117, -115, -114, -112, -111, -109, -108, +-106, -104, -102, -100, -98, -96, -94, -92, +-90, -88, -85, -83, -81, -78, -76, -73, +-71, -68, -65, -63, -60, -57, -54, -51, +-48, -46, -43, -40, -37, -34, -31, -28, +-24, -21, -18, -15, -12, -9, -6, -3, */ +}; + + + + + + +/* + FIX_MPY() - fixed-point multiplication & scaling. + Substitute inline assembly for hardware-specific + optimization suited to a particluar DSP processor. + Scaling ensures that result remains 16-bit. +*/ +inline char FIX_MPY(char a, char b) +{ + + //Serial.println(a); + //Serial.println(b); + + + /* shift right one less bit (i.e. 15-1) */ + int c = ((int)a * (int)b) >> 6; + /* last bit shifted out = rounding-bit */ + b = c & 0x01; + /* last shift + rounding bit */ + a = (c >> 1) + b; + + /* + Serial.println(Sinewave[3]); + Serial.println(c); + Serial.println(a); + while(1);*/ + + return a; +} + +/* + fix_fft() - perform forward/inverse fast Fourier transform. + fr[n],fi[n] are real and imaginary arrays, both INPUT AND + RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to + 0 for forward transform (FFT), or 1 for iFFT. +*/ +int fix_fft(char fr[], char fi[], int m, int inverse) +{ + int mr, nn, i, j, l, k, istep, n, scale, shift; + char qr, qi, tr, ti, wr, wi; + + n = 1 << m; + + /* max FFT size = N_WAVE */ + if (n > N_WAVE) + return -1; + + mr = 0; + nn = n - 1; + scale = 0; + + /* decimation in time - re-order data */ + for (m=1; m<=nn; ++m) { + l = n; + do { + l >>= 1; + } while (mr+l > nn); + mr = (mr & (l-1)) + l; + + if (mr <= m) + continue; + tr = fr[m]; + fr[m] = fr[mr]; + fr[mr] = tr; + ti = fi[m]; + fi[m] = fi[mr]; + fi[mr] = ti; + } + + l = 1; + k = LOG2_N_WAVE-1; + while (l < n) { + if (inverse) { + /* variable scaling, depending upon data */ + shift = 0; + for (i=0; i 16383 || m > 16383) { + shift = 1; + break; + } + } + if (shift) + ++scale; + } else { + /* + fixed scaling, for proper normalization -- + there will be log2(n) passes, so this results + in an overall factor of 1/n, distributed to + maximize arithmetic accuracy. + */ + shift = 1; + } + /* + it may not be obvious, but the shift will be + performed on each data point exactly once, + during this pass. + */ + istep = l << 1; + for (m=0; m>= 1; + wi >>= 1; + } + for (i=m; i>= 1; + qi >>= 1; + } + fr[j] = qr - tr; + fi[j] = qi - ti; + fr[i] = qr + tr; + fi[i] = qi + ti; + } + } + --k; + l = istep; + } + return scale; +} + +/* + fix_fftr() - forward/inverse FFT on array of real numbers. + Real FFT/iFFT using half-size complex FFT by distributing + even/odd samples into real/imaginary arrays respectively. + In order to save data space (i.e. to avoid two arrays, one + for real, one for imaginary samples), we proceed in the + following two steps: a) samples are rearranged in the real + array so that all even samples are in places 0-(N/2-1) and + all imaginary samples in places (N/2)-(N-1), and b) fix_fft + is called with fr and fi pointing to index 0 and index N/2 + respectively in the original array. The above guarantees + that fix_fft "sees" consecutive real samples as alternating + real and imaginary samples in the complex array. +*/ +int fix_fftr(char f[], int m, int inverse) +{ + int i, N = 1<<(m-1), scale = 0; + char tt, *fr=f, *fi=&f[N]; + + if (inverse) + scale = fix_fft(fi, fr, m-1, inverse); + for (i=1; i + + + + +/* + fix_fft() - perform forward/inverse fast Fourier transform. + fr[n],fi[n] are real and imaginary arrays, both INPUT AND + RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to + 0 for forward transform (FFT), or 1 for iFFT. +*/ +int fix_fft(char fr[], char fi[], int m, int inverse); + + + +/* + fix_fftr() - forward/inverse FFT on array of real numbers. + Real FFT/iFFT using half-size complex FFT by distributing + even/odd samples into real/imaginary arrays respectively. + In order to save data space (i.e. to avoid two arrays, one + for real, one for imaginary samples), we proceed in the + following two steps: a) samples are rearranged in the real + array so that all even samples are in places 0-(N/2-1) and + all imaginary samples in places (N/2)-(N-1), and b) fix_fft + is called with fr and fi pointing to index 0 and index N/2 + respectively in the original array. The above guarantees + that fix_fft "sees" consecutive real samples as alternating + real and imaginary samples in the complex array. +*/ +int fix_fftr(char f[], int m, int inverse); + + + + +#endif + + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_06_FFT_Spectrum/sketch_13_06_FFT_Spectrum.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_06_FFT_Spectrum/sketch_13_06_FFT_Spectrum.ino new file mode 100644 index 0000000..ed1e6cb --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_06_FFT_Spectrum/sketch_13_06_FFT_Spectrum.ino @@ -0,0 +1,58 @@ +// sketch_13_06_FFT_Spectrum + +#include "fix_fft.h" + +const int analogPin = A0; +const long GAIN = 5; +char im[128]; +char data[128]; + +const byte PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); +const byte PS_16 = (1 << ADPS2); + + +void setup() +{ + Serial.begin(9600); + ADCSRA &= ~PS_128; // remove prescale of 128 + ADCSRA |= PS_16; // add prescale of 16 (1MHz) +} + +void loop() +{ + sampleWindowFull(); + fix_fft(data, im, 7, 0); + updateData(); + + showSpectrum(); +} + +void sampleWindowFull() +{ + for (int i = 0; i < 128; i++) + { + int val = (analogRead(analogPin) - 512) * GAIN; + data[i] = val / 4; + im[i] = 0; + } +} + +void updateData() +{ + for (int i = 0; i < 64; i++) + { + data[i] = sqrt(data[i] * data[i] + im[i] * im[i]); + } +} + + +void showSpectrum() +{ + for (int i = 1; i < 64; i++) + { + int p = data[i]; + Serial.print(p); + Serial.print(","); + } + Serial.println(); +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_07_FFT_Freq/fix_fft.cpp b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_07_FFT_Freq/fix_fft.cpp new file mode 100644 index 0000000..f98b117 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_07_FFT_Freq/fix_fft.cpp @@ -0,0 +1,268 @@ +#include +#include "fix_fft.h" +#include + +/* fix_fft.c - Fixed-point in-place Fast Fourier Transform */ +/* + All data are fixed-point short integers, in which -32768 + to +32768 represent -1.0 to +1.0 respectively. Integer + arithmetic is used for speed, instead of the more natural + floating-point. + + For the forward FFT (time -> freq), fixed scaling is + performed to prevent arithmetic overflow, and to map a 0dB + sine/cosine wave (i.e. amplitude = 32767) to two -6dB freq + coefficients. The return value is always 0. + + For the inverse FFT (freq -> time), fixed scaling cannot be + done, as two 0dB coefficients would sum to a peak amplitude + of 64K, overflowing the 32k range of the fixed-point integers. + Thus, the fix_fft() routine performs variable scaling, and + returns a value which is the number of bits LEFT by which + the output must be shifted to get the actual amplitude + (i.e. if fix_fft() returns 3, each value of fr[] and fi[] + must be multiplied by 8 (2**3) for proper scaling. + Clearly, this cannot be done within fixed-point short + integers. In practice, if the result is to be used as a + filter, the scale_shift can usually be ignored, as the + result will be approximately correctly normalized as is. + + Written by: Tom Roberts 11/8/89 + Made portable: Malcolm Slaney 12/15/94 malcolm@interval.com + Enhanced: Dimitrios P. Bouras 14 Jun 2006 dbouras@ieee.org + Modified for 8bit values David Keller 10.10.2010 +*/ + + +#define N_WAVE 256 /* full length of Sinewave[] */ +#define LOG2_N_WAVE 8 /* log2(N_WAVE) */ + + + + +/* + Since we only use 3/4 of N_WAVE, we define only + this many samples, in order to conserve data space. +*/ + + + +const prog_int8_t Sinewave[N_WAVE-N_WAVE/4] PROGMEM = { +0, 3, 6, 9, 12, 15, 18, 21, +24, 28, 31, 34, 37, 40, 43, 46, +48, 51, 54, 57, 60, 63, 65, 68, +71, 73, 76, 78, 81, 83, 85, 88, +90, 92, 94, 96, 98, 100, 102, 104, +106, 108, 109, 111, 112, 114, 115, 117, +118, 119, 120, 121, 122, 123, 124, 124, +125, 126, 126, 127, 127, 127, 127, 127, + +127, 127, 127, 127, 127, 127, 126, 126, +125, 124, 124, 123, 122, 121, 120, 119, +118, 117, 115, 114, 112, 111, 109, 108, +106, 104, 102, 100, 98, 96, 94, 92, +90, 88, 85, 83, 81, 78, 76, 73, +71, 68, 65, 63, 60, 57, 54, 51, +48, 46, 43, 40, 37, 34, 31, 28, +24, 21, 18, 15, 12, 9, 6, 3, + +0, -3, -6, -9, -12, -15, -18, -21, +-24, -28, -31, -34, -37, -40, -43, -46, +-48, -51, -54, -57, -60, -63, -65, -68, +-71, -73, -76, -78, -81, -83, -85, -88, +-90, -92, -94, -96, -98, -100, -102, -104, +-106, -108, -109, -111, -112, -114, -115, -117, +-118, -119, -120, -121, -122, -123, -124, -124, +-125, -126, -126, -127, -127, -127, -127, -127, + +/*-127, -127, -127, -127, -127, -127, -126, -126, +-125, -124, -124, -123, -122, -121, -120, -119, +-118, -117, -115, -114, -112, -111, -109, -108, +-106, -104, -102, -100, -98, -96, -94, -92, +-90, -88, -85, -83, -81, -78, -76, -73, +-71, -68, -65, -63, -60, -57, -54, -51, +-48, -46, -43, -40, -37, -34, -31, -28, +-24, -21, -18, -15, -12, -9, -6, -3, */ +}; + + + + + + +/* + FIX_MPY() - fixed-point multiplication & scaling. + Substitute inline assembly for hardware-specific + optimization suited to a particluar DSP processor. + Scaling ensures that result remains 16-bit. +*/ +inline char FIX_MPY(char a, char b) +{ + + //Serial.println(a); + //Serial.println(b); + + + /* shift right one less bit (i.e. 15-1) */ + int c = ((int)a * (int)b) >> 6; + /* last bit shifted out = rounding-bit */ + b = c & 0x01; + /* last shift + rounding bit */ + a = (c >> 1) + b; + + /* + Serial.println(Sinewave[3]); + Serial.println(c); + Serial.println(a); + while(1);*/ + + return a; +} + +/* + fix_fft() - perform forward/inverse fast Fourier transform. + fr[n],fi[n] are real and imaginary arrays, both INPUT AND + RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to + 0 for forward transform (FFT), or 1 for iFFT. +*/ +int fix_fft(char fr[], char fi[], int m, int inverse) +{ + int mr, nn, i, j, l, k, istep, n, scale, shift; + char qr, qi, tr, ti, wr, wi; + + n = 1 << m; + + /* max FFT size = N_WAVE */ + if (n > N_WAVE) + return -1; + + mr = 0; + nn = n - 1; + scale = 0; + + /* decimation in time - re-order data */ + for (m=1; m<=nn; ++m) { + l = n; + do { + l >>= 1; + } while (mr+l > nn); + mr = (mr & (l-1)) + l; + + if (mr <= m) + continue; + tr = fr[m]; + fr[m] = fr[mr]; + fr[mr] = tr; + ti = fi[m]; + fi[m] = fi[mr]; + fi[mr] = ti; + } + + l = 1; + k = LOG2_N_WAVE-1; + while (l < n) { + if (inverse) { + /* variable scaling, depending upon data */ + shift = 0; + for (i=0; i 16383 || m > 16383) { + shift = 1; + break; + } + } + if (shift) + ++scale; + } else { + /* + fixed scaling, for proper normalization -- + there will be log2(n) passes, so this results + in an overall factor of 1/n, distributed to + maximize arithmetic accuracy. + */ + shift = 1; + } + /* + it may not be obvious, but the shift will be + performed on each data point exactly once, + during this pass. + */ + istep = l << 1; + for (m=0; m>= 1; + wi >>= 1; + } + for (i=m; i>= 1; + qi >>= 1; + } + fr[j] = qr - tr; + fi[j] = qi - ti; + fr[i] = qr + tr; + fi[i] = qi + ti; + } + } + --k; + l = istep; + } + return scale; +} + +/* + fix_fftr() - forward/inverse FFT on array of real numbers. + Real FFT/iFFT using half-size complex FFT by distributing + even/odd samples into real/imaginary arrays respectively. + In order to save data space (i.e. to avoid two arrays, one + for real, one for imaginary samples), we proceed in the + following two steps: a) samples are rearranged in the real + array so that all even samples are in places 0-(N/2-1) and + all imaginary samples in places (N/2)-(N-1), and b) fix_fft + is called with fr and fi pointing to index 0 and index N/2 + respectively in the original array. The above guarantees + that fix_fft "sees" consecutive real samples as alternating + real and imaginary samples in the complex array. +*/ +int fix_fftr(char f[], int m, int inverse) +{ + int i, N = 1<<(m-1), scale = 0; + char tt, *fr=f, *fi=&f[N]; + + if (inverse) + scale = fix_fft(fi, fr, m-1, inverse); + for (i=1; i + + + + +/* + fix_fft() - perform forward/inverse fast Fourier transform. + fr[n],fi[n] are real and imaginary arrays, both INPUT AND + RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to + 0 for forward transform (FFT), or 1 for iFFT. +*/ +int fix_fft(char fr[], char fi[], int m, int inverse); + + + +/* + fix_fftr() - forward/inverse FFT on array of real numbers. + Real FFT/iFFT using half-size complex FFT by distributing + even/odd samples into real/imaginary arrays respectively. + In order to save data space (i.e. to avoid two arrays, one + for real, one for imaginary samples), we proceed in the + following two steps: a) samples are rearranged in the real + array so that all even samples are in places 0-(N/2-1) and + all imaginary samples in places (N/2)-(N-1), and b) fix_fft + is called with fr and fi pointing to index 0 and index N/2 + respectively in the original array. The above guarantees + that fix_fft "sees" consecutive real samples as alternating + real and imaginary samples in the complex array. +*/ +int fix_fftr(char f[], int m, int inverse); + + + + +#endif + + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_07_FFT_Freq/sketch_13_07_FFT_Freq.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_07_FFT_Freq/sketch_13_07_FFT_Freq.ino new file mode 100644 index 0000000..4dda797 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_13_07_FFT_Freq/sketch_13_07_FFT_Freq.ino @@ -0,0 +1,63 @@ +// sketch_13_07_FFT_Freq + +#include "fix_fft.h" + +const int analogPin = A0; +const long GAIN = 2; +char im[128]; +char data[128]; + +const byte PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); +const byte PS_16 = (1 << ADPS2); + + +void setup() +{ + Serial.begin(9600); + ADCSRA &= ~PS_128; // remove prescale of 128 + ADCSRA |= PS_16; // add prescale of 16 (1MHz) +} + +void loop() +{ + sampleWindowFull(); + fix_fft(data, im, 7, 0); + updateData(); + + Serial.println(findF()); +} + +void sampleWindowFull() +{ + for (int i = 0; i < 128; i++) + { + int val = (analogRead(analogPin) - 512) * GAIN; + data[i] = val / 4; + im[i] = 0; + } +} + +void updateData() +{ + for (int i = 0; i < 64; i++) + { + data[i] = sqrt(data[i] * data[i] + im[i] * im[i]); + } +} + +int findF() +{ + int maxValue = 0; + int maxIndex = 0; + for (int i = 1; i < 64; i++) + { + int p = data[i]; + if (p > maxValue) + { + maxValue = p; + maxIndex = i; + } + } + int f = maxIndex * 240; + return f; +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_14_01_flashing_1/sketch_14_01_flashing_1.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_14_01_flashing_1/sketch_14_01_flashing_1.ino new file mode 100644 index 0000000..4a09efd --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_14_01_flashing_1/sketch_14_01_flashing_1.ino @@ -0,0 +1,28 @@ +// sketch_14_01_flashing_1 + +const int ledPin = 13; +const int switchPin = 5; +const int period = 1000; + +boolean flashing = false; + +void setup() +{ + pinMode(ledPin, OUTPUT); + pinMode(switchPin, INPUT_PULLUP); +} + +void loop() +{ + if (digitalRead(switchPin) == LOW) + { + flashing = ! flashing; + } + if (flashing) + { + digitalWrite(ledPin, HIGH); + delay(period); + digitalWrite(ledPin, LOW); + delay(period); + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_14_02_flashing_2/sketch_14_02_flashing_2.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_14_02_flashing_2/sketch_14_02_flashing_2.ino new file mode 100644 index 0000000..dccdc49 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_14_02_flashing_2/sketch_14_02_flashing_2.ino @@ -0,0 +1,35 @@ +// sketch_14_02_flashing_2 + +const int ledPin = 13; +const int switchPin = 5; +const int period = 1000; + +boolean flashing = false; +long lastChangeTime = 0; +int ledState = LOW; + +void setup() +{ + pinMode(ledPin, OUTPUT); + pinMode(switchPin, INPUT_PULLUP); +} + +void loop() +{ + if (digitalRead(switchPin) == LOW) + { + flashing = ! flashing; + // and turn the LED off + if (! flashing) + { + digitalWrite(ledPin, LOW); + } + } + long now = millis(); + if (flashing && now > lastChangeTime + period) + { + ledState = ! ledState; + digitalWrite(ledPin, ledState); + lastChangeTime = now; + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_14_03_flashing_3/sketch_14_03_flashing_3.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_14_03_flashing_3/sketch_14_03_flashing_3.ino new file mode 100644 index 0000000..9cb1469 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_14_03_flashing_3/sketch_14_03_flashing_3.ino @@ -0,0 +1,41 @@ +// sketch_14_03_flashing_3 + +#include + + +const int ledPin = 13; +const int switchPin = 5; +const int period = 1000; + +boolean flashing = false; +int ledState = LOW; +Timer t; + +void setup() +{ + pinMode(ledPin, OUTPUT); + pinMode(switchPin, INPUT_PULLUP); + t.every(period, flashIfRequired); +} + +void loop() +{ + if (digitalRead(switchPin) == LOW) + { + flashing = ! flashing; + if (! flashing) + { + digitalWrite(ledPin, LOW); + } + } + t.update(); +} + +void flashIfRequired() +{ + if (flashing) + { + ledState = ! ledState; + digitalWrite(ledPin, ledState); + } +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_15_01_TEA5767_Example/sketch_15_01_TEA5767_Example.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_15_01_TEA5767_Example/sketch_15_01_TEA5767_Example.ino new file mode 100644 index 0000000..9530910 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/sketch_15_01_TEA5767_Example/sketch_15_01_TEA5767_Example.ino @@ -0,0 +1,15 @@ +// TEA5767 Example + +#include +#include + +TEA5767Radio radio = TEA5767Radio(); + +void setup() +{ + radio.setFrequency(93.0); // pick your own frequency +} + +void loop() +{ +} diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/timer_interrupt_example/timer_interrupt_example.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/timer_interrupt_example/timer_interrupt_example.ino new file mode 100644 index 0000000..0258852 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/timer_interrupt_example/timer_interrupt_example.ino @@ -0,0 +1,69 @@ +#include + +double v[11]; + +void setup() +{ + // Initialize the digital pin as an output. + // Pin 13 has an LED connected on most Arduino boards + pinMode(12, OUTPUT); + initFilter(); + Serial.begin(115200); + Timer1.initialize(5000); + Timer1.attachInterrupt( timerIsr ); // attach the service routine here +} + +void loop() +{ + // Main code loop + // TODO: Put your regular (non-ISR) logic here +} + +/// -------------------------- +/// Custom ISR Timer Routine +/// -------------------------- +void timerIsr() +{ + digitalWrite(12, HIGH); + int raw = analogRead(A0); + double input = (double)raw; + double filtered = filterStep(input); + Serial.print(input); + Serial.print(" "); + Serial.println(filtered); + digitalWrite(12, LOW); +} + +// Sample f 200Hz, band stop 49-50Hz +// http://www.schwietering.com/jayduino/filtuino/index.php?characteristic=bu&passmode=bs&order=3&usesr=usesr&sr=200&frequencyLow=47¬eLow=&frequencyHigh=53¬eHigh=&pw=pw&calctype=double&run=Send +// Band stop butterworth filter order=3 alpha1=0.235 alpha2=0.265 +void initFilter() +{ + for(int i=0; i <= 10; i++) + { + v[i]=0.0; + } +} + + +double filterStep(double x) +{ + v[0] = v[1]; + v[1] = v[2]; + v[2] = v[3]; + v[3] = v[4]; + v[4] = v[5]; + v[5] = v[6]; + v[6] = (8.27971295622e-1 * x) + + ( -0.6855359773 * v[0]) + + ( -0.0000000000 * v[1]) + + ( -2.3146825811 * v[2]) + + ( -0.0000000000 * v[3]) + + ( -2.6235518066 * v[4]) + + ( -0.0000000000 * v[5]); + return + (v[0] + v[6]) + +3 * (v[2] + v[4]); +} + + diff --git a/books/ArduinoNextSteps-master/ArduinoNextSteps/wake_sleep_example/wake_sleep_example.ino b/books/ArduinoNextSteps-master/ArduinoNextSteps/wake_sleep_example/wake_sleep_example.ino new file mode 100644 index 0000000..1867664 --- /dev/null +++ b/books/ArduinoNextSteps-master/ArduinoNextSteps/wake_sleep_example/wake_sleep_example.ino @@ -0,0 +1,42 @@ +// sketch_03_03_1kHz +#include +#include +#include + +NO NARCOLEPTIC LIBARAY IS THE WAY TO GO FOR THIS - THEN DELVE INTO HOW NARCOLEPTIC WORKS. + +ALSO THE POWER LIBRARY. + +int ledPin = 13; + +void setup() +{ + pinMode(ledPin, OUTPUT); + Timer1.initialize(5000000); // wake every 5 seconds + //Timer1.attachInterrupt(everySoOften); + TIMSK1=0x01; +} + +void loop() +{ + digitalWrite(ledPin, HIGH); + delayMicroseconds(250000); + digitalWrite(ledPin, LOW); + delayMicroseconds(250000); + + set_sleep_mode(SLEEP_MODE_IDLE); + sleep_enable(); + power_adc_disable(); + power_spi_disable(); + power_timer0_disable(); + power_timer2_disable(); + power_twi_disable(); + sleep_mode(); +} + +//void everySoOften() +//{ +// +//} + +// http://donalmorrissey.blogspot.co.uk/2011/11/sleeping-arduino-part-4-wake-up-via.html diff --git a/books/ArduinoNextSteps-master/README.md b/books/ArduinoNextSteps-master/README.md new file mode 100644 index 0000000..7512378 --- /dev/null +++ b/books/ArduinoNextSteps-master/README.md @@ -0,0 +1,8 @@ +ArduinoNextSteps +================ + +Arduino sketches and other source code for the book 'Programming Arduino: Next Steps' by Simon Monk. + +See http://www.simonmonk.org for details. + +Place the ArduinoNextSteps folder into your Arduino IDE sketches folder. \ No newline at end of file diff --git a/books/ArduinoNextSteps-master/benchmark.c b/books/ArduinoNextSteps-master/benchmark.c new file mode 100644 index 0000000..3d2bddb --- /dev/null +++ b/books/ArduinoNextSteps-master/benchmark.c @@ -0,0 +1,26 @@ +// benchmark.c +#include +#include + +main() +{ + printf("\nStarting Test\n"); + time_t startTime = clock(); + + // test code here + long i = 0; + long j = 0; + for (i = 0; i < 20000000; i ++) + { + j = i + i * 10; + if (j > 10) j = 0; + } + // end of test code + time_t endTime = clock(); + + printf("%ld\n", j); // prevent loop being optimized out + printf("Finished Test\n"); + double timeSpent = (double)(endTime - startTime) / CLOCKS_PER_SEC; + printf("seconds taken: %f\n", timeSpent); + return 0; +} diff --git a/books/ArduinoNextSteps-master/sin_maker.py b/books/ArduinoNextSteps-master/sin_maker.py new file mode 100644 index 0000000..4b43609 --- /dev/null +++ b/books/ArduinoNextSteps-master/sin_maker.py @@ -0,0 +1,17 @@ +import math + +angle = 0.0 +angleStep = math.pi / 32.0 + +result = "byte sin64[] = {" + +while angle < 2 * math.pi : + x = math.sin(angle) * 127 + 127 + angle += angleStep + result = result + str(int(x)) + if angle < 2 * math.pi : + result = result + ", " + +result = result + "};" + +print(result) \ No newline at end of file diff --git a/books/beginning_c_code/Chapter04/Exercise4_4/Exercise4_4.ino b/books/beginning_c_code/Chapter04/Exercise4_4/Exercise4_4.ino new file mode 100644 index 0000000..08c6719 --- /dev/null +++ b/books/beginning_c_code/Chapter04/Exercise4_4/Exercise4_4.ino @@ -0,0 +1,59 @@ +/* + Heads or Tails + Turns on an LED which represents head or tails. The LED + remains on for about 3 seconds and the cycle repeats. + Dr. Purdum, July 12, 2012 + */ + +// define the pins to be used. +#define SENDMESSAGEAFTERTHISMANYTOSSES 100 +#define TESTSTORUN 50000 +#define HEADIOPIN 13 +#define TAILIOPIN 12 + +int head = HEADIOPIN; +int tail = TAILIOPIN; +long randomNumber = 0L; +long headCount = 0L; +long tailCount = 0L; + +// the setup routine runs once when you press reset: +void setup() { + // initialize each of the digital pins as an output. + Serial.begin(9600); + pinMode(head, OUTPUT); + pinMode(tail, OUTPUT); + randomSeed(analogRead(0)); // This seeds the random number generator +} + +// the loop routine runs over and over again forever: +void loop() { + randomNumber = generateRandomNumber(); + digitalWrite(head, LOW); // Turn both LEDs off + digitalWrite(tail, LOW); + + if (randomNumber % 2 == 1) { // Treat odd numbers as a head + digitalWrite(head, HIGH); + headCount++; + } else { + digitalWrite(tail, HIGH); // Even numbers are a tail + tailCount++; + } + + if ( (headCount + tailCount) % SENDMESSAGEAFTERTHISMANYTOSSES == 0) { + Serial.print("Heads = "); + Serial.print(headCount); + Serial.print(" tails = "); + Serial.println(tailCount); + } + if (headCount + tailCount > TESTSTORUN) { + Serial.flush(); + exit(0); + } +} + +long generateRandomNumber() +{ + return random(0, 1000000); // Generate random numbers between 0 and one million +} + diff --git a/books/beginning_c_code/Chapter04/Listing4_1/Listing4_1.ino b/books/beginning_c_code/Chapter04/Listing4_1/Listing4_1.ino new file mode 100644 index 0000000..558b7bf --- /dev/null +++ b/books/beginning_c_code/Chapter04/Listing4_1/Listing4_1.ino @@ -0,0 +1,27 @@ + /* + Alternate Blink + Turns on one LED on for one second while the other is off, then reverses the LEDs for 1 second, repeatedly. + */ + +// Pin 13 has an LED connected on most Arduino boards. +// give it a name: +int led1 = 13; +int led2 = 12; // This is for the second LED + +// the setup routine runs once when you press reset: +void setup() { + // initialize the digital pin as an output. + pinMode(led1, OUTPUT); + pinMode(led2, OUTPUT); +} + +// the loop routine runs over and over again forever: +void loop() { + digitalWrite(led1, HIGH); // turn the LED on (HIGH is the voltage level) + digitalWrite(led2, LOW); // turn the LED off by making the voltage LOW + delay(1000); // wait for a second + digitalWrite(led1, LOW); // turn the LED off by making the voltage LOW + digitalWrite(led2, HIGH); // turn the LED on (HIGH is the voltage level) + delay(1000); // wait for a second +} + diff --git a/books/beginning_c_code/Chapter04/Listing4_2/Listing4_2.ino b/books/beginning_c_code/Chapter04/Listing4_2/Listing4_2.ino new file mode 100644 index 0000000..adcc9ad --- /dev/null +++ b/books/beginning_c_code/Chapter04/Listing4_2/Listing4_2.ino @@ -0,0 +1,49 @@ +/* + Heads or Tails + Turns on an LED which represents head or tails. The LED + remains on for about 3 seconds and the cycle repeats. + + Dr. Purdum, July 12, 2012 + */ + +// define the pins to be used. +// give it a name: + +#define HEADIOPIN 13 // Which I/O pins are we using? +#define TAILIOPIN 12 + +#define PAUSE 3000 // How long to delay? +#define REST 2000 + +int head = HEADIOPIN; +int tail = TAILIOPIN; +long randomNumber = 0L; + +// the setup routine runs once when you press reset: +void setup() { + // initialize each of the digital pins as an output. + pinMode(head, OUTPUT); + pinMode(tail, OUTPUT); + randomSeed(analogRead(0)); // This seeds the random number generator +} + +// the loop routine runs over and over again forever: +void loop() { + + randomNumber = generateRandomNumber(); + digitalWrite(head, LOW); // Turn both LED's off + digitalWrite(tail, LOW); + delay(PAUSE - REST); // Let them see both are off for a time slice + if (randomNumber % 2 == 1) { // Treat odd numbers as a head + digitalWrite(head, HIGH); + } else { + digitalWrite(tail, HIGH); // Even numbers are a tail + } + delay(PAUSE); // Pause for 3 seconds +} + +long generateRandomNumber() +{ + return random(0, 1000000); // Generate random numbers between 0 and one million +} + diff --git a/books/beginning_c_code/Chapter05/Listing5_1/Listing5_1.ino b/books/beginning_c_code/Chapter05/Listing5_1/Listing5_1.ino new file mode 100644 index 0000000..1f9d76a --- /dev/null +++ b/books/beginning_c_code/Chapter05/Listing5_1/Listing5_1.ino @@ -0,0 +1,63 @@ +// define the pins to be used. +#define MAX 5000L +#define MIN 0L +#define TARGETVALUE 2500L + +#define MAXRECYCLES 5 +#define FOUNDITIOPIN 13 +#define RECYCLEIOPIN 12 +#define PAUSE 1000 + + +int foundIt = FOUNDITIOPIN; +int recycle = RECYCLEIOPIN; +long targetValue = TARGETVALUE; +long randomNumber; +int recycleCounter = 0; +int counter = 0; + +// the setup routine runs once when you press reset: +void setup() { + // initialize each of the digital pins as an output. + Serial.begin(9600); + pinMode(foundIt, OUTPUT); + pinMode(recycle, OUTPUT); + randomSeed(analogRead(0)); // This seeds the random number generator + +} + +// the loop routine runs over and over again forever: +void loop() { + + while (counter != -1) { // Check for negative values + randomNumber = generateRandomNumber(); + if (randomNumber == TARGETVALUE) { + Serial.print("Counter = "); + Serial.print(counter, DEC); + Serial.print(" recycleCounter = "); + Serial.println(recycleCounter, DEC); + digitalWrite(foundIt, HIGH); + delay(PAUSE); + digitalWrite(foundIt, LOW); + } + counter++; + if (counter < 0) { // We've overflowed an int + counter = 0; + recycleCounter++; + Serial.print("recycleCounter = "); + Serial.println(recycleCounter, DEC); + digitalWrite(recycle, HIGH); + delay(PAUSE); + digitalWrite(recycle, LOW); + } + + if (recycleCounter > MAXRECYCLES) + exit(0); // End program + } +} + +long generateRandomNumber() +{ + return random(MIN, MAX); // Generate random numbers between 0 and one million +} + diff --git a/books/beginning_c_code/Chapter06/Listing6_1/Listing6_1.ino b/books/beginning_c_code/Chapter06/Listing6_1/Listing6_1.ino new file mode 100644 index 0000000..83e55c0 --- /dev/null +++ b/books/beginning_c_code/Chapter06/Listing6_1/Listing6_1.ino @@ -0,0 +1,18 @@ +/***** + Purpose: Determine if a given year is a leap year + + Parameters: + int yr The year to test + + Return value: + int 1 if the year is a leap year, 0 otherwise +*****/ +int IsLeapYear(int yr) +{ + if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) { + return 1; // It is a leap year + } else { + return 0; // not a leap year + } +} + diff --git a/books/beginning_c_code/Chapter06/Listing6_2/Listing6_2.ino b/books/beginning_c_code/Chapter06/Listing6_2/Listing6_2.ino new file mode 100644 index 0000000..54b89c2 --- /dev/null +++ b/books/beginning_c_code/Chapter06/Listing6_2/Listing6_2.ino @@ -0,0 +1,82 @@ +/** + Program: find out is the user typed in a leap year. The code assumes + the user is not an idiot and only types in numbers that are a valid + year. + + Author: Dr. Purdum, Aug. 7, 2012 +**/ + +void setup() +{ + Serial.begin(9600); +} + +void loop() +{ + if (Serial.available() > 0) { + int bufferCount; + + int year; + char myData[20]; + + bufferCount = ReadLine(myData); + year = atoi(myData); // Convert to int + Serial.print("Year: "); + Serial.print(year); + if (IsLeapYear(year)) { + Serial.print(" is "); + } else { + Serial.print(" is not "); + } + Serial.println("a leap year"); + } +} +/***** + Purpose: Determine if a given year is a leap year + + Parameters: + int yr The year to test + + Return value: + int 1 if the year is a leap year, 0 otherwise +*****/ +int IsLeapYear(int yr) +{ + if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) { + return 1; // It is a leap year + } else { + return 0; // not a leap year + } +} + +/***** + Purpose: Read data from serial port until a newline character is read ('\n') + + Parameters: + char str[] character array that will be treated as a nul-terminated string + + Return value: + int the number of characters read for the string + + CAUTION: This method will sit here forever if no input is read from the serial + port and no newline character is entered. +****/ +int ReadLine(char str[]) +{ + char c; + int index = 0; + + while (true) { + if (Serial.available() > 0) { + c = Serial.read(); + if (c != '\n') { + str[index++] = c; + } else { + str[index] = '\0'; // null termination character + break; + } + } + } + return index; +} + diff --git a/books/beginning_c_code/Chapter07/Listing7_1/Listing7_1.ino b/books/beginning_c_code/Chapter07/Listing7_1/Listing7_1.ino new file mode 100644 index 0000000..eb191c3 --- /dev/null +++ b/books/beginning_c_code/Chapter07/Listing7_1/Listing7_1.ino @@ -0,0 +1,30 @@ +/** + Program: Demonstrate the concept of local scope + + Author: Dr. Purdum, Aug. 9, 2012 +**/ +#define MAXVAL 1000 + +int k = 0; + +void setup() +{ + Serial.begin(9600); +} + + +void loop() +{ + int x = 5; + + if (x < MAXVAL) { + int temp; + + temp = x * 100; + } + Serial.print("The value of temp is: "); + Serial.println(temp); + if (k++ > 10) + exit(0); +} + diff --git a/books/beginning_c_code/Chapter08/Listing8_1/Listing8_1.ino b/books/beginning_c_code/Chapter08/Listing8_1/Listing8_1.ino new file mode 100644 index 0000000..56357e8 --- /dev/null +++ b/books/beginning_c_code/Chapter08/Listing8_1/Listing8_1.ino @@ -0,0 +1,34 @@ +/* + Purpose: Simple program to demonstrate using a pointer + + Dr. Purdum, August 13, 2012 + */ +#include +int counter = 0; +void setup() { + // So we can communicate with the PC + Serial.begin(9600); +} + + +void loop() { + int number = 5; + int *ptrNumber; + + Serial.print("The lvalue for ptrNumber is: "); + Serial.print((long) &ptrNumber, DEC); + Serial.print(" and the rvalue is "); + Serial.println((long) ptrNumber, DEC); + + //=== Put new statements here! + Serial.print("The lvalue for number is: "); + Serial.print((long) &number, DEC); + Serial.print(" and has an rvalue of "); + Serial.println((int) number, DEC); + counter++; + if (counter > 10) { + Serial.flush(); + exit(0); + } +} + diff --git a/books/beginning_c_code/Chapter08/Listing8_2/Listing8_2.ino b/books/beginning_c_code/Chapter08/Listing8_2/Listing8_2.ino new file mode 100644 index 0000000..074aa9f --- /dev/null +++ b/books/beginning_c_code/Chapter08/Listing8_2/Listing8_2.ino @@ -0,0 +1,75 @@ +/* + Purpose: find the minimum and maximum values of an array of + data values + + Dr. Purdum, August 13, 2012 + */ +#include +#define READINGSPERDAY 24 +#define VERYHIGHTEMPERATURE 200 +#define VERYLOWTEMPERATURE -200 + +int todaysReadings[] = {62, 64, 65, 68, 70, 70, 71, 72, 74, 75, 76, 78, + 79, 79, 78, 73, 70, 70, 69, 68, 64, 63, 61, 59}; +void setup() { + // So we can communicate with the PC + Serial.begin(9600); +} + +void loop() { + int lowTemp; + int hiTemp; + int retVal; + + Serial.println("=== Before function call:"); + Serial.print("The lvalue for lowTemp is: "); + Serial.print((long) &lowTemp, DEC); + Serial.print(" and the rvalue is "); + Serial.println((long) lowTemp, DEC); + Serial.print("The lvalue for hiTemp is: "); + Serial.print((long) &hiTemp, DEC); + Serial.print(" and the rvalue is "); + Serial.println((long) hiTemp, DEC); + + retVal = CalculateMinMax(todaysReadings, &lowTemp, &hiTemp); + Serial.println("=== After the function call:"); + Serial.print("The lvalue for lowTemp is: "); + Serial.print((long) &lowTemp, DEC); + Serial.print(" and the rvalue is "); + Serial.println((long) lowTemp, DEC); + Serial.print("The lvalue for hiTemp is: "); + Serial.print((long) &hiTemp, DEC); + Serial.print(" and the rvalue is "); + Serial.println((long) hiTemp, DEC); + Serial.println("\n"); + + Serial.flush(); // Make sure all the data is sent... + exit(0); + +}/***** + Purpose: Get the daily temperature reading (READINGSPERDAY) and + set the minimum and maximum temperatures for the day. + Parameter list: + int temps[] the array of temperatures + int *minTemp pointer to the minimum temperature value + int *maxTemp pointer to the maximum temperature value + + Return value: + int the number of readings processed +*****/ +int CalculateMinMax(int temps[], int *minTemp, int *maxTemp) +{ + int j; + *minTemp = VERYHIGHTEMPERATURE; // Make the minimum temperature ridiculously high + *maxTemp = VERYLOWTEMPERATURE; // Make the maximum temperature ridiculously low + for (j = 0; j < READINGSPERDAY; j++) { + if (temps[j] >= *maxTemp) { + *maxTemp = temps[j]; + } + if (temps[j] <= *minTemp) { + *minTemp = temps[j]; + } + } + return j; +} + diff --git a/books/beginning_c_code/Chapter08/Listing8_3/Listing8_3.ino b/books/beginning_c_code/Chapter08/Listing8_3/Listing8_3.ino new file mode 100644 index 0000000..2b75d95 --- /dev/null +++ b/books/beginning_c_code/Chapter08/Listing8_3/Listing8_3.ino @@ -0,0 +1,29 @@ +/* + Purpose: Display a character array using array indexes + Dr. Purdum, August 14, 2012 + */ + +void setup() { + // So we can communicate with the PC + Serial.begin(9600); +} + + +void loop() { + char greet[6]; + int i; + + greet[0] = 'H'; // Initialize the array with some characters + greet[1] = 'e'; + greet[2] = 'l'; + greet[3] = 'l'; + greet[4] = 'o'; + greet[5] = '\0'; + + for (i = 0; i < 5; i++) { + Serial.print(greet[i]); + } + Serial.flush(); // Make sure all the data is sent... + exit(0); +} + diff --git a/books/beginning_c_code/Chapter08/Listing8_4/Listing8_4.ino b/books/beginning_c_code/Chapter08/Listing8_4/Listing8_4.ino new file mode 100644 index 0000000..89b2b35 --- /dev/null +++ b/books/beginning_c_code/Chapter08/Listing8_4/Listing8_4.ino @@ -0,0 +1,30 @@ +/* + Purpose: Display an int array using array indexes + Dr. Purdum, August 13, 2012 + */ + +void setup() { + // So we can communicate with the PC + Serial.begin(9600); +} + +void loop() { + int greet[6]; // Notice this is an int now + int *ptr; // ...as is this + int i; + + greet[0] = 0; // Numbers now... + greet[1] = 1; + greet[2] = 2; + greet[3] = 3; + greet[4] = 4; + greet[5] = 5; + + ptr = greet; + for (i = 0; i < 5; i++) { + Serial.print(greet[i]); + } + Serial.flush(); // Make sure all the data is sent... + exit(0); +} + diff --git a/books/beginning_c_code/Chapter09/Listing9_1/Listing9_1.ino b/books/beginning_c_code/Chapter09/Listing9_1/Listing9_1.ino new file mode 100644 index 0000000..a923773 --- /dev/null +++ b/books/beginning_c_code/Chapter09/Listing9_1/Listing9_1.ino @@ -0,0 +1,32 @@ +/* + Purpose: Illustrate pointer arithmetic + Dr. Purdum, August 20, 2012 + */ +#include +void setup() { + Serial.begin(9600); +} + + +void loop() { + char buffer[50]; + char *ptr; + int i; + int length; + + strcpy(buffer, "When in the course of human events"); + ptr = buffer; + length = strlen(buffer); + Serial.print("The lvalue for ptr is: "); + Serial.print((unsigned int)&ptr); + Serial.print(" and the rvalue is "); + Serial.println((unsigned int)ptr); + while (*ptr) { + Serial.print(*ptr++); + } + + Serial.flush(); // Make sure all the data is sent... + exit(0); + +} + diff --git a/books/beginning_c_code/Chapter09/Listing9_2/Listing9_2.ino b/books/beginning_c_code/Chapter09/Listing9_2/Listing9_2.ino new file mode 100644 index 0000000..dacc89a --- /dev/null +++ b/books/beginning_c_code/Chapter09/Listing9_2/Listing9_2.ino @@ -0,0 +1,31 @@ +/* + Purpose: To illustrate the relationship between two-dimensional + arrays and pointers. + Dr. Purdum, August 21, 2012 + */ +#define DAYSINWEEK 7 +#define CHARSINDAY 10 + +static char days[DAYSINWEEK][CHARSINDAY] = + {"Sunday", "Monday", "Tuesday","Wednesday", + "Thursday", "Friday", "Saturday"}; + + +void setup() { + Serial.begin(9600); // Serial link to PC +} + +void loop() { + int i, j; + for (i = 0; i < DAYSINWEEK; i++) { + Serial.print((int) &days[i][0]); // Show the lvalue + Serial.print(" "); + for (j = 0; days[i][j]; j++) { + Serial.print(days[i][j]); // Show one char + } + Serial.println(); + } + Serial.flush(); + exit(0); +} + diff --git a/books/beginning_c_code/Chapter09/Listing9_3/Listing9_3.ino b/books/beginning_c_code/Chapter09/Listing9_3/Listing9_3.ino new file mode 100644 index 0000000..8dd2dad --- /dev/null +++ b/books/beginning_c_code/Chapter09/Listing9_3/Listing9_3.ino @@ -0,0 +1,36 @@ +/* + Purpose: To illustrate the relationship between two-dimensional + arrays and pointers. + Dr. Purdum, August 21, 2012 + */ +#define DAYSINWEEK 7 +#define CHARSINDAY 10 + +void setup() { + Serial.begin(9600); // Serial link to PC +} + +void loop() { + static char days[DAYSINWEEK][CHARSINDAY] = + { + "Sunday", "Monday", "Tuesday","Wednesday", + "Thursday", "Friday", "Saturday" }; + int i, j; + char *ptr, *base; + + base = days[0]; // Different for N-rank arrays where N > 1 + for (i = 0; i < DAYSINWEEK; i++) { + ptr = base + (i * CHARSINDAY); + Serial.print((int) ptr); // Show the lvalue + Serial.print(" "); + for (j = 0; *ptr; j++) { + Serial.print(*ptr++); // Show one char + } + Serial.println(); + } + Serial.flush(); + exit(0); +} + + + diff --git a/books/beginning_c_code/Chapter09/Listing9_4/Listing9_4.ino b/books/beginning_c_code/Chapter09/Listing9_4/Listing9_4.ino new file mode 100644 index 0000000..b8710f6 --- /dev/null +++ b/books/beginning_c_code/Chapter09/Listing9_4/Listing9_4.ino @@ -0,0 +1,28 @@ +/* + Purpose: Show how to use a pointer to function + Dr. Purdum, August 21, 2012 + */ + +void setup() { + Serial.begin(9600); // Serial link to PC +} + +void loop() { + int number = 50; + int (*funcPtr)(int n); // This defines a pointer to function + + funcPtr = DisplayValue; // This copies the lvalue of DisplayValue + number = (*funcPtr)(number); + Serial.print("After return from function, number = "); + Serial.println(number); + Serial.flush(); + exit(0); +} + +int DisplayValue(int val) +{ + Serial.print("In function, val = "); + Serial.println(val); + return val * val; +} + diff --git a/books/beginning_c_code/Chapter09/Listing9_5/Listing9_5.ino b/books/beginning_c_code/Chapter09/Listing9_5/Listing9_5.ino new file mode 100644 index 0000000..79a1b6b --- /dev/null +++ b/books/beginning_c_code/Chapter09/Listing9_5/Listing9_5.ino @@ -0,0 +1,83 @@ +/* + Purpose: illustrate how you can use an array of pointers to + functions. + Dr. Purdum, 8/22/2012 +*/ +enum temperatures {TOOCOLD, TOOHOT, JUSTRIGHT}; +enum temperatures whichAction; + +const int COLD = 235; +const int HOT = 260; + +void setup() { + Serial.begin(9600); // Serial link to PC + randomSeed(analogRead(0)); // Seed random number generator +} + +void loop() { + static void (*funcPtr[])() = {TurnUpTemp, TurnDownTemp, PourCandy}; + static int iterations = 0; + int temp; + + temp = ReadVatTemp(); + whichAction = (enum temperatures) WhichOperation(temp); + (*funcPtr[whichAction])(); + if (iterations++ > 10) { + Serial.println("==================="); + Serial.flush(); + exit(0); + } +} + +/***** + Purpose: decide whether to turn up heat, turn down heat, or if + vat is ready. Pourable candy is between 235 and 260. + Parameter list: + int temp the current vat temperature + Return value: + int 0 = temp too cold, 1 = temp too high, 2 = just right +*****/ + +int WhichOperation(int temp) +{ + Serial.print("temp is "); + Serial.print(temp); + if (temp < COLD) { + return TOOCOLD; + } else { + if (temp > HOT) { + return TOOHOT; + } else + return JUSTRIGHT; + } +} + +/***** + Purpose: simulate reading a vat's temperature. Values are + constrained between 100 and 325 degrees + Parameter list: + void + + Return value: + int the temperature +*****/ +int ReadVatTemp() +{ + return random(100, 325); +} + +void TurnUpTemp() +{ + Serial.println(" in TurnUpTemp()"); +} + +void TurnDownTemp() +{ + Serial.println(" in TurnDownTemp()"); +} + +void PourCandy() +{ + Serial.println(" in PourCandy()"); +} + diff --git a/books/beginning_c_code/Chapter10/Listing10_1/Listing10_1.ino b/books/beginning_c_code/Chapter10/Listing10_1/Listing10_1.ino new file mode 100644 index 0000000..74d06fa --- /dev/null +++ b/books/beginning_c_code/Chapter10/Listing10_1/Listing10_1.ino @@ -0,0 +1,38 @@ +/* + Purpose: To show the use of the dot operator + Dr. Purdum, Aug. 25, 2012 +*/ + + +struct servicePeople { + int ID; + char Name[20]; + char PW[10]; + long Phone; +} myServicePeople, yourServicePeople; +void setup() { + Serial.begin(9600); + Serial.print("myServicePeople lvalue: "); + Serial.print((int) &myServicePeople); + Serial.print(" yourServicePeople lvalue: "); + Serial.println((int) &yourServicePeople); + yourServicePeople.ID = 205; + Serial.print("myServicePeople.ID rvalue: "); + Serial.print(myServicePeople.ID); + Serial.print(" yourServicePeople.ID rvalue: "); + Serial.println(yourServicePeople.ID); + myServicePeople = yourServicePeople; + Serial.println("After assignment:"); + Serial.print("myServicePeople.ID rvalue: "); + Serial.print(myServicePeople.ID); + Serial.print(" yourServicePeople.ID rvalue: "); + Serial.println(yourServicePeople.ID); + Serial.print("A servicePerson structure takes "); + Serial.print(sizeof(servicePeople)); + Serial.println(" bytes of storage."); +} + +void loop(){ + +} + diff --git a/books/beginning_c_code/Chapter10/Listing10_2/Listing10_2.ino b/books/beginning_c_code/Chapter10/Listing10_2/Listing10_2.ino new file mode 100644 index 0000000..215a294 --- /dev/null +++ b/books/beginning_c_code/Chapter10/Listing10_2/Listing10_2.ino @@ -0,0 +1,46 @@ +/* + Purpose: To show the use of the dot operator + Dr. Purdum, Aug. 25, 2012 +*/ + + +struct servicePeople { + int ID; + char Name[20]; + char PW[10]; + long Phone; +} myServicePeople, yourServicePeople; +struct servicePeople SetPhoneNumber(struct servicePeople temp); // New +void setup() { + Serial.begin(9600); + Serial.print("myServicePeople lvalue: "); + Serial.print((int) &myServicePeople); + Serial.print(" yourServicePeople lvalue: "); + Serial.println((int) &yourServicePeople); + yourServicePeople.ID = 205; + Serial.print("myServicePeople.ID rvalue: "); + Serial.print(myServicePeople.ID); + Serial.print(" yourServicePeople.ID rvalue: "); + Serial.println(yourServicePeople.ID); + myServicePeople = SetPhoneNumber(yourServicePeople); // Changed + Serial.println("After assignment:"); + Serial.print("myServicePeople.ID rvalue: "); + Serial.print(myServicePeople.ID); + Serial.print(" yourServicePeople.ID rvalue: "); + Serial.println(yourServicePeople.ID); + Serial.print("A servicePerson structure takes "); + Serial.print(sizeof(servicePeople)); + Serial.println(" bytes of storage."); + Serial.print("myServicePeople.Phone rvalue: "); // New + Serial.print(myServicePeople.Phone); // New +} +void loop(){ + +} +// All lines below are new +struct servicePeople SetPhoneNumber(struct servicePeople temp) +{ + temp.Phone = 2345678; + return temp; +} + diff --git a/books/beginning_c_code/Chapter10/Listing10_3/Listing10_3.ino b/books/beginning_c_code/Chapter10/Listing10_3/Listing10_3.ino new file mode 100644 index 0000000..a7559b1 --- /dev/null +++ b/books/beginning_c_code/Chapter10/Listing10_3/Listing10_3.ino @@ -0,0 +1,48 @@ +/* + Purpose: To show the use of pointers to structures + Dr. Purdum, Aug. 25, 2012 +*/ + + +struct servicePeople { + int ID; + char Name[20]; + char PW[10]; + long Phone; +} myServicePeople, yourServicePeople; +void SetPhoneNumber(struct servicePeople *temp); // New signature declaration +void setup() { + Serial.begin(9600); + Serial.print("myServicePeople lvalue: "); + Serial.print((int) &myServicePeople); + Serial.print(" yourServicePeople lvalue: "); + Serial.println((int) &yourServicePeople); + yourServicePeople.ID = 205; + Serial.print("myServicePeople.ID rvalue: "); + Serial.print(myServicePeople.ID); + Serial.print(" yourServicePeople.ID rvalue: "); + Serial.println(yourServicePeople.ID); + SetPhoneNumber(&myServicePeople); // Pass the lvalue + Serial.println("After assignment:"); + Serial.print("myServicePeople.ID rvalue: "); + Serial.print(myServicePeople.ID); + Serial.print(" yourServicePeople.ID rvalue: "); + Serial.println(yourServicePeople.ID); + Serial.print("A servicePerson structure takes "); + Serial.print(sizeof(servicePeople)); + Serial.println(" bytes of storage."); + Serial.print("myServicePeople.Phone rvalue: "); // New + Serial.println(myServicePeople.Phone); // New + Serial.print("yourServicePeople.Phone rvalue: "); + Serial.println(yourServicePeople.Phone); +} +void loop(){ + +} + +// Lines below are changed +void SetPhoneNumber(struct servicePeople *temp) +{ + (*temp).Phone = 2345678; +} + diff --git a/books/beginning_c_code/Chapter10/Listings10_4thru10/Listings10_4thru10.ino b/books/beginning_c_code/Chapter10/Listings10_4thru10/Listings10_4thru10.ino new file mode 100644 index 0000000..6feccec --- /dev/null +++ b/books/beginning_c_code/Chapter10/Listings10_4thru10/Listings10_4thru10.ino @@ -0,0 +1,166 @@ +/* + Purpose: To write data to EEPROM memory. + Dr. Purdum, Aug. 27, 2012 + */ +#include +#define DEBUG 1 // We want to see debug print statements + // Comment out these lines to avoid seeing print statements +const int MAXPEOPLE = 10; +struct servicePeople { // Structure definition for servicePeople + int ID; + char Name[20]; + char PW[10]; + long Phone; +}; + +union servicePeopleUnion { // A union definition for myUnion + int testID; + struct servicePeople testServicePeople; +} myUnion; +servicePeople myPeople[MAXPEOPLE] = { // company data for testing + {0x3737, "This is a dummy","admin",5555555}, // ID of dummy needs to be non-zero! + {101,"Kack Lawn Service","Clowder",2345678}, + {222,"Jane's Plants","Noah",4202513}, + {333,"Terrys Pool Service","Billings",4301832} +}; +// function declarations: +void DataDump(struct servicePeople temp); +int FindEepromTop(); +int ReadIntFlag(); +void ReadOneRecord(int index); +void WriteFirstRecord(); + +int loopCounter = 0; // Number of passes to make through loop +int initFlag = 0; // Has the EEPROM been initialized? +struct servicePeople temp; // A temporary structure + +void setup() +{ + int eepromMax; + int i; + + Serial.begin(9600); + eepromMax = FindEepromTop(); // How much EEPROM? +#ifdef DEBUG + Serial.print("EepromMax = "); + Serial.println(eepromMax); +#endif + initFlag = ReadIntFlag(); // Initialized? +#ifdef DEBUG + Serial.print(" flag = "); + Serial.println(initFlag); +#endif + for (i = 0; i < MAXPEOPLE; i++) { + WriteOneRecord(i); + } +} +/***** + Purpose: Find out how much EEPROM this board has. + Parameter list: + void + Return value: + int the EEPROM size + Free to use: econjack +*****/ +int FindEepromTop() +{ + return E2END + 1; +} +/***** + Purpose: This function reads the first two bytes of EEPROM and + returns the integer found there. + Parameter list: + void + Return value: + int 0 if no records in EEPROM, 1 if there are +*****/ +int ReadIntFlag() +{ + int *ptr = &myUnion.testID; + *ptr = EEPROM.read(0); + return myUnion.testID; +} +/***** + Purpose: This function writes one record from the myPeople[] array + to EEPROM + Parameter list: + int index The element of the myPeople[] array to write + Return value: + void +*****/ +void WriteOneRecord(int index) +{ + byte *b; + int i; + int offset = index * sizeof(servicePeople); + + b = (byte *) &myPeople[index]; // Going to write this record + for (i = 0; i < sizeof(servicePeople); i++) + EEPROM.write(i + offset, *b++); +} +void loop() +{ + static int eepromIndex = 1; // Assume there are records + loopCounter++; + if (initFlag > 0) { // There are records to read + ReadOneRecord(eepromIndex++); + if (myUnion.testServicePeople.ID != 0) { // Read some real data + DataDump(myUnion.testServicePeople); + } + } else { + eepromIndex++; // Make sure loop can end with no records + } + #ifdef DEBUG + Serial.println("=========="); + #endif + if (eepromIndex == MAXPEOPLE) { + Serial.flush(); + exit(0); + } +} +/***** + Purpose: This function reads one servicePerson record from + EEPROM + Parameter list: + int index The element of the myPerson[] array to read + from EEPROM + + Return value: + void +*****/ +void ReadOneRecord(int index) +{ + byte *bPtr; + int i; + int offset; + + offset = index * sizeof(servicePeople); // must offset from 0 in EEPROM + bPtr = (byte *) &myUnion.testServicePeople; // where to place the data read + for (i = 0; i < sizeof(temp); i++) { // Loop through the bytes... + *bPtr = EEPROM.read(offset + i); + bPtr++; + } +} +/***** + Purpose: Sends the data stored in parameter to the serial monitor + Parameter list: + struct servicePeople temp // The data to be displayed + Return value: + void +*****/ +void DataDump(struct servicePeople temp) +{ + + Serial.println(); + Serial.print("ID = "); + Serial.print(temp.ID); + Serial.print(" Name = "); + Serial.println(temp.Name); + Serial.print(" PW = "); + Serial.print(temp.PW); + Serial.print(" Phone = "); + Serial.println(temp.Phone); +} + + + diff --git a/books/beginning_c_code/Chapter12/Dates/Dates.cpp b/books/beginning_c_code/Chapter12/Dates/Dates.cpp new file mode 100644 index 0000000..c4af883 --- /dev/null +++ b/books/beginning_c_code/Chapter12/Dates/Dates.cpp @@ -0,0 +1,74 @@ +#include "Arduino.h" +#include "Dates.h" + +/***** + Purpose: Determine if a given year is a leap year. Algorithm + taken from C Programmer's Toolkit, Jack Purdum, Que + Corp., 1993, p.258. + + Parameters: + int year The year to test + + Return value: + int 1 if the year is a leap year, 0 otherwise +*****/ +int Dates::IsLeapYear(int year) +{ + if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { + return 1; // It is a leap year + } else { + return 0; // not a leap year + } +} + +/***** + Purpose: Determine the date for Easter for a given year. + Algorithm taken from Beginning Object Oriented + Programming with C#, Jack Purdum, Wrox, 2012. + + Parameters: + struct easter *myData Pointer to an easter structure + + Return value: + void + + CAUTION: This function assumes that the year member of the structure holds the + year being tested upon entry. +*****/ + +void Dates::GetEaster(Dates *myData){ // This is line 44 + int offset; + int leap; + int day; + int temp1, temp2, total; + + myData->myEaster.easterStr[0] = '0'; // Always a '0' + myData->myEaster.easterStr[2] = '/'; // Always a '/' + myData->myEaster.easterStr[3] = '0'; // Assume day is less than 10 + myData->myEaster.easterStr[10] = '\0'; // null char for End of string + + offset = myData->myEaster.year % 19; + leap = myData->myEaster.year % 4; + day = myData->myEaster.year % 7; + temp1 = (19 * offset + 24) % 30; + temp2 = (2 * leap + 4 * day + 6 * temp1 + 5) % 7; + total = (22 + temp1 + temp2); + if (total > 31) { + myData->myEaster.easterStr[1] = '4'; // Must be in April + myData->myEaster.month = 4; // Save the month + day = total - 31; + } else { + myData->myEaster.easterStr[1] = '3'; // Must be in March + myData->myEaster.month = 3; // Save the month + day = total; + } + myData->myEaster.day = day; // Save the day + + if (day < 10) { // One day char or two? + myData->myEaster.easterStr[4] = (char) (day + ASCIIZERO); + } else { + itoa(day, myData->myEaster.easterStr + 3, 10); // Convert day to ASCII and... + } + myData->myEaster.easterStr[5] = '/'; // Always a '/' and overwrites null from itoa() + itoa(myData->myEaster.year, myData->myEaster.easterStr + 6, 10); // Convert year to ASCII... +} diff --git a/books/beginning_c_code/Chapter12/Dates/Dates.h b/books/beginning_c_code/Chapter12/Dates/Dates.h new file mode 100644 index 0000000..c425489 --- /dev/null +++ b/books/beginning_c_code/Chapter12/Dates/Dates.h @@ -0,0 +1,29 @@ +/* + Dates.h - Library for finding is a year is a leap year + and the date for Easter for a given year. + Created by: Jack Purdum, Sept. 10, 2012 + Released into the public domain. +*/ +#ifndef Dates_h + #define Dates_h + + #include "Arduino.h" + + class Dates + { + public: + #define ASCIIZERO 48 // character for 0 in ASCII + + struct easter { + int month; + int day; + int year; + int leap; + char easterStr[11]; + }; + struct easter myEaster; + // Function prototypes: + int IsLeapYear(int year); + void GetEaster(Dates *myEaster); + }; +#endif diff --git a/books/beginning_c_code/Chapter12/Dates/Examples/Listing12_4/Listing12_4.ino b/books/beginning_c_code/Chapter12/Dates/Examples/Listing12_4/Listing12_4.ino new file mode 100644 index 0000000..fd7d5d3 --- /dev/null +++ b/books/beginning_c_code/Chapter12/Dates/Examples/Listing12_4/Listing12_4.ino @@ -0,0 +1,31 @@ +#include + +Dates myDates; + +void setup() { + Serial.begin(9600); +} + +void loop() { + int i; + + for (i = 2000; i < 2013; i++) { + Serial.print(i); + Serial.print(" is "); + if (myDates.IsLeapYear(i) == 0) + Serial.print("not "); + Serial.print("a leap year and Easter is on "); + myDates.myEaster.year = i; + myDates.GetEaster(&myDates); + Serial.print(myDates.myEaster.easterStr); + Serial.print(" "); + Serial.print(myDates.myEaster.month); + Serial.print(" "); + Serial.print(myDates.myEaster.day); + Serial.print(" "); + Serial.println(myDates.myEaster.year); + } + Serial.flush(); + exit(0); +} + diff --git a/books/beginning_c_code/Chapter12/Dates/keywords.txt b/books/beginning_c_code/Chapter12/Dates/keywords.txt new file mode 100644 index 0000000..3712a43 --- /dev/null +++ b/books/beginning_c_code/Chapter12/Dates/keywords.txt @@ -0,0 +1,3 @@ +Dates KEYWORD1 +IsLeapYear KEYWORD2 +GetEaster KEYWORD2 diff --git a/books/pdummies/.DS_Store b/books/pdummies/.DS_Store new file mode 100644 index 0000000..5a21adf Binary files /dev/null and b/books/pdummies/.DS_Store differ diff --git a/books/pdummies/APFD_Chapter10_Automated_Garden/APFD_Chapter10_Automated_Garden.ino b/books/pdummies/APFD_Chapter10_Automated_Garden/APFD_Chapter10_Automated_Garden.ino new file mode 100644 index 0000000..7d4ebe1 --- /dev/null +++ b/books/pdummies/APFD_Chapter10_Automated_Garden/APFD_Chapter10_Automated_Garden.ino @@ -0,0 +1,44 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 10: Building and Automated Garden + * A system that detects soil moisture and + * triggers a solenoid valve + * + * v0.1 30.04.2013 +*/ + +int sensorPin = A0; // The input pin for the moisture sensor +int valvePin = 9; // The output pin to actuate the valve + +const int dryThreshold = 950; // Set this threshold based upon your sensor tests + // 1023 = bone dry, < 100 totally submerged +const long sampleInterval = 600; // Sample every 10 minutes +const int irrigationTime = 5000; // Duration to let the water flow +boolean DEBUG=true; // Set to true if you want to read output on the Serial port + +void setup() { + if(DEBUG){Serial.begin(9600);} + + pinMode(sensorPin, INPUT); // Declare the sensor pin as an OUTPUT: + pinMode(valvePin, OUTPUT); // Declare the valve pin as an OUTPUT: + digitalWrite(valvePin, LOW); // Make sure the valve is closed. +} + +void loop() { + + int sensorValue = analogRead(sensorPin); // read the value from the sensor: + + if(DEBUG){ + Serial.print("Sensor value: "); + Serial.println(sensorValue); + } + + if (sensorValue>dryThreshold){ + digitalWrite(valvePin, HIGH); // Open the water valve + delay(irrigationTime); // Keep it open for the irrigation time + digitalWrite(valvePin, LOW); // Close the valve + } + delay(sampleInterval); // wait until the next time to take a reading +} + diff --git a/books/pdummies/APFD_Chapter11_Tweeting_PetDoor/APFD_Chapter11_Tweeting_PetDoor.ino b/books/pdummies/APFD_Chapter11_Tweeting_PetDoor/APFD_Chapter11_Tweeting_PetDoor.ino new file mode 100644 index 0000000..5617afe --- /dev/null +++ b/books/pdummies/APFD_Chapter11_Tweeting_PetDoor/APFD_Chapter11_Tweeting_PetDoor.ino @@ -0,0 +1,119 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 11: Building a Tweeting Pet Door + * A system that uses hall effect sensors to + * detect the movement of a pet flap and then + * posts a message to your (or your pet's) twitter account + * + * Uses the default SPI, Ethernet, EEPROM libraries, + * the SHA and Time libraries, + * and the Arduino Twitter libraries by Markku Rossi + * + * v0.1 30.04.2013 +*/ + +#include +#include +#include +#include +#include +#include + +// Enter a MAC address for your controller below. +// Newer Ethernet shields have a MAC address printed on a sticker on the shield +byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 }; +IPAddress ip(192,168,1,43); // the IP address may be different on your network +EthernetClient client; + +IPAddress twitter_ip(199, 59, 149, 232); +uint16_t twitter_port = 80; + +// Replace the text below with your CONSUMER KEY and SECRET from Twitter! +// Otherwise the code will not work! +const static char consumer_key[] PROGMEM = "*****YOUR CONSUMER KEY*****"; +const static char consumer_secret[] PROGMEM = "*****YOUR CONSUMER SECRET*****"; + +char buffer[512]; +Twitter twitter(buffer, sizeof(buffer)); + +unsigned long timestamp; +boolean entering = false; +char* entryMessage = "I'm baaaack!"; +char* exitMessage = "I'm outta here!"; + +const int entryPin = A0; // the number of the pushbutton pin +const int exitPin = A1; // the number of the pushbutton pin +int entryValue = 0; // Define variable to store the entry value +int exitValue = 0; // Define variable to store the exit value + +void setup() { + Serial.begin(9600); + Serial.println("Attempting to get an IP address using DHCP:"); + if (!Ethernet.begin(mac)) { + //if DHCP fails, start with a hard-coded address: + Serial.println("Failed to get an IP address using DHCP, trying the static IP"); + Ethernet.begin(mac, ip); + } + Serial.print("My address:"); + Serial.println(Ethernet.localIP()); + delay(3000); // delay so we can read stuff on the Serial Monitor + + pinMode(entryPin, INPUT); + pinMode(exitPin, INPUT); + + // connect to Twitter: + twitter.set_twitter_endpoint(PSTR("api.twitter.com"), + PSTR("/1/statuses/update.json"), twitter_ip, twitter_port, false); + // Reads OAuth account identification from EEPROM. + twitter.set_client_id(consumer_key, consumer_secret); + // Set OAuth account identification from program memory. + + // Replace the text below with your ACCESS TOKEN and SECRET from Twitter! + // Otherwise the code will not work! + twitter.set_account_id(PSTR("******YOUR ACCESS TOKEN******"), + PSTR("******YOUR ACCESS TOKEN SECRET******")); +} + +void loop(){ + entryValue = analogRead(entryPin); + + Serial.println(entryValue); // Uncomment this line to monitor the readings + + if (entryValue < 50){ + entering=true; + sendTweet(); + } + + exitValue = analogRead(exitPin); + if (exitValue < 50){ + entering=false; + sendTweet(); + } + delay(10); +} + +void sendTweet(){ + + if (twitter.is_ready()) { + char tweet[140]; + timestamp = twitter.get_time(); + + if(entering){ + sprintf(tweet, "%02d:%02d:%02d: %s", hour(timestamp), minute(timestamp), second(timestamp), entryMessage); + } else { + sprintf(tweet, "%02d:%02d:%02d: %s", hour(timestamp), minute(timestamp), second(timestamp), exitMessage); + } + + Serial.println(tweet); + Serial.print("Posting to Twitter: "); + if (twitter.post_status(tweet)){ + Serial.println("Status updated"); + } + else{ + Serial.println("Update failed"); + } + } + delay(10000); // wait 10 seconds to avoid double triggering (a "pet debounce") +} + diff --git a/books/pdummies/APFD_Chapter11_Tweeting_PetDoor_Test/APFD_Chapter11_Tweeting_PetDoor_Test.ino b/books/pdummies/APFD_Chapter11_Tweeting_PetDoor_Test/APFD_Chapter11_Tweeting_PetDoor_Test.ino new file mode 100644 index 0000000..8ff249f --- /dev/null +++ b/books/pdummies/APFD_Chapter11_Tweeting_PetDoor_Test/APFD_Chapter11_Tweeting_PetDoor_Test.ino @@ -0,0 +1,32 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 11: Building a Tweeting Pet Door + * A system that uses hall effect sensors to + * detect the movement of a pet flap and then + * posts a message to your (or your pet's) twitter account + * + * Use this code to test and calibrate your Hall Effect sensors + * without posting a tweet + * + * v0.1 30.04.2013 +*/ + +const int entryPin = A0; // Define the input pin for entry sensor +const int exitPin = A1; // Define the input pin for the exit sensor +int entryReading = 0; // Define variable to store the entry value +int exitReading = 0; // Define variable to store the exit value + +void setup() { + Serial.begin(9600); // Open a serial connection to display the data +} + +void loop() { + entryReading = analogRead(entryPin); // Read the value from entry sensor + exitReading = analogRead(exitPin); // Read the value from exit sensor + Serial.print("Sensor values: "); + Serial.print(entryReading); // Print the entry sensor value + Serial.print(", "); + Serial.println(exitReading); // Print the exit + delay(500); // Wait a moment, so we can read what's been printed +} diff --git a/books/pdummies/APFD_Chapter12_Home_Sensing_Station/.DS_Store b/books/pdummies/APFD_Chapter12_Home_Sensing_Station/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/books/pdummies/APFD_Chapter12_Home_Sensing_Station/.DS_Store differ diff --git a/books/pdummies/APFD_Chapter12_Home_Sensing_Station/APFD_Chapter12_Home_Sensing_Station.ino b/books/pdummies/APFD_Chapter12_Home_Sensing_Station/APFD_Chapter12_Home_Sensing_Station.ino new file mode 100644 index 0000000..92625a3 --- /dev/null +++ b/books/pdummies/APFD_Chapter12_Home_Sensing_Station/APFD_Chapter12_Home_Sensing_Station.ino @@ -0,0 +1,141 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 12: Building a Home Sensing Station + * Reads values from Analog Sensors on Pins 2,3 and 4 + * Posts these values as three datastreams to + * a single Xively feed. + * + * Requires: + * HttpClient library at: https://github.com/amcewen/HttpClient + * Xively library at: https://github.com/xively/xively-arduino + * Based on example code written by Adrian McEwen with + * modifications by Sam Mulube + * + * v0.1 15.05.2013 +*/ + +#include +#include +#include +#include + +// Replace the text below with your API_KEY and FEED_ID from Xively! +// Otherwise the code will not work! +#define API_KEY "***** YOUR API KEY GOES HERE *****" // your Xively API key goes here +#define FEED_ID ***** YOUR FEED ID GOES HERE ***** // your Xively feed ID goes here + +// MAC address for your Ethernet shield +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +// Analog pins we're monitoring (0 and 1 are used by the Ethernet shield's SD card) + +const int lightSensorPin=2; +const int tempPin1=3; +const int tempPin2=4; + +unsigned long lastConnectionTime = 0; // last time we connected to Xively +const unsigned long connectionInterval = 15000; // delay between connecting to Xively in milliseconds + +// Initialize the Xively library + +// Define the strings for our datastream IDs +char sensorId1[] = "light"; // Light level (LDR) +char sensorId2[] = "temp1"; // Temperature sensor 1 (TMP36) +char sensorId3[] = "temp2"; // Temperature sensor 2 (TMP36) + +// Create three datastreams for the feed +XivelyDatastream datastreams[] = { + XivelyDatastream(sensorId1, strlen(sensorId1), DATASTREAM_FLOAT), + XivelyDatastream(sensorId2, strlen(sensorId2), DATASTREAM_FLOAT), + XivelyDatastream(sensorId3, strlen(sensorId3), DATASTREAM_FLOAT), +}; + +// Wrap the 3 datastreams into one feed +XivelyFeed feed(FEED_ID, datastreams, 3 /* number of datastreams */); + +// Create the ethernet client and Xively client +EthernetClient client; +XivelyClient xivelyclient(client); + +void setup() { + Serial.begin(9600); + Serial.println("Initializing network"); + while (Ethernet.begin(mac) != 1) { + Serial.println("Error getting IP address via DHCP, trying again..."); + delay(15000); + } + Serial.println("Network initialized"); + Serial.println("Ready."); +} + +void loop() { + // main program loop + if (millis() - lastConnectionTime > connectionInterval) { + // read a value from the Light sensor pin (2) + float lightLevel = map(analogRead(lightSensorPin),0,1023,0,100); + // send it to Xively (sensor , + sendData(0, lightLevel); // the 0 is the index number of this stream in the datastreams[] array + + // read the datastream back from Xively + getData(0); // This is optional. Just prints what you sent to Xively to the Serial Monitor + + float temperature1 = ((getVoltage(tempPin1) -.5) * 100L); + //convert from 10 mv per degree with 500 mV offset, to degrees ((voltage - 500mV) * 100) + + // send it to Xively + sendData(1, temperature1); // the 1 is the index number of this stream in the datastreams[] array + + // read the datastream back from Xively + getData(1); + + float temperature2 = ((getVoltage(tempPin2) -.5) * 100L); + // send it to Xively + sendData(2, temperature2); // the 2 is the index number of this stream in the datastreams[] array + + // read the datastream back from Xively + getData(2); + // update connection time so we wait before connecting again + lastConnectionTime = millis(); + + Serial.println("Waiting for next reading"); + Serial.println("========================"); + } +} + +// send the supplied value to Xively, printing some debug information as we go +void sendData(int streamIndexNumber, float sensorValue) { + datastreams[streamIndexNumber].setFloat(sensorValue);~~~ + + Serial.print("Sensor value is: "); + Serial.println(datastreams[streamIndexNumber].getFloat()); + + Serial.println("Uploading to Xively"); + int ret = xivelyclient.put(feed, API_KEY); + //Serial.print("PUT return code: "); + //Serial.println(ret); +} + +// get the value of the datastream from Xively, printing out the values we received +void getData(int stream) { + Serial.println("Reading the data back from Xively"); + + int request = xivelyclient.get(feed, API_KEY); + //Serial.print("GET return code: "); + //Serial.println(request); + + if (request > 0) { + Serial.print("Datastream: "); + Serial.println(feed[stream]); + + Serial.print("Sensor value: "); + Serial.println(feed[stream].getFloat()); + Serial.println("========================"); + } +} + +float getVoltage(int pin){ +//Converts from a 0 to 1024 digital reading from 0 to 5 volts +//in ~ 5 millivolt increments +return (analogRead(pin) * .004882814); +} diff --git a/books/pdummies/APFD_Chapter12_Home_Sensing_Station_Test/APFD_Chapter12_Home_Sensing_Station_Test.ino b/books/pdummies/APFD_Chapter12_Home_Sensing_Station_Test/APFD_Chapter12_Home_Sensing_Station_Test.ino new file mode 100644 index 0000000..8d965b7 --- /dev/null +++ b/books/pdummies/APFD_Chapter12_Home_Sensing_Station_Test/APFD_Chapter12_Home_Sensing_Station_Test.ino @@ -0,0 +1,41 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 12: Building a Home Sensing Station + * Reads values from Analog Sensors on Pins 2,3 and 4 + * Posts these values as three datastreams to + * a single Xively feed. + * + * This code is just for testing an calibrating your + * temperature and light sensors + * + * v0.1 14.05.2013 +*/ + +const int lightSensorPin=2; +const int tempPin1=3; +const int tempPin2=4; + +void setup() { + Serial.begin(9600); +} + +void loop() { + float lightLevel = map(analogRead(lightSensorPin),0,1023,0,100); + + float temperature1 = ((getVoltage(tempPin1) -.5) * 100L); + float temperature2 = ((getVoltage(tempPin2) -.5) * 100L); + + Serial.print("Temp 1 ('C): "); + Serial.print(temperature1); + Serial.print(", Temp 2 ('C): "); + Serial.print(temperature2); + Serial.print(", Light (V): "); + Serial.println(lightLevel); + delay(250); +} + +float getVoltage(int pin){ +return (analogRead(pin) * .004882814); +} + diff --git a/books/pdummies/APFD_Chapter13_GPS_Datalogger/APFD_Chapter13_GPS_Datalogger.ino b/books/pdummies/APFD_Chapter13_GPS_Datalogger/APFD_Chapter13_GPS_Datalogger.ino new file mode 100644 index 0000000..6ac1992 --- /dev/null +++ b/books/pdummies/APFD_Chapter13_GPS_Datalogger/APFD_Chapter13_GPS_Datalogger.ino @@ -0,0 +1,176 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 13: Building a GPS Data Logger + * Uses Adafruit Industries Ultimate logger shield + * to capture GPS data and record it to an SD card + * + * Requires: + * Adafruit_GPS library + * SD library + * This code is from http://www.adafruit.com and is slightly modified to + * run on an Arduino Uno by default. + * Ladyada's logger modified by Bill Greiman to use the SdFat library + * + * v0.1 30.04.2013 +*/ + + +#include +#include +#include +#include +#include "GPSconfig.h" + +SoftwareSerial mySerial(8, 7); +Adafruit_GPS GPS(&mySerial); + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO true +/* set to true to only log to SD when GPS has a fix, for debugging, keep it false */ +#define LOG_FIXONLY false + +// Set the pins used +#define chipSelect 10 +#define ledPin 13 + +File logfile; + +// read a Hex value and return the decimal equivalent +uint8_t parseHex(char c) { + if (c < '0') + return 0; + if (c <= '9') + return c - '0'; + if (c < 'A') + return 0; + if (c <= 'F') + return (c - 'A')+10; +} + +// blink out an error code +void error(uint8_t errno) { +/* + if (SD.errorCode()) { + putstring("SD error: "); + Serial.print(card.errorCode(), HEX); + Serial.print(','); + Serial.println(card.errorData(), HEX); + } + */ + while(1) { + uint8_t i; + for (i=0; i + +const int irReceivePin = 2; // Pin connected to IR detector output +IRrecv irrecv(irReceivePin); // create the IR library +decode_results results; // IR results are stored here + +void setup() +{ + Serial.begin(9600); // Start the serial port + irrecv.enableIRIn(); // Start the IR receiver +} + +void loop() { + if( irrecv.decode(&results) ) + { + showReceivedData(); + irrecv.resume(); // Receive the next value + } + delay(250); +} + +void showReceivedData() +{ + if (results.decode_type == UNKNOWN) + { + Serial.println("-Could not decode message"); + } + else + { + if (results.decode_type == NEC) { + Serial.print("- decoded NEC: "); + } + else if (results.decode_type == SONY) { + Serial.print("- decoded SONY: "); + } + else if (results.decode_type == RC5) { + Serial.print("- decoded RC5: "); + } + else if (results.decode_type == RC6) { + Serial.print("- decoded RC6: "); + } + Serial.print("Value = "); + Serial.println(results.value, DEC); // Print the results as a decimal value + } +} diff --git a/books/pdummies/APFD_Chapter14_Remote_Controlled_Car/APFD_Chapter14_Remote_Controlled_Car.ino b/books/pdummies/APFD_Chapter14_Remote_Controlled_Car/APFD_Chapter14_Remote_Controlled_Car.ino new file mode 100644 index 0000000..0828b65 --- /dev/null +++ b/books/pdummies/APFD_Chapter14_Remote_Controlled_Car/APFD_Chapter14_Remote_Controlled_Car.ino @@ -0,0 +1,141 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 14: Building a Remote Controlled Car + * Detects signals from a garden variety remote control + * to drive two servo motors. + * + * Uses the standard Arduino servo library and + * the IR Remote Library by Ken Shirriff: + * https://github.com/shirriff/Arduino-IRremote + * Adapted from code by Michael Margolis + * + * v0.1 30.04.2013 +*/ + +#include +#include + +const int irReceivePin = 2; // pin connected to IR detector output +IRrecv irrecv(irReceivePin); // create the IR library +decode_results results; // IR data goes here + +const int rightMotorPin = 9; // Connected to right servo +const int leftMotorPin = 10; // Connected to left servo + +Servo rightServo; +Servo leftServo; + +int rightSpeed=90; +int leftSpeed=90; + +long keyCode=0; + +boolean DEBUG = false; // set to true if you want to display the Debug output + +void setup() +{ + if(DEBUG){ + Serial.begin(9600); + } + + irrecv.enableIRIn(); // Start the IR receiver + + leftServo.attach(9); + rightServo.attach(10); + + pinMode(rightMotorPin, OUTPUT); + pinMode(leftMotorPin, OUTPUT); +} + +void loop() { + if( irrecv.decode(&results) ) + + { + keyCode=results.value; + if(keyCode != -1) + { + switch (keyCode){ + case 50174055: // Replace this code with the one from your remote! + Serial.println("Forward"); + leftSpeed-=1; // Opposite values propel the wheels forward + rightSpeed+=1; + break; + + case 50182215: // Replace this code with the one from your remote! + Serial.println("Backward"); + leftSpeed+=1; // Opposite values propel the wheels backward + rightSpeed-=1; + break; + + case 50168955: // Replace this code with the one from your remote! + Serial.println("Stop"); + leftSpeed=90; // A value of 90 stops the servos from turning + rightSpeed=90; + break; + + case 50152125: // Replace this code with the one from your remote! + Serial.println("Turn Left"); // Wheels move in opposite directions + leftSpeed-=1; + rightSpeed-=1; + break; + + case 50135805: // Replace this code with the one from your remote! + Serial.println("Turn Right"); // Wheels move in opposite directions + leftSpeed+=1; + rightSpeed+=1; + break; + + case 50139885: // Replace this code with the one from your remote! + Serial.println("TURBO!!"); // need to move left servo to go right + leftSpeed=leftSpeed-50; + rightSpeed=rightSpeed+50; + break; + + } + + if(DEBUG){ + Serial.println(keyCode); + showReceivedData(); + Serial.print(leftSpeed); + Serial.print(", "); + Serial.println(rightSpeed); + } + + } + irrecv.resume(); // Receive the next value + } + + updateMotors(); + delay(10); +} + +void showReceivedData() +{ + if (results.decode_type == UNKNOWN) + { + Serial.println("-Could not decode message"); + } + else + { + if (results.decode_type == NEC) { + Serial.print("- decoded NEC: "); + } + else if (results.decode_type == SONY) { + Serial.print("- decoded SONY: "); + } + else if (results.decode_type == RC5) { + Serial.print("- decoded RC5: "); + } + else if (results.decode_type == RC6) { + Serial.print("- decoded RC6: "); + } + Serial.print("Value = "); + Serial.println( results.value, DEC); + } +} + +void updateMotors(){ + leftServo.write(leftSpeed); + rightServo.write(rightSpeed); +} diff --git a/books/pdummies/APFD_Chapter15_LED_Cube/APFD_Chapter15_LED_Cube.ino b/books/pdummies/APFD_Chapter15_LED_Cube/APFD_Chapter15_LED_Cube.ino new file mode 100644 index 0000000..8f52ece --- /dev/null +++ b/books/pdummies/APFD_Chapter15_LED_Cube/APFD_Chapter15_LED_Cube.ino @@ -0,0 +1,299 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 15: Building an LED Cube + * Drives animation on a 9x9x9 LED cube + * + * v0.1 30.04.2013 +*/ + +#include // Allows use of program memory space to store patterns + +// LED Pattern Table in program memory (PROGMEM) +// The last column is the display time in units of 100ms. + +prog_uchar PROGMEM patternData[] = { + // Blink all LEDs on and off + B111, B111, B111, B111, B111, B111, B111, B111, B111, 10, + B000, B000, B000, B000, B000, B000, B000, B000, B000, 10, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 10, + B000, B000, B000, B000, B000, B000, B000, B000, B000, 10, + + // Test pattern showing each LED in order: + // Left to Right columns, then + // Front to Back rows, then + // Top to Bottom plane + B100, B000, B000, B000, B000, B000, B000, B000, B000, 1, + B010, B000, B000, B000, B000, B000, B000, B000, B000, 1, + B001, B000, B000, B000, B000, B000, B000, B000, B000, 1, + B000, B100, B000, B000, B000, B000, B000, B000, B000, 1, + B000, B010, B000, B000, B000, B000, B000, B000, B000, 1, + B000, B001, B000, B000, B000, B000, B000, B000, B000, 1, + B000, B000, B100, B000, B000, B000, B000, B000, B000, 1, + B000, B000, B010, B000, B000, B000, B000, B000, B000, 1, + B000, B000, B001, B000, B000, B000, B000, B000, B000, 1, + B000, B000, B000, B100, B000, B000, B000, B000, B000, 1, + B000, B000, B000, B010, B000, B000, B000, B000, B000, 1, + B000, B000, B000, B001, B000, B000, B000, B000, B000, 1, + B000, B000, B000, B000, B100, B000, B000, B000, B000, 1, + B000, B000, B000, B000, B010, B000, B000, B000, B000, 1, + B000, B000, B000, B000, B001, B000, B000, B000, B000, 1, + B000, B000, B000, B000, B000, B100, B000, B000, B000, 1, + B000, B000, B000, B000, B000, B010, B000, B000, B000, 1, + B000, B000, B000, B000, B000, B001, B000, B000, B000, 1, + B000, B000, B000, B000, B000, B000, B100, B000, B000, 1, + B000, B000, B000, B000, B000, B000, B010, B000, B000, 1, + B000, B000, B000, B000, B000, B000, B001, B000, B000, 1, + B000, B000, B000, B000, B000, B000, B000, B100, B000, 1, + B000, B000, B000, B000, B000, B000, B000, B010, B000, 1, + B000, B000, B000, B000, B000, B000, B000, B001, B000, 1, + B000, B000, B000, B000, B000, B000, B000, B000, B100, 1, + B000, B000, B000, B000, B000, B000, B000, B000, B010, 1, + B000, B000, B000, B000, B000, B000, B000, B000, B001, 10, + + // criscrossing planes + B111, B111, B111, B000, B000, B000, B000, B000, B000, 1, + B000, B000, B000, B111, B111, B111, B000, B000, B000, 1, + B000, B000, B000, B000, B000, B000, B111, B111, B111, 1, + B000, B000, B000, B111, B111, B111, B000, B000, B000, 1, + B111, B111, B111, B000, B000, B000, B000, B000, B000, 1, + B100, B100, B100, B100, B100, B100, B100, B100, B100, 1, + B010, B010, B010, B010, B010, B010, B010, B010, B010, 1, + B001, B001, B001, B001, B001, B001, B001, B001, B001, 1, + B010, B010, B010, B010, B010, B010, B010, B010, B010, 1, + B100, B100, B100, B100, B100, B100, B100, B100, B100, 1, + + //Pause + B000, B000, B000, B000, B000, B000, B000, B000, B000, 10, + + // Orbiting column + B100, B000, B000, B100, B000, B000, B100, B000, B000, 1, + B000, B100, B000, B000, B100, B000, B000, B100, B000, 1, + B000, B000, B100, B000, B000, B100, B000, B000, B100, 1, + B000, B000, B010, B000, B000, B010, B000, B000, B010, 1, + B000, B000, B001, B000, B000, B001, B000, B000, B001, 1, + B000, B001, B000, B000, B001, B000, B000, B001, B000, 1, + B001, B000, B000, B001, B000, B000, B001, B000, B000, 1, + B010, B000, B000, B010, B000, B000, B010, B000, B000, 1, + B100, B000, B000, B100, B000, B000, B100, B000, B000, 1, + B000, B100, B000, B000, B100, B000, B000, B100, B000, 1, + B000, B000, B100, B000, B000, B100, B000, B000, B100, 1, + B000, B000, B010, B000, B000, B010, B000, B000, B010, 1, + B000, B000, B001, B000, B000, B001, B000, B000, B001, 1, + B000, B001, B000, B000, B001, B000, B000, B001, B000, 1, + B001, B000, B000, B001, B000, B000, B001, B000, B000, 1, + B010, B000, B000, B010, B000, B000, B010, B000, B000, 1, + B100, B000, B000, B100, B000, B000, B100, B000, B000, 1, + B100, B000, B000, B100, B000, B000, B100, B000, B000, 1, + B000, B100, B000, B000, B100, B000, B000, B100, B000, 1, + B000, B000, B100, B000, B000, B100, B000, B000, B100, 1, + B000, B000, B010, B000, B000, B010, B000, B000, B010, 1, + B000, B000, B001, B000, B000, B001, B000, B000, B001, 1, + B000, B001, B000, B000, B001, B000, B000, B001, B000, 1, + B001, B000, B000, B001, B000, B000, B001, B000, B000, 1, + B010, B000, B000, B010, B000, B000, B010, B000, B000, 1, + B100, B000, B000, B100, B000, B000, B100, B000, B000, 1, + B000, B100, B000, B000, B100, B000, B000, B100, B000, 1, + B000, B000, B100, B000, B000, B100, B000, B000, B100, 1, + B000, B000, B010, B000, B000, B010, B000, B000, B010, 1, + B000, B000, B001, B000, B000, B001, B000, B000, B001, 1, + B000, B001, B000, B000, B001, B000, B000, B001, B000, 1, + B001, B000, B000, B001, B000, B000, B001, B000, B000, 1, + B010, B000, B000, B010, B000, B000, B010, B000, B000, 1, + B100, B000, B000, B100, B000, B000, B100, B000, B000, 1, + + // Two orbiting columns + B100, B000, B001, B100, B000, B001, B100, B000, B001, 1, + B000, B101, B000, B000, B101, B000, B000, B101, B000, 1, + B001, B000, B100, B001, B000, B100, B001, B000, B100, 1, + B010, B000, B010, B010, B000, B010, B010, B000, B010, 1, + B100, B000, B001, B100, B000, B001, B100, B000, B001, 1, + B000, B101, B000, B000, B101, B000, B000, B101, B000, 1, + B001, B000, B100, B001, B000, B100, B001, B000, B100, 1, + B010, B000, B010, B010, B000, B010, B010, B000, B010, 1, + B100, B000, B001, B100, B000, B001, B100, B000, B001, 1, + B000, B101, B000, B000, B101, B000, B000, B101, B000, 1, + B001, B000, B100, B001, B000, B100, B001, B000, B100, 1, + B010, B000, B010, B010, B000, B010, B010, B000, B010, 1, + B100, B000, B001, B100, B000, B001, B100, B000, B001, 1, + B000, B101, B000, B000, B101, B000, B000, B101, B000, 1, + B001, B000, B100, B001, B000, B100, B001, B000, B100, 1, + B010, B000, B010, B010, B000, B010, B010, B000, B010, 1, + B100, B000, B001, B100, B000, B001, B100, B000, B001, 1, + B000, B101, B000, B000, B101, B000, B000, B101, B000, 1, + B001, B000, B100, B001, B000, B100, B001, B000, B100, 1, + B010, B000, B010, B010, B000, B010, B010, B000, B010, 1, + + + // Little cube to big cube + B000, B000, B000, B000, B011, B011, B000, B011, B011, 10, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 10, + B000, B000, B000, B000, B011, B011, B000, B011, B011, 5, + B000, B000, B000, B000, B000, B000, B000, B000, B001, 2, + B000, B000, B000, B000, B011, B011, B000, B011, B011, 2, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 2, + B000, B000, B000, B000, B011, B011, B000, B011, B011, 2, + B000, B000, B000, B000, B000, B000, B000, B000, B001, 2, + B000, B000, B000, B000, B011, B011, B000, B011, B011, 2, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, + B000, B000, B000, B000, B011, B011, B000, B011, B011, 1, + B000, B000, B000, B000, B000, B000, B000, B000, B001, 1, + B000, B000, B000, B000, B011, B011, B000, B011, B011, 1, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, + B110, B110, B000, B110, B110, B000, B000, B000, B000, 1, + B100, B000, B000, B000, B000, B000, B000, B000, B000, 1, + B110, B110, B000, B110, B110, B000, B000, B000, B000, 1, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, + B000, B000, B000, B000, B011, B011, B000, B011, B011, 1, + B000, B000, B000, B000, B000, B000, B000, B000, B001, 1, + B000, B000, B000, B000, B011, B011, B000, B011, B011, 1, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, + B110, B110, B000, B110, B110, B000, B000, B000, B000, 1, + B100, B000, B000, B000, B000, B000, B000, B000, B000, 1, + B110, B110, B000, B110, B110, B000, B000, B000, B000, 1, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, + B000, B011, B011, B000, B011, B011, B000, B000, B000, 1, + B000, B000, B001, B000, B000, B000, B000, B000, B000, 1, + B000, B011, B011, B000, B011, B011, B000, B000, B000, 1, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, + B000, B000, B000, B110, B110, B000, B110, B110, B000, 1, + B000, B000, B000, B000, B000, B000, B100, B000, B000, 1, + B000, B000, B000, B110, B110, B000, B110, B110, B000, 1, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, + B000, B011, B011, B000, B011, B011, B000, B000, B000, 1, + B000, B000, B001, B000, B000, B000, B000, B000, B000, 1, + B000, B011, B011, B000, B011, B011, B000, B000, B000, 1, + B111, B111, B111, B111, B111, B111, B111, B111, B111, 1, + B000, B000, B000, B110, B110, B000, B110, B110, B000, 1, + B000, B000, B000, B000, B000, B000, B100, B000, B000, 1, + B000, B000, B000, B110, B110, B000, B110, B110, B000, 1, + + // Diagonal wipe, starting in the center + B111, B111, B111, B111, B111, B111, B111, B111, B111, 5, + B111, B111, B111, B111, B111, B111, B111, B101, B111, 1, + B111, B111, B111, B111, B101, B111, B111, B101, B111, 1, + B111, B111, B111, B111, B101, B111, B111, B100, B111, 1, + B111, B101, B111, B111, B100, B111, B111, B100, B110, 1, + B111, B101, B111, B111, B100, B111, B111, B100, B110, 1, + B111, B011, B111, B111, B100, B110, B111, B100, B100, 1, + B111, B100, B110, B111, B100, B100, B111, B100, B000, 1, + B111, B100, B100, B111, B100, B000, B111, B000, B000, 1, + B111, B100, B000, B111, B000, B000, B011, B000, B000, 1, + B111, B000, B000, B011, B000, B000, B001, B001, B000, 1, + + // A 2-LED wide diaginal stripe that orbits the cube + B011, B000, B000, B001, B001, B000, B000, B001, B001, 1, + B001, B001, B000, B000, B001, B001, B000, B000, B011, 1, + B000, B001, B001, B000, B000, B011, B000, B000, B110, 1, + B000, B000, B011, B000, B000, B110, B000, B100, B100, 1, + B000, B000, B110, B000, B100, B100, B100, B100, B000, 1, + B000, B100, B100, B100, B100, B000, B110, B000, B000, 1, + B100, B100, B000, B110, B000, B000, B011, B000, B000, 1, + B110, B000, B000, B011, B000, B000, B001, B001, B000, 1, + B011, B000, B000, B001, B001, B000, B000, B001, B001, 1, + B001, B001, B000, B000, B001, B001, B000, B000, B011, 1, + B000, B001, B001, B000, B000, B011, B000, B000, B110, 1, + B000, B000, B011, B000, B000, B110, B000, B100, B100, 1, + B000, B000, B110, B000, B100, B100, B100, B100, B000, 1, + B000, B100, B100, B100, B100, B000, B110, B000, B000, 1, + B100, B100, B000, B110, B000, B000, B011, B000, B000, 1, + B110, B000, B000, B011, B000, B000, B001, B001, B000, 1, + + //Pause + B000, B000, B000, B000, B000, B000, B000, B000, B000, 10, +}; + + +const int cubeSize=3; // The dimensions of the cube, in LEDs +const int planeSize=9; // The number of LEDs on each plane of the cube +const int planeDisplayTime=1000; // The time each plane is displayed in microseconds +const int updateSpeed=100; // Multiplier for displayTime to get milliseconds + +byte patternBuffer[planeSize]; // Stores the current pattern from patternData +int patternIndex; // Keeps track of the line of the pattern being displayed +int patternBufferIndex; // Counts where we are while painting the display +byte displayTime; // Multiplied by 100ms to set the frame duration +unsigned long endTime; // Tracks when we are finished with the frame + +int ledrow; // Counts LED rows in the refresh loop +int ledcol; // Counts LEDs columns in the refresh loop +int ledpin; // Counts LEDs in the refresh loop + +// Defining pins in array makes it easier to access them in the program +// and change how they are wired up, if necessary. + +int LEDPin[] = {2,3,4,5,6,7,8,9,10}; +int PlanePin[] = {14,15,16}; + +void setup() +{ + // set up LED pins as output (active HIGH) + for (int i=0; i0 + do { + // memcpy is copies the data from the Program Memory (PROMGMEM) into a temporary array buffer + // called pattern buffer. This will be used to determine what to light up + memcpy_P( patternBuffer, patternData+patternIndex, planeSize ); + // The size of the pattern index is incremented by 9, which keeps track of + // where we are getting our data from in the pattern Buffer. + // It will be reset back to 0 after all three planes are displayed. + patternIndex += planeSize; + // Read the displayTime from PROGMEM and increment the pattern index to get the right values. + // The displayTime is every 10th data element. + displayTime = pgm_read_byte_near( patternData + patternIndex++ ); + // Calculate the endTime from the current time (ms) and the displayTime + endTime = millis() + displayTime * updateSpeed; + + // loop while displayTime>0 and current time < endTime + while ( millis() < endTime ) { + patternBufferIndex = 0; // reset index counter to beginning of buffer + + // Loop over the planes of the cube + for (int plane=0; plane 0); // read patterns until time=0 which signals end +} + + diff --git a/books/pdummies/APFD_Chapter4/APFD_Chapter4.ino b/books/pdummies/APFD_Chapter4/APFD_Chapter4.ino new file mode 100644 index 0000000..9e39179 --- /dev/null +++ b/books/pdummies/APFD_Chapter4/APFD_Chapter4.ino @@ -0,0 +1,68 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 4: The All-Seeing Eye + * Sequentially lights up a series of LEDs + * + * v0.3 02.02.2015 + * Changed delayTime variable so that is is consistent with the + * text of the book. (Used to be timeDelay.) + * v0.2 03.07.2013 + * Fixed error: timeChanged = millis(); not within if loop brackets +*/ + +// A variable to set a delay time between each LED +int delayTime = 40; + +// A variable to store which LED we are currently working on +int currentLED = 4; + +// A variable to store the direction of travel of LEDs +int dir = 1; + +// A variable to store the last time we changed something +unsigned long timeChanged = 0; + +// Create an array to hold the value for each LED pin +byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; + +void setup() { + // Set all pins for OUTPUT + for (int x=0; x<10; x++) { + pinMode(ledPin[x], OUTPUT); + } + + // Set up the + timeChanged = millis(); +} + +void loop() { + // Check whether it has been long enough + if ((millis() - timeChanged) > delayTime) { + + // Turn off all of the LEDs + for (int x=0; x<10; x++) { + digitalWrite(ledPin[x], LOW); + } + + // Turn on the current LED + digitalWrite(ledPin[currentLED], HIGH); + + // Increment by the direction value + currentLED += dir; + + // If we are at the end of a row, change direction + if (currentLED == 9) { + dir = -1; + } + if (currentLED == 0) { + dir = 1; + } + + + // Store the current time as the time we last changed LEDs + timeChanged = millis(); + } +} + + diff --git a/books/pdummies/APFD_Chapter5/APFD_Chapter5.ino b/books/pdummies/APFD_Chapter5/APFD_Chapter5.ino new file mode 100644 index 0000000..6bb80c2 --- /dev/null +++ b/books/pdummies/APFD_Chapter5/APFD_Chapter5.ino @@ -0,0 +1,171 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 5: Making a Light Pet + * Changes the intensity of output of three LEDs + * with different combinations to simulate "moods" + * + * v0.1 30.04.2013 +*/ + +// Set which pins will use each color +const int redLED = 9; +const int greenLED = 10; +const int blueLED = 11; + +// Assign variables for the LEDs, current value and the new value to change to +int redValue = 0; // The current value of brightness +int newRedValue = 0; // The new value of brightness + +int blueValue = 0; +int newBlueValue = 0; + +int greenValue = 0; +int newGreenValue = 0; + +// Assign "utility" variables for the random number, and the fading speed +int randomValue = 0; +int fadeSpeed = 50; + +// Assign variables to choose the mood +int mood = 0; +const int moodTime = 10000; // the time in millisections 10000 = 10 seconds + +// Setup the three LED pins for OUTPUT +void setup(){ + pinMode(redLED, OUTPUT); + pinMode(blueLED, OUTPUT); + pinMode(greenLED, OUTPUT); +} + +// the main loop of the program +void loop() { + // first, determine and set the mood of the pet + mood = random(20); // randomly pick a number from 0-19 to select what mood the pet should be in + if (mood == 0){ // if the number picked was 0, run the purr function + purr(); + } + if (mood == 1){ // if the number picked was 1, run the happy function + happy(); + } + if (mood == 2){ // if the number picked was 2, run the sad function + sad(); + } + if (mood > 2){ // if the number picked was anything higher than 2, run the color blending function + blendColors(); + } +} + +void blendColors(){ + + // Pick a random value for the red LED + newRedValue= random(255); + if (redValue < newRedValue){ + for (int x=redValue; xnewRedValue; x--) { + analogWrite(redLED, x); + delay(20); + delay(fadeSpeed); + } + } + redValue=newRedValue; + + // Pick a random value for the green LED + newGreenValue= random(255); + if (greenValue < newGreenValue){ + for (int x=greenValue; xnewGreenValue; x--) { + analogWrite(greenLED, x); + delay(fadeSpeed); + } + } + greenValue=newGreenValue; + + // Pick a random value for the blue LED + newBlueValue= random(255); + if (blueValue < newBlueValue){ + for (int x=blueValue; xnewBlueValue; x--) { + analogWrite(blueLED, x); + delay(fadeSpeed); + } + } + blueValue=newBlueValue; +} + + + // the purr function makes all three LEDs pulsate 10 times +void purr(){ + for (int count=0;count<10;count++){ + for(int x=0;x<255;x++){ + analogWrite(redLED, x); + analogWrite(greenLED, x); + analogWrite(blueLED, x); + delay(10); + } + for(int x=255;x>0;x--){ + analogWrite(redLED, x); + analogWrite(greenLED, x); + analogWrite(blueLED, x); + delay(10); + } + } +} + +// The happy function turns on only the green LED for the mood time +void happy(){ + for(int x=greenValue;x<255;x++){ + analogWrite(greenLED, x); + delay(fadeSpeed); + } + for(int x=redValue;x>0;x--){ + analogWrite(redLED, x); + delay(fadeSpeed); + } + for(int x=blueValue;x>0;x--){ + analogWrite(blueLED, x); + delay(fadeSpeed); + } + delay(moodTime); // Sets how long the pet will wait in this mood + for(int x=255;x>0;x--){ + analogWrite(greenLED, x); + delay(fadeSpeed); + } +} + +// The sad function turns on only the red LED for the mood time +void sad(){ + for(int x=redValue;x<255;x++){ + analogWrite(redLED, x); + delay(fadeSpeed); + } + for(int x=greenValue;x>0;x--){ + analogWrite(greenLED, x); + delay(fadeSpeed); + } + for(int x=blueValue;x>0;x--){ + analogWrite(blueLED, x); + delay(fadeSpeed); + } + delay(moodTime); // Sets how long the pet will wait in this mood + for(int x=255;x>0;x--){ + analogWrite(redLED, x); + delay(fadeSpeed); + } +} + diff --git a/books/pdummies/APFD_Chapter6_Animated_Smiley/APFD_Chapter6_Animated_Smiley.ino b/books/pdummies/APFD_Chapter6_Animated_Smiley/APFD_Chapter6_Animated_Smiley.ino new file mode 100644 index 0000000..f2d6bab --- /dev/null +++ b/books/pdummies/APFD_Chapter6_Animated_Smiley/APFD_Chapter6_Animated_Smiley.ino @@ -0,0 +1,78 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 6: Making a Scrolling Sign + * Creates sprites and text messages using an + * 8x8 LED matrix display + * + * This sketch draws a smiley face on the display + * and swaps it out with a frowny face + * + * v0.1 30.04.2013 + * Adapted from Oomlout.com http://www.tinyurl.com/yhwxv6h +*/ + +// Arduino Pin Definitions +int rowPin[] = {2,3,4,5,6,7,8,9}; // An Array defining which Arduino pin each row is attached to + // (The rows are common anode (driven HIGH)) +int colPin[] = {17,16,15,14,13,12,11,10}; // An Array defining which pin each column is attached to + // (The columns are common cathode (driven LOW)) +byte smile[] = { // The array used to hold a bitmap of the display + B00111100, + B01000010, + B10100101, + B10000001, + B10100101, + B10011001, + B01000010, + B00111100}; + +byte frown[] = { //The array used to hold a bitmap of the display + B00111100, + B01000010, + B10100101, + B10000001, + B10011001, + B10111101, + B01000010, + B00111100}; + +void setup() +{ + for(int i = 0; i <8; i++){ // Set the 16 pins used to control the array to be OUTPUTs + pinMode(rowPin[i], OUTPUT); // These correspond to the Arduino pins stored in the arrays + pinMode(colPin[i], OUTPUT); + } +} + +void loop() +{ + displaySprite(smile, 1000); // Display the Sprite + displaySprite(frown, 1000); // Display the Sprite +} + +void displaySprite(byte * data, unsigned long duration){ + unsigned long start = millis(); + while (start+duration>millis()){ + for(int count = 0; count < 8; count++){ // A utility counter + for(int i = 0; i < 8; i++){ + digitalWrite(rowPin[i], LOW); // Turn off all row pins + } + for(int i = 0; i < 8; i++){ // Activate only the Arduino pin of the column to light up + if(i == count){ + digitalWrite(colPin[i], LOW); // Setting this LOW connects the current column's cathode to ground + } + else{ + digitalWrite(colPin[i], HIGH); // Setting HIGH Turns all the other rows off + } + } + for(int row = 0; row < 8; row++){ // Iterate through each pixel in the current column + int bit = (data[count] >> row) & 1; // Use a bit shift in the data[] array to do a bitwise comparison + // And assign the result of the comparison to the bit + if(bit == 1){ // If the bitwise comparison is 1, + digitalWrite(rowPin[row], HIGH); // Then light up the LED + } + } + } + } +} diff --git a/books/pdummies/APFD_Chapter6_Smiley/APFD_Chapter6_Smiley.ino b/books/pdummies/APFD_Chapter6_Smiley/APFD_Chapter6_Smiley.ino new file mode 100644 index 0000000..c6cd5a0 --- /dev/null +++ b/books/pdummies/APFD_Chapter6_Smiley/APFD_Chapter6_Smiley.ino @@ -0,0 +1,65 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 6: Making a Scrolling Sign + * Creates sprites and text messages using an + * 8x8 LED matrix display + * + * This sketch just draws a smiley face on the display. + * + * v0.1 30.04.2013 + * Adapted from Oomlout.com http://www.tinyurl.com/yhwxv6h +*/ + +// Arduino Pin Definitions +int rowPin[] = {2,3,4,5,6,7,8,9}; // An Array defining which Arduino pin each row is attached to + // (The rows are common anode (driven HIGH)) +int colPin[] = {17,16,15,14,13,12,11,10}; // An Array defining which pin each column is attached to + // (The columns are common cathode (driven LOW)) +byte smile[] = { // The array used to hold a bitmap of the display + B00111100, + B01000010, + B10100101, + B10000001, + B10100101, + B10011001, + B01000010, + B00111100}; + + +void setup() +{ + for(int i = 0; i <8; i++){ // Set the 16 pins used to control the array to be OUTPUTs + pinMode(rowPin[i], OUTPUT); // These correspond to the Arduino pins stored in the arrays + pinMode(colPin[i], OUTPUT); + } +} + +void loop() +{ + displaySprite(); // Display the Sprite +} + +void displaySprite(){ + for(int count = 0; count < 8; count++){ // A utility counter + for(int i = 0; i < 8; i++){ + digitalWrite(rowPin[i], LOW); // Turn off all row pins + } + for(int i = 0; i < 8; i++){ // Activate only the Arduino pin of the column to light up + if(i == count){ + digitalWrite(colPin[i], LOW); // Setting this LOW connects the current column's cathode to ground + } + else{ + digitalWrite(colPin[i], HIGH); // Setting HIGH Turns all the other rows off + } + } + for(int row = 0; row < 8; row++){ // Iterate through each pixel in the current column + int bit = (smile[count] >> row) & 1; // Use a bit shift in the data[] array to do a bitwise comparison + // And assign the result of the comparison to the bit + if(bit == 1){ // If the bitwise comparison is 1, + digitalWrite(rowPin[row], HIGH); // Then light up the LED + } + } + } +} + diff --git a/books/pdummies/APFD_Chapter6_Text_Scrolling/APFD_Chapter6_Text_Scrolling.ino b/books/pdummies/APFD_Chapter6_Text_Scrolling/APFD_Chapter6_Text_Scrolling.ino new file mode 100644 index 0000000..6761dfc --- /dev/null +++ b/books/pdummies/APFD_Chapter6_Text_Scrolling/APFD_Chapter6_Text_Scrolling.ino @@ -0,0 +1,532 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 6: Making a Scrolling Sign + * Creates sprites and text messages using an + * 8x8 LED matrix display + * + * This sketch sends a string of text to the display + * + * v0.1 30.04.2013 + * Adapted from Oomlout.com http://www.tinyurl.com/yhwxv6h +*/ + +char message[] = "HELLO WORLD! "; // The message to display + +// Variables used for scrolling (both start at 0) +int index = 0; // This is the current charachter in the string being displayed +int offset = 0; // This is how many columns it is offset by + +// Variables defining each charachters position in an array of integer arrays +// Letters +const int A = 0; const int B = 1; const int C = 2; const int D = 3; const int E = 4; +const int F = 5; const int G = 6; const int H = 7; const int I = 8; const int J = 9; +const int K = 10; const int L =11; const int M = 12; const int N = 13; const int O = 14; +const int P = 15; const int Q =16; const int R = 17; const int S = 18; const int T = 19; +const int U = 20; const int V =21; const int W = 22; const int X = 23; const int Y = 24; +const int Z = 25; + +// Punctuation +const int COL =26; const int DASH = 27; const int BRA2 = 28; const int _ = 29; const int LINE = 34; +const int DOT =36; + +// Extra Characters +const int FULL =30; const int CHECK = 31; const int B2 = 32; const int TEMP = 33; +const int SMILE =35; const int COLDOT = 36; + +// Pin Definitions +int rowPin[] = {2,3,4,5,6,7,8,9}; // An Array defining which pin each row is attached to + // (rows are common anode (drive HIGH)) +int colPin[] = {17,16,15,14,13,12,11,10}; // An Array defining which pin each column is attached to + // (columns are common cathode (drive LOW)) + +// The array used to hold a bitmap of the display +// (if you wish to do something other than a scrolling marquee +// change the data in this variable) +byte data[] = {0,0,0,0,0,0,0,0}; + +//The alphabet +//Each Charachter is an 8 x 7 bitmap where 1 is on and 0 is off +const int _A[] = {B0001000, + B0010100, + B0100010, + B1000001, + B1111111, + B1000001, + B1000001, + B0000000}; + +const int _B[] = {B1111110, + B0100001, + B0100001, + B0111110, + B0100001, + B0100001, + B1111110, + B0000000}; + +const int _C[] = {B0011111, + B0100000, + B1000000, + B1000000, + B1000000, + B0100000, + B0011111, + B0000000}; + +const int _D[] = {B1111100, + B0100010, + B0100001, + B0100001, + B0100001, + B0100010, + B1111100, + B0000000}; + +const int _E[] = {B1111111, + B1000000, + B1000000, + B1111100, + B1000000, + B1000000, + B1111111, + B0000000}; + +const int _F[] = {B1111111, + B1000000, + B1000000, + B1111100, + B1000000, + B1000000, + B1000000, + B0000000}; + +const int _G[] = {B0011111, + B0100000, + B1000000, + B1001111, + B1000001, + B0100001, + B0011111, + B0000000}; + +const int _H[] = {B1000001, + B1000001, + B1000001, + B1111111, + B1000001, + B1000001, + B1000001, + B0000000}; + +const int _I[] = {B1111111, + B0001000, + B0001000, + B0001000, + B0001000, + B0001000, + B1111111, + B0000000}; + +const int _J[] = {B0001111, + B0000001, + B0000001, + B0000001, + B0000001, + B1000001, + B0111110, + B0000000}; + +const int _K[] = {B1000011, + B1000100, + B1001000, + B1110000, + B1001000, + B1000100, + B1000011, + B0000000}; + +const int _L[] = {B1000000, + B1000000, + B1000000, + B1000000, + B1000000, + B1000000, + B1111111, + B0000000}; + +const int _M[] = {B1110110, + B1001001, + B1001001, + B1001001, + B1001001, + B1001001, + B1001001, + B0000000}; + +const int _N[] = {B1000001, + B1100001, + B1010001, + B1001001, + B1000101, + B1000011, + B1000001, + B0000000}; + +const int _O[] = {B0011100, + B0100010, + B1000001, + B1000001, + B1000001, + B0100010, + B0011100, + B0000000}; + +const int _P[] = {B0111110, + B0100001, + B0100001, + B0111110, + B0100000, + B0100000, + B0100000, + B0000000}; + +const int _Q[] = {B0011100, + B0100010, + B1000001, + B1000001, + B1000101, + B0100010, + B0011101, + B0000000}; + +const int _R[] = {B1111110, + B0100001, + B0100001, + B0101110, + B0100100, + B0100010, + B0100001, + B0000000}; + +const int _S[] = {B0111111, + B1000000, + B1000000, + B0111110, + B0000001, + B0000001, + B1111110, + B0000000}; + +const int _T[] = {B1111111, + B0001000, + B0001000, + B0001000, + B0001000, + B0001000, + B0001000, + B0000000}; + +const int _U[] = {B1000001, + B1000001, + B1000001, + B1000001, + B1000001, + B1000001, + B0111110, + B0000000}; + +const int _V[] = {B1000001, + B1000001, + B1000001, + B1000001, + B0100010, + B0010100, + B0001000, + B0000000}; + +const int _W[] = {B1000001, + B1001001, + B1001001, + B1001001, + B1001001, + B1001001, + B0110110, + B0000000}; + +const int _X[] = {B1000001, + B0100010, + B0010100, + B0001000, + B0010100, + B0100010, + B1000001, + B0000000}; + +const int _Y[] = {B1000001, + B0100010, + B0010100, + B0001000, + B0001000, + B0001000, + B0001000, + B0000000}; + +const int _Z[] = {B1111111, + B0000010, + B0000100, + B0111110, + B0010000, + B0100000, + B1111111, + B0000000}; + +const int _COL[] ={B0000000, + B0011000, + B0011000, + B0000000, + B0011000, + B0011000, + B0000000, + B0000000}; + +const int _DASH[] = {B0000000, + B0000000, + B0000000, + B0111110, + B0000000, + B0000000, + B0000000, + B0000000}; + +const int _BRA2[] = {B0010000, + B0001000, + B0000100, + B0000100, + B0001000, + B0010000, + B0000000, + B0000000}; + +const int __[] = {B0000000, + B0000000, + B0000000, + B0000000, + B0000000, + B0000000, + B0000000, + B0000000}; + +const int _FULL[] = {B1111111, + B1111111, + B1111111, + B1111111, + B1111111, + B1111111, + B1111111, + B0000000}; + +const int _CHECK[] = {B1010101, + B0101010, + B1010101, + B0101010, + B1010101, + B0101010, + B1010101, + B0000000}; + +const int _B2[] = {B0111110, + B0000001, + B0000001, + B0001111, + B0000001, + B1000001, + B0111110, + B0000000}; + +const int _TEMP[] = {B0000011, + B0011111, + B0111111, + B1111110, + B1111111, + B0011111, + B0000011, + B0000000}; + +const int _LINE[] = {B0000001, + B0000001, + B0000001, + B0000001, + B0000001, + B0000001, + B0000001, + B0000000}; + +const int _SMILE[] = {B0000000, + B1100100, + B1100010, + B0011001, + B1100010, + B1100100, + B0000000, + B0000000}; + + +const int _DOT[] = {B0000000, + B0000000, + B0000000, + B0000000, + B1100000, + B1100000, + B0000000, + B0000000}; + +const int _COLDOT[] = {B0000000, + B0110000, + B0110000, + B0000000, + B0110011, + B0110011, + B0000000, + B0000000}; + +// Load the bitmap characters into an array (each character's position corresponds to its previously defined index +// (ie _A (a's bitmap) is at index 0 and A = 0 so letters[A] will return the 'A' bitmap.) +const int * letters[] = {_A,_B,_C,_D,_E,_F,_G,_H,_I,_J,_K,_L,_M,_N,_O,_P,_Q,_R,_S,_T,_U,_V,_W,_X,_Y,_Z,_COL,_DASH,_BRA2,__, _FULL, _CHECK, _B2, _TEMP, _LINE, _SMILE, _DOT, _COLDOT}; + +// An array holding the powers of 2. These are used as bit masks when calculating what to display +const int powers[] = {1,2,4,8,16,32,64,128}; + +// Setup runs once when power is applied +void setup() +{ + for(int i = 0; i <8; i++){ // Set the 16 pins used to control the array as OUTPUTs + pinMode(rowPin[i], OUTPUT); + pinMode(colPin[i], OUTPUT); + } +} + +void loop() +{ + loadSprite(); + displaySprite(data, 40); // 40 milliseconds delay +} + +// Loads the current scroll state frame into the data[] display array +void loadSprite(){ + int currentChar = getChar(message[index]); + int nextChar = getChar(message[index+1]); + + for(int row=0; row < 8; row++){ // Iterate through each row + data[row] = 0; // Reset the row we're working on + for(int column=0; column < 8; column++){ // Iterate through each column + data[row] = data[row] + ((powers[column] & (letters[currentChar][row] << offset))); //loads the current charachter offset by offset pixels + data[row] = data[row] + (powers[column] & (letters[nextChar][row] >> (8-offset) )); //loads the next charachter offset by offset pixels + } + } + offset++; // Increment the offset by one row + if(offset==8){offset = 0; index++; if(index==sizeof(message)-2){index=0;}} //if offset is 8 load the next charachter pair for the next time through +} + +void displaySprite(byte * data, unsigned long duration){ + unsigned long start = millis(); + while (start+duration>millis()){ + for(int column = 0; column < 8; column++){ // Iterate through each column + for(int i = 0; i < 8; i++){ + digitalWrite(rowPin[i], LOW); // Turn off all row pins + } + for(int i = 0; i < 8; i++){ // Set only the one pin + if(i == column){ + digitalWrite(colPin[i], LOW); + } // Turns the current row on + else{ + digitalWrite(colPin[i], HIGH); } // Turns the rest of the rows off + } + + for(int row = 0; row < 8; row++){ // Iterate through each pixel in the current column + int bit = (data[column] >> row) & 1; + if(bit == 1){ + digitalWrite(rowPin[row], HIGH); // If the bit in the data array is set, turn the LED on + } + } + } + } +} + + +// Returns the index of a given charachter +// For converting from a string to a lookup +// in the array of character bitmaps above + +int getChar(char charachter){ + int returnValue = CHECK; + switch(charachter){ + case 'A': returnValue = A; break; + case 'a': returnValue = A; break; + case 'B': returnValue = B; break; + case 'b': returnValue = B; break; + case 'C': returnValue = C; break; + case 'c': returnValue = C; break; + case 'D': returnValue = D; break; + case 'd': returnValue = D; break; + case 'E': returnValue = E; break; + case 'e': returnValue = E; break; + case 'F': returnValue = F; break; + case 'f': returnValue = F; break; + case 'G': returnValue = G; break; + case 'g': returnValue = G; break; + case 'H': returnValue = H; break; + case 'h': returnValue = H; break; + case 'I': returnValue = I; break; + case 'i': returnValue = I; break; + case 'J': returnValue = J; break; + case 'j': returnValue = J; break; + case 'K': returnValue = K; break; + case 'k': returnValue = K; break; + case 'L': returnValue = L; break; + case 'l': returnValue = L; break; + case 'M': returnValue = M; break; + case 'm': returnValue = M; break; + case 'N': returnValue = N; break; + case 'n': returnValue = N; break; + case 'O': returnValue = O; break; + case 'o': returnValue = O; break; + case 'P': returnValue = P; break; + case 'p': returnValue = P; break; + case 'Q': returnValue = Q; break; + case 'q': returnValue = Q; break; + case 'R': returnValue = R; break; + case 'r': returnValue = R; break; + case 'S': returnValue = S; break; + case 's': returnValue = S; break; + case 'T': returnValue = T; break; + case 't': returnValue = T; break; + case 'U': returnValue = U; break; + case 'u': returnValue = U; break; + case 'V': returnValue = V; break; + case 'v': returnValue = V; break; + case 'W': returnValue = W; break; + case 'w': returnValue = W; break; + case 'X': returnValue = X; break; + case 'x': returnValue = X; break; + case 'Y': returnValue = Y; break; + case 'y': returnValue = Y; break; + case 'Z': returnValue = Z; break; + case 'z': returnValue = Z; break; + case ' ': returnValue = _; break; + + // Characters, punctuation, smileys, and emoticons + case '3': returnValue = B2; break; + case '<': returnValue = TEMP; break; + case '*': returnValue = FULL; break; + case '|': returnValue = LINE; break; + case '_': returnValue = _; break; + case ':': returnValue = COL; break; + case '-': returnValue = DASH; break; + case ')': returnValue = BRA2; break; + case '%': returnValue = SMILE; break; + case '.': returnValue = DOT; break; + case '^': returnValue = COLDOT; break; + } + return returnValue; +} diff --git a/books/pdummies/APFD_Chapter7_ArduinoClock/APFD_Chapter7_ArduinoClock.ino b/books/pdummies/APFD_Chapter7_ArduinoClock/APFD_Chapter7_ArduinoClock.ino new file mode 100644 index 0000000..86cbc04 --- /dev/null +++ b/books/pdummies/APFD_Chapter7_ArduinoClock/APFD_Chapter7_ArduinoClock.ino @@ -0,0 +1,202 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 7: Building an Arduino Clock + * An alarm clock that uses the Adafruit Industries DS1307 RTC Breakout board + * and a 16x2 Parallel LCD Display + * + * Uses the default Wire and LiquitCrystal libraries + * and the Adafruit RTC library + * + * v0.1 30.04.2013 + * Adapted from http://www.adafruit.com/products/746 +*/ + +#include // I2C Wire Library for communicating with the DS1307 RTC +#include "RTClib.h" // Date and time functions for the DS1307 RTC connected +#include // Display functions for the LCD Display + +RTC_DS1307 rtc; // Create a realtime clock called rtc +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Create an LCD called lcd + +DateTime now; // Creates a DateTime object called now so that we can read from the RTC module + +boolean displayAlarmSet = false; // Whether we are in the show time mode or show alarm set mode +boolean alarm = false; // Whether the alarm is set or not +boolean armed = false; // Whether the alarm is armed or not + +int alarmHrs = 12; // You can set the alarm time in code, here +int alarmMins = 00; + +// User input to set alarm time +const int alarmSetPin=6; // Used to change to alarm set mode +const int incrementAlarmHrsPin=7; // Used to increment the alarm hours in alarm set mode +const int incrementAlarmMinsPin=8; // Used to increment the alarm minutes in alarm set mode +const int piezoPin = 9; // Used for the piezoelectric sounder +const int alarmArmedPin=10; // Use to enable the alarm to go off + + +void setup () { + Wire.begin(); // Enables the communication for the LCD + rtc.begin(); // Enables the RTC + lcd.begin(16, 2); // Enables he LCD + lcd.print(" It's Alive!"); // Print a message, centered, to the LCD to confirm is working + delay(1000); // Wait a moment so we can read it + lcd.clear(); // Clear the LCD + + // Set several pins for input and output + pinMode(alarmSetPin, INPUT); + pinMode(incrementAlarmHrsPin, INPUT); + pinMode(incrementAlarmMinsPin, INPUT); + pinMode(piezoPin, OUTPUT); + pinMode(alarmArmedPin, INPUT); + +} + +void loop () { + now = rtc.now(); // Get the current time + + int alarmArmed=digitalRead(alarmArmedPin); + if (alarmArmed==HIGH){ + armed=true; + } else { + armed=false; + } + + // Determine whether to sound the alarm or not + if(armed){ // If the alarm is armed and... + if (!alarm){ // If we are not currently sounding the alarm + checkAlarm(); // Check to see if it is the time it should be triggered + } + else { + soundAlarm(); // Otherwise, we should be sounding the alarm, so do it. + } +} + // Check whether we are in Alarm Set mode + int setMode = digitalRead(alarmSetPin); // Read the pin that the switch is on + if (setMode==HIGH){ // If the pin is high + displayAlarmSet=true; // Set displayAlarmSet true. It's used by updateDisplay to switch between showing alarm or current time + setAlarm(); // Go read the switches to set the alarm + } + else { // If we aren't in set mode + displayAlarmSet=false; // We are not is net mode so make sure the flag is correct + } + + // Refresh the display + updateDisplay(); +} + +// Update the display with either the current time or the time the alarm is set for +void updateDisplay(){ + + if(displayAlarmSet){ // If we are in alarm set mode, DISPLAY ALARM SET TEXT + lcd.setCursor(0, 0); // Set the cursor at the column zero, upper row + lcd.print("Set alarm time: "); + lcd.setCursor(4, 1); // Move the cursor to column four, lower row + lcd.print(" "); // Write over digits of the time that was previously displayed + lcd.setCursor(5, 1); // Move to the next column so the time will be centered + if (alarmHrs<10){ // Integers of 0-9 are only one digit. If so... + lcd.print(0); // ... add a zero in front of it + } + lcd.print(alarmHrs); // Print the current alarm hour + lcd.setCursor(7, 1); // Move to the next column + lcd.print(":"); // And print the colon + lcd.setCursor(8, 1); // Move to the next column + if (alarmMins<10){ // Integers of 0-9 are only one digit. If so... + lcd.print(0); // ... add a zero in front of it + } + lcd.print(alarmMins); // Print the current alarm minutes + lcd.setCursor(10, 1); // Move to the next column + lcd.print(" "); // Write spaces over the digits of time previously displayed + } + else { // If we are in NOT alarm set mode, DISPLAY CURRENT TIME + + int h = now.hour(); // Get the hours right now and store them in an integer called h + int m = now.minute(); // Get the minutes right now and store them in an integer called m + int s = now.second(); // Get the seconds right now and store them in an integer called s + + lcd.setCursor(0, 0); // Set the cursor at the column zero, upper row... + if(armed){ + lcd.print("* The time is: "); + } + else { + lcd.print(" The time is: "); // ...with spaces to clear characters from setting alarm. + } + lcd.setCursor(4, 1); // Move the cursor to column four, lower row + + if (h<10){ // Add a zero, if necessary, as above + lcd.print(0); + } + lcd.print(h); // Display the current hour + lcd.setCursor(6, 1); // Move to the next column + lcd.print(":"); // And print the colon + lcd.setCursor(7, 1); // Move to the next column + if (m<10){ // Add a zero, if necessary, as above + lcd.print(0); + } + lcd.print(m); // Display the current minute + lcd.setCursor(9, 1); // Move to the next column + lcd.print(":"); // And print the colon + lcd.setCursor(10, 1); // Move to the next column + if (s<10){ // Add a zero, if necessary, as above + lcd.print(0); + } + lcd.print(s); // Display the current second + } + +} + +// Check whether to sound the alarm +void checkAlarm(){ + if(alarmHrs==now.hour() && alarmMins==now.minute() && now.second()==0){ // If the alarm time is now, and it's zero seconds + alarm=true; // set the alarm flag to be true. The next time the main loop executes, the alarm will be activated + } +} + +// Increment hours or minutes +void setAlarm(){ + int hrs=digitalRead(incrementAlarmHrsPin); + int mins=digitalRead(incrementAlarmMinsPin); + + if (hrs==HIGH){ // If the hours switch is pressed + alarmHrs+=1; // Increment the hours upward + delay(200); // Wait a moment between incrementing the numbers + if(alarmHrs>23){ // if the hour is over 23, set it back to 0 + alarmHrs=0; + } + } + if (mins==HIGH){ // If the minutes switch is pressed + alarmMins+=1; // Increment the minutes upward + delay(200); // Wait a moment between incrementing the numbers + if(alarmMins>59){ // if the minute is over 59, set it back to 0 + alarmMins=0; + } + } +} + +void soundAlarm() { + float alarmFrequency=1400; // The value for the alarm tone in Hz + float period = (1.0 / alarmFrequency) * 1000000; + long beepDuration=250000; // the time in microseconds + long elapsedTime = 0; + + while (elapsedTime < beepDuration) { + digitalWrite(piezoPin,HIGH); + delayMicroseconds(period / 2); + digitalWrite(piezoPin, LOW); + delayMicroseconds(period / 2); + elapsedTime += (period); + } + digitalWrite(piezoPin, LOW); + delayMicroseconds(beepDuration); + + // Listend for either button to be pressed and if so, turn off the alarm + int hrs=digitalRead(incrementAlarmHrsPin); + int mins=digitalRead(incrementAlarmMinsPin); + + if (hrs==HIGH || mins==HIGH){ + alarm=false; + } +} + + diff --git a/books/pdummies/APFD_Chapter7_ArduinoClock_LCDTester/APFD_Chapter7_ArduinoClock_LCDTester.ino b/books/pdummies/APFD_Chapter7_ArduinoClock_LCDTester/APFD_Chapter7_ArduinoClock_LCDTester.ino new file mode 100644 index 0000000..8310a50 --- /dev/null +++ b/books/pdummies/APFD_Chapter7_ArduinoClock_LCDTester/APFD_Chapter7_ArduinoClock_LCDTester.ino @@ -0,0 +1,34 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 7: Building an Arduino Clock + * An alarm clock that uses the Adafruit Industries DS1307 RTC Breakout board + * and a 16x2 Parallel LCD Display + * + * This code just tests the LCD display + * + * Uses the default Wire and LiquitCrystal libraries + * and the Adafruit RTC library + * + * v0.1 30.04.2013 + * Adapted from http://www.adafruit.com/products/746 +*/ + +#include // I2C Wire Library for communicating with the DS1307 RTC +#include "RTClib.h" // Date and time functions for the DS1307 RTC connected +#include // Display functions for the LCD Display + +RTC_DS1307 rtc; // Create a realtime clock called rtc +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Create an LCD called lcd + +void setup () { + Wire.begin(); // Enables the communication for the LCD + rtc.begin(); // Enables the RTC + lcd.begin(16, 2); // Enables the LCD + lcd.print(" It's Alive!"); // Print a message, centered, to the LCD to confirm is working + delay(1000); // Wait a moment so we can read it + lcd.clear(); // Clear the LCD +} + +void loop(){ +} diff --git a/books/pdummies/APFD_Chapter8_Keypad_Entry_System/APFD_Chapter8_Keypad_Entry_System.ino b/books/pdummies/APFD_Chapter8_Keypad_Entry_System/APFD_Chapter8_Keypad_Entry_System.ino new file mode 100644 index 0000000..aabfb88 --- /dev/null +++ b/books/pdummies/APFD_Chapter8_Keypad_Entry_System/APFD_Chapter8_Keypad_Entry_System.ino @@ -0,0 +1,164 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 8: Building a Keypad Entry System + * A system that uses a numeric keypad to actuate a solenoid + * Code is dsiplayed on a LED 7-segment common cathode display + * with a MAX72xx display driver IC + * + * v0.1 30.04.2013 + * Adapted from keypad reading technique by Michael Margolis +*/ + +const int numberOfDigits = 4; // The number of digits in the 7-segment display +const int numRows = 4; // Number of rows in the keypad +const int numCols = 3; // Number of columns in the keypad +const int debounceTime = 20; // Number of milliseconds for switch to become stable +const int doorOpenTime = 5000; // How long you want the door strike to remain open + +const int strikePin = 9; // The pin that actuates the relay for the door strike +const int slaveSelect = 10; // Pin used to enable the slave pin on the MAX72xx + +char code[4]= {'1','2','3','4'}; // Set your code here +char codeBuffer[4]; // A buffer to store the code that is being entered + +boolean DEBUG=true; // Set thus to true to pring out status messages to the serial port +int keypressCount=0; // A variable to count how many times a key has been pressed + +// The keyMap defines the character returned when the corresponding key is pressed +const char keyMap[numRows][numCols] = { + { '1', '2', '3' }, + { '4', '5', '6' }, + { '7', '8', '9' }, + { '*', '0', '#' } +}; + +// This array defines the Arduino Digital pins used for rows and columns +// for the keypad from Sparkfun (US) and Rapid (UK) +const int rowPins[numRows] = { 7, 2, 3, 5 }; // Digital Pins for Keypad Rows 0 through 3 +const int colPins[numCols] = { 6, 8 ,4 }; // Digital Pins for Keypad Columns 0 through 2 + +void setup() +{ + if (DEBUG){Serial.begin(9600);} // If in DEBUG mode, start the serial port + + // Prepare the MAX72xx to display 7-segment data (see datasheet) + // Format: sendCommand(command, value) + + SPI.begin(); // initialize SPI interface to talk to the MAX72xx + pinMode(slaveSelect, OUTPUT); // Set the SPI slave pin for output + sendCommand(12,1); // Set to normal mode (default is shutdown mode); + sendCommand(15,0); // Display test off + sendCommand(10,8); // Set to medium brightness (range is 0-15) + sendCommand(11, numberOfDigits); // 7221 digit scan limit command + sendCommand(9,255); // Set "Decode mode" true. Provides digits: 0-9, H, E, L, P, -, blank + + // Prepare the I/O pins for the keypad and the relay + pinMode(strikePin,OUTPUT); + + for (int row = 0; row < numRows; row++) + { + pinMode(rowPins[row],INPUT); // Set row pins as input + digitalWrite(rowPins[row],HIGH); // Turn on pull-up resistors on the processor + } + for (int column = 0; column < numCols; column++) + { + pinMode(colPins[column],OUTPUT); // Set column pins as outputs for writing + digitalWrite(colPins[column],HIGH); // Make all columns inactive + } + + // Clear the display (helps when debugging) + clearDisplay(); +} + +void loop() +{ + + char key = getKey(); // See if a key has been pressed + codeBuffer[keypressCount]=key; // Add the key just pressed to the code Buffer + + if( key != 0) { // if the character is not 0 then + sendCommand(keypressCount+1, key); // Sends the character to the display + // it's a valid key press + if (DEBUG){ // Used to print values for testing and debugging + Serial.print("Digit "); + Serial.println(keypressCount); + Serial.print("Got key: "); + Serial.println(key); + Serial.print("Buffer: "); + Serial.print(codeBuffer[0]); // Print the contents of the code buffer + Serial.print(codeBuffer[1]); + Serial.print(codeBuffer[2]); + Serial.println(codeBuffer[3]); + Serial.print("Code: "); // Print the contents of the code array + Serial.print(code[0]); + Serial.print(code[1]); + Serial.print(code[2]); + Serial.println(code[3]); + } + + keypressCount++; // Incrmement the number of keys that have been pressed + + if (keypressCount==4){ // If four keys have been pressed, test whether code matches + delay(500); // wait a moment so that the forth digit can be seen on the display + if (memcmp(codeBuffer, code,4)==0) { // Compare to see if there is a match + if(DEBUG){Serial.println("MATCH!");} // If in DEBUG mode, report this + unlock(); // If there is a match, unlock + } + clearDisplay(); // Now clear the display + memset(codeBuffer, 0, 4); // Explicitly clear out the code buffer array + keypressCount=0; + } + } +} + +// Returns the key pressed, or 0 if no key is pressed +char getKey() +{ + char key = 0; // 0 indicates no key pressed + for(int column = 0; column < numCols; column++) + { + digitalWrite(colPins[column],LOW); // Activate the current column + for(int row = 0; row < numRows; row++) // Scan all rows for a key press + { + if(digitalRead(rowPins[row]) == LOW) // If a key is pressed... + { + delay(debounceTime); // Debounce + while(digitalRead(rowPins[row]) == LOW) ; // Wait for key to be released + key = keyMap[row][column]; // Store which key was pressed + } + } + digitalWrite(colPins[column],HIGH); // De-activate the current column + } + return key; // Return the key that pressed (or 0 if none) +} + + +void sendCommand(int command, unsigned char value) +{ + digitalWrite(slaveSelect,LOW); // Chip select is active when pin is LOW + SPI.transfer(command); // Send the First byte of data to the MAX72xx + SPI.transfer(value); // Send the Second byte of data + digitalWrite(slaveSelect,HIGH); // Release the chip - signals end of data transfer +} + +void clearDisplay(){ + sendCommand(1, '_'); // Clears out all the digits. You can also use underscore 'o' + sendCommand(2, '_'); + sendCommand(3, '_'); + sendCommand(4, '_'); +} + +void unlock(){ + if(DEBUG){Serial.println("Unlocking Door.");} + + // Display welcome message "HI" + // Other characters available are: j,k,l,m,n,o = -,e,h,l,p,blank + sendCommand(1, 'o'); // Blank + sendCommand(2, 'l'); // Letter H + sendCommand(3, '1'); // Letter I + sendCommand(4, 'o'); // Blank + digitalWrite(strikePin,HIGH); // Activate the relay (unlock the door strike) + delay(doorOpenTime); // Gives you time to open up the door + digitalWrite(strikePin,LOW); // Deactivate the relay (and lock door again) +} diff --git a/books/pdummies/APFD_Chapter9_RFID_Reader/APFD_Chapter9_RFID_Reader.ino b/books/pdummies/APFD_Chapter9_RFID_Reader/APFD_Chapter9_RFID_Reader.ino new file mode 100644 index 0000000..7d36153 --- /dev/null +++ b/books/pdummies/APFD_Chapter9_RFID_Reader/APFD_Chapter9_RFID_Reader.ino @@ -0,0 +1,125 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 9: Building an RFID Tag Reader + * A system that Reads and matches RFID tag to trigger a relay + * + * v0.1 30.04.2013 + * Adapted from bildr.com +*/ + + +const int relayPin = 11; // The pin the relay is connected to +const int ledPin = 12; // The pin the indicaor LED is connected to +const int RFIDResetPin = 13; // This pin tells the reader to read again +const int relayOntime = 5000; // The time to leave the relay on, in ms. + +// Make a list of your RFID tags here. +// If you don't know them, leave at least one in place as starter +// a starter ID and delete it later. Otherwise the code will break. +// (You always have to have something to compare the read tags to.) + +char tag1[13] = "4B00DDBF9FB6"; // Your scanned tag ID goes here +char tag2[13] = "010203AABBCC"; // these are example Iag IDs only +char tag3[13] = "010203AABBDD"; // these are example Iag IDs only +// etc. for more tags + +void setup(){ + Serial.begin(9600); // Start the serial connection to TX/RX data + pinMode(RFIDResetPin, OUTPUT); // Tells the reader to start again + pinMode(ledPin, OUTPUT); // Set the LED pin to output + pinMode(relayPin, OUTPUT); // Set the LED pin to output + digitalWrite(RFIDResetPin, HIGH); // Make it ready to read + Serial.println("Ready."); // Advise the consoe we are ready. +} + +void loop(){ + + Serial.println("Looking for a tag..."); // Say what we are currently doing + char tagString[13]; // Create an array to hold the tag we are reading + int index = 0; // A utility counter to track where we are in tagstring[] + boolean reading = false; // Stores whether we have a reading + + while(Serial.available()){ // If there is a serial connection... + + int readByte = Serial.read(); // Read next available byte + if(readByte == 2) reading = true; // 2 indicates the begining ofa tag + if(readByte == 3) reading = false; // 3 indicates the end of tag + + // If there is a reading and it's not the beginning or end, store it + if(reading && readByte != 2 && readByte != 10 && readByte != 13){ + + tagString[index] = readByte; // Store the tag at the index point + index ++; // increment where we are in the storage array + } + } + + checkTag(tagString); // Check if it is a match + clearTag(tagString); // Clear the char array of all values + resetReader(); // Reset the RFID reader + +} + +void checkTag(char tag[]){ + + // Compare this tag to the stored tags + if(strlen(tag) == 0) return; // If there's nothing here, do nothing + + if(compareTag(tag, tag1)){ // If read tag matches tag1, do this + lightLED(); + triggerRelay(); + } + else if(compareTag(tag, tag2)){ // If read tag matches tag2, do this + lightLED(); // You could have any function here! + } + else if(compareTag(tag, tag3)){ // If read tag matches tag3, do this + lightLED(); + } else { // If it doesn't match the list of tags... + Serial.println("New tag found: "); + Serial.println(tag); // Print the tag number of this new tag + delay(5000); // Wait 5 seconds, so we can make note of it + } + +} + +boolean compareTag(char one[], char two[]){ + // Compare our two chars to see whether the tag + // we just read is the same as the stored tag + + if(strlen(one) == 0) return false; // If there's nothing here, do nothing + + for(int i = 0; i < 12; i++){ + if(one[i] != two[i]) return false; // If the two tags are are not the same, return no match + } + Serial.println("Valid tag found!"); + return true; // Otherwise, return that there is a match! +} + +void lightLED(){ + digitalWrite(ledPin, HIGH); // Turn on the ledPin + delay(250); // Wait a moment + digitalWrite(ledPin, LOW); // Turn off the ledPin +} + +void triggerRelay(){ + digitalWrite(relayPin, HIGH); // Turn on the ledPin + delay(relayOntime); // Wait a moment + digitalWrite(relayPin, LOW); // Turn off the ledPin +} + +void clearTag(char one[]){ + // Clear the tag reading char array by filling it with ASCII 0 + // If not null, it could indicate another tag read + for(int i = 0; i < strlen(one); i++){ + one[i] = 0; + } +} + +void resetReader(){ + // Toggle the reset pin so the RFID reader will read again + digitalWrite(RFIDResetPin, LOW); + digitalWrite(RFIDResetPin, HIGH); + delay(150); +} + + diff --git a/books/pdummies/APFD_Web_Extras_Part_2/.DS_Store b/books/pdummies/APFD_Web_Extras_Part_2/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/books/pdummies/APFD_Web_Extras_Part_2/.DS_Store differ diff --git a/books/pdummies/APFD_Web_Extras_Part_2/APFD_Web_Extras_Part_2.ino b/books/pdummies/APFD_Web_Extras_Part_2/APFD_Web_Extras_Part_2.ino new file mode 100644 index 0000000..4085ccb --- /dev/null +++ b/books/pdummies/APFD_Web_Extras_Part_2/APFD_Web_Extras_Part_2.ino @@ -0,0 +1,63 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 4: The All-Seeing Eye + * Sequentially lights up a series of LEDs + * + * v0.1 30.04.2013 +*/ + +// A variable to set a delay time between each LED +int timeDelay(40); + +// A variable to store which LED we are currently working on +int currentLED = 4; + +// A variable to store the direction of travel of LEDs +int dir = 1; + +// A variable to store the last time we changed something +unsigned long timeChanged = 0; + +// Create an array to hold the value for each LED pin +byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; + +void setup() { + // Set all pins for OUTPUT + for (int x=0; x<10; x++) { + pinMode(ledPin[x], OUTPUT); + } + + // Set up the + timeChanged = millis(); +} + +void loop() { + // Check whether it has been long enough + if ((millis() - timeChanged) > timeDelay) { + + // Turn off all of the LEDs + for (int x=0; x<10; x++) { + digitalWrite(ledPin[x], LOW); + } + + // Turn on the current LED + digitalWrite(ledPin[currentLED], HIGH); + + // Increment by the direction value + currentLED += dir; + + // If we are at the end of a row, change direction + if (currentLED == 9) { + dir = -1; + } + if (currentLED == 0) { + dir = 1; + } + } + + // Store the current time as the time we last changed LEDs + timeChanged = millis(); +} + + diff --git a/books/pdummies/APFD_Web_Extras_Part_3/.DS_Store b/books/pdummies/APFD_Web_Extras_Part_3/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/books/pdummies/APFD_Web_Extras_Part_3/.DS_Store differ diff --git a/books/pdummies/APFD_Web_Extras_Part_3/APFD_Web_Extras_Part_3.ino b/books/pdummies/APFD_Web_Extras_Part_3/APFD_Web_Extras_Part_3.ino new file mode 100644 index 0000000..3ce02b4 --- /dev/null +++ b/books/pdummies/APFD_Web_Extras_Part_3/APFD_Web_Extras_Part_3.ino @@ -0,0 +1,258 @@ +/* Arduino Projects for Dummies + * by Brock Craft + * + * Chapter 8: Building a Keypad Entry System + RFID + * A system that uses a numeric keypad to actuate a solenoid + * Code is dsiplayed on a LED 7-segment common cathode display + * with a MAX72xx display driver IC + * + * v0.1 05.05.2013 + * Adapted from keypad reading technique by Michael Margolis +*/ + +#include + +const int numberOfDigits = 4; // The number of digits in the 7-segment display +const int numRows = 4; // Number of rows in the keypad +const int numCols = 3; // Number of columns in the keypad +const int debounceTime = 20; // Number of milliseconds for switch to become stable +const int doorOpenTime = 5000; // How long you want the door strike to remain open + +const int strikePin = 9; // The pin that actuates the relay for the door strike +const int slaveSelect = 10; // Pin used to enable the slave pin on the MAX72xx +const int RFIDResetPin = 12; // This pin tells the reader to read again + +// Make a list of your RFID tags here. +// If you don't know them, leave at least one in place as starter +// a starter ID and delete it later. Otherwise the code will break. +// (You always have to have something to compare the read tags to.) + +char tag1[13] = "4B00DDBF9FB6"; // Your scanned tag ID goes here +char tag2[13] = "010203AABBCC"; // these are example Iag IDs only +char tag3[13] = "010203AABBDD"; // these are example Iag IDs only +// etc. for more tags + +char code[4]= {'1','2','3','4'}; // Set your code here +char codeBuffer[4]; // A buffer to store the code that is being entered + +boolean DEBUG=true; // Set thus to true to pring out status messages to the serial port +int keypressCount=0; // A variable to count how many times a key has been pressed + +// The keyMap defines the character returned when the corresponding key is pressed +const char keyMap[numRows][numCols] = { + { '1', '2', '3' }, + { '4', '5', '6' }, + { '7', '8', '9' }, + { '*', '0', '#' } +}; + +// This array defines the Arduino Digital pins used for rows and columns +// for the keypad from Sparkfun (US) and Rapid (UK) +const int rowPins[numRows] = { 7, 2, 3, 5 }; // Digital Pins for Keypad Rows 0 through 3 +const int colPins[numCols] = { 6, 8 ,4 }; // Digital Pins for Keypad Columns 0 through 2 + +void setup() +{ + if (DEBUG){Serial.begin(9600);} // If in DEBUG mode, start the serial port + + // Prepare the MAX72xx to display 7-segment data (see datasheet) + // Format: sendCommand(command, value) + + SPI.begin(); // initialize SPI interface to talk to the MAX72xx + pinMode(slaveSelect, OUTPUT); // Set the SPI slave pin for output + sendCommand(12,1); // Set to normal mode (default is shutdown mode); + sendCommand(15,0); // Display test off + sendCommand(10,8); // Set to medium brightness (range is 0-15) + sendCommand(11, numberOfDigits); // 7221 digit scan limit command + sendCommand(9,255); // Set "Decode mode" true. Provides digits: 0-9, H, E, L, P, -, blank + + // Prepare the I/O pins for the keypad and the relay + pinMode(strikePin,OUTPUT); + + for (int row = 0; row < numRows; row++) + { + pinMode(rowPins[row],INPUT); // Set row pins as input + digitalWrite(rowPins[row],HIGH); // Turn on pull-up resistors on the processor + } + for (int column = 0; column < numCols; column++) + { + pinMode(colPins[column],OUTPUT); // Set column pins as outputs for writing + digitalWrite(colPins[column],HIGH); // Make all columns inactive + } + + // Clear the display (helps when debugging) + clearDisplay(); + + // Set up the RFID reader + pinMode(RFIDResetPin, OUTPUT); // Tells the reader to start again + digitalWrite(RFIDResetPin, HIGH); // Make it ready to read + Serial.println("Ready."); // Advise the consoe we are ready. +} + +void loop() +{ + + char key = getKey(); // See if a key has been pressed + codeBuffer[keypressCount]=key; // Add the key just pressed to the code Buffer + + if( key != 0) { // if the character is not 0 then + sendCommand(keypressCount+1, key); // Sends the character to the display + // it's a valid key press + if (DEBUG){ // Used to print values for testing and debugging + Serial.print("Digit "); + Serial.println(keypressCount); + Serial.print("Got key: "); + Serial.println(key); + Serial.print("Buffer: "); + Serial.print(codeBuffer[0]); // Print the contents of the code buffer + Serial.print(codeBuffer[1]); + Serial.print(codeBuffer[2]); + Serial.println(codeBuffer[3]); + Serial.print("Code: "); // Print the contents of the code array + Serial.print(code[0]); + Serial.print(code[1]); + Serial.print(code[2]); + Serial.println(code[3]); + } + + keypressCount++; // Incrmement the number of keys that have been pressed + + if (keypressCount==4){ // If four keys have been pressed, test whether code matches + delay(500); // wait a moment so that the forth digit can be seen on the display + if (memcmp(codeBuffer, code,4)==0) { // Compare to see if there is a match + if(DEBUG){Serial.println("MATCH!");} // If in DEBUG mode, report this + unlock(); // If there is a match, unlock + } + clearDisplay(); // Now clear the display + memset(codeBuffer, 0, 4); // Explicitly clear out the code buffer array + keypressCount=0; + } + } + + // NOW SEE IF THE RFID READER HAS DETECTED A TAG + + Serial.println("Looking for a tag..."); // Say what we are currently doing + char tagString[13]; // Create an array to hold the tag we are reading + int index = 0; // A utility counter to track where we are in tagstring[] + boolean reading = false; // Stores whether we have a reading + + while(Serial.available()){ // If there is a serial connection... + + int readByte = Serial.read(); // Read next available byte + if(readByte == 2) reading = true; // 2 indicates the begining ofa tag + if(readByte == 3) reading = false; // 3 indicates the end of tag + + // If there is a reading and it's not the beginning or end, store it + if(reading && readByte != 2 && readByte != 10 && readByte != 13){ + + tagString[index] = readByte; // Store the tag at the index point + index ++; // increment where we are in the storage array + } + } + + checkTag(tagString); // Check if it is a match + clearTag(tagString); // Clear the char array of all values + resetReader(); // Reset the RFID reader +} + +// Returns the key pressed, or 0 if no key is pressed +char getKey() +{ + char key = 0; // 0 indicates no key pressed + for(int column = 0; column < numCols; column++) + { + digitalWrite(colPins[column],LOW); // Activate the current column + for(int row = 0; row < numRows; row++) // Scan all rows for a key press + { + if(digitalRead(rowPins[row]) == LOW) // If a key is pressed... + { + delay(debounceTime); // Debounce + while(digitalRead(rowPins[row]) == LOW) ; // Wait for key to be released + key = keyMap[row][column]; // Store which key was pressed + } + } + digitalWrite(colPins[column],HIGH); // De-activate the current column + } + return key; // Return the key that pressed (or 0 if none) +} + + +void sendCommand(int command, unsigned char value) +{ + digitalWrite(slaveSelect,LOW); // Chip select is active when pin is LOW + SPI.transfer(command); // Send the First byte of data to the MAX72xx + SPI.transfer(value); // Send the Second byte of data + digitalWrite(slaveSelect,HIGH); // Release the chip - signals end of data transfer +} + +void clearDisplay(){ + sendCommand(1, '_'); // Clears out all the digits. You can also use underscore 'o' + sendCommand(2, '_'); + sendCommand(3, '_'); + sendCommand(4, '_'); +} + +void unlock(){ + if(DEBUG){Serial.println("Unlocking Door.");} + + // Display welcome message "HI" + // Other characters available are: j,k,l,m,n,o = -,e,h,l,p,blank + sendCommand(1, 'o'); // Blank + sendCommand(2, 'l'); // Letter H + sendCommand(3, '1'); // Letter I + sendCommand(4, 'o'); // Blank + digitalWrite(strikePin,HIGH); // Activate the relay (unlock the door strike) + delay(doorOpenTime); // Gives you time to open up the door + digitalWrite(strikePin,LOW); // Deactivate the relay (and lock door again) +} + +void checkTag(char tag[]){ + + // Compare this tag to the stored tags + if(strlen(tag) == 0) return; // If there's nothing here, do nothing + + if(compareTag(tag, tag1)){ // If read tag matches tag1, do this + unlock(); + } + else if(compareTag(tag, tag2)){ // If read tag matches tag2, do this + unlock(); + } + else if(compareTag(tag, tag3)){ // If read tag matches tag3, do this + unlock(); + } else { // If it doesn't match the list of tags... + Serial.println("New tag found: "); + Serial.println(tag); // Print the tag number of this new tag + delay(5000); // Wait 5 seconds, so we can make note of it + } + +} + +boolean compareTag(char one[], char two[]){ + // Compare our two chars to see whether the tag + // we just read is the same as the stored tag + + if(strlen(one) == 0) return false; // If there's nothing here, do nothing + + for(int i = 0; i < 12; i++){ + if(one[i] != two[i]) return false; // If the two tags are are not the same, return no match + } + Serial.println("Valid tag found!"); + return true; // Otherwise, return that there is a match! +} + +void clearTag(char one[]){ + // Clear the tag reading char array by filling it with ASCII 0 + // If not null, it could indicate another tag read + for(int i = 0; i < strlen(one); i++){ + one[i] = 0; + } +} + +void resetReader(){ + // Toggle the reset pin so the RFID reader will read again + digitalWrite(RFIDResetPin, LOW); + digitalWrite(RFIDResetPin, HIGH); + delay(150); +} + + diff --git a/books/pdummies/Libraries/.DS_Store b/books/pdummies/Libraries/.DS_Store new file mode 100644 index 0000000..011f30e Binary files /dev/null and b/books/pdummies/Libraries/.DS_Store differ diff --git a/books/pdummies/Libraries/Adafruit_GPS/Adafruit_GPS.cpp b/books/pdummies/Libraries/Adafruit_GPS/Adafruit_GPS.cpp new file mode 100755 index 0000000..65b8b1e --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/Adafruit_GPS.cpp @@ -0,0 +1,373 @@ +/*********************************** +This is our GPS library + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above must be included in any redistribution +****************************************/ + +#include + +// how long are max NMEA lines to parse? +#define MAXLINELENGTH 120 + +// we double buffer: read one line in and leave one for the main program +volatile char line1[MAXLINELENGTH]; +volatile char line2[MAXLINELENGTH]; +// our index into filling the current line +volatile uint8_t lineidx=0; +// pointers to the double buffers +volatile char *currentline; +volatile char *lastline; +volatile boolean recvdflag; +volatile boolean inStandbyMode; + + +boolean Adafruit_GPS::parse(char *nmea) { + // do checksum check + + // first look if we even have one + if (nmea[strlen(nmea)-4] == '*') { + uint16_t sum = parseHex(nmea[strlen(nmea)-3]) * 16; + sum += parseHex(nmea[strlen(nmea)-2]); + + // check checksum + for (uint8_t i=1; i < (strlen(nmea)-4); i++) { + sum ^= nmea[i]; + } + if (sum != 0) { + // bad checksum :( + //return false; + } + } + + // look for a few common sentences + if (strstr(nmea, "$GPGGA")) { + // found GGA + char *p = nmea; + // get time + p = strchr(p, ',')+1; + float timef = atof(p); + uint32_t time = timef; + hour = time / 10000; + minute = (time % 10000) / 100; + seconds = (time % 100); + + milliseconds = fmod(timef, 1.0) * 1000; + + // parse out latitude + p = strchr(p, ',')+1; + latitude = atof(p); + + p = strchr(p, ',')+1; + if (p[0] == 'N') lat = 'N'; + else if (p[0] == 'S') lat = 'S'; + else if (p[0] == ',') lat = 0; + else return false; + + // parse out longitude + p = strchr(p, ',')+1; + longitude = atof(p); + + p = strchr(p, ',')+1; + if (p[0] == 'W') lon = 'W'; + else if (p[0] == 'E') lon = 'E'; + else if (p[0] == ',') lon = 0; + else return false; + + p = strchr(p, ',')+1; + fixquality = atoi(p); + + p = strchr(p, ',')+1; + satellites = atoi(p); + + p = strchr(p, ',')+1; + HDOP = atof(p); + + p = strchr(p, ',')+1; + altitude = atof(p); + p = strchr(p, ',')+1; + p = strchr(p, ',')+1; + geoidheight = atof(p); + return true; + } + if (strstr(nmea, "$GPRMC")) { + // found RMC + char *p = nmea; + + // get time + p = strchr(p, ',')+1; + float timef = atof(p); + uint32_t time = timef; + hour = time / 10000; + minute = (time % 10000) / 100; + seconds = (time % 100); + + milliseconds = fmod(timef, 1.0) * 1000; + + p = strchr(p, ',')+1; + // Serial.println(p); + if (p[0] == 'A') + fix = true; + else if (p[0] == 'V') + fix = false; + else + return false; + + // parse out latitude + p = strchr(p, ',')+1; + latitude = atof(p); + + p = strchr(p, ',')+1; + if (p[0] == 'N') lat = 'N'; + else if (p[0] == 'S') lat = 'S'; + else if (p[0] == ',') lat = 0; + else return false; + + // parse out longitude + p = strchr(p, ',')+1; + longitude = atof(p); + + p = strchr(p, ',')+1; + if (p[0] == 'W') lon = 'W'; + else if (p[0] == 'E') lon = 'E'; + else if (p[0] == ',') lon = 0; + else return false; + + // speed + p = strchr(p, ',')+1; + speed = atof(p); + + // angle + p = strchr(p, ',')+1; + angle = atof(p); + + p = strchr(p, ',')+1; + uint32_t fulldate = atof(p); + day = fulldate / 10000; + month = (fulldate % 10000) / 100; + year = (fulldate % 100); + + // we dont parse the remaining, yet! + return true; + } + + return false; +} + +char Adafruit_GPS::read(void) { + char c = 0; + + if (paused) return c; + + if(gpsSwSerial) { + if(!gpsSwSerial->available()) return c; + c = gpsSwSerial->read(); + } else { + if(!gpsHwSerial->available()) return c; + c = gpsHwSerial->read(); + } + + //Serial.print(c); + + if (c == '$') { + currentline[lineidx] = 0; + lineidx = 0; + } + if (c == '\n') { + currentline[lineidx] = 0; + + if (currentline == line1) { + currentline = line2; + lastline = line1; + } else { + currentline = line1; + lastline = line2; + } + + //Serial.println("----"); + //Serial.println((char *)lastline); + //Serial.println("----"); + lineidx = 0; + recvdflag = true; + } + + currentline[lineidx++] = c; + if (lineidx >= MAXLINELENGTH) + lineidx = MAXLINELENGTH-1; + + return c; +} + +// Constructor when using SoftwareSerial or NewSoftSerial +#if ARDUINO >= 100 +Adafruit_GPS::Adafruit_GPS(SoftwareSerial *ser) +#else +Adafruit_GPS::Adafruit_GPS(NewSoftSerial *ser) +#endif +{ + common_init(); // Set everything to common state, then... + gpsSwSerial = ser; // ...override gpsSwSerial with value passed. +} + +// Constructor when using HardwareSerial +Adafruit_GPS::Adafruit_GPS(HardwareSerial *ser) { + common_init(); // Set everything to common state, then... + gpsHwSerial = ser; // ...override gpsHwSerial with value passed. +} + +// Initialization code used by all constructor types +void Adafruit_GPS::common_init(void) { + gpsSwSerial = NULL; // Set both to NULL, then override correct + gpsHwSerial = NULL; // port pointer in corresponding constructor + recvdflag = false; + paused = false; + lineidx = 0; + currentline = line1; + lastline = line2; + + hour = minute = seconds = year = month = day = + fixquality = satellites = 0; // uint8_t + lat = lon = mag = 0; // char + fix = false; // boolean + milliseconds = 0; // uint16_t + latitude = longitude = geoidheight = altitude = + speed = angle = magvariation = HDOP = 0.0; // float +} + +void Adafruit_GPS::begin(uint16_t baud) +{ + if(gpsSwSerial) gpsSwSerial->begin(baud); + else gpsHwSerial->begin(baud); + + delay(10); +} + +void Adafruit_GPS::sendCommand(char *str) { + if(gpsSwSerial) gpsSwSerial->println(str); + else gpsHwSerial->println(str); +} + +boolean Adafruit_GPS::newNMEAreceived(void) { + return recvdflag; +} + +void Adafruit_GPS::pause(boolean p) { + paused = p; +} + +char *Adafruit_GPS::lastNMEA(void) { + recvdflag = false; + return (char *)lastline; +} + +// read a Hex value and return the decimal equivalent +uint8_t Adafruit_GPS::parseHex(char c) { + if (c < '0') + return 0; + if (c <= '9') + return c - '0'; + if (c < 'A') + return 0; + if (c <= 'F') + return (c - 'A')+10; +} + +boolean Adafruit_GPS::waitForSentence(char *wait4me, uint8_t max) { + char str[20]; + + uint8_t i=0; + while (i < max) { + if (newNMEAreceived()) { + char *nmea = lastNMEA(); + strncpy(str, nmea, 20); + str[19] = 0; + i++; + + if (strstr(str, wait4me)) + return true; + } + } + + return false; +} + +boolean Adafruit_GPS::LOCUS_StartLogger(void) { + sendCommand(PMTK_LOCUS_STARTLOG); + recvdflag = false; + return waitForSentence(PMTK_LOCUS_LOGSTARTED); +} + +boolean Adafruit_GPS::LOCUS_ReadStatus(void) { + sendCommand(PMTK_LOCUS_QUERY_STATUS); + + if (! waitForSentence("$PMTKLOG")) + return false; + + char *response = lastNMEA(); + uint16_t parsed[10]; + uint8_t i; + + for (i=0; i<10; i++) parsed[i] = -1; + + response = strchr(response, ','); + for (i=0; i<10; i++) { + if (!response || (response[0] == 0) || (response[0] == '*')) + break; + response++; + parsed[i]=0; + while ((response[0] != ',') && + (response[0] != '*') && (response[0] != 0)) { + parsed[i] *= 10; + char c = response[0]; + if (isDigit(c)) + parsed[i] += c - '0'; + else + parsed[i] = c; + response++; + } + } + LOCUS_serial = parsed[0]; + LOCUS_type = parsed[1]; + if (isAlpha(parsed[2])) { + parsed[2] = parsed[2] - 'a' + 10; + } + LOCUS_mode = parsed[2]; + LOCUS_config = parsed[3]; + LOCUS_interval = parsed[4]; + LOCUS_distance = parsed[5]; + LOCUS_speed = parsed[6]; + LOCUS_status = !parsed[7]; + LOCUS_records = parsed[8]; + LOCUS_percent = parsed[9]; + + return true; +} + +// Standby Mode Switches +boolean Adafruit_GPS::standby(void) { + if (inStandbyMode) { + return false; // Returns false if already in standby mode, so that you do not wake it up by sending commands to GPS + } + else { + inStandbyMode = true; + sendCommand(PMTK_STANDBY); + //return waitForSentence(PMTK_STANDBY_SUCCESS); // don't seem to be fast enough to catch the message, or something else just is not working + return true; + } +} + +boolean Adafruit_GPS::wakeup(void) { + if (inStandbyMode) { + inStandbyMode = false; + sendCommand(""); // send byte to wake it up + return waitForSentence(PMTK_AWAKE); + } + else { + return false; // Returns false if not in standby mode, nothing to wakeup + } +} diff --git a/books/pdummies/Libraries/Adafruit_GPS/Adafruit_GPS.h b/books/pdummies/Libraries/Adafruit_GPS/Adafruit_GPS.h new file mode 100755 index 0000000..273097d --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/Adafruit_GPS.h @@ -0,0 +1,137 @@ +/*********************************** +This is the Adafruit GPS library - the ultimate GPS library +for the ultimate GPS module! + +Tested and works great with the Adafruit Ultimate GPS module +using MTK33x9 chipset + ------> http://www.adafruit.com/products/746 +Pick one up today at the Adafruit electronics shop +and help support open source hardware & software! -ada + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above must be included in any redistribution +****************************************/ + +#ifndef _ADAFRUIT_GPS_H +#define _ADAFRUIT_GPS_H + +#if ARDUINO >= 100 + #include +#else + #include +#endif + +// different commands to set the update rate from once a second (1 Hz) to 10 times a second (10Hz) +#define PMTK_SET_NMEA_UPDATE_1HZ "$PMTK220,1000*1F" +#define PMTK_SET_NMEA_UPDATE_5HZ "$PMTK220,200*2C" +#define PMTK_SET_NMEA_UPDATE_10HZ "$PMTK220,100*2F" + + +#define PMTK_SET_BAUD_57600 "$PMTK251,57600*2C" +#define PMTK_SET_BAUD_9600 "$PMTK251,9600*17" + +// turn on only the second sentence (GPRMC) +#define PMTK_SET_NMEA_OUTPUT_RMCONLY "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29" +// turn on GPRMC and GGA +#define PMTK_SET_NMEA_OUTPUT_RMCGGA "$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28" +// turn on ALL THE DATA +#define PMTK_SET_NMEA_OUTPUT_ALLDATA "$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28" +// turn off output +#define PMTK_SET_NMEA_OUTPUT_OFF "$PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28" + +// to generate your own sentences, check out the MTK command datasheet and use a checksum calculator +// such as the awesome http://www.hhhh.org/wiml/proj/nmeaxor.html + +#define PMTK_LOCUS_STARTLOG "$PMTK185,0*22" +#define PMTK_LOCUS_LOGSTARTED "$PMTK001,185,3*3C" +#define PMTK_LOCUS_QUERY_STATUS "$PMTK183*38" +#define PMTK_LOCUS_ERASE_FLASH "$PMTK184,1*22" +#define LOCUS_OVERLAP 0 +#define LOCUS_FULLSTOP 1 + +// standby command & boot successful message +#define PMTK_STANDBY "$PMTK161,0*28" +#define PMTK_STANDBY_SUCCESS "$PMTK001,161,3*3" // Not needed currently +#define PMTK_AWAKE "$PMTK010,002*2D" + +// ask for the release and version +#define PMTK_Q_RELEASE "$PMTK605*31" + +// request for updates on antenna status +#define PGCMD_ANTENNA "$PGCMD,33,1*6C" +#define PGCMD_NOANTENNA "$PGCMD,33,0*6C" + +// how long to wait when we're looking for a response +#define MAXWAITSENTENCE 5 + +#if ARDUINO >= 100 + #include "Arduino.h" +#if !defined(__AVR_ATmega32U4__) + #include "SoftwareSerial.h" +#endif +#else + #include "WProgram.h" + #include "NewSoftSerial.h" +#endif + + +class Adafruit_GPS { + public: + void begin(uint16_t baud); + +#if ARDUINO >= 100 + Adafruit_GPS(SoftwareSerial *ser); // Constructor when using SoftwareSerial +#else + Adafruit_GPS(NewSoftSerial *ser); // Constructor when using NewSoftSerial +#endif + Adafruit_GPS(HardwareSerial *ser); // Constructor when using HardwareSerial + + char *lastNMEA(void); + boolean newNMEAreceived(); + void common_init(void); + void sendCommand(char *); + void pause(boolean b); + + boolean parseNMEA(char *response); + uint8_t parseHex(char c); + + char read(void); + boolean parse(char *); + void interruptReads(boolean r); + + boolean wakeup(void); + boolean standby(void); + + uint8_t hour, minute, seconds, year, month, day; + uint16_t milliseconds; + float latitude, longitude, geoidheight, altitude; + float speed, angle, magvariation, HDOP; + char lat, lon, mag; + boolean fix; + uint8_t fixquality, satellites; + + boolean waitForSentence(char *wait, uint8_t max = MAXWAITSENTENCE); + boolean LOCUS_StartLogger(void); + boolean LOCUS_ReadStatus(void); + + uint16_t LOCUS_serial, LOCUS_records; + uint8_t LOCUS_type, LOCUS_mode, LOCUS_config, LOCUS_interval, LOCUS_distance, LOCUS_speed, LOCUS_status, LOCUS_percent; + private: + boolean paused; + + uint8_t parseResponse(char *response); +#if ARDUINO >= 100 + SoftwareSerial *gpsSwSerial; +#else + NewSoftSerial *gpsSwSerial; +#endif + HardwareSerial *gpsHwSerial; +}; + + +#endif diff --git a/books/pdummies/Libraries/Adafruit_GPS/GPSconfig.h b/books/pdummies/Libraries/Adafruit_GPS/GPSconfig.h new file mode 100644 index 0000000..d9e5b86 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/GPSconfig.h @@ -0,0 +1,62 @@ + +/* EXAMPLE + +$PSRF103,,,,*CKSUM + + 00=GGA,01=GLL,02=GSA,03=GSV,04=RMC,05=VTG + 00=SetRate,01=Query + Output every seconds, off=00,max=255 + 00=disable Checksum,01=Enable checksum for specified message +Note: checksum is required + +Example 1: Query the GGA message with checksum enabled +$PSRF103,00,01,00,01*25 + +Example 2: Enable VTG message for a 1Hz constant output with checksum enabled +$PSRF103,05,00,01,01*20 + +Example 3: Disable VTG message +$PSRF103,05,00,00,01*21 + +*/ + +#define SERIAL_SET "$PSRF100,01,4800,08,01,00*0E\r\n" + +// GGA-Global Positioning System Fixed Data, message 103,00 + +#define GGA_ON "$PSRF103,00,00,01,01*25\r\n" +#define GGA_OFF "$PSRF103,00,00,00,01*24\r\n" + +// GLL-Geographic Position-Latitude/Longitude, message 103,01 + +#define GLL_ON "$PSRF103,01,00,01,01*26\r\n" +#define GLL_OFF "$PSRF103,01,00,00,01*27\r\n" + +// GSA-GNSS DOP and Active Satellites, message 103,02 + +#define GSA_ON "$PSRF103,02,00,01,01*27\r\n" +#define GSA_OFF "$PSRF103,02,00,00,01*26\r\n" + +// GSV-GNSS Satellites in View, message 103,03 + +#define GSV_ON "$PSRF103,03,00,01,01*26\r\n" +#define GSV_OFF "$PSRF103,03,00,00,01*27\r\n" + +// RMC-Recommended Minimum Specific GNSS Data, message 103,04 + +#define RMC_ON "$PSRF103,04,00,01,01*21\r\n" +#define RMC_OFF "$PSRF103,04,00,00,01*20\r\n" + +// VTG-Course Over Ground and Ground Speed, message 103,05 + +#define VTG_ON "$PSRF103,05,00,01,01*20\r\n" +#define VTG_OFF "$PSRF103,05,00,00,01*21\r\n" + +// Switch Development Data Messages On/Off, message 105 +#define LOG_DDM 1 +#define DDM_ON "$PSRF105,01*3E\r\n" +#define DDM_OFF "$PSRF105,00*3F\r\n" + +#define USE_WAAS 0 // useful in US, but slower fix +#define WAAS_ON "$PSRF151,01*3F\r\n" // the command for turning on WAAS +#define WAAS_OFF "$PSRF151,00*3E\r\n" // the command for turning off WAAS diff --git a/books/pdummies/Libraries/Adafruit_GPS/README.txt b/books/pdummies/Libraries/Adafruit_GPS/README.txt new file mode 100755 index 0000000..86c436e --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/README.txt @@ -0,0 +1,21 @@ +This is the Adafruit GPS library - the ultimate GPS library +for the ultimate GPS module! + +Tested and works great with the Adafruit Ultimate GPS module +using MTK33x9 chipset + ------> http://www.adafruit.com/products/746 + +These modules use TTL serial to communicate, 2 pins are required to +interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above must be included in any redistribution + +To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_GPS. Check that the Adafruit_GPS folder contains Adafruit_GPS.cpp and Adafruit_GPS.h + +Place the Adafruit_GPS library folder your /libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE. \ No newline at end of file diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/blank/blank.pde b/books/pdummies/Libraries/Adafruit_GPS/examples/blank/blank.pde new file mode 100755 index 0000000..016ccb6 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/blank/blank.pde @@ -0,0 +1,11 @@ +// this sketch will allow you to bypass the Atmega chip +// and connect the GPS sensor directly to the USB/Serial +// chip converter. + +// Connect VIN to +5V +// Connect GND to Ground +// Connect GPS RX (data into GPS) to Digital 0 +// Connect GPS TX (data out from GPS) to Digital 1 + +void setup() {} +void loop() {} diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/echo/echo.pde b/books/pdummies/Libraries/Adafruit_GPS/examples/echo/echo.pde new file mode 100755 index 0000000..0ca6641 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/echo/echo.pde @@ -0,0 +1,119 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code just echos whatever is coming from the GPS unit to the +// serial monitor, handy for debugging! +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +#include +#if ARDUINO >= 100 + #include +#else + // Older Arduino IDE requires NewSoftSerial, download from: + // http://arduiniana.org/libraries/newsoftserial/ +// #include + // DO NOT install NewSoftSerial if using Arduino 1.0 or later! +#endif + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 3 +// Connect the GPS RX (receive) pin to Digital 2 +// If using hardware serial (e.g. Arduino Mega): +// Connect the GPS TX (transmit) pin to Arduino RX1, RX2 or RX3 +// Connect the GPS RX (receive) pin to matching TX1, TX2 or TX3 + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +#if ARDUINO >= 100 + SoftwareSerial mySerial(3, 2); +#else + NewSoftSerial mySerial(3, 2); +#endif +Adafruit_GPS GPS(&mySerial); +// If using hardware serial (e.g. Arduino Mega), comment +// out the above six lines and enable this line instead: +//Adafruit_GPS GPS(&Serial1); + + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO true + +// this keeps track of whether we're using the interrupt +// off by default! +boolean usingInterrupt = false; +void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy + +void setup() +{ + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + Serial.println("Adafruit GPS library basic test!"); + + // 9600 NMEA is the default baud rate for MTK - some use 4800 + GPS.begin(9600); + + // You can adjust which sentences to have the module emit, below + + // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + // uncomment this line to turn on only the "minimum recommended" data for high update rates! + //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); + // uncomment this line to turn on all the available data - for 9600 baud you'll want 1 Hz rate + //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_ALLDATA); + + // Set the update rate + // 1 Hz update rate + //GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); + // 5 Hz update rate- for 9600 baud you'll have to set the output to RMC or RMCGGA only (see above) + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_5HZ); + // 10 Hz update rate - for 9600 baud you'll have to set the output to RMC only (see above) + //GPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ); + + // Request updates on antenna status, comment out to keep quiet + GPS.sendCommand(PGCMD_ANTENNA); + + // the nice thing about this code is you can have a timer0 interrupt go off + // every 1 millisecond, and read data from the GPS for you. that makes the + // loop code a heck of a lot easier! + useInterrupt(true); + + delay(1000); +} + +// Interrupt is called once a millisecond, looks for any new GPS data, and stores it +SIGNAL(TIMER0_COMPA_vect) { + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if (GPSECHO) + if (c) UDR0 = c; + // writing direct to UDR0 is much much faster than Serial.print + // but only one character can be written at a time. +} + +void useInterrupt(boolean v) { + if (v) { + // Timer0 is already used for millis() - we'll just interrupt somewhere + // in the middle and call the "Compare A" function above + OCR0A = 0xAF; + TIMSK0 |= _BV(OCIE0A); + usingInterrupt = true; + } else { + // do not call the interrupt function COMPA anymore + TIMSK0 &= ~_BV(OCIE0A); + usingInterrupt = false; + } +} + + +void loop() // run over and over again +{ + // do nothing! all reading and printing is done in the interrupt +} diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/flora_dumplog/flora_gpsdump.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/flora_dumplog/flora_gpsdump.ino new file mode 100755 index 0000000..2814fcd --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/flora_dumplog/flora_gpsdump.ino @@ -0,0 +1,41 @@ +#include +#include +Adafruit_GPS GPS(&Serial1); + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO true + +// this keeps track of whether we're using the interrupt +// off by default! +boolean usingInterrupt = false; + +void setup() +{ + while (!Serial); + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + Serial.println("Adafruit GPS logging dump test!"); + + // 9600 NMEA is the default baud rate for MTK - some use 4800 + GPS.begin(9600); + + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_OFF); + + while (Serial1.available()) + Serial1.read(); + + delay(1000); + GPS.sendCommand("$PMTK622,1*29"); + Serial.println("----------------------------------------------------"); +} + + +void loop() // run over and over again +{ + if (Serial1.available()) { + char c = Serial1.read(); + if (c) Serial.print(c); + } +} diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/flora_gpslog/flora_gpslog.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/flora_gpslog/flora_gpslog.ino new file mode 100755 index 0000000..ba29a06 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/flora_gpslog/flora_gpslog.ino @@ -0,0 +1,81 @@ +#include +#include +Adafruit_GPS GPS(&Serial1); + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO true + +// this keeps track of whether we're using the interrupt +// off by default! +boolean usingInterrupt = false; + +void setup() +{ + //while (!Serial); + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + Serial.println("Adafruit GPS logging start test!"); + + // 9600 NMEA is the default baud rate for MTK - some use 4800 + GPS.begin(9600); + + // You can adjust which sentences to have the module emit, below + // Default is RMC + GGA + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + // Default is 1 Hz update rate + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); + + // the nice thing about this code is you can have a timer0 interrupt go off + // every 1 millisecond, and read data from the GPS for you. that makes the + // loop code a heck of a lot easier! + useInterrupt(true); + + delay(500); + while (true) { + Serial.print("Starting logging...."); + if (GPS.LOCUS_StartLogger()) { + Serial.println(" STARTED!"); + break; + } else { + Serial.println(" no response :("); + } + } +} + + + +void loop() // run over and over again +{ + pinMode(7, OUTPUT); + digitalWrite(7, HIGH); + delay(200); + digitalWrite(7, LOW); + delay(200); +} + +/******************************************************************/ +// Interrupt is called once a millisecond, looks for any new GPS data, and stores it +SIGNAL(TIMER0_COMPA_vect) { + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if (GPSECHO) + if (c) Serial.print(c); +} + +void useInterrupt(boolean v) { + if (v) { + // Timer0 is already used for millis() - we'll just interrupt somewhere + // in the middle and call the "Compare A" function above + OCR0A = 0xAF; + TIMSK0 |= _BV(OCIE0A); + usingInterrupt = true; + } else { + // do not call the interrupt function COMPA anymore + TIMSK0 &= ~_BV(OCIE0A); + usingInterrupt = false; + } +} + + diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/flora_gpstest/flora_gpstest.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/flora_gpstest/flora_gpstest.ino new file mode 100755 index 0000000..c8135ec --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/flora_gpstest/flora_gpstest.ino @@ -0,0 +1,19 @@ +// test a passthru between USB and hardware serial + +void setup() { + while (!Serial); + Serial.begin(9600); + Serial1.begin(9600); +} + + +void loop() { + if (Serial.available()) { + char c = Serial.read(); + Serial1.write(c); + } + if (Serial1.available()) { + char c = Serial1.read(); + Serial.write(c); + } +} diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/flora_parsing/flora_parsing.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/flora_parsing/flora_parsing.ino new file mode 100755 index 0000000..f103d71 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/flora_parsing/flora_parsing.ino @@ -0,0 +1,100 @@ +// Test code for Adafruit Flora GPS modules +// +// This code shows how to listen to the GPS module in an interrupt +// which allows the program to have more 'freedom' - just parse +// when a new NMEA sentence is available! Then access data when +// desired. +// +// Tested and works great with the Adafruit Flora GPS module +// ------> http://adafruit.com/products/1059 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +#include +#include +Adafruit_GPS GPS(&Serial1); + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO false + +// this keeps track of whether we're using the interrupt +// off by default! +boolean usingInterrupt = false; + +void setup() +{ + // connect at 115200 so we can read the GPS fast enough and echo without dropping chars + // also spit it out + Serial.begin(115200); + Serial.println("Adafruit GPS library basic test!"); + + // 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800 + GPS.begin(9600); + // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + // uncomment this line to turn on only the "minimum recommended" data + //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); + // For parsing data, we don't suggest using anything but either RMC only or RMC+GGA since + // the parser doesn't care about other sentences at this time + // Set the update rate + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate + // For the parsing code to work nicely and have time to sort thru the data, and + // print it out we don't suggest using anything higher than 1 Hz + + // Request updates on antenna status, comment out to keep quiet + GPS.sendCommand(PGCMD_ANTENNA); + + delay(1000); + // Ask for firmware version + Serial1.println(PMTK_Q_RELEASE); +} + + + +uint32_t timer = millis(); +void loop() // run over and over again +{ + // read data from the GPS in the 'main loop' + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if (GPSECHO) + if (c) Serial.print(c); + // if a sentence is received, we can check the checksum, parse it... + if (GPS.newNMEAreceived()) { + // a tricky thing here is if we print the NMEA sentence, or data + // we end up not listening and catching other sentences! + // so be very wary if using OUTPUT_ALLDATA and trytng to print out data + Serial.println(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false + if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false + return; // we can fail to parse a sentence in which case we should just wait for another + } + // if millis() or timer wraps around, we'll just reset it + if (timer > millis()) timer = millis(); + + // approximately every 2 seconds or so, print out the current stats + if (millis() - timer > 2000) { + timer = millis(); // reset the timer + Serial.print("\nTime: "); + Serial.print(GPS.hour, DEC); Serial.print(':'); + Serial.print(GPS.minute, DEC); Serial.print(':'); + Serial.print(GPS.seconds, DEC); Serial.print('.'); + Serial.println(GPS.milliseconds); + Serial.print("Date: "); + Serial.print(GPS.day, DEC); Serial.print('/'); + Serial.print(GPS.month, DEC); Serial.print("/20"); + Serial.println(GPS.year, DEC); + Serial.print("Fix: "); Serial.print((int)GPS.fix); + Serial.print(" quality: "); Serial.println((int)GPS.fixquality); + if (GPS.fix) { + Serial.print("Location: "); + Serial.print(GPS.latitude, 4); Serial.print(GPS.lat); + Serial.print(", "); + Serial.print(GPS.longitude, 4); Serial.println(GPS.lon); + Serial.print("Speed (knots): "); Serial.println(GPS.speed); + Serial.print("Angle: "); Serial.println(GPS.angle); + Serial.print("Altitude: "); Serial.println(GPS.altitude); + Serial.print("Satellites: "); Serial.println((int)GPS.satellites); + } + } +} diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/leo_echo/leo_echo.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_echo/leo_echo.ino new file mode 100755 index 0000000..8830a2a --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_echo/leo_echo.ino @@ -0,0 +1,76 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code just echos whatever is coming from the GPS unit to the +// serial monitor, handy for debugging! +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +//This code is intended for use with Arduino Leonardo and other ATmega32U4-based Arduinos + +#include +#include + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 8 +// Connect the GPS RX (receive) pin to Digital 7 +// If using hardware serial: +// Connect the GPS TX (transmit) pin to Arduino RX1 (Digital 0) +// Connect the GPS RX (receive) pin to matching TX1 (Digital 1) + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +//SoftwareSerial mySerial(8, 7); + +// If using hardware serial, comment +// out the above two lines and enable these two lines instead: +HardwareSerial mySerial = Serial1; + +#define PMTK_SET_NMEA_UPDATE_1HZ "$PMTK220,1000*1F" +#define PMTK_SET_NMEA_UPDATE_5HZ "$PMTK220,200*2C" +#define PMTK_SET_NMEA_UPDATE_10HZ "$PMTK220,100*2F" + +// turn on only the second sentence (GPRMC) +#define PMTK_SET_NMEA_OUTPUT_RMCONLY "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29" +// turn on GPRMC and GGA +#define PMTK_SET_NMEA_OUTPUT_RMCGGA "$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28" +// turn on ALL THE DATA +#define PMTK_SET_NMEA_OUTPUT_ALLDATA "$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28" +// turn off output +#define PMTK_SET_NMEA_OUTPUT_OFF "$PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28" + +#define PMTK_Q_RELEASE "$PMTK605*31" + +void setup() { + while (!Serial); // wait for leo to be ready + + Serial.begin(57600); // this baud rate doesn't actually matter! + Serial1.begin(9600); + delay(2000); + Serial.println("Get version!"); + Serial1.println(PMTK_Q_RELEASE); + + // you can send various commands to get it started + //mySerial.println(PMTK_SET_NMEA_OUTPUT_RMCGGA); + mySerial.println(PMTK_SET_NMEA_OUTPUT_ALLDATA); + + mySerial.println(PMTK_SET_NMEA_UPDATE_1HZ); + } + + +void loop() { + if (Serial.available()) { + char c = Serial.read(); + Serial.write(c); + mySerial.write(c); + } + if (mySerial.available()) { + char c = mySerial.read(); + Serial.write(c); + } +} \ No newline at end of file diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_dumpbasic/leo_locus_dumpbasic.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_dumpbasic/leo_locus_dumpbasic.ino new file mode 100755 index 0000000..b52b7bb --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_dumpbasic/leo_locus_dumpbasic.ino @@ -0,0 +1,65 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code turns on the LOCUS built-in datalogger. The datalogger +// turns off when power is lost, so you MUST turn it on every time +// you want to use it! +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +//This code is intended for use with Arduino Leonardo and other ATmega32U4-based Arduinos + +#include +#include + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 8 +// Connect the GPS RX (receive) pin to Digital 7 +// If using hardware serial: +// Connect the GPS TX (transmit) pin to Arduino RX1 (Digital 0) +// Connect the GPS RX (receive) pin to matching TX1 (Digital 1) + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +//SoftwareSerial mySerial(8, 7); +//Adafruit_GPS GPS(&mySerial); + +// If using hardware serial, comment +// out the above two lines and enable these two lines instead: +Adafruit_GPS GPS(&Serial1); +HardwareSerial mySerial = Serial1; + +void setup() +{ + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + delay(2000); + Serial.println("Adafruit GPS logging start test!"); + + // 9600 NMEA is the default baud rate for MTK - some use 4800 + GPS.begin(9600); + + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_OFF); + + while (mySerial.available()) + mySerial.read(); + + delay(1000); + GPS.sendCommand("$PMTK622,1*29"); + Serial.println("----------------------------------------------------"); +} + + +void loop() // run over and over again +{ + if (mySerial.available()) { + Serial.write(mySerial.read()); + } +} + diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_erase/leo_locus_erase.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_erase/leo_locus_erase.ino new file mode 100755 index 0000000..4d68476 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_erase/leo_locus_erase.ino @@ -0,0 +1,64 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code erases the LOCUS built-in datalogger storage +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +//This code is intended for use with Arduino Leonardo and other ATmega32U4-based Arduinos + +#include +#include + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 8 +// Connect the GPS RX (receive) pin to Digital 7 +// If using hardware serial: +// Connect the GPS TX (transmit) pin to Arduino RX1 (Digital 0) +// Connect the GPS RX (receive) pin to matching TX1 (Digital 1) + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +//SoftwareSerial mySerial(8, 7); +//Adafruit_GPS GPS(&mySerial); + +// If using hardware serial, comment +// out the above two lines and enable these two lines instead: +Adafruit_GPS GPS(&Serial1); +HardwareSerial mySerial = Serial1; + +void setup() +{ + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + delay(2000); + Serial.println("Adafruit GPS erase FLASH!"); + + // 9600 NMEA is the default baud rate for MTK + GPS.begin(9600); + + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_OFF); + + + Serial.println("This code will ERASE the data log stored in the FLASH - Permanently!"); + Serial.print("Are you sure you want to do this? [Y/N]: "); + while (Serial.read() != 'Y') delay(10); + Serial.println("\nERASING! UNPLUG YOUR ARDUINO WITHIN 5 SECONDS IF YOU DIDNT MEAN TO!"); + delay(5000); + GPS.sendCommand(PMTK_LOCUS_ERASE_FLASH); + Serial.println("Erased"); +} + +void loop() // run over and over again +{ + if (mySerial.available()) { + Serial.write(mySerial.read()); + } +} + diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_start/leo_locus_start.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_start/leo_locus_start.ino new file mode 100755 index 0000000..ff21122 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_start/leo_locus_start.ino @@ -0,0 +1,73 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code turns on the LOCUS built-in datalogger. The datalogger +// turns off when power is lost, so you MUST turn it on every time +// you want to use it! +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada +//This code is intended for use with Arduino Leonardo and other ATmega32U4-based Arduinos + +#include +#include + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 8 +// Connect the GPS RX (receive) pin to Digital 7 +// If using hardware serial: +// Connect the GPS TX (transmit) pin to Arduino RX1 (Digital 0) +// Connect the GPS RX (receive) pin to matching TX1 (Digital 1) + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +//SoftwareSerial mySerial(8, 7); +//Adafruit_GPS GPS(&mySerial); + +// If using hardware serial, comment +// out the above two lines and enable these two lines instead: +Adafruit_GPS GPS(&Serial1); +HardwareSerial mySerial = Serial1; + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO true + +void setup() +{ + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + delay(2000); + Serial.println("Adafruit GPS logging start test!"); + + // 9600 NMEA is the default baud rate for MTK - some use 4800 + GPS.begin(9600); + + // You can adjust which sentences to have the module emit, below + // Default is RMC + GGA + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + // Default is 1 Hz update rate + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); + + delay(500); + Serial.print("\nSTARTING LOGGING...."); + if (GPS.LOCUS_StartLogger()) + Serial.println(" STARTED!"); + else + Serial.println(" no response :("); + delay(1000); +} + +void loop() // run over and over again +{ + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if ((c) && (GPSECHO)) + Serial.write(c); +} + diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_status/leo_locus_status.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_status/leo_locus_status.ino new file mode 100755 index 0000000..7f735a1 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_locus_status/leo_locus_status.ino @@ -0,0 +1,113 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code turns on the LOCUS built-in datalogger. The datalogger +// turns off when power is lost, so you MUST turn it on every time +// you want to use it! +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +//This code is intended for use with Arduino Leonardo and other ATmega32U4-based Arduinos + +#include +#include + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 8 +// Connect the GPS RX (receive) pin to Digital 7 +// If using hardware serial: +// Connect the GPS TX (transmit) pin to Arduino RX1 (Digital 0) +// Connect the GPS RX (receive) pin to matching TX1 (Digital 1) + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +//SoftwareSerial mySerial(8, 7); +//Adafruit_GPS GPS(&mySerial); + +// If using hardware serial, comment +// out the above two lines and enable these two lines instead: +Adafruit_GPS GPS(&Serial1); +HardwareSerial mySerial = Serial1; + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO false + +void setup() +{ + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + delay(5000); + Serial.println("Adafruit GPS logging start test!"); + + // 9600 NMEA is the default baud rate for MTK - some use 4800 + GPS.begin(9600); + + // You can adjust which sentences to have the module emit, below + // Default is RMC + GGA + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + // Default is 1 Hz update rate + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); + + while (true) { + Serial.print("Starting logging...."); + if (GPS.LOCUS_StartLogger()) { + Serial.println(" STARTED!"); + break; + } else { + Serial.println(" no response :("); + } + } +} + +uint32_t updateTime = 1000; + +void loop() // run over and over again +{ + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if ((c) && (GPSECHO)) + Serial.write(c); + + if (millis() > updateTime) + { + updateTime = millis() + 1000; + if (GPS.LOCUS_ReadStatus()) { + Serial.print("\n\nLog #"); + Serial.print(GPS.LOCUS_serial, DEC); + if (GPS.LOCUS_type == LOCUS_OVERLAP) + Serial.print(", Overlap, "); + else if (GPS.LOCUS_type == LOCUS_FULLSTOP) + Serial.print(", Full Stop, Logging"); + + if (GPS.LOCUS_mode & 0x1) Serial.print(" AlwaysLocate"); + if (GPS.LOCUS_mode & 0x2) Serial.print(" FixOnly"); + if (GPS.LOCUS_mode & 0x4) Serial.print(" Normal"); + if (GPS.LOCUS_mode & 0x8) Serial.print(" Interval"); + if (GPS.LOCUS_mode & 0x10) Serial.print(" Distance"); + if (GPS.LOCUS_mode & 0x20) Serial.print(" Speed"); + + Serial.print(", Content "); Serial.print((int)GPS.LOCUS_config); + Serial.print(", Interval "); Serial.print((int)GPS.LOCUS_interval); + Serial.print(" sec, Distance "); Serial.print((int)GPS.LOCUS_distance); + Serial.print(" m, Speed "); Serial.print((int)GPS.LOCUS_speed); + Serial.print(" m/s, Status "); + if (GPS.LOCUS_status) + Serial.print("LOGGING, "); + else + Serial.print("OFF, "); + Serial.print((int)GPS.LOCUS_records); Serial.print(" Records, "); + Serial.print((int)GPS.LOCUS_percent); Serial.print("% Used "); + + }//if (GPS.LOCUS_ReadStatus()) + }//if (millis() > updateTime) +}//loop + + + diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/leo_parsing/leo_parsing.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_parsing/leo_parsing.ino new file mode 100755 index 0000000..d18c3b4 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/leo_parsing/leo_parsing.ino @@ -0,0 +1,123 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code shows how to listen to the GPS module in an interrupt +// which allows the program to have more 'freedom' - just parse +// when a new NMEA sentence is available! Then access data when +// desired. +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +//This code is intended for use with Arduino Leonardo and other ATmega32U4-based Arduinos + +#include +#include + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 8 +// Connect the GPS RX (receive) pin to Digital 7 +// If using hardware serial: +// Connect the GPS TX (transmit) pin to Arduino RX1 (Digital 0) +// Connect the GPS RX (receive) pin to matching TX1 (Digital 1) + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +//SoftwareSerial mySerial(8, 7); +//Adafruit_GPS GPS(&mySerial); + +// If using hardware serial, comment +// out the above two lines and enable these two lines instead: +Adafruit_GPS GPS(&Serial1); +HardwareSerial mySerial = Serial1; + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO true + +void setup() +{ + + // connect at 115200 so we can read the GPS fast enough and echo without dropping chars + // also spit it out + Serial.begin(115200); + delay(5000); + Serial.println("Adafruit GPS library basic test!"); + + // 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800 + GPS.begin(9600); + + // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + // uncomment this line to turn on only the "minimum recommended" data + //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); + // For parsing data, we don't suggest using anything but either RMC only or RMC+GGA since + // the parser doesn't care about other sentences at this time + + // Set the update rate + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate + // For the parsing code to work nicely and have time to sort thru the data, and + // print it out we don't suggest using anything higher than 1 Hz + + // Request updates on antenna status, comment out to keep quiet + GPS.sendCommand(PGCMD_ANTENNA); + + delay(1000); + // Ask for firmware version + mySerial.println(PMTK_Q_RELEASE); +} + +uint32_t timer = millis(); +void loop() // run over and over again +{ + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if ((c) && (GPSECHO)) + Serial.write(c); + + // if a sentence is received, we can check the checksum, parse it... + if (GPS.newNMEAreceived()) { + // a tricky thing here is if we print the NMEA sentence, or data + // we end up not listening and catching other sentences! + // so be very wary if using OUTPUT_ALLDATA and trytng to print out data + //Serial.println(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false + + if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false + return; // we can fail to parse a sentence in which case we should just wait for another + } + + // if millis() or timer wraps around, we'll just reset it + if (timer > millis()) timer = millis(); + + // approximately every 2 seconds or so, print out the current stats + if (millis() - timer > 2000) { + timer = millis(); // reset the timer + + Serial.print("\nTime: "); + Serial.print(GPS.hour, DEC); Serial.print(':'); + Serial.print(GPS.minute, DEC); Serial.print(':'); + Serial.print(GPS.seconds, DEC); Serial.print('.'); + Serial.println(GPS.milliseconds); + Serial.print("Date: "); + Serial.print(GPS.day, DEC); Serial.print('/'); + Serial.print(GPS.month, DEC); Serial.print("/20"); + Serial.println(GPS.year, DEC); + Serial.print("Fix: "); Serial.print((int)GPS.fix); + Serial.print(" quality: "); Serial.println((int)GPS.fixquality); + if (GPS.fix) { + Serial.print("Location: "); + Serial.print(GPS.latitude, 4); Serial.print(GPS.lat); + Serial.print(", "); + Serial.print(GPS.longitude, 4); Serial.println(GPS.lon); + + Serial.print("Speed (knots): "); Serial.println(GPS.speed); + Serial.print("Angle: "); Serial.println(GPS.angle); + Serial.print("Altitude: "); Serial.println(GPS.altitude); + Serial.print("Satellites: "); Serial.println((int)GPS.satellites); + } + } +} diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/locus_dumpbasic/locus_dumpbasic.pde b/books/pdummies/Libraries/Adafruit_GPS/examples/locus_dumpbasic/locus_dumpbasic.pde new file mode 100755 index 0000000..9a89a61 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/locus_dumpbasic/locus_dumpbasic.pde @@ -0,0 +1,82 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code turns on the LOCUS built-in datalogger. The datalogger +// turns off when power is lost, so you MUST turn it on every time +// you want to use it! +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +#include +#if ARDUINO >= 100 + #include +#else + // Older Arduino IDE requires NewSoftSerial, download from: + // http://arduiniana.org/libraries/newsoftserial/ +// #include + // DO NOT install NewSoftSerial if using Arduino 1.0 or later! +#endif + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 3 +// Connect the GPS RX (receive) pin to Digital 2 +// If using hardware serial (e.g. Arduino Mega): +// Connect the GPS TX (transmit) pin to Arduino RX1, RX2 or RX3 +// Connect the GPS RX (receive) pin to matching TX1, TX2 or TX3 + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +#if ARDUINO >= 100 + SoftwareSerial mySerial(3, 2); +#else + NewSoftSerial mySerial(3, 2); +#endif +Adafruit_GPS GPS(&mySerial); +// If using hardware serial (e.g. Arduino Mega), comment +// out the above six lines and enable this line instead: +//Adafruit_GPS GPS(&Serial1); + +void setup() +{ + while (!Serial); // Leonardo will wait till serial connects + + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + Serial.println("Adafruit GPS logging start test!"); + + // 9600 NMEA is the default baud rate for MTK - some use 4800 + GPS.begin(9600); + + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_OFF); + + // If using hardware serial (e.g. Arduino Mega), change this to Serial1, etc. + while (mySerial.available()) + mySerial.read(); + + delay(1000); + GPS.sendCommand("$PMTK622,1*29"); + Serial.println("----------------------------------------------------"); +} + + +void loop() // run over and over again +{ + // If using hardware serial (e.g. Arduino Mega), change this to Serial1, etc. + if (mySerial.available()) { + char c = mySerial.read(); + if (c) { +#ifdef UDR0 + UDR0 = c; +#else + Serial.print(c); +#endif + } + } +} + diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/locus_erase/locus_erase.pde b/books/pdummies/Libraries/Adafruit_GPS/examples/locus_erase/locus_erase.pde new file mode 100755 index 0000000..bc2d36c --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/locus_erase/locus_erase.pde @@ -0,0 +1,115 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code erases the LOCUS built-in datalogger storage +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +#include +#if ARDUINO >= 100 + #include +#else + // Older Arduino IDE requires NewSoftSerial, download from: + // http://arduiniana.org/libraries/newsoftserial/ +// #include + // DO NOT install NewSoftSerial if using Arduino 1.0 or later! +#endif + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 3 +// Connect the GPS RX (receive) pin to Digital 2 +// If using hardware serial (e.g. Arduino Mega): +// Connect the GPS TX (transmit) pin to Arduino RX1, RX2 or RX3 +// Connect the GPS RX (receive) pin to matching TX1, TX2 or TX3 + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +#if ARDUINO >= 100 + SoftwareSerial mySerial(3, 2); +#else + NewSoftSerial mySerial(3, 2); +#endif +Adafruit_GPS GPS(&mySerial); +// If using hardware serial (e.g. Arduino Mega), comment +// out the above six lines and enable this line instead: +//Adafruit_GPS GPS(&Serial1); + + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO false + +// this keeps track of whether we're using the interrupt +// off by default! +boolean usingInterrupt = false; +void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy + +void setup() +{ + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + Serial.println("Adafruit GPS erase FLASH!"); + + // 9600 NMEA is the default baud rate for MTK + GPS.begin(9600); + + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_OFF); + + // the nice thing about this code is you can have a timer0 interrupt go off + // every 1 millisecond, and read data from the GPS for you. that makes the + // loop code a heck of a lot easier! + useInterrupt(true); + + Serial.println("This code will ERASE the data log stored in the FLASH - Permanently!"); + Serial.print("Are you sure you want to do this? [Y/N]: "); + while (Serial.read() != 'Y') delay(10); + Serial.println("\nERASING! UNPLUG YOUR ARDUINO WITHIN 5 SECONDS IF YOU DIDNT MEAN TO!"); + delay(5000); + GPS.sendCommand(PMTK_LOCUS_ERASE_FLASH); + Serial.println("Erased"); +} + + + +void loop() // run over and over again +{ + // If using hardware serial (e.g. Arduino Mega), change this to Serial1, etc. + if (mySerial.available()) { + char c = mySerial.read(); + if (c) UDR0 = c; + } +} + +/******************************************************************/ +// Interrupt is called once a millisecond, looks for any new GPS data, and stores it +SIGNAL(TIMER0_COMPA_vect) { + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if (GPSECHO) + if (c) UDR0 = c; + // writing direct to UDR0 is much much faster than Serial.print + // but only one character can be written at a time. + +} + +void useInterrupt(boolean v) { + if (v) { + // Timer0 is already used for millis() - we'll just interrupt somewhere + // in the middle and call the "Compare A" function above + OCR0A = 0xAF; + TIMSK0 |= _BV(OCIE0A); + usingInterrupt = true; + } else { + // do not call the interrupt function COMPA anymore + TIMSK0 &= ~_BV(OCIE0A); + usingInterrupt = false; + } +} + + diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/locus_start/locus_start.pde b/books/pdummies/Libraries/Adafruit_GPS/examples/locus_start/locus_start.pde new file mode 100755 index 0000000..272be30 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/locus_start/locus_start.pde @@ -0,0 +1,121 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code turns on the LOCUS built-in datalogger. The datalogger +// turns off when power is lost, so you MUST turn it on every time +// you want to use it! +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +#include +#if ARDUINO >= 100 + #include +#else + // Older Arduino IDE requires NewSoftSerial, download from: + // http://arduiniana.org/libraries/newsoftserial/ +// #include + // DO NOT install NewSoftSerial if using Arduino 1.0 or later! +#endif + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 3 +// Connect the GPS RX (receive) pin to Digital 2 +// If using hardware serial (e.g. Arduino Mega): +// Connect the GPS TX (transmit) pin to Arduino RX1, RX2 or RX3 +// Connect the GPS RX (receive) pin to matching TX1, TX2 or TX3 + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +#if ARDUINO >= 100 + SoftwareSerial mySerial(3, 2); +#else + NewSoftSerial mySerial(3, 2); +#endif +Adafruit_GPS GPS(&mySerial); +// If using hardware serial (e.g. Arduino Mega), comment +// out the above six lines and enable this line instead: +//Adafruit_GPS GPS(&Serial1); + + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO true + +// this keeps track of whether we're using the interrupt +// off by default! +boolean usingInterrupt = false; +void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy + +void setup() +{ + while (!Serial); // the Leonardo will 'wait' until the USB plug is connected + + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + Serial.println("Adafruit GPS logging start test!"); + + // 9600 NMEA is the default baud rate for MTK - some use 4800 + GPS.begin(9600); + + // You can adjust which sentences to have the module emit, below + // Default is RMC + GGA + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + // Default is 1 Hz update rate + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); + + // the nice thing about this code is you can have a timer0 interrupt go off + // every 1 millisecond, and read data from the GPS for you. that makes the + // loop code a heck of a lot easier! + useInterrupt(true); + delay(500); + Serial.print("\nSTARTING LOGGING...."); + if (GPS.LOCUS_StartLogger()) + Serial.println(" STARTED!"); + else + Serial.println(" no response :("); + delay(1000); +} + + + +void loop() // run over and over again +{ + // do nothing! all reading and printing is done in the interrupt +} + +/******************************************************************/ + +// Interrupt is called once a millisecond, looks for any new GPS data, and stores it +SIGNAL(TIMER0_COMPA_vect) { + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if (GPSECHO && c) { +#ifdef UDR0 + UDR0 = c; + // writing direct to UDR0 is much much faster than Serial.print + // but only one character can be written at a time. +#endif + } +} + +void useInterrupt(boolean v) { + if (v) { + // Timer0 is already used for millis() - we'll just interrupt somewhere + // in the middle and call the "Compare A" function above + OCR0A = 0xAF; + TIMSK0 |= _BV(OCIE0A); + usingInterrupt = true; + } else { + // do not call the interrupt function COMPA anymore + TIMSK0 &= ~_BV(OCIE0A); + usingInterrupt = false; + } +} + + diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/locus_status/locus_status.pde b/books/pdummies/Libraries/Adafruit_GPS/examples/locus_status/locus_status.pde new file mode 100755 index 0000000..b746e75 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/locus_status/locus_status.pde @@ -0,0 +1,144 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code turns on the LOCUS built-in datalogger. The datalogger +// turns off when power is lost, so you MUST turn it on every time +// you want to use it! +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +#include +#include + +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 3 +// Connect the GPS RX (receive) pin to Digital 2 +// If using hardware serial (e.g. Arduino Mega): +// Connect the GPS TX (transmit) pin to Arduino RX1, RX2 or RX3 +// Connect the GPS RX (receive) pin to matching TX1, TX2 or TX3 + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +SoftwareSerial mySerial(3, 2); + +Adafruit_GPS GPS(&mySerial); +// If using hardware serial (e.g. Arduino Mega), comment +// out the above six lines and enable this line instead: +//Adafruit_GPS GPS(&Serial1); + + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO false + +// this keeps track of whether we're using the interrupt +// off by default! +boolean usingInterrupt = false; +void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy + +void setup() +{ + while (!Serial); // the Leonardo will 'wait' until the USB plug is connected + + // connect at 115200 so we can read the GPS fast enuf and + // also spit it out + Serial.begin(115200); + Serial.println("Adafruit GPS logging start test!"); + + // 9600 NMEA is the default baud rate for MTK - some use 4800 + GPS.begin(9600); + + // You can adjust which sentences to have the module emit, below + // Default is RMC + GGA + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + // Default is 1 Hz update rate + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); + + // the nice thing about this code is you can have a timer0 interrupt go off + // every 1 millisecond, and read data from the GPS for you. that makes the + // loop code a heck of a lot easier! + useInterrupt(true); + + while (true) { + Serial.print("Starting logging...."); + if (GPS.LOCUS_StartLogger()) { + Serial.println(" STARTED!"); + break; + } else { + Serial.println(" no response :("); + } + } +} + + + +void loop() // run over and over again +{ + delay(1000); + + if (GPS.LOCUS_ReadStatus()) { + Serial.print("\n\nLog #"); + Serial.print(GPS.LOCUS_serial, DEC); + if (GPS.LOCUS_type == LOCUS_OVERLAP) + Serial.print(", Overlap, "); + else if (GPS.LOCUS_type == LOCUS_FULLSTOP) + Serial.print(", Full Stop, Logging"); + + if (GPS.LOCUS_mode & 0x1) Serial.print(" AlwaysLocate"); + if (GPS.LOCUS_mode & 0x2) Serial.print(" FixOnly"); + if (GPS.LOCUS_mode & 0x4) Serial.print(" Normal"); + if (GPS.LOCUS_mode & 0x8) Serial.print(" Interval"); + if (GPS.LOCUS_mode & 0x10) Serial.print(" Distance"); + if (GPS.LOCUS_mode & 0x20) Serial.print(" Speed"); + + Serial.print(", Content "); Serial.print((int)GPS.LOCUS_config); + Serial.print(", Interval "); Serial.print((int)GPS.LOCUS_interval); + Serial.print(" sec, Distance "); Serial.print((int)GPS.LOCUS_distance); + Serial.print(" m, Speed "); Serial.print((int)GPS.LOCUS_speed); + Serial.print(" m/s, Status "); + if (GPS.LOCUS_status) + Serial.print("LOGGING, "); + else + Serial.print("OFF, "); + Serial.print((int)GPS.LOCUS_records); Serial.print(" Records, "); + Serial.print((int)GPS.LOCUS_percent); Serial.print("% Used "); + + } +} + +/******************************************************************/ +// Interrupt is called once a millisecond, looks for any new GPS data, and stores it +SIGNAL(TIMER0_COMPA_vect) { + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if (GPSECHO && c) { +#ifdef UDR0 + UDR0 = c; + // writing direct to UDR0 is much much faster than Serial.print + // but only one character can be written at a time. +#endif + } +} + + +void useInterrupt(boolean v) { + if (v) { + // Timer0 is already used for millis() - we'll just interrupt somewhere + // in the middle and call the "Compare A" function above + OCR0A = 0xAF; + TIMSK0 |= _BV(OCIE0A); + usingInterrupt = true; + } else { + // do not call the interrupt function COMPA anymore + TIMSK0 &= ~_BV(OCIE0A); + usingInterrupt = false; + } +} + + + diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/parsing/parsing.pde b/books/pdummies/Libraries/Adafruit_GPS/examples/parsing/parsing.pde new file mode 100755 index 0000000..ce485a0 --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/parsing/parsing.pde @@ -0,0 +1,167 @@ +// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver +// +// This code shows how to listen to the GPS module in an interrupt +// which allows the program to have more 'freedom' - just parse +// when a new NMEA sentence is available! Then access data when +// desired. +// +// Tested and works great with the Adafruit Ultimate GPS module +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/746 +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +#include +#include + +// If you're using a GPS module: +// Connect the GPS Power pin to 5V +// Connect the GPS Ground pin to ground +// If using software serial (sketch example default): +// Connect the GPS TX (transmit) pin to Digital 3 +// Connect the GPS RX (receive) pin to Digital 2 +// If using hardware serial (e.g. Arduino Mega): +// Connect the GPS TX (transmit) pin to Arduino RX1, RX2 or RX3 +// Connect the GPS RX (receive) pin to matching TX1, TX2 or TX3 + +// If you're using the Adafruit GPS shield, change +// SoftwareSerial mySerial(3, 2); -> SoftwareSerial mySerial(8, 7); +// and make sure the switch is set to SoftSerial + +// If using software serial, keep these lines enabled +// (you can change the pin numbers to match your wiring): +SoftwareSerial mySerial(3, 2); + +Adafruit_GPS GPS(&mySerial); +// If using hardware serial (e.g. Arduino Mega), comment +// out the above six lines and enable this line instead: +//Adafruit_GPS GPS(&Serial1); + + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences. +#define GPSECHO true + +// this keeps track of whether we're using the interrupt +// off by default! +boolean usingInterrupt = false; +void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy + +void setup() +{ + + // connect at 115200 so we can read the GPS fast enough and echo without dropping chars + // also spit it out + Serial.begin(115200); + Serial.println("Adafruit GPS library basic test!"); + + // 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800 + GPS.begin(9600); + + // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + // uncomment this line to turn on only the "minimum recommended" data + //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); + // For parsing data, we don't suggest using anything but either RMC only or RMC+GGA since + // the parser doesn't care about other sentences at this time + + // Set the update rate + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate + // For the parsing code to work nicely and have time to sort thru the data, and + // print it out we don't suggest using anything higher than 1 Hz + + // Request updates on antenna status, comment out to keep quiet + GPS.sendCommand(PGCMD_ANTENNA); + + // the nice thing about this code is you can have a timer0 interrupt go off + // every 1 millisecond, and read data from the GPS for you. that makes the + // loop code a heck of a lot easier! + useInterrupt(true); + + delay(1000); + // Ask for firmware version + mySerial.println(PMTK_Q_RELEASE); +} + + +// Interrupt is called once a millisecond, looks for any new GPS data, and stores it +SIGNAL(TIMER0_COMPA_vect) { + char c = GPS.read(); + // if you want to debug, this is a good time to do it! +#ifdef UDR0 + if (GPSECHO) + if (c) UDR0 = c; + // writing direct to UDR0 is much much faster than Serial.print + // but only one character can be written at a time. +#endif +} + +void useInterrupt(boolean v) { + if (v) { + // Timer0 is already used for millis() - we'll just interrupt somewhere + // in the middle and call the "Compare A" function above + OCR0A = 0xAF; + TIMSK0 |= _BV(OCIE0A); + usingInterrupt = true; + } else { + // do not call the interrupt function COMPA anymore + TIMSK0 &= ~_BV(OCIE0A); + usingInterrupt = false; + } +} + +uint32_t timer = millis(); +void loop() // run over and over again +{ + // in case you are not using the interrupt above, you'll + // need to 'hand query' the GPS, not suggested :( + if (! usingInterrupt) { + // read data from the GPS in the 'main loop' + char c = GPS.read(); + // if you want to debug, this is a good time to do it! + if (GPSECHO) + if (c) Serial.print(c); + } + + // if a sentence is received, we can check the checksum, parse it... + if (GPS.newNMEAreceived()) { + // a tricky thing here is if we print the NMEA sentence, or data + // we end up not listening and catching other sentences! + // so be very wary if using OUTPUT_ALLDATA and trytng to print out data + //Serial.println(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false + + if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false + return; // we can fail to parse a sentence in which case we should just wait for another + } + + // if millis() or timer wraps around, we'll just reset it + if (timer > millis()) timer = millis(); + + // approximately every 2 seconds or so, print out the current stats + if (millis() - timer > 2000) { + timer = millis(); // reset the timer + + Serial.print("\nTime: "); + Serial.print(GPS.hour, DEC); Serial.print(':'); + Serial.print(GPS.minute, DEC); Serial.print(':'); + Serial.print(GPS.seconds, DEC); Serial.print('.'); + Serial.println(GPS.milliseconds); + Serial.print("Date: "); + Serial.print(GPS.day, DEC); Serial.print('/'); + Serial.print(GPS.month, DEC); Serial.print("/20"); + Serial.println(GPS.year, DEC); + Serial.print("Fix: "); Serial.print((int)GPS.fix); + Serial.print(" quality: "); Serial.println((int)GPS.fixquality); + if (GPS.fix) { + Serial.print("Location: "); + Serial.print(GPS.latitude, 4); Serial.print(GPS.lat); + Serial.print(", "); + Serial.print(GPS.longitude, 4); Serial.println(GPS.lon); + + Serial.print("Speed (knots): "); Serial.println(GPS.speed); + Serial.print("Angle: "); Serial.println(GPS.angle); + Serial.print("Altitude: "); Serial.println(GPS.altitude); + Serial.print("Satellites: "); Serial.println((int)GPS.satellites); + } + } +} \ No newline at end of file diff --git a/books/pdummies/Libraries/Adafruit_GPS/examples/shield_sdlog/shield_sdlog.ino b/books/pdummies/Libraries/Adafruit_GPS/examples/shield_sdlog/shield_sdlog.ino new file mode 100755 index 0000000..8c871cb --- /dev/null +++ b/books/pdummies/Libraries/Adafruit_GPS/examples/shield_sdlog/shield_sdlog.ino @@ -0,0 +1,164 @@ + +#include +#include +#include +#include +#include "GPSconfig.h" + +// Ladyada's logger modified by Bill Greiman to use the SdFat library +// +// This code shows how to listen to the GPS module in an interrupt +// which allows the program to have more 'freedom' - just parse +// when a new NMEA sentence is available! Then access data when +// desired. +// +// Tested and works great with the Adafruit Ultimate GPS Shield +// using MTK33x9 chipset +// ------> http://www.adafruit.com/products/ +// Pick one up today at the Adafruit electronics shop +// and help support open source hardware & software! -ada + +SoftwareSerial mySerial(8, 7); +Adafruit_GPS GPS(&mySerial); + +// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console +// Set to 'true' if you want to debug and listen to the raw GPS sentences +#define GPSECHO true +/* set to true to only log to SD when GPS has a fix, for debugging, keep it false */ +#define LOG_FIXONLY false + +// Set the pins used +#define chipSelect 10 +#define ledPin 13 + +File logfile; + +// read a Hex value and return the decimal equivalent +uint8_t parseHex(char c) { + if (c < '0') + return 0; + if (c <= '9') + return c - '0'; + if (c < 'A') + return 0; + if (c <= 'F') + return (c - 'A')+10; +} + +// blink out an error code +void error(uint8_t errno) { +/* + if (SD.errorCode()) { + putstring("SD error: "); + Serial.print(card.errorCode(), HEX); + Serial.print(','); + Serial.println(card.errorData(), HEX); + } + */ + while(1) { + uint8_t i; + for (i=0; i +#endif +#include +#include + +// Initialize constants +const char* HttpClient::kUserAgent = "Arduino/2.0"; +const char* HttpClient::kGet = "GET"; +const char* HttpClient::kPost = "POST"; +const char* HttpClient::kPut = "PUT"; +const char* HttpClient::kDelete = "DELETE"; +const char* HttpClient::kContentLengthPrefix = "Content-Length: "; + +#ifdef PROXY_ENABLED // currently disabled as introduces dependency on Dns.h in Ethernet +HttpClient::HttpClient(Client& aClient, const char* aProxy, uint16_t aProxyPort) + : iClient(&aClient), iProxyPort(aProxyPort) +{ + resetState(); + if (aProxy) + { + // Resolve the IP address for the proxy + DNSClient dns; + dns.begin(Ethernet.dnsServerIP()); + // Not ideal that we discard any errors here, but not a lot we can do in the ctor + // and we'll get a connect error later anyway + (void)dns.getHostByName(aProxy, iProxyAddress); + } +} +#else +HttpClient::HttpClient(Client& aClient) + : iClient(&aClient), iProxyPort(0) +{ + resetState(); +} +#endif + +void HttpClient::resetState() +{ + iState = eIdle; + iStatusCode = 0; + iContentLength = 0; + iBodyLengthConsumed = 0; + iContentLengthPtr = 0; +} + +void HttpClient::stop() +{ + iClient->stop(); + resetState(); +} + +void HttpClient::beginRequest() +{ + iState = eRequestStarted; +} + +int HttpClient::startRequest(const char* aServerName, uint16_t aServerPort, const char* aURLPath, const char* aHttpMethod, const char* aUserAgent) +{ + tHttpState initialState = iState; + if ((eIdle != iState) && (eRequestStarted != iState)) + { + return HTTP_ERROR_API; + } + + if (iProxyPort) + { + if (!iClient->connect(iProxyAddress, iProxyPort) > 0) + { +#ifdef LOGGING + Serial.println("Proxy connection failed"); +#endif + return HTTP_ERROR_CONNECTION_FAILED; + } + } + else + { + if (!iClient->connect(aServerName, aServerPort) > 0) + { +#ifdef LOGGING + Serial.println("Connection failed"); +#endif + return HTTP_ERROR_CONNECTION_FAILED; + } + } + + // Now we're connected, send the first part of the request + int ret = sendInitialHeaders(aServerName, IPAddress(0,0,0,0), aServerPort, aURLPath, aHttpMethod, aUserAgent); + if ((initialState == eIdle) && (HTTP_SUCCESS == ret)) + { + // This was a simple version of the API, so terminate the headers now + finishHeaders(); + } + // else we'll call it in endRequest or in the first call to print, etc. + + return ret; +} + +int HttpClient::startRequest(const IPAddress& aServerAddress, const char* aServerName, uint16_t aServerPort, const char* aURLPath, const char* aHttpMethod, const char* aUserAgent) +{ + tHttpState initialState = iState; + if ((eIdle != iState) && (eRequestStarted != iState)) + { + return HTTP_ERROR_API; + } + + if (iProxyPort) + { + if (!iClient->connect(iProxyAddress, iProxyPort) > 0) + { +#ifdef LOGGING + Serial.println("Proxy connection failed"); +#endif + return HTTP_ERROR_CONNECTION_FAILED; + } + } + else + { + if (!iClient->connect(aServerAddress, aServerPort) > 0) + { +#ifdef LOGGING + Serial.println("Connection failed"); +#endif + return HTTP_ERROR_CONNECTION_FAILED; + } + } + + // Now we're connected, send the first part of the request + int ret = sendInitialHeaders(aServerName, aServerAddress, aServerPort, aURLPath, aHttpMethod, aUserAgent); + if ((initialState == eIdle) && (HTTP_SUCCESS == ret)) + { + // This was a simple version of the API, so terminate the headers now + finishHeaders(); + } + // else we'll call it in endRequest or in the first call to print, etc. + + return ret; +} + +int HttpClient::sendInitialHeaders(const char* aServerName, IPAddress aServerIP, uint16_t aPort, const char* aURLPath, const char* aHttpMethod, const char* aUserAgent) +{ +#ifdef LOGGING + Serial.println("Connected"); +#endif + // Send the HTTP command, i.e. "GET /somepath/ HTTP/1.0" + iClient->print(aHttpMethod); + iClient->print(" "); + if (iProxyPort) + { + // We're going through a proxy, send a full URL + iClient->print("http://"); + if (aServerName) + { + // We've got a server name, so use it + iClient->print(aServerName); + } + else + { + // We'll have to use the IP address + iClient->print(aServerIP); + } + if (aPort != kHttpPort) + { + iClient->print(":"); + iClient->print(aPort); + } + } + iClient->print(aURLPath); + iClient->println(" HTTP/1.1"); + // The host header, if required + if (aServerName) + { + iClient->print("Host: "); + iClient->print(aServerName); + if (aPort != kHttpPort) + { + iClient->print(":"); + iClient->print(aPort); + } + iClient->println(); + } + // And user-agent string + iClient->print("User-Agent: "); + if (aUserAgent) + { + iClient->println(aUserAgent); + } + else + { + iClient->println(kUserAgent); + } + + // Everything has gone well + iState = eRequestStarted; + return HTTP_SUCCESS; +} + +void HttpClient::sendHeader(const char* aHeader) +{ + iClient->println(aHeader); +} + +void HttpClient::sendHeader(const char* aHeaderName, const char* aHeaderValue) +{ + iClient->print(aHeaderName); + iClient->print(": "); + iClient->println(aHeaderValue); +} + +void HttpClient::sendHeader(const char* aHeaderName, const int aHeaderValue) +{ + iClient->print(aHeaderName); + iClient->print(": "); + iClient->println(aHeaderValue); +} + +void HttpClient::sendBasicAuth(const char* aUser, const char* aPassword) +{ + // Send the initial part of this header line + iClient->print("Authorization: Basic "); + // Now Base64 encode "aUser:aPassword" and send that + // This seems trickier than it should be but it's mostly to avoid either + // (a) some arbitrarily sized buffer which hopes to be big enough, or + // (b) allocating and freeing memory + // ...so we'll loop through 3 bytes at a time, outputting the results as we + // go. + // In Base64, each 3 bytes of unencoded data become 4 bytes of encoded data + unsigned char input[3]; + unsigned char output[5]; // Leave space for a '\0' terminator so we can easily print + int userLen = strlen(aUser); + int passwordLen = strlen(aPassword); + int inputOffset = 0; + for (int i = 0; i < (userLen+1+passwordLen); i++) + { + // Copy the relevant input byte into the input + if (i < userLen) + { + input[inputOffset++] = aUser[i]; + } + else if (i == userLen) + { + input[inputOffset++] = ':'; + } + else + { + input[inputOffset++] = aPassword[i-(userLen+1)]; + } + // See if we've got a chunk to encode + if ( (inputOffset == 3) || (i == userLen+passwordLen) ) + { + // We've either got to a 3-byte boundary, or we've reached then end + b64_encode(input, inputOffset, output, 4); + // NUL-terminate the output string + output[4] = '\0'; + // And write it out + iClient->print((char*)output); +// FIXME We might want to fill output with '=' characters if b64_encode doesn't +// FIXME do it for us when we're encoding the final chunk + inputOffset = 0; + } + } + // And end the header we've sent + iClient->println(); +} + +void HttpClient::finishHeaders() +{ + iClient->println(); + iState = eRequestSent; +} + +void HttpClient::endRequest() +{ + if (iState < eRequestSent) + { + // We still need to finish off the headers + finishHeaders(); + } + // else the end of headers has already been sent, so nothing to do here +} + +int HttpClient::responseStatusCode() +{ + if (iState < eRequestSent) + { + return HTTP_ERROR_API; + } + // The first line will be of the form Status-Line: + // HTTP-Version SP Status-Code SP Reason-Phrase CRLF + // Where HTTP-Version is of the form: + // HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT + + char c = '\0'; + do + { + // Make sure the status code is reset, and likewise the state. This + // lets us easily cope with 1xx informational responses by just + // ignoring them really, and reading the next line for a proper response + iStatusCode = 0; + iState = eRequestSent; + + unsigned long timeoutStart = millis(); + // Psuedo-regexp we're expecting before the status-code + const char* statusPrefix = "HTTP/*.* "; + const char* statusPtr = statusPrefix; + // Whilst we haven't timed out & haven't reached the end of the headers + while ((c != '\n') && + ( (millis() - timeoutStart) < kHttpResponseTimeout )) + { + if (available()) + { + c = read(); + if (c != -1) + { + switch(iState) + { + case eRequestSent: + // We haven't reached the status code yet + if ( (*statusPtr == '*') || (*statusPtr == c) ) + { + // This character matches, just move along + statusPtr++; + if (*statusPtr == '\0') + { + // We've reached the end of the prefix + iState = eReadingStatusCode; + } + } + else + { + return HTTP_ERROR_INVALID_RESPONSE; + } + break; + case eReadingStatusCode: + if (isdigit(c)) + { + // This assumes we won't get more than the 3 digits we + // want + iStatusCode = iStatusCode*10 + (c - '0'); + } + else + { + // We've reached the end of the status code + // We could sanity check it here or double-check for ' ' + // rather than anything else, but let's be lenient + iState = eStatusCodeRead; + } + break; + case eStatusCodeRead: + // We're just waiting for the end of the line now + break; + }; + // We read something, reset the timeout counter + timeoutStart = millis(); + } + } + else + { + // We haven't got any data, so let's pause to allow some to + // arrive + delay(kHttpWaitForDataDelay); + } + } + if ( (c == '\n') && (iStatusCode < 200) ) + { + // We've reached the end of an informational status line + c = '\0'; // Clear c so we'll go back into the data reading loop + } + } + // If we've read a status code successfully but it's informational (1xx) + // loop back to the start + while ( (iState == eStatusCodeRead) && (iStatusCode < 200) ); + + if ( (c == '\n') && (iState == eStatusCodeRead) ) + { + // We've read the status-line successfully + return iStatusCode; + } + else if (c != '\n') + { + // We must've timed out before we reached the end of the line + return HTTP_ERROR_TIMED_OUT; + } + else + { + // This wasn't a properly formed status line, or at least not one we + // could understand + return HTTP_ERROR_INVALID_RESPONSE; + } +} + +int HttpClient::skipResponseHeaders() +{ + // Just keep reading until we finish reading the headers or time out + unsigned long timeoutStart = millis(); + // Whilst we haven't timed out & haven't reached the end of the headers + while ((!endOfHeadersReached()) && + ( (millis() - timeoutStart) < kHttpResponseTimeout )) + { + if (available()) + { + (void)readHeader(); + // We read something, reset the timeout counter + timeoutStart = millis(); + } + else + { + // We haven't got any data, so let's pause to allow some to + // arrive + delay(kHttpWaitForDataDelay); + } + } + if (endOfHeadersReached()) + { + // Success + return HTTP_SUCCESS; + } + else + { + // We must've timed out + return HTTP_ERROR_TIMED_OUT; + } +} + +bool HttpClient::endOfBodyReached() +{ + if (endOfHeadersReached() && (contentLength() != kNoContentLengthHeader)) + { + // We've got to the body and we know how long it will be + return (iBodyLengthConsumed >= contentLength()); + } + return false; +} + +int HttpClient::read() +{ +#if 0 // Fails on WiFi because multi-byte read seems to be broken + uint8_t b[1]; + int ret = read(b, 1); + if (ret == 1) + { + return b[0]; + } + else + { + return -1; + } +#else + int ret = iClient->read(); + if (ret >= 0) + { + if (endOfHeadersReached() && iContentLength > 0) + { + // We're outputting the body now and we've seen a Content-Length header + // So keep track of how many bytes are left + iBodyLengthConsumed++; + } + } + return ret; +#endif +} + +int HttpClient::read(uint8_t *buf, size_t size) +{ + int ret =iClient->read(buf, size); + if (endOfHeadersReached() && iContentLength > 0) + { + // We're outputting the body now and we've seen a Content-Length header + // So keep track of how many bytes are left + if (ret >= 0) + { + iBodyLengthConsumed += ret; + } + } + return ret; +} + +int HttpClient::readHeader() +{ + char c = read(); + + if (endOfHeadersReached()) + { + // We've passed the headers, but rather than return an error, we'll just + // act as a slightly less efficient version of read() + return c; + } + + // Whilst reading out the headers to whoever wants them, we'll keep an + // eye out for the "Content-Length" header + switch(iState) + { + case eStatusCodeRead: + // We're at the start of a line, or somewhere in the middle of reading + // the Content-Length prefix + if (*iContentLengthPtr == c) + { + // This character matches, just move along + iContentLengthPtr++; + if (*iContentLengthPtr == '\0') + { + // We've reached the end of the prefix + iState = eReadingContentLength; + // Just in case we get multiple Content-Length headers, this + // will ensure we just get the value of the last one + iContentLength = 0; + } + } + else if ((iContentLengthPtr == kContentLengthPrefix) && (c == '\r')) + { + // We've found a '\r' at the start of a line, so this is probably + // the end of the headers + iState = eLineStartingCRFound; + } + else + { + // This isn't the Content-Length header, skip to the end of the line + iState = eSkipToEndOfHeader; + } + break; + case eReadingContentLength: + if (isdigit(c)) + { + iContentLength = iContentLength*10 + (c - '0'); + } + else + { + // We've reached the end of the content length + // We could sanity check it here or double-check for "\r\n" + // rather than anything else, but let's be lenient + iState = eSkipToEndOfHeader; + } + break; + case eLineStartingCRFound: + if (c == '\n') + { + iState = eReadingBody; + } + break; + default: + // We're just waiting for the end of the line now + break; + }; + + if ( (c == '\n') && !endOfHeadersReached() ) + { + // We've got to the end of this line, start processing again + iState = eStatusCodeRead; + iContentLengthPtr = kContentLengthPrefix; + } + // And return the character read to whoever wants it + return c; +} + + + diff --git a/books/pdummies/Libraries/HttpClient/HttpClient.h b/books/pdummies/Libraries/HttpClient/HttpClient.h new file mode 100755 index 0000000..016d47a --- /dev/null +++ b/books/pdummies/Libraries/HttpClient/HttpClient.h @@ -0,0 +1,439 @@ +// Class to simplify HTTP fetching on Arduino +// (c) Copyright MCQN Ltd. 2010-2012 +// Released under Apache License, version 2.0 + +#ifndef HttpClient_h +#define HttpClient_h + +#include +#include +#include "Client.h" + +static const int HTTP_SUCCESS =0; +// The end of the headers has been reached. This consumes the '\n' +// Could not connect to the server +static const int HTTP_ERROR_CONNECTION_FAILED =-1; +// This call was made when the HttpClient class wasn't expecting it +// to be called. Usually indicates your code is using the class +// incorrectly +static const int HTTP_ERROR_API =-2; +// Spent too long waiting for a reply +static const int HTTP_ERROR_TIMED_OUT =-3; +// The response from the server is invalid, is it definitely an HTTP +// server? +static const int HTTP_ERROR_INVALID_RESPONSE =-4; + +class HttpClient : public Client +{ +public: + static const int kNoContentLengthHeader =-1; + static const int kHttpPort =80; + static const char* kUserAgent; + static const char* kGet; + static const char* kPost; + static const char* kPut; + static const char* kDelete; + +// FIXME Write longer API request, using port and user-agent, example +// FIXME Update tempToPachube example to calculate Content-Length correctly + +#ifdef PROXY_ENABLED // currently disabled as introduces dependency on Dns.h in Ethernet + HttpClient(Client& aClient, const char* aProxy =NULL, uint16_t aProxyPort =0); +#else + HttpClient(Client& aClient); +#endif + + /** Start a more complex request. + Use this when you need to send additional headers in the request, + but you will also need to call endRequest() when you are finished. + */ + void beginRequest(); + + /** End a more complex request. + Use this when you need to have sent additional headers in the request, + but you will also need to call beginRequest() at the start. + */ + void endRequest(); + + /** Connect to the server and start to send a GET request. + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aServerPort Port to connect to on the server + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int get(const char* aServerName, uint16_t aServerPort, const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerName, aServerPort, aURLPath, kGet, aUserAgent); } + + /** Connect to the server and start to send a GET request. + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int get(const char* aServerName, const char* aURLPath, const char* aUserAgent =NULL) + { return startRequest(aServerName, kHttpPort, aURLPath, kGet, aUserAgent); } + + /** Connect to the server and start to send a GET request. This version connects + doesn't perform a DNS lookup and just connects to the given IP address. + @param aServerAddress IP address of the server to connect to + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aServerPort Port to connect to on the server + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int get(const IPAddress& aServerAddress, + const char* aServerName, + uint16_t aServerPort, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerAddress, aServerName, aServerPort, aURLPath, kGet, aUserAgent); } + + /** Connect to the server and start to send a GET request. This version connects + doesn't perform a DNS lookup and just connects to the given IP address. + @param aServerAddress IP address of the server to connect to + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int get(const IPAddress& aServerAddress, + const char* aServerName, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerAddress, aServerName, kHttpPort, aURLPath, kGet, aUserAgent); } + + /** Connect to the server and start to send a POST request. + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aServerPort Port to connect to on the server + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int post(const char* aServerName, + uint16_t aServerPort, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerName, aServerPort, aURLPath, kPost, aUserAgent); } + + /** Connect to the server and start to send a POST request. + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int post(const char* aServerName, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerName, kHttpPort, aURLPath, kPost, aUserAgent); } + + /** Connect to the server and start to send a POST request. This version connects + doesn't perform a DNS lookup and just connects to the given IP address. + @param aServerAddress IP address of the server to connect to + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aServerPort Port to connect to on the server + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int post(const IPAddress& aServerAddress, + const char* aServerName, + uint16_t aServerPort, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerAddress, aServerName, aServerPort, aURLPath, kPost, aUserAgent); } + + /** Connect to the server and start to send a POST request. This version connects + doesn't perform a DNS lookup and just connects to the given IP address. + @param aServerAddress IP address of the server to connect to + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int post(const IPAddress& aServerAddress, + const char* aServerName, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerAddress, aServerName, kHttpPort, aURLPath, kPost, aUserAgent); } + + /** Connect to the server and start to send a PUT request. + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aServerPort Port to connect to on the server + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int put(const char* aServerName, + uint16_t aServerPort, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerName, aServerPort, aURLPath, kPut, aUserAgent); } + + /** Connect to the server and start to send a PUT request. + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int put(const char* aServerName, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerName, kHttpPort, aURLPath, kPut, aUserAgent); } + + /** Connect to the server and start to send a PUT request. This version connects + doesn't perform a DNS lookup and just connects to the given IP address. + @param aServerAddress IP address of the server to connect to + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aServerPort Port to connect to on the server + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int put(const IPAddress& aServerAddress, + const char* aServerName, + uint16_t aServerPort, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerAddress, aServerName, aServerPort, aURLPath, kPut, aUserAgent); } + + /** Connect to the server and start to send a PUT request. This version connects + doesn't perform a DNS lookup and just connects to the given IP address. + @param aServerAddress IP address of the server to connect to + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aURLPath Url to request + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int put(const IPAddress& aServerAddress, + const char* aServerName, + const char* aURLPath, + const char* aUserAgent =NULL) + { return startRequest(aServerAddress, aServerName, kHttpPort, aURLPath, kPut, aUserAgent); } + + /** Connect to the server and start to send the request. + @param aServerName Name of the server being connected to. + @param aServerPort Port to connect to on the server + @param aURLPath Url to request + @param aHttpMethod Type of HTTP request to make, e.g. "GET", "POST", etc. + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int startRequest(const char* aServerName, + uint16_t aServerPort, + const char* aURLPath, + const char* aHttpMethod, + const char* aUserAgent); + + /** Connect to the server and start to send the request. + @param aServerAddress IP address of the server to connect to. + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aServerPort Port to connect to on the server + @param aURLPath Url to request + @param aHttpMethod Type of HTTP request to make, e.g. "GET", "POST", etc. + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int startRequest(const IPAddress& aServerAddress, + const char* aServerName, + uint16_t aServerPort, + const char* aURLPath, + const char* aHttpMethod, + const char* aUserAgent); + + /** Send an additional header line. This can only be called in between the + calls to startRequest and finishRequest. + @param aHeader Header line to send, in its entirety (but without the + trailing CRLF. E.g. "Authorization: Basic YQDDCAIGES" + */ + void sendHeader(const char* aHeader); + + /** Send an additional header line. This is an alternate form of + sendHeader() which takes the header name and content as separate strings. + The call will add the ": " to separate the header, so for example, to + send a XXXXXX header call sendHeader("XXXXX", "Something") + @param aHeaderName Type of header being sent + @param aHeaderValue Value for that header + */ + void sendHeader(const char* aHeaderName, const char* aHeaderValue); + + /** Send an additional header line. This is an alternate form of + sendHeader() which takes the header name and content separately but where + the value is provided as an integer. + The call will add the ": " to separate the header, so for example, to + send a XXXXXX header call sendHeader("XXXXX", 123) + @param aHeaderName Type of header being sent + @param aHeaderValue Value for that header + */ + void sendHeader(const char* aHeaderName, const int aHeaderValue); + + /** Send a basic authentication header. This will encode the given username + and password, and send them in suitable header line for doing Basic + Authentication. + @param aUser Username for the authorization + @param aPassword Password for the user aUser + */ + void sendBasicAuth(const char* aUser, const char* aPassword); + + /** Finish sending the HTTP request. This basically just sends the blank + line to signify the end of the request + */ + void finishRequest(); + + /** Get the HTTP status code contained in the response. + For example, 200 for successful request, 404 for file not found, etc. + */ + int responseStatusCode(); + + /** Read the next character of the response headers. + This functions in the same way as read() but to be used when reading + through the headers. Check whether or not the end of the headers has + been reached by calling endOfHeadersReached(), although after that point + this will still return data as read() would, but slightly less efficiently + @return The next character of the response headers + */ + int readHeader(); + + /** Skip any response headers to get to the body. + Use this if you don't want to do any special processing of the headers + returned in the response. You can also use it after you've found all of + the headers you're interested in, and just want to get on with processing + the body. + @return HTTP_SUCCESS if successful, else an error code + */ + int skipResponseHeaders(); + + /** Test whether all of the response headers have been consumed. + @return true if we are now processing the response body, else false + */ + bool endOfHeadersReached() { return (iState == eReadingBody); }; + + /** Test whether the end of the body has been reached. + Only works if the Content-Length header was returned by the server + @return true if we are now at the end of the body, else false + */ + bool endOfBodyReached(); + virtual bool endOfStream() { return endOfBodyReached(); }; + virtual bool completed() { return endOfBodyReached(); }; + + /** Return the length of the body. + @return Length of the body, in bytes, or kNoContentLengthHeader if no + Content-Length header was returned by the server + */ + int contentLength() { return iContentLength; }; + + // Inherited from Print + // Note: 1st call to these indicates the user is sending the body, so if need + // Note: be we should finish the header first + virtual size_t write(uint8_t aByte) { if (iState < eRequestSent) { finishHeaders(); }; return iClient-> write(aByte); }; + virtual size_t write(const uint8_t *aBuffer, size_t aSize) { if (iState < eRequestSent) { finishHeaders(); }; return iClient->write(aBuffer, aSize); }; + // Inherited from Stream + virtual int available() { return iClient->available(); }; + /** Read the next byte from the server. + @return Byte read or -1 if there are no bytes available. + */ + virtual int read(); + virtual int read(uint8_t *buf, size_t size); + virtual int peek() { return iClient->peek(); }; + virtual void flush() { return iClient->flush(); }; + + // Inherited from Client + virtual int connect(IPAddress ip, uint16_t port) { return iClient->connect(ip, port); }; + virtual int connect(const char *host, uint16_t port) { return iClient->connect(host, port); }; + virtual void stop(); + virtual uint8_t connected() { iClient->connected(); }; + virtual operator bool() { return bool(iClient); }; +protected: + /** Reset internal state data back to the "just initialised" state + */ + void resetState(); + + /** Send the first part of the request and the initial headers. + @param aServerName Name of the server being connected to. If NULL, the + "Host" header line won't be sent + @param aServerIP IP address of the server (only used if we're going through a + proxy and aServerName is NULL + @param aServerPort Port of the server being connected to. + @param aURLPath Url to request + @param aHttpMethod Type of HTTP request to make, e.g. "GET", "POST", etc. + @param aUserAgent User-Agent string to send. If NULL the default + user-agent kUserAgent will be sent + @return 0 if successful, else error + */ + int sendInitialHeaders(const char* aServerName, + IPAddress aServerIP, + uint16_t aPort, + const char* aURLPath, + const char* aHttpMethod, + const char* aUserAgent); + + /* Let the server know that we've reached the end of the headers + */ + void finishHeaders(); + + // Number of milliseconds that we wait each time there isn't any data + // available to be read (during status code and header processing) + static const int kHttpWaitForDataDelay = 1000; + // Number of milliseconds that we'll wait in total without receiveing any + // data before returning HTTP_ERROR_TIMED_OUT (during status code and header + // processing) + static const int kHttpResponseTimeout = 30*1000; + static const char* kContentLengthPrefix; + typedef enum { + eIdle, + eRequestStarted, + eRequestSent, + eReadingStatusCode, + eStatusCodeRead, + eReadingContentLength, + eSkipToEndOfHeader, + eLineStartingCRFound, + eReadingBody + } tHttpState; + // Ethernet client we're using + Client* iClient; + // Current state of the finite-state-machine + tHttpState iState; + // Stores the status code for the response, once known + int iStatusCode; + // Stores the value of the Content-Length header, if present + int iContentLength; + // How many bytes of the response body have been read by the user + int iBodyLengthConsumed; + // How far through a Content-Length header prefix we are + const char* iContentLengthPtr; + // Address of the proxy to use, if we're using one + IPAddress iProxyAddress; + uint16_t iProxyPort; +}; + +#endif diff --git a/books/pdummies/Libraries/HttpClient/README.txt b/books/pdummies/Libraries/HttpClient/README.txt new file mode 100755 index 0000000..d223d80 --- /dev/null +++ b/books/pdummies/Libraries/HttpClient/README.txt @@ -0,0 +1,8 @@ +HttpClient is a library to make it easier to interact with web servers from Arduino. + +Dependencies: +- Requires the new Ethernet library API (with DHCP and DNS) which is in Arduino 1.0. + +In normal usage, handles the outgoing request and Host header. The returned status code is +parsed for you, as is the Content-Length header (if present). + diff --git a/books/pdummies/Libraries/HttpClient/b64.cpp b/books/pdummies/Libraries/HttpClient/b64.cpp new file mode 100755 index 0000000..b926cad --- /dev/null +++ b/books/pdummies/Libraries/HttpClient/b64.cpp @@ -0,0 +1,70 @@ +// Simple Base64 code +// (c) Copyright 2010 MCQN Ltd. +// Released under Apache License, version 2.0 + +#include "b64.h" + +/* Simple test program +#include +void main() +{ + char* in = "amcewen"; + char out[22]; + + b64_encode(in, 15, out, 22); + out[21] = '\0'; + + printf(out); +} +*/ + +int b64_encode(const unsigned char* aInput, int aInputLen, unsigned char* aOutput, int aOutputLen) +{ + // Work out if we've got enough space to encode the input + // Every 6 bits of input becomes a byte of output + if (aOutputLen < (aInputLen*8)/6) + { + // FIXME Should we return an error here, or just the length + return (aInputLen*8)/6; + } + + // If we get here we've got enough space to do the encoding + + const char* b64_dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + if (aInputLen == 3) + { + aOutput[0] = b64_dictionary[aInput[0] >> 2]; + aOutput[1] = b64_dictionary[(aInput[0] & 0x3)<<4|(aInput[1]>>4)]; + aOutput[2] = b64_dictionary[(aInput[1]&0x0F)<<2|(aInput[2]>>6)]; + aOutput[3] = b64_dictionary[aInput[2]&0x3F]; + } + else if (aInputLen == 2) + { + aOutput[0] = b64_dictionary[aInput[0] >> 2]; + aOutput[1] = b64_dictionary[(aInput[0] & 0x3)<<4|(aInput[1]>>4)]; + aOutput[2] = b64_dictionary[(aInput[1]&0x0F)<<2]; + aOutput[3] = '='; + } + else if (aInputLen == 1) + { + aOutput[0] = b64_dictionary[aInput[0] >> 2]; + aOutput[1] = b64_dictionary[(aInput[0] & 0x3)<<4]; + aOutput[2] = '='; + aOutput[3] = '='; + } + else + { + // Break the input into 3-byte chunks and process each of them + int i; + for (i = 0; i < aInputLen/3; i++) + { + b64_encode(&aInput[i*3], 3, &aOutput[i*4], 4); + } + if (aInputLen % 3 > 0) + { + // It doesn't fit neatly into a 3-byte chunk, so process what's left + b64_encode(&aInput[i*3], aInputLen % 3, &aOutput[i*4], aOutputLen - (i*4)); + } + } +} + diff --git a/books/pdummies/Libraries/HttpClient/b64.h b/books/pdummies/Libraries/HttpClient/b64.h new file mode 100755 index 0000000..cdb1226 --- /dev/null +++ b/books/pdummies/Libraries/HttpClient/b64.h @@ -0,0 +1,6 @@ +#ifndef b64_h +#define b64_h + +int b64_encode(const unsigned char* aInput, int aInputLen, unsigned char* aOutput, int aOutputLen); + +#endif diff --git a/books/pdummies/Libraries/HttpClient/examples/SimpleHttpExample/SimpleHttpExample.ino b/books/pdummies/Libraries/HttpClient/examples/SimpleHttpExample/SimpleHttpExample.ino new file mode 100755 index 0000000..f12f987 --- /dev/null +++ b/books/pdummies/Libraries/HttpClient/examples/SimpleHttpExample/SimpleHttpExample.ino @@ -0,0 +1,119 @@ +// (c) Copyright 2010-2012 MCQN Ltd. +// Released under Apache License, version 2.0 +// +// Simple example to show how to use the HttpClient library +// Get's the web page given at http:// and +// outputs the content to the serial port + +#include +#include +#include +#include + +// This example downloads the URL "http://arduino.cc/" + +// Name of the server we want to connect to +const char kHostname[] = "arduino.cc"; +// Path to download (this is the bit after the hostname in the URL +// that you want to download +const char kPath[] = "/"; + +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +// Number of milliseconds to wait without receiving any data before we give up +const int kNetworkTimeout = 30*1000; +// Number of milliseconds to wait if no data is available before trying again +const int kNetworkDelay = 1000; + +void setup() +{ + // initialize serial communications at 9600 bps: + Serial.begin(9600); + + while (Ethernet.begin(mac) != 1) + { + Serial.println("Error getting IP address via DHCP, trying again..."); + delay(15000); + } +} + +void loop() +{ + int err =0; + + EthernetClient c; + HttpClient http(c); + + err = http.get(kHostname, kPath); + if (err == 0) + { + Serial.println("startedRequest ok"); + + err = http.responseStatusCode(); + if (err >= 0) + { + Serial.print("Got status code: "); + Serial.println(err); + + // Usually you'd check that the response code is 200 or a + // similar "success" code (200-299) before carrying on, + // but we'll print out whatever response we get + + err = http.skipResponseHeaders(); + if (err >= 0) + { + int bodyLen = http.contentLength(); + Serial.print("Content length is: "); + Serial.println(bodyLen); + Serial.println(); + Serial.println("Body returned follows:"); + + // Now we've got to the body, so we can print it out + unsigned long timeoutStart = millis(); + char c; + // Whilst we haven't timed out & haven't reached the end of the body + while ( (http.connected() || http.available()) && + ((millis() - timeoutStart) < kNetworkTimeout) ) + { + if (http.available()) + { + c = http.read(); + // Print out this character + Serial.print(c); + + bodyLen--; + // We read something, reset the timeout counter + timeoutStart = millis(); + } + else + { + // We haven't got any data, so let's pause to allow some to + // arrive + delay(kNetworkDelay); + } + } + } + else + { + Serial.print("Failed to skip response headers: "); + Serial.println(err); + } + } + else + { + Serial.print("Getting response failed: "); + Serial.println(err); + } + } + else + { + Serial.print("Connect failed: "); + Serial.println(err); + } + http.stop(); + + // And just stop, now that we've tried a download + while(1); +} + + diff --git a/books/pdummies/Libraries/HttpClient/keywords.txt b/books/pdummies/Libraries/HttpClient/keywords.txt new file mode 100755 index 0000000..cdefda4 --- /dev/null +++ b/books/pdummies/Libraries/HttpClient/keywords.txt @@ -0,0 +1,39 @@ +####################################### +# Syntax Coloring Map For HttpClient +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +HttpClient KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +get KEYWORD2 +post KEYWORD2 +put KEYWORD2 +startRequest KEYWORD2 +beginRequest KEYWORD2 +sendHeader KEYWORD2 +sendBasicAuth KEYWORD2 +endRequest KEYWORD2 +responseStatusCode KEYWORD2 +readHeader KEYWORD2 +skipResponseHeaders KEYWORD2 +endOfHeadersReached KEYWORD2 +endOfBodyReached KEYWORD2 +completed KEYWORD2 +contentLength KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### +HTTP_SUCCESS LITERAL1 +HTTP_ERROR_CONNECTION_FAILED LITERAL1 +HTTP_ERROR_API LITERAL1 +HTTP_ERROR_TIMED_OUT LITERAL1 +HTTP_ERROR_INVALID_RESPONSE LITERAL1 + diff --git a/books/pdummies/Libraries/IRremote/IRremote.cpp b/books/pdummies/Libraries/IRremote/IRremote.cpp new file mode 100755 index 0000000..21a5acb --- /dev/null +++ b/books/pdummies/Libraries/IRremote/IRremote.cpp @@ -0,0 +1,1025 @@ +/* + * IRremote + * Version 0.11 August, 2009 + * Copyright 2009 Ken Shirriff + * For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html + * + * Modified by Paul Stoffregen to support other boards and timers + * Modified by Mitra Ardron + * Added Sanyo and Mitsubishi controllers + * Modified Sony to spot the repeat codes that some Sony's send + * + * Interrupt code based on NECIRrcv by Joe Knapp + * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556 + * Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/ + * + * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post) + */ + +#include "IRremote.h" +#include "IRremoteInt.h" + +// Provides ISR +#include + +volatile irparams_t irparams; + +// These versions of MATCH, MATCH_MARK, and MATCH_SPACE are only for debugging. +// To use them, set DEBUG in IRremoteInt.h +// Normally macros are used for efficiency +#ifdef DEBUG +int MATCH(int measured, int desired) { + Serial.print("Testing: "); + Serial.print(TICKS_LOW(desired), DEC); + Serial.print(" <= "); + Serial.print(measured, DEC); + Serial.print(" <= "); + Serial.println(TICKS_HIGH(desired), DEC); + return measured >= TICKS_LOW(desired) && measured <= TICKS_HIGH(desired); +} + +int MATCH_MARK(int measured_ticks, int desired_us) { + Serial.print("Testing mark "); + Serial.print(measured_ticks * USECPERTICK, DEC); + Serial.print(" vs "); + Serial.print(desired_us, DEC); + Serial.print(": "); + Serial.print(TICKS_LOW(desired_us + MARK_EXCESS), DEC); + Serial.print(" <= "); + Serial.print(measured_ticks, DEC); + Serial.print(" <= "); + Serial.println(TICKS_HIGH(desired_us + MARK_EXCESS), DEC); + return measured_ticks >= TICKS_LOW(desired_us + MARK_EXCESS) && measured_ticks <= TICKS_HIGH(desired_us + MARK_EXCESS); +} + +int MATCH_SPACE(int measured_ticks, int desired_us) { + Serial.print("Testing space "); + Serial.print(measured_ticks * USECPERTICK, DEC); + Serial.print(" vs "); + Serial.print(desired_us, DEC); + Serial.print(": "); + Serial.print(TICKS_LOW(desired_us - MARK_EXCESS), DEC); + Serial.print(" <= "); + Serial.print(measured_ticks, DEC); + Serial.print(" <= "); + Serial.println(TICKS_HIGH(desired_us - MARK_EXCESS), DEC); + return measured_ticks >= TICKS_LOW(desired_us - MARK_EXCESS) && measured_ticks <= TICKS_HIGH(desired_us - MARK_EXCESS); +} +#endif + +void IRsend::sendNEC(unsigned long data, int nbits) +{ + enableIROut(38); + mark(NEC_HDR_MARK); + space(NEC_HDR_SPACE); + for (int i = 0; i < nbits; i++) { + if (data & TOPBIT) { + mark(NEC_BIT_MARK); + space(NEC_ONE_SPACE); + } + else { + mark(NEC_BIT_MARK); + space(NEC_ZERO_SPACE); + } + data <<= 1; + } + mark(NEC_BIT_MARK); + space(0); +} + +void IRsend::sendSony(unsigned long data, int nbits) { + enableIROut(40); + mark(SONY_HDR_MARK); + space(SONY_HDR_SPACE); + data = data << (32 - nbits); + for (int i = 0; i < nbits; i++) { + if (data & TOPBIT) { + mark(SONY_ONE_MARK); + space(SONY_HDR_SPACE); + } + else { + mark(SONY_ZERO_MARK); + space(SONY_HDR_SPACE); + } + data <<= 1; + } +} + +void IRsend::sendRaw(unsigned int buf[], int len, int hz) +{ + enableIROut(hz); + for (int i = 0; i < len; i++) { + if (i & 1) { + space(buf[i]); + } + else { + mark(buf[i]); + } + } + space(0); // Just to be sure +} + +// Note: first bit must be a one (start bit) +void IRsend::sendRC5(unsigned long data, int nbits) +{ + enableIROut(36); + data = data << (32 - nbits); + mark(RC5_T1); // First start bit + space(RC5_T1); // Second start bit + mark(RC5_T1); // Second start bit + for (int i = 0; i < nbits; i++) { + if (data & TOPBIT) { + space(RC5_T1); // 1 is space, then mark + mark(RC5_T1); + } + else { + mark(RC5_T1); + space(RC5_T1); + } + data <<= 1; + } + space(0); // Turn off at end +} + +// Caller needs to take care of flipping the toggle bit +void IRsend::sendRC6(unsigned long data, int nbits) +{ + enableIROut(36); + data = data << (32 - nbits); + mark(RC6_HDR_MARK); + space(RC6_HDR_SPACE); + mark(RC6_T1); // start bit + space(RC6_T1); + int t; + for (int i = 0; i < nbits; i++) { + if (i == 3) { + // double-wide trailer bit + t = 2 * RC6_T1; + } + else { + t = RC6_T1; + } + if (data & TOPBIT) { + mark(t); + space(t); + } + else { + space(t); + mark(t); + } + + data <<= 1; + } + space(0); // Turn off at end +} +void IRsend::sendPanasonic(unsigned int address, unsigned long data) { + enableIROut(35); + mark(PANASONIC_HDR_MARK); + space(PANASONIC_HDR_SPACE); + + for(int i=0;i<16;i++) + { + mark(PANASONIC_BIT_MARK); + if (address & 0x8000) { + space(PANASONIC_ONE_SPACE); + } else { + space(PANASONIC_ZERO_SPACE); + } + address <<= 1; + } + for (int i=0; i < 32; i++) { + mark(PANASONIC_BIT_MARK); + if (data & TOPBIT) { + space(PANASONIC_ONE_SPACE); + } else { + space(PANASONIC_ZERO_SPACE); + } + data <<= 1; + } + mark(PANASONIC_BIT_MARK); + space(0); +} +void IRsend::sendJVC(unsigned long data, int nbits, int repeat) +{ + enableIROut(38); + data = data << (32 - nbits); + if (!repeat){ + mark(JVC_HDR_MARK); + space(JVC_HDR_SPACE); + } + for (int i = 0; i < nbits; i++) { + if (data & TOPBIT) { + mark(JVC_BIT_MARK); + space(JVC_ONE_SPACE); + } + else { + mark(JVC_BIT_MARK); + space(JVC_ZERO_SPACE); + } + data <<= 1; + } + mark(JVC_BIT_MARK); + space(0); +} +void IRsend::mark(int time) { + // Sends an IR mark for the specified number of microseconds. + // The mark output is modulated at the PWM frequency. + TIMER_ENABLE_PWM; // Enable pin 3 PWM output + delayMicroseconds(time); +} + +/* Leave pin off for time (given in microseconds) */ +void IRsend::space(int time) { + // Sends an IR space for the specified number of microseconds. + // A space is no output, so the PWM output is disabled. + TIMER_DISABLE_PWM; // Disable pin 3 PWM output + delayMicroseconds(time); +} + +void IRsend::enableIROut(int khz) { + // Enables IR output. The khz value controls the modulation frequency in kilohertz. + // The IR output will be on pin 3 (OC2B). + // This routine is designed for 36-40KHz; if you use it for other values, it's up to you + // to make sure it gives reasonable results. (Watch out for overflow / underflow / rounding.) + // TIMER2 is used in phase-correct PWM mode, with OCR2A controlling the frequency and OCR2B + // controlling the duty cycle. + // There is no prescaling, so the output frequency is 16MHz / (2 * OCR2A) + // To turn the output on and off, we leave the PWM running, but connect and disconnect the output pin. + // A few hours staring at the ATmega documentation and this will all make sense. + // See my Secrets of Arduino PWM at http://arcfn.com/2009/07/secrets-of-arduino-pwm.html for details. + + + // Disable the Timer2 Interrupt (which is used for receiving IR) + TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt + + pinMode(TIMER_PWM_PIN, OUTPUT); + digitalWrite(TIMER_PWM_PIN, LOW); // When not sending PWM, we want it low + + // COM2A = 00: disconnect OC2A + // COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted + // WGM2 = 101: phase-correct PWM with OCRA as top + // CS2 = 000: no prescaling + // The top value for the timer. The modulation frequency will be SYSCLOCK / 2 / OCR2A. + TIMER_CONFIG_KHZ(khz); +} + +IRrecv::IRrecv(int recvpin) +{ + irparams.recvpin = recvpin; + irparams.blinkflag = 0; +} + +// initialization +void IRrecv::enableIRIn() { + cli(); + // setup pulse clock timer interrupt + //Prescale /8 (16M/8 = 0.5 microseconds per tick) + // Therefore, the timer interval can range from 0.5 to 128 microseconds + // depending on the reset value (255 to 0) + TIMER_CONFIG_NORMAL(); + + //Timer2 Overflow Interrupt Enable + TIMER_ENABLE_INTR; + + TIMER_RESET; + + sei(); // enable interrupts + + // initialize state machine variables + irparams.rcvstate = STATE_IDLE; + irparams.rawlen = 0; + + // set pin modes + pinMode(irparams.recvpin, INPUT); +} + +// enable/disable blinking of pin 13 on IR processing +void IRrecv::blink13(int blinkflag) +{ + irparams.blinkflag = blinkflag; + if (blinkflag) + pinMode(BLINKLED, OUTPUT); +} + +// TIMER2 interrupt code to collect raw data. +// Widths of alternating SPACE, MARK are recorded in rawbuf. +// Recorded in ticks of 50 microseconds. +// rawlen counts the number of entries recorded so far. +// First entry is the SPACE between transmissions. +// As soon as a SPACE gets long, ready is set, state switches to IDLE, timing of SPACE continues. +// As soon as first MARK arrives, gap width is recorded, ready is cleared, and new logging starts +ISR(TIMER_INTR_NAME) +{ + TIMER_RESET; + + uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin); + + irparams.timer++; // One more 50us tick + if (irparams.rawlen >= RAWBUF) { + // Buffer overflow + irparams.rcvstate = STATE_STOP; + } + switch(irparams.rcvstate) { + case STATE_IDLE: // In the middle of a gap + if (irdata == MARK) { + if (irparams.timer < GAP_TICKS) { + // Not big enough to be a gap. + irparams.timer = 0; + } + else { + // gap just ended, record duration and start recording transmission + irparams.rawlen = 0; + irparams.rawbuf[irparams.rawlen++] = irparams.timer; + irparams.timer = 0; + irparams.rcvstate = STATE_MARK; + } + } + break; + case STATE_MARK: // timing MARK + if (irdata == SPACE) { // MARK ended, record time + irparams.rawbuf[irparams.rawlen++] = irparams.timer; + irparams.timer = 0; + irparams.rcvstate = STATE_SPACE; + } + break; + case STATE_SPACE: // timing SPACE + if (irdata == MARK) { // SPACE just ended, record it + irparams.rawbuf[irparams.rawlen++] = irparams.timer; + irparams.timer = 0; + irparams.rcvstate = STATE_MARK; + } + else { // SPACE + if (irparams.timer > GAP_TICKS) { + // big SPACE, indicates gap between codes + // Mark current code as ready for processing + // Switch to STOP + // Don't reset timer; keep counting space width + irparams.rcvstate = STATE_STOP; + } + } + break; + case STATE_STOP: // waiting, measuring gap + if (irdata == MARK) { // reset gap timer + irparams.timer = 0; + } + break; + } + + if (irparams.blinkflag) { + if (irdata == MARK) { + BLINKLED_ON(); // turn pin 13 LED on + } + else { + BLINKLED_OFF(); // turn pin 13 LED off + } + } +} + +void IRrecv::resume() { + irparams.rcvstate = STATE_IDLE; + irparams.rawlen = 0; +} + + + +// Decodes the received IR message +// Returns 0 if no data ready, 1 if data ready. +// Results of decoding are stored in results +int IRrecv::decode(decode_results *results) { + results->rawbuf = irparams.rawbuf; + results->rawlen = irparams.rawlen; + if (irparams.rcvstate != STATE_STOP) { + return ERR; + } +#ifdef DEBUG + Serial.println("Attempting NEC decode"); +#endif + if (decodeNEC(results)) { + return DECODED; + } +#ifdef DEBUG + Serial.println("Attempting Sony decode"); +#endif + if (decodeSony(results)) { + return DECODED; + } +#ifdef DEBUG + Serial.println("Attempting Sanyo decode"); +#endif + if (decodeSanyo(results)) { + return DECODED; + } +#ifdef DEBUG + Serial.println("Attempting Mitsubishi decode"); +#endif + if (decodeMitsubishi(results)) { + return DECODED; + } +#ifdef DEBUG + Serial.println("Attempting RC5 decode"); +#endif + if (decodeRC5(results)) { + return DECODED; + } +#ifdef DEBUG + Serial.println("Attempting RC6 decode"); +#endif + if (decodeRC6(results)) { + return DECODED; + } +#ifdef DEBUG + Serial.println("Attempting Panasonic decode"); +#endif + if (decodePanasonic(results)) { + return DECODED; + } +#ifdef DEBUG + Serial.println("Attempting JVC decode"); +#endif + if (decodeJVC(results)) { + return DECODED; + } + // decodeHash returns a hash on any input. + // Thus, it needs to be last in the list. + // If you add any decodes, add them before this. + if (decodeHash(results)) { + return DECODED; + } + // Throw away and start over + resume(); + return ERR; +} + +// NECs have a repeat only 4 items long +long IRrecv::decodeNEC(decode_results *results) { + long data = 0; + int offset = 1; // Skip first space + // Initial mark + if (!MATCH_MARK(results->rawbuf[offset], NEC_HDR_MARK)) { + return ERR; + } + offset++; + // Check for repeat + if (irparams.rawlen == 4 && + MATCH_SPACE(results->rawbuf[offset], NEC_RPT_SPACE) && + MATCH_MARK(results->rawbuf[offset+1], NEC_BIT_MARK)) { + results->bits = 0; + results->value = REPEAT; + results->decode_type = NEC; + return DECODED; + } + if (irparams.rawlen < 2 * NEC_BITS + 4) { + return ERR; + } + // Initial space + if (!MATCH_SPACE(results->rawbuf[offset], NEC_HDR_SPACE)) { + return ERR; + } + offset++; + for (int i = 0; i < NEC_BITS; i++) { + if (!MATCH_MARK(results->rawbuf[offset], NEC_BIT_MARK)) { + return ERR; + } + offset++; + if (MATCH_SPACE(results->rawbuf[offset], NEC_ONE_SPACE)) { + data = (data << 1) | 1; + } + else if (MATCH_SPACE(results->rawbuf[offset], NEC_ZERO_SPACE)) { + data <<= 1; + } + else { + return ERR; + } + offset++; + } + // Success + results->bits = NEC_BITS; + results->value = data; + results->decode_type = NEC; + return DECODED; +} + +long IRrecv::decodeSony(decode_results *results) { + long data = 0; + if (irparams.rawlen < 2 * SONY_BITS + 2) { + return ERR; + } + int offset = 0; // Dont skip first space, check its size + + // Some Sony's deliver repeats fast after first + // unfortunately can't spot difference from of repeat from two fast clicks + if (results->rawbuf[offset] < SONY_DOUBLE_SPACE_USECS) { + // Serial.print("IR Gap found: "); + results->bits = 0; + results->value = REPEAT; + results->decode_type = SANYO; + return DECODED; + } + offset++; + + // Initial mark + if (!MATCH_MARK(results->rawbuf[offset], SONY_HDR_MARK)) { + return ERR; + } + offset++; + + while (offset + 1 < irparams.rawlen) { + if (!MATCH_SPACE(results->rawbuf[offset], SONY_HDR_SPACE)) { + break; + } + offset++; + if (MATCH_MARK(results->rawbuf[offset], SONY_ONE_MARK)) { + data = (data << 1) | 1; + } + else if (MATCH_MARK(results->rawbuf[offset], SONY_ZERO_MARK)) { + data <<= 1; + } + else { + return ERR; + } + offset++; + } + + // Success + results->bits = (offset - 1) / 2; + if (results->bits < 12) { + results->bits = 0; + return ERR; + } + results->value = data; + results->decode_type = SONY; + return DECODED; +} + +// I think this is a Sanyo decoder - serial = SA 8650B +// Looks like Sony except for timings, 48 chars of data and time/space different +long IRrecv::decodeSanyo(decode_results *results) { + long data = 0; + if (irparams.rawlen < 2 * SANYO_BITS + 2) { + return ERR; + } + int offset = 0; // Skip first space + // Initial space + /* Put this back in for debugging - note can't use #DEBUG as if Debug on we don't see the repeat cos of the delay + Serial.print("IR Gap: "); + Serial.println( results->rawbuf[offset]); + Serial.println( "test against:"); + Serial.println(results->rawbuf[offset]); + */ + if (results->rawbuf[offset] < SANYO_DOUBLE_SPACE_USECS) { + // Serial.print("IR Gap found: "); + results->bits = 0; + results->value = REPEAT; + results->decode_type = SANYO; + return DECODED; + } + offset++; + + // Initial mark + if (!MATCH_MARK(results->rawbuf[offset], SANYO_HDR_MARK)) { + return ERR; + } + offset++; + + // Skip Second Mark + if (!MATCH_MARK(results->rawbuf[offset], SANYO_HDR_MARK)) { + return ERR; + } + offset++; + + while (offset + 1 < irparams.rawlen) { + if (!MATCH_SPACE(results->rawbuf[offset], SANYO_HDR_SPACE)) { + break; + } + offset++; + if (MATCH_MARK(results->rawbuf[offset], SANYO_ONE_MARK)) { + data = (data << 1) | 1; + } + else if (MATCH_MARK(results->rawbuf[offset], SANYO_ZERO_MARK)) { + data <<= 1; + } + else { + return ERR; + } + offset++; + } + + // Success + results->bits = (offset - 1) / 2; + if (results->bits < 12) { + results->bits = 0; + return ERR; + } + results->value = data; + results->decode_type = SANYO; + return DECODED; +} + +// Looks like Sony except for timings, 48 chars of data and time/space different +long IRrecv::decodeMitsubishi(decode_results *results) { + // Serial.print("?!? decoding Mitsubishi:");Serial.print(irparams.rawlen); Serial.print(" want "); Serial.println( 2 * MITSUBISHI_BITS + 2); + long data = 0; + if (irparams.rawlen < 2 * MITSUBISHI_BITS + 2) { + return ERR; + } + int offset = 0; // Skip first space + // Initial space + /* Put this back in for debugging - note can't use #DEBUG as if Debug on we don't see the repeat cos of the delay + Serial.print("IR Gap: "); + Serial.println( results->rawbuf[offset]); + Serial.println( "test against:"); + Serial.println(results->rawbuf[offset]); + */ + /* Not seeing double keys from Mitsubishi + if (results->rawbuf[offset] < MITSUBISHI_DOUBLE_SPACE_USECS) { + // Serial.print("IR Gap found: "); + results->bits = 0; + results->value = REPEAT; + results->decode_type = MITSUBISHI; + return DECODED; + } + */ + offset++; + + // Typical + // 14200 7 41 7 42 7 42 7 17 7 17 7 18 7 41 7 18 7 17 7 17 7 18 7 41 8 17 7 17 7 18 7 17 7 + + // Initial Space + if (!MATCH_MARK(results->rawbuf[offset], MITSUBISHI_HDR_SPACE)) { + return ERR; + } + offset++; + while (offset + 1 < irparams.rawlen) { + if (MATCH_MARK(results->rawbuf[offset], MITSUBISHI_ONE_MARK)) { + data = (data << 1) | 1; + } + else if (MATCH_MARK(results->rawbuf[offset], MITSUBISHI_ZERO_MARK)) { + data <<= 1; + } + else { + // Serial.println("A"); Serial.println(offset); Serial.println(results->rawbuf[offset]); + return ERR; + } + offset++; + if (!MATCH_SPACE(results->rawbuf[offset], MITSUBISHI_HDR_SPACE)) { + // Serial.println("B"); Serial.println(offset); Serial.println(results->rawbuf[offset]); + break; + } + offset++; + } + + // Success + results->bits = (offset - 1) / 2; + if (results->bits < MITSUBISHI_BITS) { + results->bits = 0; + return ERR; + } + results->value = data; + results->decode_type = MITSUBISHI; + return DECODED; +} + + +// Gets one undecoded level at a time from the raw buffer. +// The RC5/6 decoding is easier if the data is broken into time intervals. +// E.g. if the buffer has MARK for 2 time intervals and SPACE for 1, +// successive calls to getRClevel will return MARK, MARK, SPACE. +// offset and used are updated to keep track of the current position. +// t1 is the time interval for a single bit in microseconds. +// Returns -1 for error (measured time interval is not a multiple of t1). +int IRrecv::getRClevel(decode_results *results, int *offset, int *used, int t1) { + if (*offset >= results->rawlen) { + // After end of recorded buffer, assume SPACE. + return SPACE; + } + int width = results->rawbuf[*offset]; + int val = ((*offset) % 2) ? MARK : SPACE; + int correction = (val == MARK) ? MARK_EXCESS : - MARK_EXCESS; + + int avail; + if (MATCH(width, t1 + correction)) { + avail = 1; + } + else if (MATCH(width, 2*t1 + correction)) { + avail = 2; + } + else if (MATCH(width, 3*t1 + correction)) { + avail = 3; + } + else { + return -1; + } + + (*used)++; + if (*used >= avail) { + *used = 0; + (*offset)++; + } +#ifdef DEBUG + if (val == MARK) { + Serial.println("MARK"); + } + else { + Serial.println("SPACE"); + } +#endif + return val; +} + +long IRrecv::decodeRC5(decode_results *results) { + if (irparams.rawlen < MIN_RC5_SAMPLES + 2) { + return ERR; + } + int offset = 1; // Skip gap space + long data = 0; + int used = 0; + // Get start bits + if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return ERR; + if (getRClevel(results, &offset, &used, RC5_T1) != SPACE) return ERR; + if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return ERR; + int nbits; + for (nbits = 0; offset < irparams.rawlen; nbits++) { + int levelA = getRClevel(results, &offset, &used, RC5_T1); + int levelB = getRClevel(results, &offset, &used, RC5_T1); + if (levelA == SPACE && levelB == MARK) { + // 1 bit + data = (data << 1) | 1; + } + else if (levelA == MARK && levelB == SPACE) { + // zero bit + data <<= 1; + } + else { + return ERR; + } + } + + // Success + results->bits = nbits; + results->value = data; + results->decode_type = RC5; + return DECODED; +} + +long IRrecv::decodeRC6(decode_results *results) { + if (results->rawlen < MIN_RC6_SAMPLES) { + return ERR; + } + int offset = 1; // Skip first space + // Initial mark + if (!MATCH_MARK(results->rawbuf[offset], RC6_HDR_MARK)) { + return ERR; + } + offset++; + if (!MATCH_SPACE(results->rawbuf[offset], RC6_HDR_SPACE)) { + return ERR; + } + offset++; + long data = 0; + int used = 0; + // Get start bit (1) + if (getRClevel(results, &offset, &used, RC6_T1) != MARK) return ERR; + if (getRClevel(results, &offset, &used, RC6_T1) != SPACE) return ERR; + int nbits; + for (nbits = 0; offset < results->rawlen; nbits++) { + int levelA, levelB; // Next two levels + levelA = getRClevel(results, &offset, &used, RC6_T1); + if (nbits == 3) { + // T bit is double wide; make sure second half matches + if (levelA != getRClevel(results, &offset, &used, RC6_T1)) return ERR; + } + levelB = getRClevel(results, &offset, &used, RC6_T1); + if (nbits == 3) { + // T bit is double wide; make sure second half matches + if (levelB != getRClevel(results, &offset, &used, RC6_T1)) return ERR; + } + if (levelA == MARK && levelB == SPACE) { // reversed compared to RC5 + // 1 bit + data = (data << 1) | 1; + } + else if (levelA == SPACE && levelB == MARK) { + // zero bit + data <<= 1; + } + else { + return ERR; // Error + } + } + // Success + results->bits = nbits; + results->value = data; + results->decode_type = RC6; + return DECODED; +} +long IRrecv::decodePanasonic(decode_results *results) { + unsigned long long data = 0; + int offset = 1; + + if (!MATCH_MARK(results->rawbuf[offset], PANASONIC_HDR_MARK)) { + return ERR; + } + offset++; + if (!MATCH_MARK(results->rawbuf[offset], PANASONIC_HDR_SPACE)) { + return ERR; + } + offset++; + + // decode address + for (int i = 0; i < PANASONIC_BITS; i++) { + if (!MATCH_MARK(results->rawbuf[offset++], PANASONIC_BIT_MARK)) { + return ERR; + } + if (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ONE_SPACE)) { + data = (data << 1) | 1; + } else if (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ZERO_SPACE)) { + data <<= 1; + } else { + return ERR; + } + offset++; + } + results->value = (unsigned long)data; + results->panasonicAddress = (unsigned int)(data >> 32); + results->decode_type = PANASONIC; + results->bits = PANASONIC_BITS; + return DECODED; +} +long IRrecv::decodeJVC(decode_results *results) { + long data = 0; + int offset = 1; // Skip first space + // Check for repeat + if (irparams.rawlen - 1 == 33 && + MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK) && + MATCH_MARK(results->rawbuf[irparams.rawlen-1], JVC_BIT_MARK)) { + results->bits = 0; + results->value = REPEAT; + results->decode_type = JVC; + return DECODED; + } + // Initial mark + if (!MATCH_MARK(results->rawbuf[offset], JVC_HDR_MARK)) { + return ERR; + } + offset++; + if (irparams.rawlen < 2 * JVC_BITS + 1 ) { + return ERR; + } + // Initial space + if (!MATCH_SPACE(results->rawbuf[offset], JVC_HDR_SPACE)) { + return ERR; + } + offset++; + for (int i = 0; i < JVC_BITS; i++) { + if (!MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)) { + return ERR; + } + offset++; + if (MATCH_SPACE(results->rawbuf[offset], JVC_ONE_SPACE)) { + data = (data << 1) | 1; + } + else if (MATCH_SPACE(results->rawbuf[offset], JVC_ZERO_SPACE)) { + data <<= 1; + } + else { + return ERR; + } + offset++; + } + //Stop bit + if (!MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)){ + return ERR; + } + // Success + results->bits = JVC_BITS; + results->value = data; + results->decode_type = JVC; + return DECODED; +} + +/* ----------------------------------------------------------------------- + * hashdecode - decode an arbitrary IR code. + * Instead of decoding using a standard encoding scheme + * (e.g. Sony, NEC, RC5), the code is hashed to a 32-bit value. + * + * The algorithm: look at the sequence of MARK signals, and see if each one + * is shorter (0), the same length (1), or longer (2) than the previous. + * Do the same with the SPACE signals. Hszh the resulting sequence of 0's, + * 1's, and 2's to a 32-bit value. This will give a unique value for each + * different code (probably), for most code systems. + * + * http://arcfn.com/2010/01/using-arbitrary-remotes-with-arduino.html + */ + +// Compare two tick values, returning 0 if newval is shorter, +// 1 if newval is equal, and 2 if newval is longer +// Use a tolerance of 20% +int IRrecv::compare(unsigned int oldval, unsigned int newval) { + if (newval < oldval * .8) { + return 0; + } + else if (oldval < newval * .8) { + return 2; + } + else { + return 1; + } +} + +// Use FNV hash algorithm: http://isthe.com/chongo/tech/comp/fnv/#FNV-param +#define FNV_PRIME_32 16777619 +#define FNV_BASIS_32 2166136261 + +/* Converts the raw code values into a 32-bit hash code. + * Hopefully this code is unique for each button. + * This isn't a "real" decoding, just an arbitrary value. + */ +long IRrecv::decodeHash(decode_results *results) { + // Require at least 6 samples to prevent triggering on noise + if (results->rawlen < 6) { + return ERR; + } + long hash = FNV_BASIS_32; + for (int i = 1; i+2 < results->rawlen; i++) { + int value = compare(results->rawbuf[i], results->rawbuf[i+2]); + // Add value into the hash + hash = (hash * FNV_PRIME_32) ^ value; + } + results->value = hash; + results->bits = 32; + results->decode_type = UNKNOWN; + return DECODED; +} + +/* Sharp and DISH support by Todd Treece ( http://unionbridge.org/design/ircommand ) + +The Dish send function needs to be repeated 4 times, and the Sharp function +has the necessary repeat built in because of the need to invert the signal. + +Sharp protocol documentation: +http://www.sbprojects.com/knowledge/ir/sharp.htm + +Here are the LIRC files that I found that seem to match the remote codes +from the oscilloscope: + +Sharp LCD TV: +http://lirc.sourceforge.net/remotes/sharp/GA538WJSA + +DISH NETWORK (echostar 301): +http://lirc.sourceforge.net/remotes/echostar/301_501_3100_5100_58xx_59xx + +For the DISH codes, only send the last for characters of the hex. +i.e. use 0x1C10 instead of 0x0000000000001C10 which is listed in the +linked LIRC file. +*/ + +void IRsend::sendSharp(unsigned long data, int nbits) { + unsigned long invertdata = data ^ SHARP_TOGGLE_MASK; + enableIROut(38); + for (int i = 0; i < nbits; i++) { + if (data & 0x4000) { + mark(SHARP_BIT_MARK); + space(SHARP_ONE_SPACE); + } + else { + mark(SHARP_BIT_MARK); + space(SHARP_ZERO_SPACE); + } + data <<= 1; + } + + mark(SHARP_BIT_MARK); + space(SHARP_ZERO_SPACE); + delay(46); + for (int i = 0; i < nbits; i++) { + if (invertdata & 0x4000) { + mark(SHARP_BIT_MARK); + space(SHARP_ONE_SPACE); + } + else { + mark(SHARP_BIT_MARK); + space(SHARP_ZERO_SPACE); + } + invertdata <<= 1; + } + mark(SHARP_BIT_MARK); + space(SHARP_ZERO_SPACE); + delay(46); +} + +void IRsend::sendDISH(unsigned long data, int nbits) +{ + enableIROut(56); + mark(DISH_HDR_MARK); + space(DISH_HDR_SPACE); + for (int i = 0; i < nbits; i++) { + if (data & DISH_TOP_BIT) { + mark(DISH_BIT_MARK); + space(DISH_ONE_SPACE); + } + else { + mark(DISH_BIT_MARK); + space(DISH_ZERO_SPACE); + } + data <<= 1; + } +} diff --git a/books/pdummies/Libraries/IRremote/IRremote.h b/books/pdummies/Libraries/IRremote/IRremote.h new file mode 100755 index 0000000..0e5fdf2 --- /dev/null +++ b/books/pdummies/Libraries/IRremote/IRremote.h @@ -0,0 +1,118 @@ +/* + * IRremote + * Version 0.1 July, 2009 + * Copyright 2009 Ken Shirriff + * For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.htm http://arcfn.com + * Edited by Mitra to add new controller SANYO + * + * Interrupt code based on NECIRrcv by Joe Knapp + * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556 + * Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/ + * + * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post) + */ + +#ifndef IRremote_h +#define IRremote_h + +// The following are compile-time library options. +// If you change them, recompile the library. +// If DEBUG is defined, a lot of debugging output will be printed during decoding. +// TEST must be defined for the IRtest unittests to work. It will make some +// methods virtual, which will be slightly slower, which is why it is optional. +// #define DEBUG +// #define TEST + +// Results returned from the decoder +class decode_results { +public: + int decode_type; // NEC, SONY, RC5, UNKNOWN + unsigned int panasonicAddress; // This is only used for decoding Panasonic data + unsigned long value; // Decoded value + int bits; // Number of bits in decoded value + volatile unsigned int *rawbuf; // Raw intervals in .5 us ticks + int rawlen; // Number of records in rawbuf. +}; + +// Values for decode_type +#define NEC 1 +#define SONY 2 +#define RC5 3 +#define RC6 4 +#define DISH 5 +#define SHARP 6 +#define PANASONIC 7 +#define JVC 8 +#define SANYO 9 +#define MITSUBISHI 10 +#define UNKNOWN -1 + +// Decoded value for NEC when a repeat code is received +#define REPEAT 0xffffffff + +// main class for receiving IR +class IRrecv +{ +public: + IRrecv(int recvpin); + void blink13(int blinkflag); + int decode(decode_results *results); + void enableIRIn(); + void resume(); +private: + // These are called by decode + int getRClevel(decode_results *results, int *offset, int *used, int t1); + long decodeNEC(decode_results *results); + long decodeSony(decode_results *results); + long decodeSanyo(decode_results *results); + long decodeMitsubishi(decode_results *results); + long decodeRC5(decode_results *results); + long decodeRC6(decode_results *results); + long decodePanasonic(decode_results *results); + long decodeJVC(decode_results *results); + long decodeHash(decode_results *results); + int compare(unsigned int oldval, unsigned int newval); + +} +; + +// Only used for testing; can remove virtual for shorter code +#ifdef TEST +#define VIRTUAL virtual +#else +#define VIRTUAL +#endif + +class IRsend +{ +public: + IRsend() {} + void sendNEC(unsigned long data, int nbits); + void sendSony(unsigned long data, int nbits); + // Neither Sanyo nor Mitsubishi send is implemented yet + // void sendSanyo(unsigned long data, int nbits); + // void sendMitsubishi(unsigned long data, int nbits); + void sendRaw(unsigned int buf[], int len, int hz); + void sendRC5(unsigned long data, int nbits); + void sendRC6(unsigned long data, int nbits); + void sendDISH(unsigned long data, int nbits); + void sendSharp(unsigned long data, int nbits); + void sendPanasonic(unsigned int address, unsigned long data); + void sendJVC(unsigned long data, int nbits, int repeat); // *Note instead of sending the REPEAT constant if you want the JVC repeat signal sent, send the original code value and change the repeat argument from 0 to 1. JVC protocol repeats by skipping the header NOT by sending a separate code value like NEC does. + // private: + void enableIROut(int khz); + VIRTUAL void mark(int usec); + VIRTUAL void space(int usec); +} +; + +// Some useful constants + +#define USECPERTICK 50 // microseconds per clock interrupt tick +#define RAWBUF 100 // Length of raw duration buffer + +// Marks tend to be 100us too long, and spaces 100us too short +// when received due to sensor lag. +#define MARK_EXCESS 100 + +#endif diff --git a/books/pdummies/Libraries/IRremote/IRremoteInt.h b/books/pdummies/Libraries/IRremote/IRremoteInt.h new file mode 100755 index 0000000..e6bcd00 --- /dev/null +++ b/books/pdummies/Libraries/IRremote/IRremoteInt.h @@ -0,0 +1,453 @@ +/* + * IRremote + * Version 0.1 July, 2009 + * Copyright 2009 Ken Shirriff + * For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html + * + * Modified by Paul Stoffregen to support other boards and timers + * + * Interrupt code based on NECIRrcv by Joe Knapp + * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556 + * Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/ + * + * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post) + */ + +#ifndef IRremoteint_h +#define IRremoteint_h + +#if defined(ARDUINO) && ARDUINO >= 100 +#include +#else +#include +#endif + +// define which timer to use +// +// Uncomment the timer you wish to use on your board. If you +// are using another library which uses timer2, you have options +// to switch IRremote to use a different timer. + +// Arduino Mega +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + //#define IR_USE_TIMER1 // tx = pin 11 + #define IR_USE_TIMER2 // tx = pin 9 + //#define IR_USE_TIMER3 // tx = pin 5 + //#define IR_USE_TIMER4 // tx = pin 6 + //#define IR_USE_TIMER5 // tx = pin 46 + +// Teensy 1.0 +#elif defined(__AVR_AT90USB162__) + #define IR_USE_TIMER1 // tx = pin 17 + +// Teensy 2.0 +#elif defined(__AVR_ATmega32U4__) + //#define IR_USE_TIMER1 // tx = pin 14 + //#define IR_USE_TIMER3 // tx = pin 9 + #define IR_USE_TIMER4_HS // tx = pin 10 + +// Teensy++ 1.0 & 2.0 +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) + //#define IR_USE_TIMER1 // tx = pin 25 + #define IR_USE_TIMER2 // tx = pin 1 + //#define IR_USE_TIMER3 // tx = pin 16 + +// Sanguino +#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) + //#define IR_USE_TIMER1 // tx = pin 13 + #define IR_USE_TIMER2 // tx = pin 14 + +// Atmega8 +#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__) + #define IR_USE_TIMER1 // tx = pin 9 + +// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc +#else + //#define IR_USE_TIMER1 // tx = pin 9 + #define IR_USE_TIMER2 // tx = pin 3 +#endif + + + +#ifdef F_CPU +#define SYSCLOCK F_CPU // main Arduino clock +#else +#define SYSCLOCK 16000000 // main Arduino clock +#endif + +#define ERR 0 +#define DECODED 1 + + +// defines for setting and clearing register bits +#ifndef cbi +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) +#endif +#ifndef sbi +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + +// Pulse parms are *50-100 for the Mark and *50+100 for the space +// First MARK is the one after the long gap +// pulse parameters in usec +#define NEC_HDR_MARK 9000 +#define NEC_HDR_SPACE 4500 +#define NEC_BIT_MARK 560 +#define NEC_ONE_SPACE 1600 +#define NEC_ZERO_SPACE 560 +#define NEC_RPT_SPACE 2250 + +#define SONY_HDR_MARK 2400 +#define SONY_HDR_SPACE 600 +#define SONY_ONE_MARK 1200 +#define SONY_ZERO_MARK 600 +#define SONY_RPT_LENGTH 45000 +#define SONY_DOUBLE_SPACE_USECS 500 // usually ssee 713 - not using ticks as get number wrapround + +// SA 8650B +#define SANYO_HDR_MARK 3500 // seen range 3500 +#define SANYO_HDR_SPACE 950 // seen 950 +#define SANYO_ONE_MARK 2400 // seen 2400 +#define SANYO_ZERO_MARK 700 // seen 700 +#define SANYO_DOUBLE_SPACE_USECS 800 // usually ssee 713 - not using ticks as get number wrapround +#define SANYO_RPT_LENGTH 45000 + +// Mitsubishi RM 75501 +// 14200 7 41 7 42 7 42 7 17 7 17 7 18 7 41 7 18 7 17 7 17 7 18 7 41 8 17 7 17 7 18 7 17 7 + +// #define MITSUBISHI_HDR_MARK 250 // seen range 3500 +#define MITSUBISHI_HDR_SPACE 350 // 7*50+100 +#define MITSUBISHI_ONE_MARK 1950 // 41*50-100 +#define MITSUBISHI_ZERO_MARK 750 // 17*50-100 +// #define MITSUBISHI_DOUBLE_SPACE_USECS 800 // usually ssee 713 - not using ticks as get number wrapround +// #define MITSUBISHI_RPT_LENGTH 45000 + + +#define RC5_T1 889 +#define RC5_RPT_LENGTH 46000 + +#define RC6_HDR_MARK 2666 +#define RC6_HDR_SPACE 889 +#define RC6_T1 444 +#define RC6_RPT_LENGTH 46000 + +#define SHARP_BIT_MARK 245 +#define SHARP_ONE_SPACE 1805 +#define SHARP_ZERO_SPACE 795 +#define SHARP_GAP 600000 +#define SHARP_TOGGLE_MASK 0x3FF +#define SHARP_RPT_SPACE 3000 + +#define DISH_HDR_MARK 400 +#define DISH_HDR_SPACE 6100 +#define DISH_BIT_MARK 400 +#define DISH_ONE_SPACE 1700 +#define DISH_ZERO_SPACE 2800 +#define DISH_RPT_SPACE 6200 +#define DISH_TOP_BIT 0x8000 + +#define PANASONIC_HDR_MARK 3502 +#define PANASONIC_HDR_SPACE 1750 +#define PANASONIC_BIT_MARK 502 +#define PANASONIC_ONE_SPACE 1244 +#define PANASONIC_ZERO_SPACE 400 + +#define JVC_HDR_MARK 8000 +#define JVC_HDR_SPACE 4000 +#define JVC_BIT_MARK 600 +#define JVC_ONE_SPACE 1600 +#define JVC_ZERO_SPACE 550 +#define JVC_RPT_LENGTH 60000 + +#define SHARP_BITS 15 +#define DISH_BITS 16 + +#define TOLERANCE 25 // percent tolerance in measurements +#define LTOL (1.0 - TOLERANCE/100.) +#define UTOL (1.0 + TOLERANCE/100.) + +#define _GAP 5000 // Minimum map between transmissions +#define GAP_TICKS (_GAP/USECPERTICK) + +#define TICKS_LOW(us) (int) (((us)*LTOL/USECPERTICK)) +#define TICKS_HIGH(us) (int) (((us)*UTOL/USECPERTICK + 1)) + +#ifndef DEBUG +int MATCH(int measured, int desired) {return measured >= TICKS_LOW(desired) && measured <= TICKS_HIGH(desired);} +int MATCH_MARK(int measured_ticks, int desired_us) {return MATCH(measured_ticks, (desired_us + MARK_EXCESS));} +int MATCH_SPACE(int measured_ticks, int desired_us) {return MATCH(measured_ticks, (desired_us - MARK_EXCESS));} +// Debugging versions are in IRremote.cpp +#endif + +// receiver states +#define STATE_IDLE 2 +#define STATE_MARK 3 +#define STATE_SPACE 4 +#define STATE_STOP 5 + +// information for the interrupt handler +typedef struct { + uint8_t recvpin; // pin for IR data from detector + uint8_t rcvstate; // state machine + uint8_t blinkflag; // TRUE to enable blinking of pin 13 on IR processing + unsigned int timer; // state timer, counts 50uS ticks. + unsigned int rawbuf[RAWBUF]; // raw data + uint8_t rawlen; // counter of entries in rawbuf +} +irparams_t; + +// Defined in IRremote.cpp +extern volatile irparams_t irparams; + +// IR detector output is active low +#define MARK 0 +#define SPACE 1 + +#define TOPBIT 0x80000000 + +#define NEC_BITS 32 +#define SONY_BITS 12 +#define SANYO_BITS 12 +#define MITSUBISHI_BITS 16 +#define MIN_RC5_SAMPLES 11 +#define MIN_RC6_SAMPLES 1 +#define PANASONIC_BITS 48 +#define JVC_BITS 16 + + + + +// defines for timer2 (8 bits) +#if defined(IR_USE_TIMER2) +#define TIMER_RESET +#define TIMER_ENABLE_PWM (TCCR2A |= _BV(COM2B1)) +#define TIMER_DISABLE_PWM (TCCR2A &= ~(_BV(COM2B1))) +#define TIMER_ENABLE_INTR (TIMSK2 = _BV(OCIE2A)) +#define TIMER_DISABLE_INTR (TIMSK2 = 0) +#define TIMER_INTR_NAME TIMER2_COMPA_vect +#define TIMER_CONFIG_KHZ(val) ({ \ + const uint8_t pwmval = SYSCLOCK / 2000 / (val); \ + TCCR2A = _BV(WGM20); \ + TCCR2B = _BV(WGM22) | _BV(CS20); \ + OCR2A = pwmval; \ + OCR2B = pwmval / 3; \ +}) +#define TIMER_COUNT_TOP (SYSCLOCK * USECPERTICK / 1000000) +#if (TIMER_COUNT_TOP < 256) +#define TIMER_CONFIG_NORMAL() ({ \ + TCCR2A = _BV(WGM21); \ + TCCR2B = _BV(CS20); \ + OCR2A = TIMER_COUNT_TOP; \ + TCNT2 = 0; \ +}) +#else +#define TIMER_CONFIG_NORMAL() ({ \ + TCCR2A = _BV(WGM21); \ + TCCR2B = _BV(CS21); \ + OCR2A = TIMER_COUNT_TOP / 8; \ + TCNT2 = 0; \ +}) +#endif +#if defined(CORE_OC2B_PIN) +#define TIMER_PWM_PIN CORE_OC2B_PIN /* Teensy */ +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define TIMER_PWM_PIN 9 /* Arduino Mega */ +#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) +#define TIMER_PWM_PIN 14 /* Sanguino */ +#else +#define TIMER_PWM_PIN 3 /* Arduino Duemilanove, Diecimila, LilyPad, etc */ +#endif + + +// defines for timer1 (16 bits) +#elif defined(IR_USE_TIMER1) +#define TIMER_RESET +#define TIMER_ENABLE_PWM (TCCR1A |= _BV(COM1A1)) +#define TIMER_DISABLE_PWM (TCCR1A &= ~(_BV(COM1A1))) +#if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__) + #define TIMER_ENABLE_INTR (TIMSK = _BV(OCIE1A)) + #define TIMER_DISABLE_INTR (TIMSK = 0) +#else + #define TIMER_ENABLE_INTR (TIMSK1 = _BV(OCIE1A)) + #define TIMER_DISABLE_INTR (TIMSK1 = 0) +#endif +#define TIMER_INTR_NAME TIMER1_COMPA_vect +#define TIMER_CONFIG_KHZ(val) ({ \ + const uint16_t pwmval = SYSCLOCK / 2000 / (val); \ + TCCR1A = _BV(WGM11); \ + TCCR1B = _BV(WGM13) | _BV(CS10); \ + ICR1 = pwmval; \ + OCR1A = pwmval / 3; \ +}) +#define TIMER_CONFIG_NORMAL() ({ \ + TCCR1A = 0; \ + TCCR1B = _BV(WGM12) | _BV(CS10); \ + OCR1A = SYSCLOCK * USECPERTICK / 1000000; \ + TCNT1 = 0; \ +}) +#if defined(CORE_OC1A_PIN) +#define TIMER_PWM_PIN CORE_OC1A_PIN /* Teensy */ +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define TIMER_PWM_PIN 11 /* Arduino Mega */ +#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) +#define TIMER_PWM_PIN 13 /* Sanguino */ +#else +#define TIMER_PWM_PIN 9 /* Arduino Duemilanove, Diecimila, LilyPad, etc */ +#endif + + +// defines for timer3 (16 bits) +#elif defined(IR_USE_TIMER3) +#define TIMER_RESET +#define TIMER_ENABLE_PWM (TCCR3A |= _BV(COM3A1)) +#define TIMER_DISABLE_PWM (TCCR3A &= ~(_BV(COM3A1))) +#define TIMER_ENABLE_INTR (TIMSK3 = _BV(OCIE3A)) +#define TIMER_DISABLE_INTR (TIMSK3 = 0) +#define TIMER_INTR_NAME TIMER3_COMPA_vect +#define TIMER_CONFIG_KHZ(val) ({ \ + const uint16_t pwmval = SYSCLOCK / 2000 / (val); \ + TCCR3A = _BV(WGM31); \ + TCCR3B = _BV(WGM33) | _BV(CS30); \ + ICR3 = pwmval; \ + OCR3A = pwmval / 3; \ +}) +#define TIMER_CONFIG_NORMAL() ({ \ + TCCR3A = 0; \ + TCCR3B = _BV(WGM32) | _BV(CS30); \ + OCR3A = SYSCLOCK * USECPERTICK / 1000000; \ + TCNT3 = 0; \ +}) +#if defined(CORE_OC3A_PIN) +#define TIMER_PWM_PIN CORE_OC3A_PIN /* Teensy */ +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define TIMER_PWM_PIN 5 /* Arduino Mega */ +#else +#error "Please add OC3A pin number here\n" +#endif + + +// defines for timer4 (10 bits, high speed option) +#elif defined(IR_USE_TIMER4_HS) +#define TIMER_RESET +#define TIMER_ENABLE_PWM (TCCR4A |= _BV(COM4A1)) +#define TIMER_DISABLE_PWM (TCCR4A &= ~(_BV(COM4A1))) +#define TIMER_ENABLE_INTR (TIMSK4 = _BV(TOIE4)) +#define TIMER_DISABLE_INTR (TIMSK4 = 0) +#define TIMER_INTR_NAME TIMER4_OVF_vect +#define TIMER_CONFIG_KHZ(val) ({ \ + const uint16_t pwmval = SYSCLOCK / 2000 / (val); \ + TCCR4A = (1<> 8; \ + OCR4C = pwmval; \ + TC4H = (pwmval / 3) >> 8; \ + OCR4A = (pwmval / 3) & 255; \ +}) +#define TIMER_CONFIG_NORMAL() ({ \ + TCCR4A = 0; \ + TCCR4B = _BV(CS40); \ + TCCR4C = 0; \ + TCCR4D = 0; \ + TCCR4E = 0; \ + TC4H = (SYSCLOCK * USECPERTICK / 1000000) >> 8; \ + OCR4C = (SYSCLOCK * USECPERTICK / 1000000) & 255; \ + TC4H = 0; \ + TCNT4 = 0; \ +}) +#if defined(CORE_OC4A_PIN) +#define TIMER_PWM_PIN CORE_OC4A_PIN /* Teensy */ +#elif defined(__AVR_ATmega32U4__) +#define TIMER_PWM_PIN 13 /* Leonardo */ +#else +#error "Please add OC4A pin number here\n" +#endif + + +// defines for timer4 (16 bits) +#elif defined(IR_USE_TIMER4) +#define TIMER_RESET +#define TIMER_ENABLE_PWM (TCCR4A |= _BV(COM4A1)) +#define TIMER_DISABLE_PWM (TCCR4A &= ~(_BV(COM4A1))) +#define TIMER_ENABLE_INTR (TIMSK4 = _BV(OCIE4A)) +#define TIMER_DISABLE_INTR (TIMSK4 = 0) +#define TIMER_INTR_NAME TIMER4_COMPA_vect +#define TIMER_CONFIG_KHZ(val) ({ \ + const uint16_t pwmval = SYSCLOCK / 2000 / (val); \ + TCCR4A = _BV(WGM41); \ + TCCR4B = _BV(WGM43) | _BV(CS40); \ + ICR4 = pwmval; \ + OCR4A = pwmval / 3; \ +}) +#define TIMER_CONFIG_NORMAL() ({ \ + TCCR4A = 0; \ + TCCR4B = _BV(WGM42) | _BV(CS40); \ + OCR4A = SYSCLOCK * USECPERTICK / 1000000; \ + TCNT4 = 0; \ +}) +#if defined(CORE_OC4A_PIN) +#define TIMER_PWM_PIN CORE_OC4A_PIN +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define TIMER_PWM_PIN 6 /* Arduino Mega */ +#else +#error "Please add OC4A pin number here\n" +#endif + + +// defines for timer5 (16 bits) +#elif defined(IR_USE_TIMER5) +#define TIMER_RESET +#define TIMER_ENABLE_PWM (TCCR5A |= _BV(COM5A1)) +#define TIMER_DISABLE_PWM (TCCR5A &= ~(_BV(COM5A1))) +#define TIMER_ENABLE_INTR (TIMSK5 = _BV(OCIE5A)) +#define TIMER_DISABLE_INTR (TIMSK5 = 0) +#define TIMER_INTR_NAME TIMER5_COMPA_vect +#define TIMER_CONFIG_KHZ(val) ({ \ + const uint16_t pwmval = SYSCLOCK / 2000 / (val); \ + TCCR5A = _BV(WGM51); \ + TCCR5B = _BV(WGM53) | _BV(CS50); \ + ICR5 = pwmval; \ + OCR5A = pwmval / 3; \ +}) +#define TIMER_CONFIG_NORMAL() ({ \ + TCCR5A = 0; \ + TCCR5B = _BV(WGM52) | _BV(CS50); \ + OCR5A = SYSCLOCK * USECPERTICK / 1000000; \ + TCNT5 = 0; \ +}) +#if defined(CORE_OC5A_PIN) +#define TIMER_PWM_PIN CORE_OC5A_PIN +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define TIMER_PWM_PIN 46 /* Arduino Mega */ +#else +#error "Please add OC5A pin number here\n" +#endif + + +#else // unknown timer +#error "Internal code configuration error, no known IR_USE_TIMER# defined\n" +#endif + + +// defines for blinking the LED +#if defined(CORE_LED0_PIN) +#define BLINKLED CORE_LED0_PIN +#define BLINKLED_ON() (digitalWrite(CORE_LED0_PIN, HIGH)) +#define BLINKLED_OFF() (digitalWrite(CORE_LED0_PIN, LOW)) +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define BLINKLED 13 +#define BLINKLED_ON() (PORTB |= B10000000) +#define BLINKLED_OFF() (PORTB &= B01111111) +#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) +#define BLINKLED 0 +#define BLINKLED_ON() (PORTD |= B00000001) +#define BLINKLED_OFF() (PORTD &= B11111110) +#else +#define BLINKLED 13 +#define BLINKLED_ON() (PORTB |= B00100000) +#define BLINKLED_OFF() (PORTB &= B11011111) +#endif + +#endif diff --git a/books/pdummies/Libraries/IRremote/LICENSE.txt b/books/pdummies/Libraries/IRremote/LICENSE.txt new file mode 100755 index 0000000..77cec6d --- /dev/null +++ b/books/pdummies/Libraries/IRremote/LICENSE.txt @@ -0,0 +1,458 @@ + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + diff --git a/books/pdummies/Libraries/IRremote/examples/IRrecord/IRrecord.ino b/books/pdummies/Libraries/IRremote/examples/IRrecord/IRrecord.ino new file mode 100755 index 0000000..caf86de --- /dev/null +++ b/books/pdummies/Libraries/IRremote/examples/IRrecord/IRrecord.ino @@ -0,0 +1,167 @@ +/* + * IRrecord: record and play back IR signals as a minimal + * An IR detector/demodulator must be connected to the input RECV_PIN. + * An IR LED must be connected to the output PWM pin 3. + * A button must be connected to the input BUTTON_PIN; this is the + * send button. + * A visible LED can be connected to STATUS_PIN to provide status. + * + * The logic is: + * If the button is pressed, send the IR code. + * If an IR code is received, record it. + * + * Version 0.11 September, 2009 + * Copyright 2009 Ken Shirriff + * http://arcfn.com + */ + +#include + +int RECV_PIN = 11; +int BUTTON_PIN = 12; +int STATUS_PIN = 13; + +IRrecv irrecv(RECV_PIN); +IRsend irsend; + +decode_results results; + +void setup() +{ + Serial.begin(9600); + irrecv.enableIRIn(); // Start the receiver + pinMode(BUTTON_PIN, INPUT); + pinMode(STATUS_PIN, OUTPUT); +} + +// Storage for the recorded code +int codeType = -1; // The type of code +unsigned long codeValue; // The code value if not raw +unsigned int rawCodes[RAWBUF]; // The durations if raw +int codeLen; // The length of the code +int toggle = 0; // The RC5/6 toggle state + +// Stores the code for later playback +// Most of this code is just logging +void storeCode(decode_results *results) { + codeType = results->decode_type; + int count = results->rawlen; + if (codeType == UNKNOWN) { + Serial.println("Received unknown code, saving as raw"); + codeLen = results->rawlen - 1; + // To store raw codes: + // Drop first value (gap) + // Convert from ticks to microseconds + // Tweak marks shorter, and spaces longer to cancel out IR receiver distortion + for (int i = 1; i <= codeLen; i++) { + if (i % 2) { + // Mark + rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS; + Serial.print(" m"); + } + else { + // Space + rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS; + Serial.print(" s"); + } + Serial.print(rawCodes[i - 1], DEC); + } + Serial.println(""); + } + else { + if (codeType == NEC) { + Serial.print("Received NEC: "); + if (results->value == REPEAT) { + // Don't record a NEC repeat value as that's useless. + Serial.println("repeat; ignoring."); + return; + } + } + else if (codeType == SONY) { + Serial.print("Received SONY: "); + } + else if (codeType == RC5) { + Serial.print("Received RC5: "); + } + else if (codeType == RC6) { + Serial.print("Received RC6: "); + } + else { + Serial.print("Unexpected codeType "); + Serial.print(codeType, DEC); + Serial.println(""); + } + Serial.println(results->value, HEX); + codeValue = results->value; + codeLen = results->bits; + } +} + +void sendCode(int repeat) { + if (codeType == NEC) { + if (repeat) { + irsend.sendNEC(REPEAT, codeLen); + Serial.println("Sent NEC repeat"); + } + else { + irsend.sendNEC(codeValue, codeLen); + Serial.print("Sent NEC "); + Serial.println(codeValue, HEX); + } + } + else if (codeType == SONY) { + irsend.sendSony(codeValue, codeLen); + Serial.print("Sent Sony "); + Serial.println(codeValue, HEX); + } + else if (codeType == RC5 || codeType == RC6) { + if (!repeat) { + // Flip the toggle bit for a new button press + toggle = 1 - toggle; + } + // Put the toggle bit into the code to send + codeValue = codeValue & ~(1 << (codeLen - 1)); + codeValue = codeValue | (toggle << (codeLen - 1)); + if (codeType == RC5) { + Serial.print("Sent RC5 "); + Serial.println(codeValue, HEX); + irsend.sendRC5(codeValue, codeLen); + } + else { + irsend.sendRC6(codeValue, codeLen); + Serial.print("Sent RC6 "); + Serial.println(codeValue, HEX); + } + } + else if (codeType == UNKNOWN /* i.e. raw */) { + // Assume 38 KHz + irsend.sendRaw(rawCodes, codeLen, 38); + Serial.println("Sent raw"); + } +} + +int lastButtonState; + +void loop() { + // If button pressed, send the code. + int buttonState = digitalRead(BUTTON_PIN); + if (lastButtonState == HIGH && buttonState == LOW) { + Serial.println("Released"); + irrecv.enableIRIn(); // Re-enable receiver + } + + if (buttonState) { + Serial.println("Pressed, sending"); + digitalWrite(STATUS_PIN, HIGH); + sendCode(lastButtonState == buttonState); + digitalWrite(STATUS_PIN, LOW); + delay(50); // Wait a bit between retransmissions + } + else if (irrecv.decode(&results)) { + digitalWrite(STATUS_PIN, HIGH); + storeCode(&results); + irrecv.resume(); // resume receiver + digitalWrite(STATUS_PIN, LOW); + } + lastButtonState = buttonState; +} diff --git a/books/pdummies/Libraries/IRremote/examples/IRrecvDemo/IRrecvDemo.ino b/books/pdummies/Libraries/IRremote/examples/IRrecvDemo/IRrecvDemo.ino new file mode 100755 index 0000000..f7b45b8 --- /dev/null +++ b/books/pdummies/Libraries/IRremote/examples/IRrecvDemo/IRrecvDemo.ino @@ -0,0 +1,28 @@ +/* + * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv + * An IR detector/demodulator must be connected to the input RECV_PIN. + * Version 0.1 July, 2009 + * Copyright 2009 Ken Shirriff + * http://arcfn.com + */ + +#include + +int RECV_PIN = 11; + +IRrecv irrecv(RECV_PIN); + +decode_results results; + +void setup() +{ + Serial.begin(9600); + irrecv.enableIRIn(); // Start the receiver +} + +void loop() { + if (irrecv.decode(&results)) { + Serial.println(results.value, HEX); + irrecv.resume(); // Receive the next value + } +} diff --git a/books/pdummies/Libraries/IRremote/examples/IRrecvDump/IRrecvDump.ino b/books/pdummies/Libraries/IRremote/examples/IRrecvDump/IRrecvDump.ino new file mode 100755 index 0000000..6afcb0f --- /dev/null +++ b/books/pdummies/Libraries/IRremote/examples/IRrecvDump/IRrecvDump.ino @@ -0,0 +1,81 @@ +/* + * IRremote: IRrecvDump - dump details of IR codes with IRrecv + * An IR detector/demodulator must be connected to the input RECV_PIN. + * Version 0.1 July, 2009 + * Copyright 2009 Ken Shirriff + * http://arcfn.com + * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post) + */ + +#include + +int RECV_PIN = 11; + +IRrecv irrecv(RECV_PIN); + +decode_results results; + +void setup() +{ + Serial.begin(9600); + irrecv.enableIRIn(); // Start the receiver +} + +// Dumps out the decode_results structure. +// Call this after IRrecv::decode() +// void * to work around compiler issue +//void dump(void *v) { +// decode_results *results = (decode_results *)v +void dump(decode_results *results) { + int count = results->rawlen; + if (results->decode_type == UNKNOWN) { + Serial.print("Unknown encoding: "); + } + else if (results->decode_type == NEC) { + Serial.print("Decoded NEC: "); + } + else if (results->decode_type == SONY) { + Serial.print("Decoded SONY: "); + } + else if (results->decode_type == RC5) { + Serial.print("Decoded RC5: "); + } + else if (results->decode_type == RC6) { + Serial.print("Decoded RC6: "); + } + else if (results->decode_type == PANASONIC) { + Serial.print("Decoded PANASONIC - Address: "); + Serial.print(results->panasonicAddress,HEX); + Serial.print(" Value: "); + } + else if (results->decode_type == JVC) { + Serial.print("Decoded JVC: "); + } + Serial.print(results->value, HEX); + Serial.print(" ("); + Serial.print(results->bits, DEC); + Serial.println(" bits)"); + Serial.print("Raw ("); + Serial.print(count, DEC); + Serial.print("): "); + + for (int i = 0; i < count; i++) { + if ((i % 2) == 1) { + Serial.print(results->rawbuf[i]*USECPERTICK, DEC); + } + else { + Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); + } + Serial.print(" "); + } + Serial.println(""); +} + + +void loop() { + if (irrecv.decode(&results)) { + Serial.println(results.value, HEX); + dump(&results); + irrecv.resume(); // Receive the next value + } +} diff --git a/books/pdummies/Libraries/IRremote/examples/IRrelay/IRrelay.ino b/books/pdummies/Libraries/IRremote/examples/IRrelay/IRrelay.ino new file mode 100755 index 0000000..046fb5f --- /dev/null +++ b/books/pdummies/Libraries/IRremote/examples/IRrelay/IRrelay.ino @@ -0,0 +1,85 @@ +/* + * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv + * An IR detector/demodulator must be connected to the input RECV_PIN. + * Version 0.1 July, 2009 + * Copyright 2009 Ken Shirriff + * http://arcfn.com + */ + +#include + +int RECV_PIN = 11; +int RELAY_PIN = 4; + +IRrecv irrecv(RECV_PIN); +decode_results results; + +// Dumps out the decode_results structure. +// Call this after IRrecv::decode() +// void * to work around compiler issue +//void dump(void *v) { +// decode_results *results = (decode_results *)v +void dump(decode_results *results) { + int count = results->rawlen; + if (results->decode_type == UNKNOWN) { + Serial.println("Could not decode message"); + } + else { + if (results->decode_type == NEC) { + Serial.print("Decoded NEC: "); + } + else if (results->decode_type == SONY) { + Serial.print("Decoded SONY: "); + } + else if (results->decode_type == RC5) { + Serial.print("Decoded RC5: "); + } + else if (results->decode_type == RC6) { + Serial.print("Decoded RC6: "); + } + Serial.print(results->value, HEX); + Serial.print(" ("); + Serial.print(results->bits, DEC); + Serial.println(" bits)"); + } + Serial.print("Raw ("); + Serial.print(count, DEC); + Serial.print("): "); + + for (int i = 0; i < count; i++) { + if ((i % 2) == 1) { + Serial.print(results->rawbuf[i]*USECPERTICK, DEC); + } + else { + Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); + } + Serial.print(" "); + } + Serial.println(""); +} + +void setup() +{ + pinMode(RELAY_PIN, OUTPUT); + pinMode(13, OUTPUT); + Serial.begin(9600); + irrecv.enableIRIn(); // Start the receiver +} + +int on = 0; +unsigned long last = millis(); + +void loop() { + if (irrecv.decode(&results)) { + // If it's been at least 1/4 second since the last + // IR received, toggle the relay + if (millis() - last > 250) { + on = !on; + digitalWrite(RELAY_PIN, on ? HIGH : LOW); + digitalWrite(13, on ? HIGH : LOW); + dump(&results); + } + last = millis(); + irrecv.resume(); // Receive the next value + } +} diff --git a/books/pdummies/Libraries/IRremote/examples/IRsendDemo/IRsendDemo.ino b/books/pdummies/Libraries/IRremote/examples/IRsendDemo/IRsendDemo.ino new file mode 100755 index 0000000..a21af31 --- /dev/null +++ b/books/pdummies/Libraries/IRremote/examples/IRsendDemo/IRsendDemo.ino @@ -0,0 +1,25 @@ +/* + * IRremote: IRsendDemo - demonstrates sending IR codes with IRsend + * An IR LED must be connected to Arduino PWM pin 3. + * Version 0.1 July, 2009 + * Copyright 2009 Ken Shirriff + * http://arcfn.com + */ + +#include + +IRsend irsend; + +void setup() +{ + Serial.begin(9600); +} + +void loop() { + if (Serial.read() != -1) { + for (int i = 0; i < 3; i++) { + irsend.sendSony(0xa90, 12); // Sony TV power code + delay(40); + } + } +} diff --git a/books/pdummies/Libraries/IRremote/examples/IRtest/IRtest.ino b/books/pdummies/Libraries/IRremote/examples/IRtest/IRtest.ino new file mode 100755 index 0000000..4845a4a --- /dev/null +++ b/books/pdummies/Libraries/IRremote/examples/IRtest/IRtest.ino @@ -0,0 +1,190 @@ +/* + * IRremote: IRtest unittest + * Version 0.1 July, 2009 + * Copyright 2009 Ken Shirriff + * http://arcfn.com + * + * Note: to run these tests, edit IRremote/IRremote.h to add "#define TEST" + * You must then recompile the library by removing IRremote.o and restarting + * the arduino IDE. + */ + +#include +#include + +// Dumps out the decode_results structure. +// Call this after IRrecv::decode() +// void * to work around compiler issue +//void dump(void *v) { +// decode_results *results = (decode_results *)v +void dump(decode_results *results) { + int count = results->rawlen; + if (results->decode_type == UNKNOWN) { + Serial.println("Could not decode message"); + } + else { + if (results->decode_type == NEC) { + Serial.print("Decoded NEC: "); + } + else if (results->decode_type == SONY) { + Serial.print("Decoded SONY: "); + } + else if (results->decode_type == RC5) { + Serial.print("Decoded RC5: "); + } + else if (results->decode_type == RC6) { + Serial.print("Decoded RC6: "); + } + Serial.print(results->value, HEX); + Serial.print(" ("); + Serial.print(results->bits, DEC); + Serial.println(" bits)"); + } + Serial.print("Raw ("); + Serial.print(count, DEC); + Serial.print("): "); + + for (int i = 0; i < count; i++) { + if ((i % 2) == 1) { + Serial.print(results->rawbuf[i]*USECPERTICK, DEC); + } + else { + Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); + } + Serial.print(" "); + } + Serial.println(""); +} + +IRrecv irrecv(0); +decode_results results; + +class IRsendDummy : +public IRsend +{ +public: + // For testing, just log the marks/spaces +#define SENDLOG_LEN 128 + int sendlog[SENDLOG_LEN]; + int sendlogcnt; + IRsendDummy() : + IRsend() { + } + void reset() { + sendlogcnt = 0; + } + void mark(int time) { + sendlog[sendlogcnt] = time; + if (sendlogcnt < SENDLOG_LEN) sendlogcnt++; + } + void space(int time) { + sendlog[sendlogcnt] = -time; + if (sendlogcnt < SENDLOG_LEN) sendlogcnt++; + } + // Copies the dummy buf into the interrupt buf + void useDummyBuf() { + int last = SPACE; + irparams.rcvstate = STATE_STOP; + irparams.rawlen = 1; // Skip the gap + for (int i = 0 ; i < sendlogcnt; i++) { + if (sendlog[i] < 0) { + if (last == MARK) { + // New space + irparams.rawbuf[irparams.rawlen++] = (-sendlog[i] - MARK_EXCESS) / USECPERTICK; + last = SPACE; + } + else { + // More space + irparams.rawbuf[irparams.rawlen - 1] += -sendlog[i] / USECPERTICK; + } + } + else if (sendlog[i] > 0) { + if (last == SPACE) { + // New mark + irparams.rawbuf[irparams.rawlen++] = (sendlog[i] + MARK_EXCESS) / USECPERTICK; + last = MARK; + } + else { + // More mark + irparams.rawbuf[irparams.rawlen - 1] += sendlog[i] / USECPERTICK; + } + } + } + if (irparams.rawlen % 2) { + irparams.rawlen--; // Remove trailing space + } + } +}; + +IRsendDummy irsenddummy; + +void verify(unsigned long val, int bits, int type) { + irsenddummy.useDummyBuf(); + irrecv.decode(&results); + Serial.print("Testing "); + Serial.print(val, HEX); + if (results.value == val && results.bits == bits && results.decode_type == type) { + Serial.println(": OK"); + } + else { + Serial.println(": Error"); + dump(&results); + } +} + +void testNEC(unsigned long val, int bits) { + irsenddummy.reset(); + irsenddummy.sendNEC(val, bits); + verify(val, bits, NEC); +} +void testSony(unsigned long val, int bits) { + irsenddummy.reset(); + irsenddummy.sendSony(val, bits); + verify(val, bits, SONY); +} +void testRC5(unsigned long val, int bits) { + irsenddummy.reset(); + irsenddummy.sendRC5(val, bits); + verify(val, bits, RC5); +} +void testRC6(unsigned long val, int bits) { + irsenddummy.reset(); + irsenddummy.sendRC6(val, bits); + verify(val, bits, RC6); +} + +void test() { + Serial.println("NEC tests"); + testNEC(0x00000000, 32); + testNEC(0xffffffff, 32); + testNEC(0xaaaaaaaa, 32); + testNEC(0x55555555, 32); + testNEC(0x12345678, 32); + Serial.println("Sony tests"); + testSony(0xfff, 12); + testSony(0x000, 12); + testSony(0xaaa, 12); + testSony(0x555, 12); + testSony(0x123, 12); + Serial.println("RC5 tests"); + testRC5(0xfff, 12); + testRC5(0x000, 12); + testRC5(0xaaa, 12); + testRC5(0x555, 12); + testRC5(0x123, 12); + Serial.println("RC6 tests"); + testRC6(0xfffff, 20); + testRC6(0x00000, 20); + testRC6(0xaaaaa, 20); + testRC6(0x55555, 20); + testRC6(0x12345, 20); +} + +void setup() +{ + Serial.begin(9600); + test(); +} + +void loop() { +} diff --git a/books/pdummies/Libraries/IRremote/examples/IRtest2/IRtest2.ino b/books/pdummies/Libraries/IRremote/examples/IRtest2/IRtest2.ino new file mode 100755 index 0000000..56b8a4d --- /dev/null +++ b/books/pdummies/Libraries/IRremote/examples/IRtest2/IRtest2.ino @@ -0,0 +1,290 @@ +/* + * Test send/receive functions of IRremote, using a pair of Arduinos. + * + * Arduino #1 should have an IR LED connected to the send pin (3). + * Arduino #2 should have an IR detector/demodulator connected to the + * receive pin (11) and a visible LED connected to pin 3. + * + * The cycle: + * Arduino #1 will wait 2 seconds, then run through the tests. + * It repeats this forever. + * Arduino #2 will wait for at least one second of no signal + * (to synchronize with #1). It will then wait for the same test + * signals. It will log all the status to the serial port. It will + * also indicate status through the LED, which will flash each time a test + * is completed. If there is an error, it will light up for 5 seconds. + * + * The test passes if the LED flashes 19 times, pauses, and then repeats. + * The test fails if the LED lights for 5 seconds. + * + * The test software automatically decides which board is the sender and which is + * the receiver by looking for an input on the send pin, which will indicate + * the sender. You should hook the serial port to the receiver for debugging. + * + * Copyright 2010 Ken Shirriff + * http://arcfn.com + */ + +#include + +int RECV_PIN = 11; +int LED_PIN = 3; + +IRrecv irrecv(RECV_PIN); +IRsend irsend; + +decode_results results; + +#define RECEIVER 1 +#define SENDER 2 +#define ERROR 3 + +int mode; + +void setup() +{ + Serial.begin(9600); + // Check RECV_PIN to decide if we're RECEIVER or SENDER + if (digitalRead(RECV_PIN) == HIGH) { + mode = RECEIVER; + irrecv.enableIRIn(); + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, LOW); + Serial.println("Receiver mode"); + } + else { + mode = SENDER; + Serial.println("Sender mode"); + } +} + +// Wait for the gap between tests, to synchronize with +// the sender. +// Specifically, wait for a signal followed by a gap of at last gap ms. +void waitForGap(int gap) { + Serial.println("Waiting for gap"); + while (1) { + while (digitalRead(RECV_PIN) == LOW) { + } + unsigned long time = millis(); + while (digitalRead(RECV_PIN) == HIGH) { + if (millis() - time > gap) { + return; + } + } + } +} + +// Dumps out the decode_results structure. +// Call this after IRrecv::decode() +void dump(decode_results *results) { + int count = results->rawlen; + if (results->decode_type == UNKNOWN) { + Serial.println("Could not decode message"); + } + else { + if (results->decode_type == NEC) { + Serial.print("Decoded NEC: "); + } + else if (results->decode_type == SONY) { + Serial.print("Decoded SONY: "); + } + else if (results->decode_type == RC5) { + Serial.print("Decoded RC5: "); + } + else if (results->decode_type == RC6) { + Serial.print("Decoded RC6: "); + } + Serial.print(results->value, HEX); + Serial.print(" ("); + Serial.print(results->bits, DEC); + Serial.println(" bits)"); + } + Serial.print("Raw ("); + Serial.print(count, DEC); + Serial.print("): "); + + for (int i = 0; i < count; i++) { + if ((i % 2) == 1) { + Serial.print(results->rawbuf[i]*USECPERTICK, DEC); + } + else { + Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); + } + Serial.print(" "); + } + Serial.println(""); +} + + +// Test send or receive. +// If mode is SENDER, send a code of the specified type, value, and bits +// If mode is RECEIVER, receive a code and verify that it is of the +// specified type, value, and bits. For success, the LED is flashed; +// for failure, the mode is set to ERROR. +// The motivation behind this method is that the sender and the receiver +// can do the same test calls, and the mode variable indicates whether +// to send or receive. +void test(char *label, int type, unsigned long value, int bits) { + if (mode == SENDER) { + Serial.println(label); + if (type == NEC) { + irsend.sendNEC(value, bits); + } + else if (type == SONY) { + irsend.sendSony(value, bits); + } + else if (type == RC5) { + irsend.sendRC5(value, bits); + } + else if (type == RC6) { + irsend.sendRC6(value, bits); + } + else { + Serial.print(label); + Serial.println("Bad type!"); + } + delay(200); + } + else if (mode == RECEIVER) { + irrecv.resume(); // Receive the next value + unsigned long max_time = millis() + 30000; + Serial.print(label); + + // Wait for decode or timeout + while (!irrecv.decode(&results)) { + if (millis() > max_time) { + Serial.println("Timeout receiving data"); + mode = ERROR; + return; + } + } + if (type == results.decode_type && value == results.value && bits == results.bits) { + Serial.println (": OK"); + digitalWrite(LED_PIN, HIGH); + delay(20); + digitalWrite(LED_PIN, LOW); + } + else { + Serial.println(": BAD"); + dump(&results); + mode = ERROR; + } + } +} + +// Test raw send or receive. This is similar to the test method, +// except it send/receives raw data. +void testRaw(char *label, unsigned int *rawbuf, int rawlen) { + if (mode == SENDER) { + Serial.println(label); + irsend.sendRaw(rawbuf, rawlen, 38 /* kHz */); + delay(200); + } + else if (mode == RECEIVER ) { + irrecv.resume(); // Receive the next value + unsigned long max_time = millis() + 30000; + Serial.print(label); + + // Wait for decode or timeout + while (!irrecv.decode(&results)) { + if (millis() > max_time) { + Serial.println("Timeout receiving data"); + mode = ERROR; + return; + } + } + + // Received length has extra first element for gap + if (rawlen != results.rawlen - 1) { + Serial.print("Bad raw length "); + Serial.println(results.rawlen, DEC); + mode = ERROR; + return; + } + for (int i = 0; i < rawlen; i++) { + long got = results.rawbuf[i+1] * USECPERTICK; + // Adjust for extra duration of marks + if (i % 2 == 0) { + got -= MARK_EXCESS; + } + else { + got += MARK_EXCESS; + } + // See if close enough, within 25% + if (rawbuf[i] * 1.25 < got || got * 1.25 < rawbuf[i]) { + Serial.println(": BAD"); + dump(&results); + mode = ERROR; + return; + } + + } + Serial.println (": OK"); + digitalWrite(LED_PIN, HIGH); + delay(20); + digitalWrite(LED_PIN, LOW); + } +} + +// This is the raw data corresponding to NEC 0x12345678 +unsigned int sendbuf[] = { /* NEC format */ + 9000, 4500, + 560, 560, 560, 560, 560, 560, 560, 1690, /* 1 */ + 560, 560, 560, 560, 560, 1690, 560, 560, /* 2 */ + 560, 560, 560, 560, 560, 1690, 560, 1690, /* 3 */ + 560, 560, 560, 1690, 560, 560, 560, 560, /* 4 */ + 560, 560, 560, 1690, 560, 560, 560, 1690, /* 5 */ + 560, 560, 560, 1690, 560, 1690, 560, 560, /* 6 */ + 560, 560, 560, 1690, 560, 1690, 560, 1690, /* 7 */ + 560, 1690, 560, 560, 560, 560, 560, 560, /* 8 */ + 560}; + +void loop() { + if (mode == SENDER) { + delay(2000); // Delay for more than gap to give receiver a better chance to sync. + } + else if (mode == RECEIVER) { + waitForGap(1000); + } + else if (mode == ERROR) { + // Light up for 5 seconds for error + digitalWrite(LED_PIN, HIGH); + delay(5000); + digitalWrite(LED_PIN, LOW); + mode = RECEIVER; // Try again + return; + } + + // The test suite. + test("SONY1", SONY, 0x123, 12); + test("SONY2", SONY, 0x000, 12); + test("SONY3", SONY, 0xfff, 12); + test("SONY4", SONY, 0x12345, 20); + test("SONY5", SONY, 0x00000, 20); + test("SONY6", SONY, 0xfffff, 20); + test("NEC1", NEC, 0x12345678, 32); + test("NEC2", NEC, 0x00000000, 32); + test("NEC3", NEC, 0xffffffff, 32); + test("NEC4", NEC, REPEAT, 32); + test("RC51", RC5, 0x12345678, 32); + test("RC52", RC5, 0x0, 32); + test("RC53", RC5, 0xffffffff, 32); + test("RC61", RC6, 0x12345678, 32); + test("RC62", RC6, 0x0, 32); + test("RC63", RC6, 0xffffffff, 32); + + // Tests of raw sending and receiving. + // First test sending raw and receiving raw. + // Then test sending raw and receiving decoded NEC + // Then test sending NEC and receiving raw + testRaw("RAW1", sendbuf, 67); + if (mode == SENDER) { + testRaw("RAW2", sendbuf, 67); + test("RAW3", NEC, 0x12345678, 32); + } + else { + test("RAW2", NEC, 0x12345678, 32); + testRaw("RAW3", sendbuf, 67); + } +} diff --git a/books/pdummies/Libraries/IRremote/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino b/books/pdummies/Libraries/IRremote/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino new file mode 100755 index 0000000..33c167c --- /dev/null +++ b/books/pdummies/Libraries/IRremote/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino @@ -0,0 +1,29 @@ +/* + * IRremote: IRsendDemo - demonstrates sending IR codes with IRsend + * An IR LED must be connected to Arduino PWM pin 3. + * Version 0.1 July, 2009 + * Copyright 2009 Ken Shirriff + * http://arcfn.com + * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post) + */ +#include + +#define PanasonicAddress 0x4004 // Panasonic address (Pre data) +#define PanasonicPower 0x100BCBD // Panasonic Power button + +#define JVCPower 0xC5E8 + +IRsend irsend; + +void setup() +{ +} + +void loop() { + irsend.sendPanasonic(PanasonicAddress,PanasonicPower); // This should turn your TV on and off + + irsend.sendJVC(JVCPower, 16,0); // hex value, 16 bits, no repeat + delayMicroseconds(50); // see http://www.sbprojects.com/knowledge/ir/jvc.php for information + irsend.sendJVC(JVCPower, 16,1); // hex value, 16 bits, repeat + delayMicroseconds(50); +} diff --git a/books/pdummies/Libraries/IRremote/keywords.txt b/books/pdummies/Libraries/IRremote/keywords.txt new file mode 100755 index 0000000..74010c4 --- /dev/null +++ b/books/pdummies/Libraries/IRremote/keywords.txt @@ -0,0 +1,50 @@ +####################################### +# Syntax Coloring Map For IRremote +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +decode_results KEYWORD1 +IRrecv KEYWORD1 +IRsend KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +blink13 KEYWORD2 +decode KEYWORD2 +enableIRIn KEYWORD2 +resume KEYWORD2 +enableIROut KEYWORD2 +sendNEC KEYWORD2 +sendSony KEYWORD2 +sendSanyo KEYWORD2 +sendMitsubishi KEYWORD2 +sendRaw KEYWORD2 +sendRC5 KEYWORD2 +sendRC6 KEYWORD2 +sendDISH KEYWORD2 +sendSharp KEYWORD2 +sendPanasonic KEYWORD2 +sendJVC KEYWORD2 + +# +####################################### +# Constants (LITERAL1) +####################################### + +NEC LITERAL1 +SONY LITERAL1 +SANYO LITERAL1 +MITSUBISHI LITERAL1 +RC5 LITERAL1 +RC6 LITERAL1 +DISH LITERAL1 +SHARP LITERAL1 +PANASONIC LITERAL1 +JVC LITERAL1 +UNKNOWN LITERAL1 +REPEAT LITERAL1 \ No newline at end of file diff --git a/books/pdummies/Libraries/IRremote/readme.txt b/books/pdummies/Libraries/IRremote/readme.txt new file mode 100755 index 0000000..3de6526 --- /dev/null +++ b/books/pdummies/Libraries/IRremote/readme.txt @@ -0,0 +1,14 @@ +This is the IRremote library for the Arduino. + +To download from github (http://github.com/shirriff/Arduino-IRremote), click on the "Downloads" link in the upper right, click "Download as zip", and get a zip file. Unzip it and rename the directory shirriff-Arduino-IRremote-nnn to IRremote + +To install, move the downloaded IRremote directory to: +arduino-1.x/libraries/IRremote +where arduino-1.x is your Arduino installation directory + +After installation you should have files such as: +arduino-1.x/libraries/IRremote/IRremote.cpp + +For details on the library see the Wiki on github or the blog post http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html + +Copyright 2009-2012 Ken Shirriff diff --git a/books/pdummies/Libraries/RTClib/RTClib.cpp b/books/pdummies/Libraries/RTClib/RTClib.cpp new file mode 100755 index 0000000..4516a57 --- /dev/null +++ b/books/pdummies/Libraries/RTClib/RTClib.cpp @@ -0,0 +1,240 @@ +// Code by JeeLabs http://news.jeelabs.org/code/ +// Released to the public domain! Enjoy! + +#include +#include +#include "RTClib.h" + +#define DS1307_ADDRESS 0x68 +#define SECONDS_PER_DAY 86400L + +#define SECONDS_FROM_1970_TO_2000 946684800 + +#if (ARDUINO >= 100) + #include // capital A so it is error prone on case-sensitive filesystems +#else + #include +#endif + +int i = 0; //The new wire library needs to take an int when you are sending for the zero register +//////////////////////////////////////////////////////////////////////////////// +// utility code, some of this could be exposed in the DateTime API if needed + +const uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //has to be const or compiler compaints + +// number of days since 2000/01/01, valid for 2001..2099 +static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) { + if (y >= 2000) + y -= 2000; + uint16_t days = d; + for (uint8_t i = 1; i < m; ++i) + days += pgm_read_byte(daysInMonth + i - 1); + if (m > 2 && y % 4 == 0) + ++days; + return days + 365 * y + (y + 3) / 4 - 1; +} + +static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) { + return ((days * 24L + h) * 60 + m) * 60 + s; +} + +//////////////////////////////////////////////////////////////////////////////// +// DateTime implementation - ignores time zones and DST changes +// NOTE: also ignores leap seconds, see http://en.wikipedia.org/wiki/Leap_second + +DateTime::DateTime (uint32_t t) { + t -= SECONDS_FROM_1970_TO_2000; // bring to 2000 timestamp from 1970 + + ss = t % 60; + t /= 60; + mm = t % 60; + t /= 60; + hh = t % 24; + uint16_t days = t / 24; + uint8_t leap; + for (yOff = 0; ; ++yOff) { + leap = yOff % 4 == 0; + if (days < 365 + leap) + break; + days -= 365 + leap; + } + for (m = 1; ; ++m) { + uint8_t daysPerMonth = pgm_read_byte(daysInMonth + m - 1); + if (leap && m == 2) + ++daysPerMonth; + if (days < daysPerMonth) + break; + days -= daysPerMonth; + } + d = days + 1; +} + +DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) { + if (year >= 2000) + year -= 2000; + yOff = year; + m = month; + d = day; + hh = hour; + mm = min; + ss = sec; +} + +static uint8_t conv2d(const char* p) { + uint8_t v = 0; + if ('0' <= *p && *p <= '9') + v = *p - '0'; + return 10 * v + *++p - '0'; +} + +// A convenient constructor for using "the compiler's time": +// DateTime now (__DATE__, __TIME__); +// NOTE: using PSTR would further reduce the RAM footprint +DateTime::DateTime (const char* date, const char* time) { + // sample input: date = "Dec 26 2009", time = "12:34:56" + yOff = conv2d(date + 9); + // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + switch (date[0]) { + case 'J': m = date[1] == 'a' ? 1 : m = date[2] == 'n' ? 6 : 7; break; + case 'F': m = 2; break; + case 'A': m = date[2] == 'r' ? 4 : 8; break; + case 'M': m = date[2] == 'r' ? 3 : 5; break; + case 'S': m = 9; break; + case 'O': m = 10; break; + case 'N': m = 11; break; + case 'D': m = 12; break; + } + d = conv2d(date + 4); + hh = conv2d(time); + mm = conv2d(time + 3); + ss = conv2d(time + 6); +} + +uint8_t DateTime::dayOfWeek() const { + uint16_t day = date2days(yOff, m, d); + return (day + 6) % 7; // Jan 1, 2000 is a Saturday, i.e. returns 6 +} + +uint32_t DateTime::unixtime(void) const { + uint32_t t; + uint16_t days = date2days(yOff, m, d); + t = time2long(days, hh, mm, ss); + t += SECONDS_FROM_1970_TO_2000; // seconds from 1970 to 2000 + + return t; +} + +//////////////////////////////////////////////////////////////////////////////// +// RTC_DS1307 implementation + +static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); } +static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); } + +uint8_t RTC_DS1307::begin(void) { + return 1; +} + + +#if (ARDUINO >= 100) + +uint8_t RTC_DS1307::isrunning(void) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.write(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 1); + uint8_t ss = Wire.read(); + return !(ss>>7); +} + +void RTC_DS1307::adjust(const DateTime& dt) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.write(i); + Wire.write(bin2bcd(dt.second())); + Wire.write(bin2bcd(dt.minute())); + Wire.write(bin2bcd(dt.hour())); + Wire.write(bin2bcd(0)); + Wire.write(bin2bcd(dt.day())); + Wire.write(bin2bcd(dt.month())); + Wire.write(bin2bcd(dt.year() - 2000)); + Wire.write(i); + Wire.endTransmission(); +} + +DateTime RTC_DS1307::now() { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.write(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 7); + uint8_t ss = bcd2bin(Wire.read() & 0x7F); + uint8_t mm = bcd2bin(Wire.read()); + uint8_t hh = bcd2bin(Wire.read()); + Wire.read(); + uint8_t d = bcd2bin(Wire.read()); + uint8_t m = bcd2bin(Wire.read()); + uint16_t y = bcd2bin(Wire.read()) + 2000; + + return DateTime (y, m, d, hh, mm, ss); +} + +#else + +uint8_t RTC_DS1307::isrunning(void) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.send(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 1); + uint8_t ss = Wire.receive(); + return !(ss>>7); +} + +void RTC_DS1307::adjust(const DateTime& dt) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.send(i); + Wire.send(bin2bcd(dt.second())); + Wire.send(bin2bcd(dt.minute())); + Wire.send(bin2bcd(dt.hour())); + Wire.send(bin2bcd(0)); + Wire.send(bin2bcd(dt.day())); + Wire.send(bin2bcd(dt.month())); + Wire.send(bin2bcd(dt.year() - 2000)); + Wire.send(i); + Wire.endTransmission(); +} + +DateTime RTC_DS1307::now() { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.send(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 7); + uint8_t ss = bcd2bin(Wire.receive() & 0x7F); + uint8_t mm = bcd2bin(Wire.receive()); + uint8_t hh = bcd2bin(Wire.receive()); + Wire.receive(); + uint8_t d = bcd2bin(Wire.receive()); + uint8_t m = bcd2bin(Wire.receive()); + uint16_t y = bcd2bin(Wire.receive()) + 2000; + + return DateTime (y, m, d, hh, mm, ss); +} + +#endif + + +//////////////////////////////////////////////////////////////////////////////// +// RTC_Millis implementation + +long RTC_Millis::offset = 0; + +void RTC_Millis::adjust(const DateTime& dt) { + offset = dt.unixtime() - millis() / 1000; +} + +DateTime RTC_Millis::now() { + return (uint32_t)(offset + millis() / 1000); +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/books/pdummies/Libraries/RTClib/RTClib.h b/books/pdummies/Libraries/RTClib/RTClib.h new file mode 100755 index 0000000..f5bf9d1 --- /dev/null +++ b/books/pdummies/Libraries/RTClib/RTClib.h @@ -0,0 +1,47 @@ +// Code by JeeLabs http://news.jeelabs.org/code/ +// Released to the public domain! Enjoy! + +// Simple general-purpose date/time class (no TZ / DST / leap second handling!) +class DateTime { +public: + DateTime (uint32_t t =0); + DateTime (uint16_t year, uint8_t month, uint8_t day, + uint8_t hour =0, uint8_t min =0, uint8_t sec =0); + DateTime (const char* date, const char* time); + uint16_t year() const { return 2000 + yOff; } + uint8_t month() const { return m; } + uint8_t day() const { return d; } + uint8_t hour() const { return hh; } + uint8_t minute() const { return mm; } + uint8_t second() const { return ss; } + uint8_t dayOfWeek() const; + + // 32-bit times as seconds since 1/1/2000 + long secondstime() const; + // 32-bit times as seconds since 1/1/1970 + uint32_t unixtime(void) const; + +protected: + uint8_t yOff, m, d, hh, mm, ss; +}; + +// RTC based on the DS1307 chip connected via I2C and the Wire library +class RTC_DS1307 { +public: + static uint8_t begin(void); + static void adjust(const DateTime& dt); + uint8_t isrunning(void); + static DateTime now(); +}; + +// RTC using the internal millis() clock, has to be initialized before use +// NOTE: this clock won't be correct once the millis() timer rolls over (>49d?) +class RTC_Millis { +public: + static void begin(const DateTime& dt) { adjust(dt); } + static void adjust(const DateTime& dt); + static DateTime now(); + +protected: + static long offset; +}; diff --git a/books/pdummies/Libraries/RTClib/examples/datecalc/datecalc.pde b/books/pdummies/Libraries/RTClib/examples/datecalc/datecalc.pde new file mode 100755 index 0000000..98d992c --- /dev/null +++ b/books/pdummies/Libraries/RTClib/examples/datecalc/datecalc.pde @@ -0,0 +1,65 @@ +// Simple date conversions and calculations + +#include +#include "RTClib.h" + +void showDate(const char* txt, const DateTime& dt) { + Serial.print(txt); + Serial.print(' '); + Serial.print(dt.year(), DEC); + Serial.print('/'); + Serial.print(dt.month(), DEC); + Serial.print('/'); + Serial.print(dt.day(), DEC); + Serial.print(' '); + Serial.print(dt.hour(), DEC); + Serial.print(':'); + Serial.print(dt.minute(), DEC); + Serial.print(':'); + Serial.print(dt.second(), DEC); + + Serial.print(" = "); + Serial.print(dt.unixtime()); + Serial.print("s / "); + Serial.print(dt.unixtime() / 86400L); + Serial.print("d since 1970"); + + Serial.println(); +} + +void setup () { + Serial.begin(57600); + + DateTime dt0 (0, 1, 1, 0, 0, 0); + showDate("dt0", dt0); + + DateTime dt1 (1, 1, 1, 0, 0, 0); + showDate("dt1", dt1); + + DateTime dt2 (2009, 1, 1, 0, 0, 0); + showDate("dt2", dt2); + + DateTime dt3 (2009, 1, 2, 0, 0, 0); + showDate("dt3", dt3); + + DateTime dt4 (2009, 1, 27, 0, 0, 0); + showDate("dt4", dt4); + + DateTime dt5 (2009, 2, 27, 0, 0, 0); + showDate("dt5", dt5); + + DateTime dt6 (2009, 12, 27, 0, 0, 0); + showDate("dt6", dt6); + + DateTime dt7 (dt6.unixtime() + 3600); // one hour later + showDate("dt7", dt7); + + DateTime dt8 (dt6.unixtime() + 86400L); // one day later + showDate("dt8", dt8); + + DateTime dt9 (dt6.unixtime() + 7 * 86400L); // one week later + showDate("dt9", dt9); +} + +void loop () { +} diff --git a/books/pdummies/Libraries/RTClib/examples/ds1307/ds1307.pde b/books/pdummies/Libraries/RTClib/examples/ds1307/ds1307.pde new file mode 100755 index 0000000..8a31e68 --- /dev/null +++ b/books/pdummies/Libraries/RTClib/examples/ds1307/ds1307.pde @@ -0,0 +1,61 @@ +// Date and time functions using a DS1307 RTC connected via I2C and Wire lib + +#include +#include "RTClib.h" + +RTC_DS1307 RTC; + +void setup () { + Serial.begin(57600); + Wire.begin(); + RTC.begin(); + + if (! RTC.isrunning()) { + Serial.println("RTC is NOT running!"); + // following line sets the RTC to the date & time this sketch was compiled + RTC.adjust(DateTime(__DATE__, __TIME__)); + } +} + +void loop () { + DateTime now = RTC.now(); + + Serial.print(now.year(), DEC); + Serial.print('/'); + Serial.print(now.month(), DEC); + Serial.print('/'); + Serial.print(now.day(), DEC); + Serial.print(' '); + Serial.print(now.hour(), DEC); + Serial.print(':'); + Serial.print(now.minute(), DEC); + Serial.print(':'); + Serial.print(now.second(), DEC); + Serial.println(); + + Serial.print(" since midnight 1/1/1970 = "); + Serial.print(now.unixtime()); + Serial.print("s = "); + Serial.print(now.unixtime() / 86400L); + Serial.println("d"); + + // calculate a date which is 7 days and 30 seconds into the future + DateTime future (now.unixtime() + 7 * 86400L + 30); + + Serial.print(" now + 7d + 30s: "); + Serial.print(future.year(), DEC); + Serial.print('/'); + Serial.print(future.month(), DEC); + Serial.print('/'); + Serial.print(future.day(), DEC); + Serial.print(' '); + Serial.print(future.hour(), DEC); + Serial.print(':'); + Serial.print(future.minute(), DEC); + Serial.print(':'); + Serial.print(future.second(), DEC); + Serial.println(); + + Serial.println(); + delay(3000); +} diff --git a/books/pdummies/Libraries/RTClib/examples/softrtc/softrtc.pde b/books/pdummies/Libraries/RTClib/examples/softrtc/softrtc.pde new file mode 100755 index 0000000..48c717e --- /dev/null +++ b/books/pdummies/Libraries/RTClib/examples/softrtc/softrtc.pde @@ -0,0 +1,52 @@ +// Date and time functions using just software, based on millis() & timer + +#include +#include "RTClib.h" + +RTC_Millis RTC; + +void setup () { + Serial.begin(57600); + // following line sets the RTC to the date & time this sketch was compiled + RTC.begin(DateTime(__DATE__, __TIME__)); +} + +void loop () { + DateTime now = RTC.now(); + + Serial.print(now.year(), DEC); + Serial.print('/'); + Serial.print(now.month(), DEC); + Serial.print('/'); + Serial.print(now.day(), DEC); + Serial.print(' '); + Serial.print(now.hour(), DEC); + Serial.print(':'); + Serial.print(now.minute(), DEC); + Serial.print(':'); + Serial.print(now.second(), DEC); + Serial.println(); + + Serial.print(" seconds since 1970: "); + Serial.println(now.unixtime()); + + // calculate a date which is 7 days and 30 seconds into the future + DateTime future (now.unixtime() + 7 * 86400L + 30); + + Serial.print(" now + 7d + 30s: "); + Serial.print(future.year(), DEC); + Serial.print('/'); + Serial.print(future.month(), DEC); + Serial.print('/'); + Serial.print(future.day(), DEC); + Serial.print(' '); + Serial.print(future.hour(), DEC); + Serial.print(':'); + Serial.print(future.minute(), DEC); + Serial.print(':'); + Serial.print(future.second(), DEC); + Serial.println(); + + Serial.println(); + delay(3000); +} diff --git a/books/pdummies/Libraries/RTClib/keywords.txt b/books/pdummies/Libraries/RTClib/keywords.txt new file mode 100755 index 0000000..f0bdeac --- /dev/null +++ b/books/pdummies/Libraries/RTClib/keywords.txt @@ -0,0 +1,34 @@ +####################################### +# Syntax Coloring Map For RTC +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +DateTime KEYWORD1 +RTC_DS1307 KEYWORD1 +RTC_Millis KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +year KEYWORD2 +month KEYWORD2 +day KEYWORD2 +hour KEYWORD2 +minute KEYWORD2 +second KEYWORD2 +dayOfWeek KEYWORD2 +secondstime KEYWORD2 +unixtime KEYWORD2 +begin KEYWORD2 +adjust KEYWORD2 +isrunning KEYWORD2 +now KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/books/pdummies/Libraries/SD/File.cpp b/books/pdummies/Libraries/SD/File.cpp new file mode 100755 index 0000000..035480d --- /dev/null +++ b/books/pdummies/Libraries/SD/File.cpp @@ -0,0 +1,173 @@ +/* + + SD - a slightly more friendly wrapper for sdfatlib + + This library aims to expose a subset of SD card functionality + in the form of a higher level "wrapper" object. + + License: GNU General Public License V3 + (Because sdfatlib is licensed with this.) + + (C) Copyright 2010 SparkFun Electronics + + */ + +#include + +/* for debugging file open/close leaks + uint8_t nfilecount=0; +*/ + +File::File(SdFile f, char *n) { + // oh man you are kidding me, new() doesnt exist? Ok we do it by hand! + _file = (SdFile *)malloc(sizeof(SdFile)); + if (_file) { + memcpy(_file, &f, sizeof(SdFile)); + + strncpy(_name, n, 12); + _name[12] = 0; + + /* for debugging file open/close leaks + nfilecount++; + Serial.print("Created \""); + Serial.print(n); + Serial.print("\": "); + Serial.println(nfilecount, DEC); + */ + } +} + +File::File(void) { + _file = 0; + _name[0] = 0; + //Serial.print("Created empty file object"); +} + +File::~File(void) { + // Serial.print("Deleted file object"); +} + +// returns a pointer to the file name +char *File::name(void) { + return _name; +} + +// a directory is a special type of file +boolean File::isDirectory(void) { + return (_file && _file->isDir()); +} + + +#if ARDUINO >= 100 + +size_t File::write(uint8_t val) { + if (_file) + return _file->write(val); + else + return 0; +} + +size_t File::write(const char *str) { + if (_file) + return _file->write(str); + else + return 0; +} + +size_t File::write(const uint8_t *buf, size_t size) { + if (_file) + return _file->write(buf, size); + else + return 0; +} + +#else + +void File::write(uint8_t val) { + if (_file) + _file->write(val); +} + +void File::write(const char *str) { + if (_file) + _file->write(str); +} + +void File::write(const uint8_t *buf, size_t size) { + if (_file) + _file->write(buf, size); +} + +#endif // ARDUINO + +int File::peek() { + if (! _file) + return 0; + + int c = _file->read(); + if (c != -1) _file->seekCur(-1); + return c; +} + +int File::read() { + if (_file) + return _file->read(); + return -1; +} + +// buffered read for more efficient, high speed reading +int File::read(void *buf, uint16_t nbyte) { + if (_file) + return _file->read(buf, nbyte); + return 0; +} + +int File::available() { + if (! _file) return 0; + + uint32_t n = size() - position(); + + return n > 0X7FFF ? 0X7FFF : n; +} + +void File::flush() { + if (_file) + _file->sync(); +} + +boolean File::seek(uint32_t pos) { + if (! _file) return false; + + return _file->seekSet(pos); +} + +uint32_t File::position() { + if (! _file) return -1; + return _file->curPosition(); +} + +uint32_t File::size() { + if (! _file) return 0; + return _file->fileSize(); +} + +void File::close() { + if (_file) { + _file->close(); + free(_file); + _file = 0; + + /* for debugging file open/close leaks + nfilecount--; + Serial.print("Deleted "); + Serial.println(nfilecount, DEC); + */ + } +} + +File::operator bool() { + if (_file) + return _file->isOpen(); + return false; +} + diff --git a/books/pdummies/Libraries/SD/README.txt b/books/pdummies/Libraries/SD/README.txt new file mode 100755 index 0000000..495ea4c --- /dev/null +++ b/books/pdummies/Libraries/SD/README.txt @@ -0,0 +1,13 @@ + +** SD - a slightly more friendly wrapper for sdfatlib ** + +This library aims to expose a subset of SD card functionality in the +form of a higher level "wrapper" object. + +License: GNU General Public License V3 + (Because sdfatlib is licensed with this.) + +(C) Copyright 2010 SparkFun Electronics + +Now better than ever with optimization, multiple file support, directory handling, etc - ladyada! + diff --git a/books/pdummies/Libraries/SD/SD.cpp b/books/pdummies/Libraries/SD/SD.cpp new file mode 100755 index 0000000..ba2f454 --- /dev/null +++ b/books/pdummies/Libraries/SD/SD.cpp @@ -0,0 +1,620 @@ +/* + + SD - a slightly more friendly wrapper for sdfatlib + + This library aims to expose a subset of SD card functionality + in the form of a higher level "wrapper" object. + + License: GNU General Public License V3 + (Because sdfatlib is licensed with this.) + + (C) Copyright 2010 SparkFun Electronics + + + This library provides four key benefits: + + * Including `SD.h` automatically creates a global + `SD` object which can be interacted with in a similar + manner to other standard global objects like `Serial` and `Ethernet`. + + * Boilerplate initialisation code is contained in one method named + `begin` and no further objects need to be created in order to access + the SD card. + + * Calls to `open` can supply a full path name including parent + directories which simplifies interacting with files in subdirectories. + + * Utility methods are provided to determine whether a file exists + and to create a directory heirarchy. + + + Note however that not all functionality provided by the underlying + sdfatlib library is exposed. + + */ + +/* + + Implementation Notes + + In order to handle multi-directory path traversal, functionality that + requires this ability is implemented as callback functions. + + Individual methods call the `walkPath` function which performs the actual + directory traversal (swapping between two different directory/file handles + along the way) and at each level calls the supplied callback function. + + Some types of functionality will take an action at each level (e.g. exists + or make directory) which others will only take an action at the bottom + level (e.g. open). + + */ + +#include "SD.h" + +// Used by `getNextPathComponent` +#define MAX_COMPONENT_LEN 12 // What is max length? +#define PATH_COMPONENT_BUFFER_LEN MAX_COMPONENT_LEN+1 + +bool getNextPathComponent(char *path, unsigned int *p_offset, + char *buffer) { + /* + + Parse individual path components from a path. + + e.g. after repeated calls '/foo/bar/baz' will be split + into 'foo', 'bar', 'baz'. + + This is similar to `strtok()` but copies the component into the + supplied buffer rather than modifying the original string. + + + `buffer` needs to be PATH_COMPONENT_BUFFER_LEN in size. + + `p_offset` needs to point to an integer of the offset at + which the previous path component finished. + + Returns `true` if more components remain. + + Returns `false` if this is the last component. + (This means path ended with 'foo' or 'foo/'.) + + */ + + // TODO: Have buffer local to this function, so we know it's the + // correct length? + + int bufferOffset = 0; + + int offset = *p_offset; + + // Skip root or other separator + if (path[offset] == '/') { + offset++; + } + + // Copy the next next path segment + while (bufferOffset < MAX_COMPONENT_LEN + && (path[offset] != '/') + && (path[offset] != '\0')) { + buffer[bufferOffset++] = path[offset++]; + } + + buffer[bufferOffset] = '\0'; + + // Skip trailing separator so we can determine if this + // is the last component in the path or not. + if (path[offset] == '/') { + offset++; + } + + *p_offset = offset; + + return (path[offset] != '\0'); +} + + + +boolean walkPath(char *filepath, SdFile& parentDir, + boolean (*callback)(SdFile& parentDir, + char *filePathComponent, + boolean isLastComponent, + void *object), + void *object = NULL) { + /* + + When given a file path (and parent directory--normally root), + this function traverses the directories in the path and at each + level calls the supplied callback function while also providing + the supplied object for context if required. + + e.g. given the path '/foo/bar/baz' + the callback would be called at the equivalent of + '/foo', '/foo/bar' and '/foo/bar/baz'. + + The implementation swaps between two different directory/file + handles as it traverses the directories and does not use recursion + in an attempt to use memory efficiently. + + If a callback wishes to stop the directory traversal it should + return false--in this case the function will stop the traversal, + tidy up and return false. + + If a directory path doesn't exist at some point this function will + also return false and not subsequently call the callback. + + If a directory path specified is complete, valid and the callback + did not indicate the traversal should be interrupted then this + function will return true. + + */ + + + SdFile subfile1; + SdFile subfile2; + + char buffer[PATH_COMPONENT_BUFFER_LEN]; + + unsigned int offset = 0; + + SdFile *p_parent; + SdFile *p_child; + + SdFile *p_tmp_sdfile; + + p_child = &subfile1; + + p_parent = &parentDir; + + while (true) { + + boolean moreComponents = getNextPathComponent(filepath, &offset, buffer); + + boolean shouldContinue = callback((*p_parent), buffer, !moreComponents, object); + + if (!shouldContinue) { + // TODO: Don't repeat this code? + // If it's one we've created then we + // don't need the parent handle anymore. + if (p_parent != &parentDir) { + (*p_parent).close(); + } + return false; + } + + if (!moreComponents) { + break; + } + + boolean exists = (*p_child).open(*p_parent, buffer, O_RDONLY); + + // If it's one we've created then we + // don't need the parent handle anymore. + if (p_parent != &parentDir) { + (*p_parent).close(); + } + + // Handle case when it doesn't exist and we can't continue... + if (exists) { + // We alternate between two file handles as we go down + // the path. + if (p_parent == &parentDir) { + p_parent = &subfile2; + } + + p_tmp_sdfile = p_parent; + p_parent = p_child; + p_child = p_tmp_sdfile; + } else { + return false; + } + } + + if (p_parent != &parentDir) { + (*p_parent).close(); // TODO: Return/ handle different? + } + + return true; +} + + + +/* + + The callbacks used to implement various functionality follow. + + Each callback is supplied with a parent directory handle, + character string with the name of the current file path component, + a flag indicating if this component is the last in the path and + a pointer to an arbitrary object used for context. + + */ + +boolean callback_pathExists(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + /* + + Callback used to determine if a file/directory exists in parent + directory. + + Returns true if file path exists. + + */ + SdFile child; + + boolean exists = child.open(parentDir, filePathComponent, O_RDONLY); + + if (exists) { + child.close(); + } + + return exists; +} + + + +boolean callback_makeDirPath(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + /* + + Callback used to create a directory in the parent directory if + it does not already exist. + + Returns true if a directory was created or it already existed. + + */ + boolean result = false; + SdFile child; + + result = callback_pathExists(parentDir, filePathComponent, isLastComponent, object); + if (!result) { + result = child.makeDir(parentDir, filePathComponent); + } + + return result; +} + + + /* + +boolean callback_openPath(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + + Callback used to open a file specified by a filepath that may + specify one or more directories above it. + + Expects the context object to be an instance of `SDClass` and + will use the `file` property of the instance to open the requested + file/directory with the associated file open mode property. + + Always returns true if the directory traversal hasn't reached the + bottom of the directory heirarchy. + + Returns false once the file has been opened--to prevent the traversal + from descending further. (This may be unnecessary.) + + if (isLastComponent) { + SDClass *p_SD = static_cast(object); + p_SD->file.open(parentDir, filePathComponent, p_SD->fileOpenMode); + if (p_SD->fileOpenMode == FILE_WRITE) { + p_SD->file.seekSet(p_SD->file.fileSize()); + } + // TODO: Return file open result? + return false; + } + return true; +} + */ + + + +boolean callback_remove(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + if (isLastComponent) { + return SdFile::remove(parentDir, filePathComponent); + } + return true; +} + +boolean callback_rmdir(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + if (isLastComponent) { + SdFile f; + if (!f.open(parentDir, filePathComponent, O_READ)) return false; + return f.rmDir(); + } + return true; +} + + + +/* Implementation of class used to create `SDCard` object. */ + + + +boolean SDClass::begin(uint8_t csPin, int8_t mosi, int8_t miso, int8_t sck) { + /* + + Performs the initialisation required by the sdfatlib library. + + Return true if initialization succeeds, false otherwise. + + */ + return card.init(SPI_HALF_SPEED, csPin, mosi, miso, sck) && + volume.init(card) && + root.openRoot(volume); +} + + + +// this little helper is used to traverse paths +SdFile SDClass::getParentDir(char *filepath, int *index) { + // get parent directory + SdFile d1 = root; // start with the mostparent, root! + SdFile d2; + + // we'll use the pointers to swap between the two objects + SdFile *parent = &d1; + SdFile *subdir = &d2; + + char *origpath = filepath; + + while (strchr(filepath, '/')) { + + // get rid of leading /'s + if (filepath[0] == '/') { + filepath++; + continue; + } + + if (! strchr(filepath, '/')) { + // it was in the root directory, so leave now + break; + } + + // extract just the name of the next subdirectory + uint8_t idx = strchr(filepath, '/') - filepath; + if (idx > 12) + idx = 12; // dont let them specify long names + char subdirname[13]; + strncpy(subdirname, filepath, idx); + subdirname[idx] = 0; + + // close the subdir (we reuse them) if open + subdir->close(); + if (! subdir->open(parent, subdirname, O_READ)) { + // failed to open one of the subdirectories + return SdFile(); + } + // move forward to the next subdirectory + filepath += idx; + + // we reuse the objects, close it. + parent->close(); + + // swap the pointers + SdFile *t = parent; + parent = subdir; + subdir = t; + } + + *index = (int)(filepath - origpath); + // parent is now the parent diretory of the file! + return *parent; +} + + +File SDClass::open(char *filepath, uint8_t mode) { + /* + + Open the supplied file path for reading or writing. + + The file content can be accessed via the `file` property of + the `SDClass` object--this property is currently + a standard `SdFile` object from `sdfatlib`. + + Defaults to read only. + + If `write` is true, default action (when `append` is true) is to + append data to the end of the file. + + If `append` is false then the file will be truncated first. + + If the file does not exist and it is opened for writing the file + will be created. + + An attempt to open a file for reading that does not exist is an + error. + + */ + + int pathidx; + + // do the interative search + SdFile parentdir = getParentDir(filepath, &pathidx); + // no more subdirs! + + filepath += pathidx; + + if (! filepath[0]) { + // it was the directory itself! + return File(parentdir, "/"); + } + + // Open the file itself + SdFile file; + + // failed to open a subdir! + if (!parentdir.isOpen()) + return File(); + + // there is a special case for the Root directory since its a static dir + if (parentdir.isRoot()) { + if ( ! file.open(SD.root, filepath, mode)) { + // failed to open the file :( + return File(); + } + // dont close the root! + } else { + if ( ! file.open(parentdir, filepath, mode)) { + return File(); + } + // close the parent + parentdir.close(); + } + + if (mode & (O_APPEND | O_WRITE)) + file.seekSet(file.fileSize()); + return File(file, filepath); +} + + +/* +File SDClass::open(char *filepath, uint8_t mode) { + // + + Open the supplied file path for reading or writing. + + The file content can be accessed via the `file` property of + the `SDClass` object--this property is currently + a standard `SdFile` object from `sdfatlib`. + + Defaults to read only. + + If `write` is true, default action (when `append` is true) is to + append data to the end of the file. + + If `append` is false then the file will be truncated first. + + If the file does not exist and it is opened for writing the file + will be created. + + An attempt to open a file for reading that does not exist is an + error. + + // + + // TODO: Allow for read&write? (Possibly not, as it requires seek.) + + fileOpenMode = mode; + walkPath(filepath, root, callback_openPath, this); + + return File(); + +} +*/ + + +//boolean SDClass::close() { +// /* +// +// Closes the file opened by the `open` method. +// +// */ +// file.close(); +//} + + +boolean SDClass::exists(char *filepath) { + /* + + Returns true if the supplied file path exists. + + */ + return walkPath(filepath, root, callback_pathExists); +} + + +//boolean SDClass::exists(char *filepath, SdFile& parentDir) { +// /* +// +// Returns true if the supplied file path rooted at `parentDir` +// exists. +// +// */ +// return walkPath(filepath, parentDir, callback_pathExists); +//} + + +boolean SDClass::mkdir(char *filepath) { + /* + + Makes a single directory or a heirarchy of directories. + + A rough equivalent to `mkdir -p`. + + */ + return walkPath(filepath, root, callback_makeDirPath); +} + +boolean SDClass::rmdir(char *filepath) { + /* + + Makes a single directory or a heirarchy of directories. + + A rough equivalent to `mkdir -p`. + + */ + return walkPath(filepath, root, callback_rmdir); +} + +boolean SDClass::remove(char *filepath) { + return walkPath(filepath, root, callback_remove); +} + +void SDClass::enableCRC(boolean mode) { + card.enableCRC(mode); +} + + +// allows you to recurse into a directory +File File::openNextFile(uint8_t mode) { + dir_t p; + + //Serial.print("\t\treading dir..."); + while (_file->readDir(&p) > 0) { + + // done if past last used entry + if (p.name[0] == DIR_NAME_FREE) { + //Serial.println("end"); + return File(); + } + + // skip deleted entry and entries for . and .. + if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') { + //Serial.println("dots"); + continue; + } + + // only list subdirectories and files + if (!DIR_IS_FILE_OR_SUBDIR(&p)) { + //Serial.println("notafile"); + continue; + } + + // print file name with possible blank fill + SdFile f; + char name[13]; + _file->dirName(p, name); + //Serial.print("try to open file "); + //Serial.println(name); + + if (f.open(_file, name, mode)) { + //Serial.println("OK!"); + return File(f, name); + } else { + //Serial.println("ugh"); + return File(); + } + } + + //Serial.println("nothing"); + return File(); +} + +void File::rewindDirectory(void) { + if (isDirectory()) + _file->rewind(); +} + +SDClass SD; diff --git a/books/pdummies/Libraries/SD/SD.h b/books/pdummies/Libraries/SD/SD.h new file mode 100755 index 0000000..bb6226e --- /dev/null +++ b/books/pdummies/Libraries/SD/SD.h @@ -0,0 +1,114 @@ +/* + + SD - a slightly more friendly wrapper for sdfatlib + + This library aims to expose a subset of SD card functionality + in the form of a higher level "wrapper" object. + + License: GNU General Public License V3 + (Because sdfatlib is licensed with this.) + + (C) Copyright 2010 SparkFun Electronics + + */ + +#ifndef __SD_H__ +#define __SD_H__ + +#if ARDUINO >= 100 + #include "Arduino.h" +#else + #include "WProgram.h" +#endif + +#include +#include + +#define FILE_READ O_READ +#define FILE_WRITE (O_READ | O_WRITE | O_CREAT) + +class File : public Stream { + private: + char _name[13]; // our name + SdFile *_file; // underlying file pointer + +public: + File(SdFile f, char *name); // wraps an underlying SdFile + File(void); // 'empty' constructor + ~File(void); // destructor +#if ARDUINO >= 100 + virtual size_t write(uint8_t); + virtual size_t write(const char *str); + virtual size_t write(const uint8_t *buf, size_t size); +#else + virtual void write(uint8_t); + virtual void write(const char *str); + virtual void write(const uint8_t *buf, size_t size); +#endif + virtual int read(); + virtual int peek(); + virtual int available(); + virtual void flush(); + int read(void *buf, uint16_t nbyte); + boolean seek(uint32_t pos); + uint32_t position(); + uint32_t size(); + void close(); + operator bool(); + char * name(); + + boolean isDirectory(void); + File openNextFile(uint8_t mode = O_RDONLY); + void rewindDirectory(void); +}; + +class SDClass { + +private: + // These are required for initialisation and use of sdfatlib + Sd2Card card; + SdVolume volume; + SdFile root; + + // my quick&dirty iterator, should be replaced + SdFile getParentDir(char *filepath, int *indx); +public: + // This needs to be called to set up the connection to the SD card + // before other methods are used. + boolean begin(uint8_t csPin = SD_CHIP_SELECT_PIN, int8_t mosi = -1, int8_t miso = -1, int8_t sck = -1); + + // Open the specified file/directory with the supplied mode (e.g. read or + // write, etc). Returns a File object for interacting with the file. + // Note that currently only one file can be open at a time. + File open(char *filename, uint8_t mode = FILE_READ); + + // Methods to determine if the requested file path exists. + boolean exists(char *filepath); + + // Create the requested directory heirarchy--if intermediate directories + // do not exist they will be created. + boolean mkdir(char *filepath); + + // Delete the file. + boolean remove(char *filepath); + + boolean rmdir(char *filepath); + + void enableCRC(boolean mode); + +private: + + // This is used to determine the mode used to open a file + // it's here because it's the easiest place to pass the + // information through the directory walking function. But + // it's probably not the best place for it. + // It shouldn't be set directly--it is set via the parameters to `open`. + int fileOpenMode; + + friend class File; + friend boolean callback_openPath(SdFile&, char *, boolean, void *); +}; + +extern SDClass SD; + +#endif diff --git a/books/pdummies/Libraries/SD/examples/CardInfo/CardInfo.pde b/books/pdummies/Libraries/SD/examples/CardInfo/CardInfo.pde new file mode 100755 index 0000000..2a50f38 --- /dev/null +++ b/books/pdummies/Libraries/SD/examples/CardInfo/CardInfo.pde @@ -0,0 +1,113 @@ +/* + SD card test + + This example shows how use the utility libraries on which the' + SD library is based in order to get info about your SD card. + Very useful for testing a card when you're not sure whether its working or not. + + The circuit: + * SD card attached to SPI bus as follows: + ** UNO: MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed) + and pin #10 (SS) must be an output + ** Mega: MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed) + and pin #52 (SS) must be an output + ** Leonardo: Connect to hardware SPI via the ICSP header + Pin 4 used here for consistency with other Arduino examples + + + created 28 Mar 2011 by Limor Fried + modified 9 Apr 2012 by Tom Igoe + */ + // include the SD library: +#include + +// set up variables using the SD utility library functions: +Sd2Card card; +SdVolume volume; +SdFile root; + +// change this to match your SD shield or module; +// Arduino Ethernet shield: pin 4 +// Adafruit SD shields and modules: pin 10 +// Sparkfun SD shield: pin 8 +const int chipSelect = 4; + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for Leonardo only + } + + + Serial.print("\nInitializing SD card..."); + // On the Ethernet Shield, CS is pin 4. It's set as an output by default. + // Note that even if it's not used as the CS pin, the hardware SS pin + // (10 on most Arduino boards, 53 on the Mega) must be left as an output + // or the SD library functions will not work. + pinMode(SS, OUTPUT); + + + // we'll use the initialization code from the utility libraries + // since we're just testing if the card is working! + while (!card.init(SPI_HALF_SPEED, chipSelect)) { + Serial.println("initialization failed. Things to check:"); + Serial.println("* is a card is inserted?"); + Serial.println("* Is your wiring correct?"); + Serial.println("* did you change the chipSelect pin to match your shield or module?"); + } + + // print the type of card + Serial.print("\nCard type: "); + switch(card.type()) { + case SD_CARD_TYPE_SD1: + Serial.println("SD1"); + break; + case SD_CARD_TYPE_SD2: + Serial.println("SD2"); + break; + case SD_CARD_TYPE_SDHC: + Serial.println("SDHC"); + break; + default: + Serial.println("Unknown"); + } + + // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32 + if (!volume.init(card)) { + Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card"); + return; + } + + + // print the type and size of the first FAT-type volume + uint32_t volumesize; + Serial.print("\nVolume type is FAT"); + Serial.println(volume.fatType(), DEC); + Serial.println(); + + volumesize = volume.blocksPerCluster(); // clusters are collections of blocks + volumesize *= volume.clusterCount(); // we'll have a lot of clusters + volumesize *= 512; // SD card blocks are always 512 bytes + Serial.print("Volume size (bytes): "); + Serial.println(volumesize); + Serial.print("Volume size (Kbytes): "); + volumesize /= 1024; + Serial.println(volumesize); + Serial.print("Volume size (Mbytes): "); + volumesize /= 1024; + Serial.println(volumesize); + + + Serial.println("\nFiles found on the card (name, date and size in bytes): "); + root.openRoot(volume); + + // list all files in the card with date and size + root.ls(LS_R | LS_DATE | LS_SIZE); +} + + +void loop(void) { + +} diff --git a/books/pdummies/Libraries/SD/examples/Datalogger/Datalogger.pde b/books/pdummies/Libraries/SD/examples/Datalogger/Datalogger.pde new file mode 100755 index 0000000..83e1722 --- /dev/null +++ b/books/pdummies/Libraries/SD/examples/Datalogger/Datalogger.pde @@ -0,0 +1,102 @@ +/* + SD card datalogger + + This example shows how to log data from three analog sensors + to an SD card using the SD library. + + The circuit: + * SD card attached to SPI bus as follows: + ** UNO: MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed) + and pin #10 (SS) must be an output + ** Mega: MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed) + and pin #52 (SS) must be an output + ** Leonardo: Connect to hardware SPI via the ICSP header + Pin 4 used here for consistency with other Arduino examples + + created 24 Nov 2010 + modified 9 Apr 2012 by Tom Igoe + + This example code is in the public domain. + + */ + +#include + +// On the Ethernet Shield, CS is pin 4. Note that even if it's not +// used as the CS pin, the hardware CS pin (10 on most Arduino boards, +// 53 on the Mega) must be left as an output or the SD library +// functions will not work. +const int chipSelect = 4; + +File dataFile; + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for Leonardo only + } + + + Serial.print("Initializing SD card..."); + // make sure that the default chip select pin is set to + // output, even if you don't use it: + pinMode(SS, OUTPUT); + + // see if the card is present and can be initialized: + if (!SD.begin(chipSelect)) { + Serial.println("Card failed, or not present"); + // don't do anything more: + while (1) ; + } + Serial.println("card initialized."); + + // Open up the file we're going to log to! + dataFile = SD.open("datalog.txt", FILE_WRITE); + if (! dataFile) { + Serial.println("error opening datalog.txt"); + // Wait forever since we cant write data + while (1) ; + } +} + +void loop() +{ + // make a string for assembling the data to log: + String dataString = ""; + + // read three sensors and append to the string: + for (int analogPin = 0; analogPin < 3; analogPin++) { + int sensor = analogRead(analogPin); + dataString += String(sensor); + if (analogPin < 2) { + dataString += ","; + } + } + + dataFile.println(dataString); + + // print to the serial port too: + Serial.println(dataString); + + // The following line will 'save' the file to the SD card after every + // line of data - this will use more power and slow down how much data + // you can read but it's safer! + // If you want to speed up the system, remove the call to flush() and it + // will save the file only every 512 bytes - every time a sector on the + // SD card is filled with data. + dataFile.flush(); + + // Take 1 measurement every 500 milliseconds + delay(500); +} + + + + + + + + + diff --git a/books/pdummies/Libraries/SD/examples/DumpFile/DumpFile.pde b/books/pdummies/Libraries/SD/examples/DumpFile/DumpFile.pde new file mode 100755 index 0000000..ac633ce --- /dev/null +++ b/books/pdummies/Libraries/SD/examples/DumpFile/DumpFile.pde @@ -0,0 +1,72 @@ +/* + SD card file dump + + This example shows how to read a file from the SD card using the + SD library and send it over the serial port. + + The circuit: + * SD card attached to SPI bus as follows: + ** UNO: MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed) + and pin #10 (SS) must be an output + ** Mega: MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed) + and pin #52 (SS) must be an output + ** Leonardo: Connect to hardware SPI via the ICSP header + + created 22 December 2010 by Limor Fried + modified 9 Apr 2012 by Tom Igoe + + This example code is in the public domain. + + */ + +#include + +// change this to match your SD shield or module; +// Arduino Ethernet shield: pin 4 +// Adafruit SD shields and modules: pin 10 +// Sparkfun SD shield: pin 8 +const int chipSelect = 4; + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for Leonardo only + } + + + Serial.print("Initializing SD card..."); + // make sure that the default chip select pin is set to + // output, even if you don't use it: + pinMode(SS, OUTPUT); + + // see if the card is present and can be initialized: + if (!SD.begin(chipSelect)) { + Serial.println("Card failed, or not present"); + // don't do anything more: + return; + } + Serial.println("card initialized."); + + // open the file. note that only one file can be open at a time, + // so you have to close this one before opening another. + File dataFile = SD.open("datalog.txt"); + + // if the file is available, write to it: + if (dataFile) { + while (dataFile.available()) { + Serial.write(dataFile.read()); + } + dataFile.close(); + } + // if the file isn't open, pop up an error: + else { + Serial.println("error opening datalog.txt"); + } +} + +void loop() +{ +} + diff --git a/books/pdummies/Libraries/SD/examples/Files/Files.pde b/books/pdummies/Libraries/SD/examples/Files/Files.pde new file mode 100755 index 0000000..dbfa7a1 --- /dev/null +++ b/books/pdummies/Libraries/SD/examples/Files/Files.pde @@ -0,0 +1,91 @@ +/* + SD card basic file example + + This example shows how to create and destroy an SD card file + The circuit: + * SD card attached to SPI bus as follows: + ** UNO: MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed) + and pin #10 (SS) must be an output + ** Mega: MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed) + and pin #52 (SS) must be an output + ** Leonardo: Connect to hardware SPI via the ICSP header + + created Nov 2010 + by David A. Mellis + modified 9 Apr 2012 + by Tom Igoe + + This example code is in the public domain. + + */ +#include + +File myFile; + +// change this to match your SD shield or module; +// Arduino Ethernet shield: pin 4 +// Adafruit SD shields and modules: pin 10 +// Sparkfun SD shield: pin 8 +const int chipSelect = 4; + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for Leonardo only + } + + + Serial.print("Initializing SD card..."); + // On the Ethernet Shield, CS is pin 4. It's set as an output by default. + // Note that even if it's not used as the CS pin, the hardware SS pin + // (10 on most Arduino boards, 53 on the Mega) must be left as an output + // or the SD library functions will not work. + pinMode(SS, OUTPUT); + + if (!SD.begin(chipSelect)) { + Serial.println("initialization failed!"); + return; + } + Serial.println("initialization done."); + + if (SD.exists("example.txt")) { + Serial.println("example.txt exists."); + } + else { + Serial.println("example.txt doesn't exist."); + } + + // open a new file and immediately close it: + Serial.println("Creating example.txt..."); + myFile = SD.open("example.txt", FILE_WRITE); + myFile.close(); + + // Check to see if the file exists: + if (SD.exists("example.txt")) { + Serial.println("example.txt exists."); + } + else { + Serial.println("example.txt doesn't exist."); + } + + // delete the file: + Serial.println("Removing example.txt..."); + SD.remove("example.txt"); + + if (SD.exists("example.txt")){ + Serial.println("example.txt exists."); + } + else { + Serial.println("example.txt doesn't exist."); + } +} + +void loop() +{ + // nothing happens after setup finishes. +} + + + diff --git a/books/pdummies/Libraries/SD/examples/ReadWrite/ReadWrite.pde b/books/pdummies/Libraries/SD/examples/ReadWrite/ReadWrite.pde new file mode 100755 index 0000000..2ea8428 --- /dev/null +++ b/books/pdummies/Libraries/SD/examples/ReadWrite/ReadWrite.pde @@ -0,0 +1,91 @@ +/* + SD card read/write + + This example shows how to read and write data to and from an SD card file + The circuit: + * SD card attached to SPI bus as follows: + ** UNO: MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed) + and pin #10 (SS) must be an output + ** Mega: MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed) + and pin #52 (SS) must be an output + ** Leonardo: Connect to hardware SPI via the ICSP header + + + created Nov 2010 by David A. Mellis + modified 9 Apr 2012 by Tom Igoe + + This example code is in the public domain. + + */ + +#include + +File myFile; + +// change this to match your SD shield or module; +// Arduino Ethernet shield: pin 4 +// Adafruit SD shields and modules: pin 10 +// Sparkfun SD shield: pin 8 +const int chipSelect = 4; + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for Leonardo only + } + + + Serial.print("Initializing SD card..."); + // On the Ethernet Shield, CS is pin 4. It's set as an output by default. + // Note that even if it's not used as the CS pin, the hardware SS pin + // (10 on most Arduino boards, 53 on the Mega) must be left as an output + // or the SD library functions will not work. + pinMode(SS, OUTPUT); + + if (!SD.begin(chipSelect)) { + Serial.println("initialization failed!"); + return; + } + Serial.println("initialization done."); + + // open the file. note that only one file can be open at a time, + // so you have to close this one before opening another. + myFile = SD.open("test.txt", FILE_WRITE); + + // if the file opened okay, write to it: + if (myFile) { + Serial.print("Writing to test.txt..."); + myFile.println("testing 1, 2, 3."); + // close the file: + myFile.close(); + Serial.println("done."); + } else { + // if the file didn't open, print an error: + Serial.println("error opening test.txt"); + } + + // re-open the file for reading: + myFile = SD.open("test.txt"); + if (myFile) { + Serial.println("test.txt:"); + + // read from the file until there's nothing else in it: + while (myFile.available()) { + Serial.write(myFile.read()); + } + // close the file: + myFile.close(); + } else { + // if the file didn't open, print an error: + Serial.println("error opening test.txt"); + } +} + +void loop() +{ + // nothing happens after setup +} + + diff --git a/books/pdummies/Libraries/SD/examples/listfiles/listfiles.pde b/books/pdummies/Libraries/SD/examples/listfiles/listfiles.pde new file mode 100755 index 0000000..fcaa029 --- /dev/null +++ b/books/pdummies/Libraries/SD/examples/listfiles/listfiles.pde @@ -0,0 +1,94 @@ +/* + SD card basic file example + + This example shows how to create and destroy an SD card file + The circuit: + * SD card attached to SPI bus as follows: + ** UNO: MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed) + and pin #10 (SS) must be an output + ** Mega: MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed) + and pin #52 (SS) must be an output + ** Leonardo: Connect to hardware SPI via the ICSP header + + created Nov 2010 by David A. Mellis + modified 9 Apr 2012 by Tom Igoe + modified 13 June 2012 by Limor Fried + + This example code is in the public domain. + + */ +#include + +File root; + +// change this to match your SD shield or module; +// Arduino Ethernet shield: pin 4 +// Adafruit SD shields and modules: pin 10 +// Sparkfun SD shield: pin 8 +const int chipSelect = 4; + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for Leonardo only + } + + + Serial.print("Initializing SD card..."); + // On the Ethernet Shield, CS is pin 4. It's set as an output by default. + // Note that even if it's not used as the CS pin, the hardware SS pin + // (10 on Arduino Uno boards, 53 on the Mega) must be left as an output + // or the SD library functions will not work. + pinMode(SS, OUTPUT); + + if (!SD.begin(chipSelect)) { + Serial.println("initialization failed!"); + return; + } + Serial.println("initialization done."); + + root = SD.open("/"); + + printDirectory(root, 0); + + Serial.println("done!"); +} + +void loop() +{ + // nothing happens after setup finishes. +} + +void printDirectory(File dir, int numTabs) { + // Begin at the start of the directory + dir.rewindDirectory(); + + while(true) { + File entry = dir.openNextFile(); + if (! entry) { + // no more files + //Serial.println("**nomorefiles**"); + break; + } + for (uint8_t i=0; i. + */ +#ifndef FatStructs_h +#define FatStructs_h +/** + * \file + * FAT file structures + */ +/* + * mostly from Microsoft document fatgen103.doc + * http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + */ +//------------------------------------------------------------------------------ +/** Value for byte 510 of boot block or MBR */ +uint8_t const BOOTSIG0 = 0X55; +/** Value for byte 511 of boot block or MBR */ +uint8_t const BOOTSIG1 = 0XAA; +//------------------------------------------------------------------------------ +/** + * \struct partitionTable + * \brief MBR partition table entry + * + * A partition table entry for a MBR formatted storage device. + * The MBR partition table has four entries. + */ +struct partitionTable { + /** + * Boot Indicator . Indicates whether the volume is the active + * partition. Legal values include: 0X00. Do not use for booting. + * 0X80 Active partition. + */ + uint8_t boot; + /** + * Head part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t beginHead; + /** + * Sector part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned beginSector : 6; + /** High bits cylinder for first block in partition. */ + unsigned beginCylinderHigh : 2; + /** + * Combine beginCylinderLow with beginCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t beginCylinderLow; + /** + * Partition type. See defines that begin with PART_TYPE_ for + * some Microsoft partition types. + */ + uint8_t type; + /** + * head part of cylinder-head-sector address of the last sector in the + * partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t endHead; + /** + * Sector part of cylinder-head-sector address of the last sector in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned endSector : 6; + /** High bits of end cylinder */ + unsigned endCylinderHigh : 2; + /** + * Combine endCylinderLow with endCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t endCylinderLow; + /** Logical block address of the first block in the partition. */ + uint32_t firstSector; + /** Length of the partition, in blocks. */ + uint32_t totalSectors; +}; +/** Type name for partitionTable */ +typedef struct partitionTable part_t; +//------------------------------------------------------------------------------ +/** + * \struct masterBootRecord + * + * \brief Master Boot Record + * + * The first block of a storage device that is formatted with a MBR. + */ +struct masterBootRecord { + /** Code Area for master boot program. */ + uint8_t codeArea[440]; + /** Optional WindowsNT disk signature. May contain more boot code. */ + uint32_t diskSignature; + /** Usually zero but may be more boot code. */ + uint16_t usuallyZero; + /** Partition tables. */ + part_t part[4]; + /** First MBR signature byte. Must be 0X55 */ + uint8_t mbrSig0; + /** Second MBR signature byte. Must be 0XAA */ + uint8_t mbrSig1; +}; +/** Type name for masterBootRecord */ +typedef struct masterBootRecord mbr_t; +//------------------------------------------------------------------------------ +/** + * \struct biosParmBlock + * + * \brief BIOS parameter block + * + * The BIOS parameter block describes the physical layout of a FAT volume. + */ +struct biosParmBlock { + /** + * Count of bytes per sector. This value may take on only the + * following values: 512, 1024, 2048 or 4096 + */ + uint16_t bytesPerSector; + /** + * Number of sectors per allocation unit. This value must be a + * power of 2 that is greater than 0. The legal values are + * 1, 2, 4, 8, 16, 32, 64, and 128. + */ + uint8_t sectorsPerCluster; + /** + * Number of sectors before the first FAT. + * This value must not be zero. + */ + uint16_t reservedSectorCount; + /** The count of FAT data structures on the volume. This field should + * always contain the value 2 for any FAT volume of any type. + */ + uint8_t fatCount; + /** + * For FAT12 and FAT16 volumes, this field contains the count of + * 32-byte directory entries in the root directory. For FAT32 volumes, + * this field must be set to 0. For FAT12 and FAT16 volumes, this + * value should always specify a count that when multiplied by 32 + * results in a multiple of bytesPerSector. FAT16 volumes should + * use the value 512. + */ + uint16_t rootDirEntryCount; + /** + * This field is the old 16-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then totalSectors32 + * must be non-zero. For FAT32 volumes, this field must be 0. For + * FAT12 and FAT16 volumes, this field contains the sector count, and + * totalSectors32 is 0 if the total sector count fits + * (is less than 0x10000). + */ + uint16_t totalSectors16; + /** + * This dates back to the old MS-DOS 1.x media determination and is + * no longer usually used for anything. 0xF8 is the standard value + * for fixed (non-removable) media. For removable media, 0xF0 is + * frequently used. Legal values are 0xF0 or 0xF8-0xFF. + */ + uint8_t mediaType; + /** + * Count of sectors occupied by one FAT on FAT12/FAT16 volumes. + * On FAT32 volumes this field must be 0, and sectorsPerFat32 + * contains the FAT size count. + */ + uint16_t sectorsPerFat16; + /** Sectors per track for interrupt 0x13. Not used otherwise. */ + uint16_t sectorsPerTrtack; + /** Number of heads for interrupt 0x13. Not used otherwise. */ + uint16_t headCount; + /** + * Count of hidden sectors preceding the partition that contains this + * FAT volume. This field is generally only relevant for media + * visible on interrupt 0x13. + */ + uint32_t hidddenSectors; + /** + * This field is the new 32-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then + * totalSectors16 must be non-zero. + */ + uint32_t totalSectors32; + /** + * Count of sectors occupied by one FAT on FAT32 volumes. + */ + uint32_t sectorsPerFat32; + /** + * This field is only defined for FAT32 media and does not exist on + * FAT12 and FAT16 media. + * Bits 0-3 -- Zero-based number of active FAT. + * Only valid if mirroring is disabled. + * Bits 4-6 -- Reserved. + * Bit 7 -- 0 means the FAT is mirrored at runtime into all FATs. + * -- 1 means only one FAT is active; it is the one referenced in bits 0-3. + * Bits 8-15 -- Reserved. + */ + uint16_t fat32Flags; + /** + * FAT32 version. High byte is major revision number. + * Low byte is minor revision number. Only 0.0 define. + */ + uint16_t fat32Version; + /** + * Cluster number of the first cluster of the root directory for FAT32. + * This usually 2 but not required to be 2. + */ + uint32_t fat32RootCluster; + /** + * Sector number of FSINFO structure in the reserved area of the + * FAT32 volume. Usually 1. + */ + uint16_t fat32FSInfo; + /** + * If non-zero, indicates the sector number in the reserved area + * of the volume of a copy of the boot record. Usually 6. + * No value other than 6 is recommended. + */ + uint16_t fat32BackBootBlock; + /** + * Reserved for future expansion. Code that formats FAT32 volumes + * should always set all of the bytes of this field to 0. + */ + uint8_t fat32Reserved[12]; +}; +/** Type name for biosParmBlock */ +typedef struct biosParmBlock bpb_t; +//------------------------------------------------------------------------------ +/** + * \struct fat32BootSector + * + * \brief Boot sector for a FAT16 or FAT32 volume. + * + */ +struct fat32BootSector { + /** X86 jmp to boot program */ + uint8_t jmpToBootCode[3]; + /** informational only - don't depend on it */ + char oemName[8]; + /** BIOS Parameter Block */ + bpb_t bpb; + /** for int0x13 use value 0X80 for hard drive */ + uint8_t driveNumber; + /** used by Windows NT - should be zero for FAT */ + uint8_t reserved1; + /** 0X29 if next three fields are valid */ + uint8_t bootSignature; + /** usually generated by combining date and time */ + uint32_t volumeSerialNumber; + /** should match volume label in root dir */ + char volumeLabel[11]; + /** informational only - don't depend on it */ + char fileSystemType[8]; + /** X86 boot code */ + uint8_t bootCode[420]; + /** must be 0X55 */ + uint8_t bootSectorSig0; + /** must be 0XAA */ + uint8_t bootSectorSig1; +}; +//------------------------------------------------------------------------------ +// End Of Chain values for FAT entries +/** FAT16 end of chain value used by Microsoft. */ +uint16_t const FAT16EOC = 0XFFFF; +/** Minimum value for FAT16 EOC. Use to test for EOC. */ +uint16_t const FAT16EOC_MIN = 0XFFF8; +/** FAT32 end of chain value used by Microsoft. */ +uint32_t const FAT32EOC = 0X0FFFFFFF; +/** Minimum value for FAT32 EOC. Use to test for EOC. */ +uint32_t const FAT32EOC_MIN = 0X0FFFFFF8; +/** Mask a for FAT32 entry. Entries are 28 bits. */ +uint32_t const FAT32MASK = 0X0FFFFFFF; + +/** Type name for fat32BootSector */ +typedef struct fat32BootSector fbs_t; +//------------------------------------------------------------------------------ +/** + * \struct directoryEntry + * \brief FAT short directory entry + * + * Short means short 8.3 name, not the entry size. + * + * Date Format. A FAT directory entry date stamp is a 16-bit field that is + * basically a date relative to the MS-DOS epoch of 01/01/1980. Here is the + * format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the + * 16-bit word): + * + * Bits 9-15: Count of years from 1980, valid value range 0-127 + * inclusive (1980-2107). + * + * Bits 5-8: Month of year, 1 = January, valid value range 1-12 inclusive. + * + * Bits 0-4: Day of month, valid value range 1-31 inclusive. + * + * Time Format. A FAT directory entry time stamp is a 16-bit field that has + * a granularity of 2 seconds. Here is the format (bit 0 is the LSB of the + * 16-bit word, bit 15 is the MSB of the 16-bit word). + * + * Bits 11-15: Hours, valid value range 0-23 inclusive. + * + * Bits 5-10: Minutes, valid value range 0-59 inclusive. + * + * Bits 0-4: 2-second count, valid value range 0-29 inclusive (0 - 58 seconds). + * + * The valid time range is from Midnight 00:00:00 to 23:59:58. + */ +struct directoryEntry { + /** + * Short 8.3 name. + * The first eight bytes contain the file name with blank fill. + * The last three bytes contain the file extension with blank fill. + */ + uint8_t name[11]; + /** Entry attributes. + * + * The upper two bits of the attribute byte are reserved and should + * always be set to 0 when a file is created and never modified or + * looked at after that. See defines that begin with DIR_ATT_. + */ + uint8_t attributes; + /** + * Reserved for use by Windows NT. Set value to 0 when a file is + * created and never modify or look at it after that. + */ + uint8_t reservedNT; + /** + * The granularity of the seconds part of creationTime is 2 seconds + * so this field is a count of tenths of a second and its valid + * value range is 0-199 inclusive. (WHG note - seems to be hundredths) + */ + uint8_t creationTimeTenths; + /** Time file was created. */ + uint16_t creationTime; + /** Date file was created. */ + uint16_t creationDate; + /** + * Last access date. Note that there is no last access time, only + * a date. This is the date of last read or write. In the case of + * a write, this should be set to the same date as lastWriteDate. + */ + uint16_t lastAccessDate; + /** + * High word of this entry's first cluster number (always 0 for a + * FAT12 or FAT16 volume). + */ + uint16_t firstClusterHigh; + /** Time of last write. File creation is considered a write. */ + uint16_t lastWriteTime; + /** Date of last write. File creation is considered a write. */ + uint16_t lastWriteDate; + /** Low word of this entry's first cluster number. */ + uint16_t firstClusterLow; + /** 32-bit unsigned holding this file's size in bytes. */ + uint32_t fileSize; +}; +//------------------------------------------------------------------------------ +// Definitions for directory entries +// +/** Type name for directoryEntry */ +typedef struct directoryEntry dir_t; +/** escape for name[0] = 0XE5 */ +uint8_t const DIR_NAME_0XE5 = 0X05; +/** name[0] value for entry that is free after being "deleted" */ +uint8_t const DIR_NAME_DELETED = 0XE5; +/** name[0] value for entry that is free and no allocated entries follow */ +uint8_t const DIR_NAME_FREE = 0X00; +/** file is read-only */ +uint8_t const DIR_ATT_READ_ONLY = 0X01; +/** File should hidden in directory listings */ +uint8_t const DIR_ATT_HIDDEN = 0X02; +/** Entry is for a system file */ +uint8_t const DIR_ATT_SYSTEM = 0X04; +/** Directory entry contains the volume label */ +uint8_t const DIR_ATT_VOLUME_ID = 0X08; +/** Entry is for a directory */ +uint8_t const DIR_ATT_DIRECTORY = 0X10; +/** Old DOS archive bit for backup support */ +uint8_t const DIR_ATT_ARCHIVE = 0X20; +/** Test value for long name entry. Test is + (d->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME. */ +uint8_t const DIR_ATT_LONG_NAME = 0X0F; +/** Test mask for long name entry */ +uint8_t const DIR_ATT_LONG_NAME_MASK = 0X3F; +/** defined attribute bits */ +uint8_t const DIR_ATT_DEFINED_BITS = 0X3F; +/** Directory entry is part of a long name */ +static inline uint8_t DIR_IS_LONG_NAME(const dir_t* dir) { + return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; +} +/** Mask for file/subdirectory tests */ +uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); +/** Directory entry is for a file */ +static inline uint8_t DIR_IS_FILE(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; +} +/** Directory entry is for a subdirectory */ +static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; +} +/** Directory entry is for a file or subdirectory */ +static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; +} +#endif // FatStructs_h diff --git a/books/pdummies/Libraries/SD/utility/Sd2Card.cpp b/books/pdummies/Libraries/SD/utility/Sd2Card.cpp new file mode 100755 index 0000000..5272bc2 --- /dev/null +++ b/books/pdummies/Libraries/SD/utility/Sd2Card.cpp @@ -0,0 +1,747 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#if ARDUINO >= 100 + #include "Arduino.h" +#else + #include "WProgram.h" +#endif +#include "Sd2Card.h" +//------------------------------------------------------------------------------ + +static int8_t mosiPin_, misoPin_, clockPin_; +static volatile uint8_t *mosiport, *clkport, *misoport; +static uint8_t mosipinmask, clkpinmask, misopinmask; + +//------------------------------------------------------------------------------ +/** nop to tune soft SPI timing */ +#define nop asm volatile ("nop\n\t") + +#ifndef SOFTWARE_SPI +// functions for hardware SPI +/** Send a byte to the card */ +static void spiSend(uint8_t data) { + if (clockPin_ == -1) { + SPDR = data; + while (!(SPSR & (1 << SPIF))); + } else { + cli(); + // Fast SPI bitbang swiped from LPD8806 library + for (uint8_t i = 0; i < 8; i++) { + *clkport &= ~clkpinmask; + if (data & 0x80) + *mosiport |= mosipinmask; + else + *mosiport &= ~mosipinmask; + *clkport |= clkpinmask; + data <<= 1; + } + nop;nop;nop;nop; + *clkport &= ~clkpinmask; + + sei(); + } +} + +/** Receive a byte from the card */ +static uint8_t spiRec(void) { + if (clockPin_ == -1) { + spiSend(0XFF); + return SPDR; + } else { + uint8_t data = 0; + // no interrupts during byte receive - about 8 us + cli(); + // output pin high - like sending 0XFF + *mosiport |= mosipinmask; + + for (uint8_t i = 0; i < 8; i++) { + *clkport |= clkpinmask; + data <<= 1; + + //if (fastDigitalRead(SPI_MISO_PIN)) data |= 1; + if ((*misoport) & misopinmask) data |= 1; + + *clkport &= ~clkpinmask; + + // adjust so SCK is nice + nop; + nop; + } + // enable interrupts + sei(); + return data; + } +} + + +#else // SOFTWARE_SPI + +//------------------------------------------------------------------------------ +/** Soft SPI receive */ +uint8_t spiRec(void) { + uint8_t data = 0; + // no interrupts during byte receive - about 8 us + cli(); + // output pin high - like sending 0XFF + fastDigitalWrite(SPI_MOSI_PIN, HIGH); + + for (uint8_t i = 0; i < 8; i++) { + fastDigitalWrite(SPI_SCK_PIN, HIGH); + + // adjust so SCK is nice + nop; + nop; + + data <<= 1; + + if (fastDigitalRead(SPI_MISO_PIN)) data |= 1; + + fastDigitalWrite(SPI_SCK_PIN, LOW); + } + // enable interrupts + sei(); + return data; +} +//------------------------------------------------------------------------------ +/** Soft SPI send */ +void spiSend(uint8_t data) { + // no interrupts during byte send - about 8 us + cli(); + for (uint8_t i = 0; i < 8; i++) { + fastDigitalWrite(SPI_SCK_PIN, LOW); + + fastDigitalWrite(SPI_MOSI_PIN, data & 0X80); + + data <<= 1; + + fastDigitalWrite(SPI_SCK_PIN, HIGH); + } + // hold SCK high for a few ns + nop; + nop; + nop; + nop; + + fastDigitalWrite(SPI_SCK_PIN, LOW); + // enable interrupts + sei(); +} +#endif // SOFTWARE_SPI +//------------------------------------------------------------------------------ +// send command and return error code. Return zero for OK +uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { + // end read if in partialBlockRead mode + readEnd(); + + // select card + chipSelectLow(); + + // wait up to 300 ms if busy + waitNotBusy(300); + + // send command + spiSend(cmd | 0x40); + + // send argument + for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); + + // send CRC + uint8_t crc = 0XFF; + if (cmd == CMD0) crc = 0X95; // correct crc for CMD0 with arg 0 + if (cmd == CMD8) crc = 0X87; // correct crc for CMD8 with arg 0X1AA + spiSend(crc); + + // wait for response + for (uint8_t i = 0; ((status_ = spiRec()) & 0X80) && i != 0XFF; i++); + return status_; +} +//------------------------------------------------------------------------------ +/** + * Determine the size of an SD flash memory card. + * + * \return The number of 512 byte data blocks in the card + * or zero if an error occurs. + */ +uint32_t Sd2Card::cardSize(void) { + csd_t csd; + if (!readCSD(&csd)) return 0; + if (csd.v1.csd_ver == 0) { + uint8_t read_bl_len = csd.v1.read_bl_len; + uint16_t c_size = (csd.v1.c_size_high << 10) + | (csd.v1.c_size_mid << 2) | csd.v1.c_size_low; + uint8_t c_size_mult = (csd.v1.c_size_mult_high << 1) + | csd.v1.c_size_mult_low; + return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); + } else if (csd.v2.csd_ver == 1) { + uint32_t c_size = ((uint32_t)csd.v2.c_size_high << 16) + | (csd.v2.c_size_mid << 8) | csd.v2.c_size_low; + return (c_size + 1) << 10; + } else { + error(SD_CARD_ERROR_BAD_CSD); + return 0; + } +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectHigh(void) { + digitalWrite(chipSelectPin_, HIGH); +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectLow(void) { + digitalWrite(chipSelectPin_, LOW); +} +//------------------------------------------------------------------------------ +/** Erase a range of blocks. + * + * \param[in] firstBlock The address of the first block in the range. + * \param[in] lastBlock The address of the last block in the range. + * + * \note This function requests the SD card to do a flash erase for a + * range of blocks. The data on the card after an erase operation is + * either 0 or 1, depends on the card vendor. The card must support + * single block erase. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { + if (!eraseSingleBlockEnable()) { + error(SD_CARD_ERROR_ERASE_SINGLE_BLOCK); + goto fail; + } + if (type_ != SD_CARD_TYPE_SDHC) { + firstBlock <<= 9; + lastBlock <<= 9; + } + if (cardCommand(CMD32, firstBlock) + || cardCommand(CMD33, lastBlock) + || cardCommand(CMD38, 0)) { + error(SD_CARD_ERROR_ERASE); + goto fail; + } + if (!waitNotBusy(SD_ERASE_TIMEOUT)) { + error(SD_CARD_ERROR_ERASE_TIMEOUT); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Determine if card supports single block erase. + * + * \return The value one, true, is returned if single block erase is supported. + * The value zero, false, is returned if single block erase is not supported. + */ +uint8_t Sd2Card::eraseSingleBlockEnable(void) { + csd_t csd; + return readCSD(&csd) ? csd.v1.erase_blk_en : 0; +} +//------------------------------------------------------------------------------ +/** + * Initialize an SD flash memory card. + * + * \param[in] sckRateID SPI clock rate selector. See setSckRate(). + * \param[in] chipSelectPin SD chip select pin number. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. The reason for failure + * can be determined by calling errorCode() and errorData(). + */ +uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin, int8_t mosiPin, int8_t misoPin, int8_t clockPin) { + + writeCRC_ = errorCode_ = inBlock_ = partialBlockRead_ = type_ = 0; + chipSelectPin_ = chipSelectPin; + mosiPin_ = mosiPin; + misoPin_ = misoPin; + clockPin_ = clockPin; + // 16-bit init start time allows over a minute + uint16_t t0 = (uint16_t)millis(); + uint32_t arg; + + // set pin modes + pinMode(chipSelectPin_, OUTPUT); + chipSelectHigh(); + + if (clockPin != -1) { + // use slow bitbang mode + pinMode(misoPin_, INPUT); + pinMode(mosiPin_, OUTPUT); + pinMode(clockPin_, OUTPUT); + clkport = portOutputRegister(digitalPinToPort(clockPin_)); + clkpinmask = digitalPinToBitMask(clockPin_); + mosiport = portOutputRegister(digitalPinToPort(mosiPin_)); + mosipinmask = digitalPinToBitMask(mosiPin_); + misoport = portInputRegister(digitalPinToPort(misoPin_)); + misopinmask = digitalPinToBitMask(misoPin_); + } else { + pinMode(SPI_MISO_PIN, INPUT); + pinMode(SPI_MOSI_PIN, OUTPUT); + pinMode(SPI_SCK_PIN, OUTPUT); + +#ifndef SOFTWARE_SPI + // SS must be in output mode even it is not chip select + pinMode(SS_PIN, OUTPUT); + digitalWrite(SS_PIN, HIGH); // disable any SPI device using hardware SS pin + // Enable SPI, Master, clock rate f_osc/128 + SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); + // clear double speed + SPSR &= ~(1 << SPI2X); +#endif // SOFTWARE_SPI + } + + // must supply min of 74 clock cycles with CS high. + for (uint8_t i = 0; i < 10; i++) spiSend(0XFF); + + chipSelectLow(); + + // command to go idle in SPI mode + while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_CMD0); + goto fail; + } + } + // check SD version + if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { + type(SD_CARD_TYPE_SD1); + } else { + // only need last byte of r7 response + for (uint8_t i = 0; i < 4; i++) status_ = spiRec(); + if (status_ != 0XAA) { + error(SD_CARD_ERROR_CMD8); + goto fail; + } + type(SD_CARD_TYPE_SD2); + } + // initialize card and send host supports SDHC if SD2 + arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; + + while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) { + // check for timeout + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_ACMD41); + goto fail; + } + } + // if SD2 read OCR register to check for SDHC card + if (type() == SD_CARD_TYPE_SD2) { + if (cardCommand(CMD58, 0)) { + error(SD_CARD_ERROR_CMD58); + goto fail; + } + if ((spiRec() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC); + // discard rest of ocr - contains allowed voltage range + for (uint8_t i = 0; i < 3; i++) spiRec(); + } + chipSelectHigh(); + +#ifndef SOFTWARE_SPI + if (clockPin_ == -1) + return setSckRate(sckRateID); + else + return true; +#else // SOFTWARE_SPI + return true; +#endif // SOFTWARE_SPI + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Enable or disable partial block reads. + * + * Enabling partial block reads improves performance by allowing a block + * to be read over the SPI bus as several sub-blocks. Errors may occur + * if the time between reads is too long since the SD card may timeout. + * The SPI SS line will be held low until the entire block is read or + * readEnd() is called. + * + * Use this for applications like the Adafruit Wave Shield. + * + * \param[in] value The value TRUE (non-zero) or FALSE (zero).) + */ +void Sd2Card::partialBlockRead(uint8_t value) { + readEnd(); + partialBlockRead_ = value; +} +//------------------------------------------------------------------------------ +/** + * Read a 512 byte block from an SD card device. + * + * \param[in] block Logical block to be read. + * \param[out] dst Pointer to the location that will receive the data. + + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::readBlock(uint32_t block, uint8_t* dst) { + return readData(block, 0, 512, dst); +} +//------------------------------------------------------------------------------ +/** + * Read part of a 512 byte block from an SD card. + * + * \param[in] block Logical block to be read. + * \param[in] offset Number of bytes to skip at start of block + * \param[out] dst Pointer to the location that will receive the data. + * \param[in] count Number of bytes to read + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::readData(uint32_t block, + uint16_t offset, uint16_t count, uint8_t* dst) { + uint16_t n; + if (count == 0) return true; + if ((count + offset) > 512) { + goto fail; + } + if (!inBlock_ || block != block_ || offset < offset_) { + block_ = block; + // use address if not SDHC card + if (type()!= SD_CARD_TYPE_SDHC) block <<= 9; + if (cardCommand(CMD17, block)) { + error(SD_CARD_ERROR_CMD17); + goto fail; + } + if (!waitStartBlock()) { + goto fail; + } + offset_ = 0; + inBlock_ = 1; + } + +#ifdef OPTIMIZE_HARDWARE_SPI + // start first spi transfer + SPDR = 0XFF; + + // skip data before offset + for (;offset_ < offset; offset_++) { + while (!(SPSR & (1 << SPIF))); + SPDR = 0XFF; + } + // transfer data + n = count - 1; + for (uint16_t i = 0; i < n; i++) { + while (!(SPSR & (1 << SPIF))); + dst[i] = SPDR; + SPDR = 0XFF; + } + // wait for last byte + while (!(SPSR & (1 << SPIF))); + dst[n] = SPDR; + +#else // OPTIMIZE_HARDWARE_SPI + + // skip data before offset + for (;offset_ < offset; offset_++) { + spiRec(); + } + // transfer data + for (uint16_t i = 0; i < count; i++) { + dst[i] = spiRec(); + } +#endif // OPTIMIZE_HARDWARE_SPI + + offset_ += count; + if (!partialBlockRead_ || offset_ >= 512) { + // read rest of data, checksum and set chip select high + readEnd(); + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Skip remaining data in a block when in partial block read mode. */ +void Sd2Card::readEnd(void) { + if (inBlock_) { + // skip data and crc +#ifdef OPTIMIZE_HARDWARE_SPI + // optimize skip for hardware + SPDR = 0XFF; + while (offset_++ < 513) { + while (!(SPSR & (1 << SPIF))); + SPDR = 0XFF; + } + // Wait for last CRC byte + while (!(SPSR & (1 << SPIF))); +#else // OPTIMIZE_HARDWARE_SPI + while (offset_++ < 514) spiRec(); +#endif // OPTIMIZE_HARDWARE_SPI + chipSelectHigh(); + inBlock_ = 0; + } +} +//------------------------------------------------------------------------------ +/** read CID or CSR register */ +uint8_t Sd2Card::readRegister(uint8_t cmd, void* buf) { + uint8_t* dst = reinterpret_cast(buf); + if (cardCommand(cmd, 0)) { + error(SD_CARD_ERROR_READ_REG); + goto fail; + } + if (!waitStartBlock()) goto fail; + // transfer data + for (uint16_t i = 0; i < 16; i++) dst[i] = spiRec(); + spiRec(); // get first crc byte + spiRec(); // get second crc byte + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Set the SPI clock rate. + * + * \param[in] sckRateID A value in the range [0, 6]. + * + * The SPI clock will be set to F_CPU/pow(2, 1 + sckRateID). The maximum + * SPI rate is F_CPU/2 for \a sckRateID = 0 and the minimum rate is F_CPU/128 + * for \a scsRateID = 6. + * + * \return The value one, true, is returned for success and the value zero, + * false, is returned for an invalid value of \a sckRateID. + */ +uint8_t Sd2Card::setSckRate(uint8_t sckRateID) { + if (sckRateID > 6) { + error(SD_CARD_ERROR_SCK_RATE); + return false; + } + // see avr processor datasheet for SPI register bit definitions + if ((sckRateID & 1) || sckRateID == 6) { + SPSR &= ~(1 << SPI2X); + } else { + SPSR |= (1 << SPI2X); + } + SPCR &= ~((1 < SD_READ_TIMEOUT) { + error(SD_CARD_ERROR_READ_TIMEOUT); + goto fail; + } + } + if (status_ != DATA_START_BLOCK) { + error(SD_CARD_ERROR_READ); + goto fail; + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Writes a 512 byte block to an SD card. + * + * \param[in] blockNumber Logical block to be written. + * \param[in] src Pointer to the location of the data to be written. + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { +#if SD_PROTECT_BLOCK_ZERO + // don't allow write to first block + if (blockNumber == 0) { + error(SD_CARD_ERROR_WRITE_BLOCK_ZERO); + goto fail; + } +#endif // SD_PROTECT_BLOCK_ZERO + + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD24, blockNumber)) { + error(SD_CARD_ERROR_CMD24); + goto fail; + } + if (!writeData(DATA_START_BLOCK, src)) goto fail; + + // wait for flash programming to complete + if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + error(SD_CARD_ERROR_WRITE_TIMEOUT); + goto fail; + } + // response is r2 so get and check two bytes for nonzero + if (cardCommand(CMD13, 0) || spiRec()) { + error(SD_CARD_ERROR_WRITE_PROGRAMMING); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Write one data block in a multiple block write sequence */ +uint8_t Sd2Card::writeData(const uint8_t* src) { + // wait for previous write to finish + if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + error(SD_CARD_ERROR_WRITE_MULTIPLE); + chipSelectHigh(); + return false; + } + return writeData(WRITE_MULTIPLE_TOKEN, src); +} +//------------------------------------------------------------------------------ +// send one block of data for write block or write multiple blocks +uint8_t Sd2Card::writeData(uint8_t token, const uint8_t* src) { + + // CRC16 checksum is supposed to be ignored in SPI mode (unless + // explicitly enabled) and a dummy value is normally written. + // A few funny cards (e.g. Eye-Fi X2) expect a valid CRC anyway. + // Call setCRC(true) to enable CRC16 checksum on block writes. + // This has a noticeable impact on write speed. :( + int16_t crc; + if(writeCRC_) { + int16_t i, x; + // CRC16 code via Scott Dattalo www.dattalo.com + for(crc=i=0; i<512; i++) { + x = ((crc >> 8) ^ src[i]) & 0xff; + x ^= x >> 4; + crc = (crc << 8) ^ (x << 12) ^ (x << 5) ^ x; + } + } else { + crc = 0xffff; // Dummy CRC value + } + +#ifdef OPTIMIZE_HARDWARE_SPI + + // send data - optimized loop + SPDR = token; + + // send two byte per iteration + for (uint16_t i = 0; i < 512; i += 2) { + while (!(SPSR & (1 << SPIF))); + SPDR = src[i]; + while (!(SPSR & (1 << SPIF))); + SPDR = src[i+1]; + } + + // wait for last data byte + while (!(SPSR & (1 << SPIF))); + +#else // OPTIMIZE_HARDWARE_SPI + spiSend(token); + for (uint16_t i = 0; i < 512; i++) { + spiSend(src[i]); + } +#endif // OPTIMIZE_HARDWARE_SPI + + spiSend(crc >> 8); // Might be dummy value, that's OK + spiSend(crc); + + status_ = spiRec(); + if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) { + error(SD_CARD_ERROR_WRITE); + chipSelectHigh(); + return false; + } + return true; +} +//------------------------------------------------------------------------------ +/** Start a write multiple blocks sequence. + * + * \param[in] blockNumber Address of first block in sequence. + * \param[in] eraseCount The number of blocks to be pre-erased. + * + * \note This function is used with writeData() and writeStop() + * for optimized multiple block writes. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::writeStart(uint32_t blockNumber, uint32_t eraseCount) { +#if SD_PROTECT_BLOCK_ZERO + // don't allow write to first block + if (blockNumber == 0) { + error(SD_CARD_ERROR_WRITE_BLOCK_ZERO); + goto fail; + } +#endif // SD_PROTECT_BLOCK_ZERO + // send pre-erase count + if (cardAcmd(ACMD23, eraseCount)) { + error(SD_CARD_ERROR_ACMD23); + goto fail; + } + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD25, blockNumber)) { + error(SD_CARD_ERROR_CMD25); + goto fail; + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** End a write multiple blocks sequence. + * +* \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::writeStop(void) { + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; + spiSend(STOP_TRAN_TOKEN); + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; + chipSelectHigh(); + return true; + + fail: + error(SD_CARD_ERROR_STOP_TRAN); + chipSelectHigh(); + return false; +} + +void Sd2Card::enableCRC(uint8_t mode) { + writeCRC_ = mode; +} + diff --git a/books/pdummies/Libraries/SD/utility/Sd2Card.h b/books/pdummies/Libraries/SD/utility/Sd2Card.h new file mode 100755 index 0000000..f78644c --- /dev/null +++ b/books/pdummies/Libraries/SD/utility/Sd2Card.h @@ -0,0 +1,253 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#ifndef Sd2Card_h +#define Sd2Card_h +/** + * \file + * Sd2Card class + */ +#include "Sd2PinMap.h" +#include "SdInfo.h" +/** Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate(). */ +uint8_t const SPI_FULL_SPEED = 0; +/** Set SCK rate to F_CPU/4. See Sd2Card::setSckRate(). */ +uint8_t const SPI_HALF_SPEED = 1; +/** Set SCK rate to F_CPU/8. Sd2Card::setSckRate(). */ +uint8_t const SPI_QUARTER_SPEED = 2; + +/** + * Define MEGA_SOFT_SPI non-zero to use software SPI on Mega Arduinos. + * Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. + * + * MEGA_SOFT_SPI allows an unmodified Adafruit GPS Shield to be used + * on Mega Arduinos. Software SPI works well with GPS Shield V1.1 + * but many SD cards will fail with GPS Shield V1.0. + */ +#define MEGA_SOFT_SPI 0 + +/** + * Define LEO_SOFT_SPI non-zero to use software SPI on Leonardo Arduinos. + * Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. + * + * LEO_SOFT_SPI allows an unmodified Adafruit GPS Shield to be used + * on Leonardo Arduinos. Software SPI works well with GPS Shield V1.1 + * but many SD cards will fail with GPS Shield V1.0. + */ +#define LEO_SOFT_SPI 0 + +//------------------------------------------------------------------------------ +#if MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__)) +#define SOFTWARE_SPI +#endif // MEGA_SOFT_SPI +//------------------------------------------------------------------------------ +#if LEO_SOFT_SPI && (defined(__AVR_ATmega32U4__)) +#define SOFTWARE_SPI +#endif // LEO_SOFT_SPI +//------------------------------------------------------------------------------ +// SPI pin definitions +// +#ifndef SOFTWARE_SPI +// hardware pin defs +/** + * SD Chip Select pin + * + * Warning if this pin is redefined the hardware SS will pin will be enabled + * as an output by init(). An avr processor will not function as an SPI + * master unless SS is set to output mode. + */ +/** The default chip select pin for the SD card is SS. */ +uint8_t const SD_CHIP_SELECT_PIN = SS_PIN; +// The following three pins must not be redefined for hardware SPI. +/** SPI Master Out Slave In pin */ +uint8_t const SPI_MOSI_PIN = MOSI_PIN; +/** SPI Master In Slave Out pin */ +uint8_t const SPI_MISO_PIN = MISO_PIN; +/** SPI Clock pin */ +uint8_t const SPI_SCK_PIN = SCK_PIN; +/** optimize loops for hardware SPI */ +//#define OPTIMIZE_HARDWARE_SPI // MEME FIX ME LATER + +#else // SOFTWARE_SPI +// define software SPI pins so Mega/Leonardo can use unmodified GPS Shield +/** SPI chip select pin */ +uint8_t const SD_CHIP_SELECT_PIN = 10; +/** SPI Master Out Slave In pin */ +uint8_t const SPI_MOSI_PIN = 11; +/** SPI Master In Slave Out pin */ +uint8_t const SPI_MISO_PIN = 12; +/** SPI Clock pin */ +uint8_t const SPI_SCK_PIN = 13; +#endif // SOFTWARE_SPI +//------------------------------------------------------------------------------ +/** Protect block zero from write if nonzero */ +#define SD_PROTECT_BLOCK_ZERO 1 +/** init timeout ms */ +uint16_t const SD_INIT_TIMEOUT = 2000; +/** erase timeout ms */ +uint16_t const SD_ERASE_TIMEOUT = 10000; +/** read timeout ms */ +uint16_t const SD_READ_TIMEOUT = 300; +/** write time out ms */ +uint16_t const SD_WRITE_TIMEOUT = 600; +//------------------------------------------------------------------------------ +// SD card errors +/** timeout error for command CMD0 */ +uint8_t const SD_CARD_ERROR_CMD0 = 0X1; +/** CMD8 was not accepted - not a valid SD card*/ +uint8_t const SD_CARD_ERROR_CMD8 = 0X2; +/** card returned an error response for CMD17 (read block) */ +uint8_t const SD_CARD_ERROR_CMD17 = 0X3; +/** card returned an error response for CMD24 (write block) */ +uint8_t const SD_CARD_ERROR_CMD24 = 0X4; +/** WRITE_MULTIPLE_BLOCKS command failed */ +uint8_t const SD_CARD_ERROR_CMD25 = 0X05; +/** card returned an error response for CMD58 (read OCR) */ +uint8_t const SD_CARD_ERROR_CMD58 = 0X06; +/** SET_WR_BLK_ERASE_COUNT failed */ +uint8_t const SD_CARD_ERROR_ACMD23 = 0X07; +/** card's ACMD41 initialization process timeout */ +uint8_t const SD_CARD_ERROR_ACMD41 = 0X08; +/** card returned a bad CSR version field */ +uint8_t const SD_CARD_ERROR_BAD_CSD = 0X09; +/** erase block group command failed */ +uint8_t const SD_CARD_ERROR_ERASE = 0X0A; +/** card not capable of single block erase */ +uint8_t const SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0X0B; +/** Erase sequence timed out */ +uint8_t const SD_CARD_ERROR_ERASE_TIMEOUT = 0X0C; +/** card returned an error token instead of read data */ +uint8_t const SD_CARD_ERROR_READ = 0X0D; +/** read CID or CSD failed */ +uint8_t const SD_CARD_ERROR_READ_REG = 0X0E; +/** timeout while waiting for start of read data */ +uint8_t const SD_CARD_ERROR_READ_TIMEOUT = 0X0F; +/** card did not accept STOP_TRAN_TOKEN */ +uint8_t const SD_CARD_ERROR_STOP_TRAN = 0X10; +/** card returned an error token as a response to a write operation */ +uint8_t const SD_CARD_ERROR_WRITE = 0X11; +/** attempt to write protected block zero */ +uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X12; +/** card did not go ready for a multiple block write */ +uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X13; +/** card returned an error to a CMD13 status check after a write */ +uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X14; +/** timeout occurred during write programming */ +uint8_t const SD_CARD_ERROR_WRITE_TIMEOUT = 0X15; +/** incorrect rate selected */ +uint8_t const SD_CARD_ERROR_SCK_RATE = 0X16; +//------------------------------------------------------------------------------ +// card types +/** Standard capacity V1 SD card */ +uint8_t const SD_CARD_TYPE_SD1 = 1; +/** Standard capacity V2 SD card */ +uint8_t const SD_CARD_TYPE_SD2 = 2; +/** High Capacity SD card */ +uint8_t const SD_CARD_TYPE_SDHC = 3; +//------------------------------------------------------------------------------ +/** + * \class Sd2Card + * \brief Raw access to SD and SDHC flash memory cards. + */ +class Sd2Card { + public: + /** Construct an instance of Sd2Card. */ + Sd2Card(void) : errorCode_(0), inBlock_(0), partialBlockRead_(0), type_(0) {} + uint32_t cardSize(void); + uint8_t erase(uint32_t firstBlock, uint32_t lastBlock); + uint8_t eraseSingleBlockEnable(void); + /** + * \return error code for last error. See Sd2Card.h for a list of error codes. + */ + uint8_t errorCode(void) const {return errorCode_;} + /** \return error data for last error. */ + uint8_t errorData(void) const {return status_;} + /** + * Initialize an SD flash memory card with default clock rate and chip + * select pin. See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). + */ + uint8_t init(void) { + return init(SPI_FULL_SPEED, SD_CHIP_SELECT_PIN); + } + /** + * Initialize an SD flash memory card with the selected SPI clock rate + * and the default SD chip select pin. + * See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). + */ + uint8_t init(uint8_t sckRateID) { + return init(sckRateID, SD_CHIP_SELECT_PIN); + } + uint8_t init(uint8_t sckRateID, uint8_t chipSelectPin, int8_t mosiPin = -1, int8_t misoPin = -1, int8_t clockPin = -1); + void partialBlockRead(uint8_t value); + /** Returns the current value, true or false, for partial block read. */ + uint8_t partialBlockRead(void) const {return partialBlockRead_;} + uint8_t readBlock(uint32_t block, uint8_t* dst); + uint8_t readData(uint32_t block, + uint16_t offset, uint16_t count, uint8_t* dst); + /** + * Read a cards CID register. The CID contains card identification + * information such as Manufacturer ID, Product name, Product serial + * number and Manufacturing date. */ + uint8_t readCID(cid_t* cid) { + return readRegister(CMD10, cid); + } + /** + * Read a cards CSD register. The CSD contains Card-Specific Data that + * provides information regarding access to the card's contents. */ + uint8_t readCSD(csd_t* csd) { + return readRegister(CMD9, csd); + } + void readEnd(void); + uint8_t setSckRate(uint8_t sckRateID); + /** Return the card type: SD V1, SD V2 or SDHC */ + uint8_t type(void) const {return type_;} + uint8_t writeBlock(uint32_t blockNumber, const uint8_t* src); + uint8_t writeData(const uint8_t* src); + uint8_t writeStart(uint32_t blockNumber, uint32_t eraseCount); + uint8_t writeStop(void); + void enableCRC(uint8_t mode); + + private: + uint32_t block_; + uint8_t chipSelectPin_; + uint8_t errorCode_; + uint8_t inBlock_; + uint16_t offset_; + uint8_t partialBlockRead_; + uint8_t status_; + uint8_t type_; + uint8_t writeCRC_; + + // private functions + uint8_t cardAcmd(uint8_t cmd, uint32_t arg) { + cardCommand(CMD55, 0); + return cardCommand(cmd, arg); + } + uint8_t cardCommand(uint8_t cmd, uint32_t arg); + void error(uint8_t code) {errorCode_ = code;} + uint8_t readRegister(uint8_t cmd, void* buf); + uint8_t sendWriteCommand(uint32_t blockNumber, uint32_t eraseCount); + void chipSelectHigh(void); + void chipSelectLow(void); + void type(uint8_t value) {type_ = value;} + uint8_t waitNotBusy(uint16_t timeoutMillis); + uint8_t writeData(uint8_t token, const uint8_t* src); + uint8_t waitStartBlock(void); +}; +#endif // Sd2Card_h diff --git a/books/pdummies/Libraries/SD/utility/Sd2PinMap.h b/books/pdummies/Libraries/SD/utility/Sd2PinMap.h new file mode 100755 index 0000000..5538268 --- /dev/null +++ b/books/pdummies/Libraries/SD/utility/Sd2PinMap.h @@ -0,0 +1,360 @@ +/* Arduino SdFat Library + * Copyright (C) 2010 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +// Warning this file was generated by a program. +#ifndef Sd2PinMap_h +#define Sd2PinMap_h +#include + +#if (ARDUINO >= 100) +#include "Arduino.h" +#endif + +//------------------------------------------------------------------------------ +/** struct for mapping digital pins */ +struct pin_map_t { + volatile uint8_t* ddr; + volatile uint8_t* pin; + volatile uint8_t* port; + uint8_t bit; +}; +//------------------------------------------------------------------------------ +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +// Mega + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 20; +uint8_t const SCL_PIN = 21; + +// SPI port +uint8_t const SS_PIN = 53; +uint8_t const MOSI_PIN = 51; +uint8_t const MISO_PIN = 50; +uint8_t const SCK_PIN = 52; + +static const pin_map_t digitalPinMap[] = { + {&DDRE, &PINE, &PORTE, 0}, // E0 0 + {&DDRE, &PINE, &PORTE, 1}, // E1 1 + {&DDRE, &PINE, &PORTE, 4}, // E4 2 + {&DDRE, &PINE, &PORTE, 5}, // E5 3 + {&DDRG, &PING, &PORTG, 5}, // G5 4 + {&DDRE, &PINE, &PORTE, 3}, // E3 5 + {&DDRH, &PINH, &PORTH, 3}, // H3 6 + {&DDRH, &PINH, &PORTH, 4}, // H4 7 + {&DDRH, &PINH, &PORTH, 5}, // H5 8 + {&DDRH, &PINH, &PORTH, 6}, // H6 9 + {&DDRB, &PINB, &PORTB, 4}, // B4 10 + {&DDRB, &PINB, &PORTB, 5}, // B5 11 + {&DDRB, &PINB, &PORTB, 6}, // B6 12 + {&DDRB, &PINB, &PORTB, 7}, // B7 13 + {&DDRJ, &PINJ, &PORTJ, 1}, // J1 14 + {&DDRJ, &PINJ, &PORTJ, 0}, // J0 15 + {&DDRH, &PINH, &PORTH, 1}, // H1 16 + {&DDRH, &PINH, &PORTH, 0}, // H0 17 + {&DDRD, &PIND, &PORTD, 3}, // D3 18 + {&DDRD, &PIND, &PORTD, 2}, // D2 19 + {&DDRD, &PIND, &PORTD, 1}, // D1 20 + {&DDRD, &PIND, &PORTD, 0}, // D0 21 + {&DDRA, &PINA, &PORTA, 0}, // A0 22 + {&DDRA, &PINA, &PORTA, 1}, // A1 23 + {&DDRA, &PINA, &PORTA, 2}, // A2 24 + {&DDRA, &PINA, &PORTA, 3}, // A3 25 + {&DDRA, &PINA, &PORTA, 4}, // A4 26 + {&DDRA, &PINA, &PORTA, 5}, // A5 27 + {&DDRA, &PINA, &PORTA, 6}, // A6 28 + {&DDRA, &PINA, &PORTA, 7}, // A7 29 + {&DDRC, &PINC, &PORTC, 7}, // C7 30 + {&DDRC, &PINC, &PORTC, 6}, // C6 31 + {&DDRC, &PINC, &PORTC, 5}, // C5 32 + {&DDRC, &PINC, &PORTC, 4}, // C4 33 + {&DDRC, &PINC, &PORTC, 3}, // C3 34 + {&DDRC, &PINC, &PORTC, 2}, // C2 35 + {&DDRC, &PINC, &PORTC, 1}, // C1 36 + {&DDRC, &PINC, &PORTC, 0}, // C0 37 + {&DDRD, &PIND, &PORTD, 7}, // D7 38 + {&DDRG, &PING, &PORTG, 2}, // G2 39 + {&DDRG, &PING, &PORTG, 1}, // G1 40 + {&DDRG, &PING, &PORTG, 0}, // G0 41 + {&DDRL, &PINL, &PORTL, 7}, // L7 42 + {&DDRL, &PINL, &PORTL, 6}, // L6 43 + {&DDRL, &PINL, &PORTL, 5}, // L5 44 + {&DDRL, &PINL, &PORTL, 4}, // L4 45 + {&DDRL, &PINL, &PORTL, 3}, // L3 46 + {&DDRL, &PINL, &PORTL, 2}, // L2 47 + {&DDRL, &PINL, &PORTL, 1}, // L1 48 + {&DDRL, &PINL, &PORTL, 0}, // L0 49 + {&DDRB, &PINB, &PORTB, 3}, // B3 50 + {&DDRB, &PINB, &PORTB, 2}, // B2 51 + {&DDRB, &PINB, &PORTB, 1}, // B1 52 + {&DDRB, &PINB, &PORTB, 0}, // B0 53 + {&DDRF, &PINF, &PORTF, 0}, // F0 54 + {&DDRF, &PINF, &PORTF, 1}, // F1 55 + {&DDRF, &PINF, &PORTF, 2}, // F2 56 + {&DDRF, &PINF, &PORTF, 3}, // F3 57 + {&DDRF, &PINF, &PORTF, 4}, // F4 58 + {&DDRF, &PINF, &PORTF, 5}, // F5 59 + {&DDRF, &PINF, &PORTF, 6}, // F6 60 + {&DDRF, &PINF, &PORTF, 7}, // F7 61 + {&DDRK, &PINK, &PORTK, 0}, // K0 62 + {&DDRK, &PINK, &PORTK, 1}, // K1 63 + {&DDRK, &PINK, &PORTK, 2}, // K2 64 + {&DDRK, &PINK, &PORTK, 3}, // K3 65 + {&DDRK, &PINK, &PORTK, 4}, // K4 66 + {&DDRK, &PINK, &PORTK, 5}, // K5 67 + {&DDRK, &PINK, &PORTK, 6}, // K6 68 + {&DDRK, &PINK, &PORTK, 7} // K7 69 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) +// Sanguino + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 17; +uint8_t const SCL_PIN = 18; + +// SPI port +uint8_t const SS_PIN = 4; +uint8_t const MOSI_PIN = 5; +uint8_t const MISO_PIN = 6; +uint8_t const SCK_PIN = 7; + +static const pin_map_t digitalPinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 4}, // B4 4 + {&DDRB, &PINB, &PORTB, 5}, // B5 5 + {&DDRB, &PINB, &PORTB, 6}, // B6 6 + {&DDRB, &PINB, &PORTB, 7}, // B7 7 + {&DDRD, &PIND, &PORTD, 0}, // D0 8 + {&DDRD, &PIND, &PORTD, 1}, // D1 9 + {&DDRD, &PIND, &PORTD, 2}, // D2 10 + {&DDRD, &PIND, &PORTD, 3}, // D3 11 + {&DDRD, &PIND, &PORTD, 4}, // D4 12 + {&DDRD, &PIND, &PORTD, 5}, // D5 13 + {&DDRD, &PIND, &PORTD, 6}, // D6 14 + {&DDRD, &PIND, &PORTD, 7}, // D7 15 + {&DDRC, &PINC, &PORTC, 0}, // C0 16 + {&DDRC, &PINC, &PORTC, 1}, // C1 17 + {&DDRC, &PINC, &PORTC, 2}, // C2 18 + {&DDRC, &PINC, &PORTC, 3}, // C3 19 + {&DDRC, &PINC, &PORTC, 4}, // C4 20 + {&DDRC, &PINC, &PORTC, 5}, // C5 21 + {&DDRC, &PINC, &PORTC, 6}, // C6 22 + {&DDRC, &PINC, &PORTC, 7}, // C7 23 + {&DDRA, &PINA, &PORTA, 7}, // A7 24 + {&DDRA, &PINA, &PORTA, 6}, // A6 25 + {&DDRA, &PINA, &PORTA, 5}, // A5 26 + {&DDRA, &PINA, &PORTA, 4}, // A4 27 + {&DDRA, &PINA, &PORTA, 3}, // A3 28 + {&DDRA, &PINA, &PORTA, 2}, // A2 29 + {&DDRA, &PINA, &PORTA, 1}, // A1 30 + {&DDRA, &PINA, &PORTA, 0} // A0 31 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega32U4__) +// XXXXTeensy 2.0XXXX - this is not going to be the teensy pinout anymore! +// because we need to give priority to the leonardo + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 2; +uint8_t const SCL_PIN = 3; + +// SPI port +uint8_t const SS_PIN = SS; +uint8_t const MOSI_PIN = MOSI; +uint8_t const MISO_PIN = MISO; +uint8_t const SCK_PIN = SCK; + +static const pin_map_t digitalPinMap[] = { + {&DDRD, &PIND, &PORTD, 2}, // D2 0 + {&DDRD, &PIND, &PORTD, 3}, // D3 1 + {&DDRD, &PIND, &PORTD, 1}, // D1 2 + {&DDRD, &PIND, &PORTD, 0}, // D0 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRC, &PINC, &PORTC, 6}, // C6 5 + {&DDRD, &PIND, &PORTD, 7}, // D7 6 + {&DDRE, &PINE, &PORTE, 6}, // E6 7 + {&DDRB, &PINB, &PORTB, 4}, // B4 8 + {&DDRB, &PINB, &PORTB, 5}, // B5 9 + {&DDRB, &PINB, &PORTB, 6}, // B6 10 + {&DDRB, &PINB, &PORTB, 7}, // B7 11 + {&DDRD, &PIND, &PORTD, 6}, // D6 12 + {&DDRC, &PINC, &PORTC, 7}, // C7 13 + /* + {&DDRB, &PINB, &PORTB, 5}, // B5 14 + {&DDRB, &PINB, &PORTB, 6}, // B6 15 + {&DDRF, &PINF, &PORTF, 7}, // F7 16 + {&DDRF, &PINF, &PORTF, 6}, // F6 17 + {&DDRF, &PINF, &PORTF, 5}, // F5 18 + {&DDRF, &PINF, &PORTF, 4}, // F4 19 + {&DDRF, &PINF, &PORTF, 1}, // F1 20 + {&DDRF, &PINF, &PORTF, 0}, // F0 21 + {&DDRD, &PIND, &PORTD, 4}, // D4 22 + {&DDRD, &PIND, &PORTD, 5}, // D5 23 + {&DDRE, &PINE, &PORTE, 6} // E6 24 + */ +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) +// Teensy++ 1.0 & 2.0 + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 1; +uint8_t const SCL_PIN = 0; + +// SPI port +uint8_t const SS_PIN = 20; +uint8_t const MOSI_PIN = 22; +uint8_t const MISO_PIN = 23; +uint8_t const SCK_PIN = 21; + +static const pin_map_t digitalPinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRE, &PINE, &PORTE, 0}, // E0 8 + {&DDRE, &PINE, &PORTE, 1}, // E1 9 + {&DDRC, &PINC, &PORTC, 0}, // C0 10 + {&DDRC, &PINC, &PORTC, 1}, // C1 11 + {&DDRC, &PINC, &PORTC, 2}, // C2 12 + {&DDRC, &PINC, &PORTC, 3}, // C3 13 + {&DDRC, &PINC, &PORTC, 4}, // C4 14 + {&DDRC, &PINC, &PORTC, 5}, // C5 15 + {&DDRC, &PINC, &PORTC, 6}, // C6 16 + {&DDRC, &PINC, &PORTC, 7}, // C7 17 + {&DDRE, &PINE, &PORTE, 6}, // E6 18 + {&DDRE, &PINE, &PORTE, 7}, // E7 19 + {&DDRB, &PINB, &PORTB, 0}, // B0 20 + {&DDRB, &PINB, &PORTB, 1}, // B1 21 + {&DDRB, &PINB, &PORTB, 2}, // B2 22 + {&DDRB, &PINB, &PORTB, 3}, // B3 23 + {&DDRB, &PINB, &PORTB, 4}, // B4 24 + {&DDRB, &PINB, &PORTB, 5}, // B5 25 + {&DDRB, &PINB, &PORTB, 6}, // B6 26 + {&DDRB, &PINB, &PORTB, 7}, // B7 27 + {&DDRA, &PINA, &PORTA, 0}, // A0 28 + {&DDRA, &PINA, &PORTA, 1}, // A1 29 + {&DDRA, &PINA, &PORTA, 2}, // A2 30 + {&DDRA, &PINA, &PORTA, 3}, // A3 31 + {&DDRA, &PINA, &PORTA, 4}, // A4 32 + {&DDRA, &PINA, &PORTA, 5}, // A5 33 + {&DDRA, &PINA, &PORTA, 6}, // A6 34 + {&DDRA, &PINA, &PORTA, 7}, // A7 35 + {&DDRE, &PINE, &PORTE, 4}, // E4 36 + {&DDRE, &PINE, &PORTE, 5}, // E5 37 + {&DDRF, &PINF, &PORTF, 0}, // F0 38 + {&DDRF, &PINF, &PORTF, 1}, // F1 39 + {&DDRF, &PINF, &PORTF, 2}, // F2 40 + {&DDRF, &PINF, &PORTF, 3}, // F3 41 + {&DDRF, &PINF, &PORTF, 4}, // F4 42 + {&DDRF, &PINF, &PORTF, 5}, // F5 43 + {&DDRF, &PINF, &PORTF, 6}, // F6 44 + {&DDRF, &PINF, &PORTF, 7} // F7 45 +}; +//------------------------------------------------------------------------------ +#else // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +// 168 and 328 Arduinos + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 18; +uint8_t const SCL_PIN = 19; + +// SPI port +uint8_t const SS_PIN = 10; +uint8_t const MOSI_PIN = 11; +uint8_t const MISO_PIN = 12; +uint8_t const SCK_PIN = 13; + +static const pin_map_t digitalPinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRB, &PINB, &PORTB, 0}, // B0 8 + {&DDRB, &PINB, &PORTB, 1}, // B1 9 + {&DDRB, &PINB, &PORTB, 2}, // B2 10 + {&DDRB, &PINB, &PORTB, 3}, // B3 11 + {&DDRB, &PINB, &PORTB, 4}, // B4 12 + {&DDRB, &PINB, &PORTB, 5}, // B5 13 + {&DDRC, &PINC, &PORTC, 0}, // C0 14 + {&DDRC, &PINC, &PORTC, 1}, // C1 15 + {&DDRC, &PINC, &PORTC, 2}, // C2 16 + {&DDRC, &PINC, &PORTC, 3}, // C3 17 + {&DDRC, &PINC, &PORTC, 4}, // C4 18 + {&DDRC, &PINC, &PORTC, 5} // C5 19 +}; +#endif // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +//------------------------------------------------------------------------------ +static const uint8_t digitalPinCount = sizeof(digitalPinMap)/sizeof(pin_map_t); + +uint8_t badPinNumber(void) + __attribute__((error("Pin number is too large or not a constant"))); + +static inline __attribute__((always_inline)) + uint8_t getPinMode(uint8_t pin) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1; + } else { + return badPinNumber(); + } +} +static inline __attribute__((always_inline)) + void setPinMode(uint8_t pin, uint8_t mode) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + if (mode) { + *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit; + } else { + *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit); + } + } else { + badPinNumber(); + } +} +static inline __attribute__((always_inline)) + uint8_t fastDigitalRead(uint8_t pin) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1; + } else { + return badPinNumber(); + } +} +static inline __attribute__((always_inline)) + void fastDigitalWrite(uint8_t pin, uint8_t value) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + if (value) { + *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit; + } else { + *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit); + } + } else { + badPinNumber(); + } +} +#endif // Sd2PinMap_h diff --git a/books/pdummies/Libraries/SD/utility/SdFat.h b/books/pdummies/Libraries/SD/utility/SdFat.h new file mode 100755 index 0000000..a643373 --- /dev/null +++ b/books/pdummies/Libraries/SD/utility/SdFat.h @@ -0,0 +1,553 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdFat_h +#define SdFat_h +/** + * \file + * SdFile and SdVolume classes + */ +#include +#include "Sd2Card.h" +#include "FatStructs.h" +#include "Print.h" +//------------------------------------------------------------------------------ +/** + * Allow use of deprecated functions if non-zero + */ +#define ALLOW_DEPRECATED_FUNCTIONS 1 +//------------------------------------------------------------------------------ +// forward declaration since SdVolume is used in SdFile +class SdVolume; +//============================================================================== +// SdFile class + +// flags for ls() +/** ls() flag to print modify date */ +uint8_t const LS_DATE = 1; +/** ls() flag to print file size */ +uint8_t const LS_SIZE = 2; +/** ls() flag for recursive list of subdirectories */ +uint8_t const LS_R = 4; + +// use the gnu style oflag in open() +/** open() oflag for reading */ +uint8_t const O_READ = 0X01; +/** open() oflag - same as O_READ */ +uint8_t const O_RDONLY = O_READ; +/** open() oflag for write */ +uint8_t const O_WRITE = 0X02; +/** open() oflag - same as O_WRITE */ +uint8_t const O_WRONLY = O_WRITE; +/** open() oflag for reading and writing */ +uint8_t const O_RDWR = (O_READ | O_WRITE); +/** open() oflag mask for access modes */ +uint8_t const O_ACCMODE = (O_READ | O_WRITE); +/** The file offset shall be set to the end of the file prior to each write. */ +uint8_t const O_APPEND = 0X04; +/** synchronous writes - call sync() after each write */ +uint8_t const O_SYNC = 0X08; +/** create the file if nonexistent */ +uint8_t const O_CREAT = 0X10; +/** If O_CREAT and O_EXCL are set, open() shall fail if the file exists */ +uint8_t const O_EXCL = 0X20; +/** truncate the file to zero length */ +uint8_t const O_TRUNC = 0X40; + +// flags for timestamp +/** set the file's last access date */ +uint8_t const T_ACCESS = 1; +/** set the file's creation date and time */ +uint8_t const T_CREATE = 2; +/** Set the file's write date and time */ +uint8_t const T_WRITE = 4; +// values for type_ +/** This SdFile has not been opened. */ +uint8_t const FAT_FILE_TYPE_CLOSED = 0; +/** SdFile for a file */ +uint8_t const FAT_FILE_TYPE_NORMAL = 1; +/** SdFile for a FAT16 root directory */ +uint8_t const FAT_FILE_TYPE_ROOT16 = 2; +/** SdFile for a FAT32 root directory */ +uint8_t const FAT_FILE_TYPE_ROOT32 = 3; +/** SdFile for a subdirectory */ +uint8_t const FAT_FILE_TYPE_SUBDIR = 4; +/** Test value for directory type */ +uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16; + +/** date field for FAT directory entry */ +static inline uint16_t FAT_DATE(uint16_t year, uint8_t month, uint8_t day) { + return (year - 1980) << 9 | month << 5 | day; +} +/** year part of FAT directory date field */ +static inline uint16_t FAT_YEAR(uint16_t fatDate) { + return 1980 + (fatDate >> 9); +} +/** month part of FAT directory date field */ +static inline uint8_t FAT_MONTH(uint16_t fatDate) { + return (fatDate >> 5) & 0XF; +} +/** day part of FAT directory date field */ +static inline uint8_t FAT_DAY(uint16_t fatDate) { + return fatDate & 0X1F; +} +/** time field for FAT directory entry */ +static inline uint16_t FAT_TIME(uint8_t hour, uint8_t minute, uint8_t second) { + return hour << 11 | minute << 5 | second >> 1; +} +/** hour part of FAT directory time field */ +static inline uint8_t FAT_HOUR(uint16_t fatTime) { + return fatTime >> 11; +} +/** minute part of FAT directory time field */ +static inline uint8_t FAT_MINUTE(uint16_t fatTime) { + return(fatTime >> 5) & 0X3F; +} +/** second part of FAT directory time field */ +static inline uint8_t FAT_SECOND(uint16_t fatTime) { + return 2*(fatTime & 0X1F); +} +/** Default date for file timestamps is 1 Jan 2000 */ +uint16_t const FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1; +/** Default time for file timestamp is 1 am */ +uint16_t const FAT_DEFAULT_TIME = (1 << 11); +//------------------------------------------------------------------------------ +/** + * \class SdFile + * \brief Access FAT16 and FAT32 files on SD and SDHC cards. + */ +class SdFile : public Print { + public: + /** Create an instance of SdFile. */ + SdFile(void) : type_(FAT_FILE_TYPE_CLOSED) {} + /** + * writeError is set to true if an error occurs during a write(). + * Set writeError to false before calling print() and/or write() and check + * for true after calls to print() and/or write(). + */ + bool writeError; + /** + * Cancel unbuffered reads for this file. + * See setUnbufferedRead() + */ + void clearUnbufferedRead(void) { + flags_ &= ~F_FILE_UNBUFFERED_READ; + } + uint8_t close(void); + uint8_t contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + uint8_t createContiguous(SdFile* dirFile, + const char* fileName, uint32_t size); + /** \return The current cluster number for a file or directory. */ + uint32_t curCluster(void) const {return curCluster_;} + /** \return The current position for a file or directory. */ + uint32_t curPosition(void) const {return curPosition_;} + /** + * Set the date/time callback function + * + * \param[in] dateTime The user's call back function. The callback + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here + * + * // return date using FAT_DATE macro to format fields + * *date = FAT_DATE(year, month, day); + * + * // return time using FAT_TIME macro to format fields + * *time = FAT_TIME(hour, minute, second); + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + * See the timestamp() function. + */ + static void dateTimeCallback( + void (*dateTime)(uint16_t* date, uint16_t* time)) { + dateTime_ = dateTime; + } + /** + * Cancel the date/time callback function. + */ + static void dateTimeCallbackCancel(void) { + // use explicit zero since NULL is not defined for Sanguino + dateTime_ = 0; + } + /** \return Address of the block that contains this file's directory. */ + uint32_t dirBlock(void) const {return dirBlock_;} + uint8_t dirEntry(dir_t* dir); + /** \return Index of this file's directory in the block dirBlock. */ + uint8_t dirIndex(void) const {return dirIndex_;} + static void dirName(const dir_t& dir, char* name); + /** \return The total number of bytes in a file or directory. */ + uint32_t fileSize(void) const {return fileSize_;} + /** \return The first cluster number for a file or directory. */ + uint32_t firstCluster(void) const {return firstCluster_;} + /** \return True if this is a SdFile for a directory else false. */ + uint8_t isDir(void) const {return type_ >= FAT_FILE_TYPE_MIN_DIR;} + /** \return True if this is a SdFile for a file else false. */ + uint8_t isFile(void) const {return type_ == FAT_FILE_TYPE_NORMAL;} + /** \return True if this is a SdFile for an open file/directory else false. */ + uint8_t isOpen(void) const {return type_ != FAT_FILE_TYPE_CLOSED;} + /** \return True if this is a SdFile for a subdirectory else false. */ + uint8_t isSubDir(void) const {return type_ == FAT_FILE_TYPE_SUBDIR;} + /** \return True if this is a SdFile for the root directory. */ + uint8_t isRoot(void) const { + return type_ == FAT_FILE_TYPE_ROOT16 || type_ == FAT_FILE_TYPE_ROOT32; + } + void ls(uint8_t flags = 0, uint8_t indent = 0); + uint8_t makeDir(SdFile* dir, const char* dirName); + uint8_t open(SdFile* dirFile, uint16_t index, uint8_t oflag); + uint8_t open(SdFile* dirFile, const char* fileName, uint8_t oflag); + + uint8_t openRoot(SdVolume* vol); + static void printDirName(const dir_t& dir, uint8_t width); + static void printFatDate(uint16_t fatDate); + static void printFatTime(uint16_t fatTime); + static void printTwoDigits(uint8_t v); + /** + * Read the next byte from a file. + * + * \return For success read returns the next byte in the file as an int. + * If an error occurs or end of file is reached -1 is returned. + */ + int16_t read(void) { + uint8_t b; + return read(&b, 1) == 1 ? b : -1; + } + int16_t read(void* buf, uint16_t nbyte); + int8_t readDir(dir_t* dir); + static uint8_t remove(SdFile* dirFile, const char* fileName); + uint8_t remove(void); + /** Set the file's current position to zero. */ + void rewind(void) { + curPosition_ = curCluster_ = 0; + } + uint8_t rmDir(void); + uint8_t rmRfStar(void); + /** Set the files position to current position + \a pos. See seekSet(). */ + uint8_t seekCur(uint32_t pos) { + return seekSet(curPosition_ + pos); + } + /** + * Set the files current position to end of file. Useful to position + * a file for append. See seekSet(). + */ + uint8_t seekEnd(void) {return seekSet(fileSize_);} + uint8_t seekSet(uint32_t pos); + /** + * Use unbuffered reads to access this file. Used with Wave + * Shield ISR. Used with Sd2Card::partialBlockRead() in WaveRP. + * + * Not recommended for normal applications. + */ + void setUnbufferedRead(void) { + if (isFile()) flags_ |= F_FILE_UNBUFFERED_READ; + } + uint8_t timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, + uint8_t hour, uint8_t minute, uint8_t second); + uint8_t sync(void); + /** Type of this SdFile. You should use isFile() or isDir() instead of type() + * if possible. + * + * \return The file or directory type. + */ + uint8_t type(void) const {return type_;} + uint8_t truncate(uint32_t size); + /** \return Unbuffered read flag. */ + uint8_t unbufferedRead(void) const { + return flags_ & F_FILE_UNBUFFERED_READ; + } + /** \return SdVolume that contains this file. */ + SdVolume* volume(void) const {return vol_;} +#if ARDUINO >= 100 + size_t write(uint8_t b); + size_t write(const void* buf, uint16_t nbyte); + size_t write(const char* str); +#else + void write(uint8_t b); + int16_t write(const void* buf, uint16_t nbyte); + void write(const char* str); +#endif + void write_P(PGM_P str); + void writeln_P(PGM_P str); +//------------------------------------------------------------------------------ +#if ALLOW_DEPRECATED_FUNCTIONS +// Deprecated functions - suppress cpplint warnings with NOLINT comment + /** \deprecated Use: + * uint8_t SdFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + */ + uint8_t contiguousRange(uint32_t& bgnBlock, uint32_t& endBlock) { // NOLINT + return contiguousRange(&bgnBlock, &endBlock); + } + /** \deprecated Use: + * uint8_t SdFile::createContiguous(SdFile* dirFile, + * const char* fileName, uint32_t size) + */ + uint8_t createContiguous(SdFile& dirFile, // NOLINT + const char* fileName, uint32_t size) { + return createContiguous(&dirFile, fileName, size); + } + + /** + * \deprecated Use: + * static void SdFile::dateTimeCallback( + * void (*dateTime)(uint16_t* date, uint16_t* time)); + */ + static void dateTimeCallback( + void (*dateTime)(uint16_t& date, uint16_t& time)) { // NOLINT + oldDateTime_ = dateTime; + dateTime_ = dateTime ? oldToNew : 0; + } + /** \deprecated Use: uint8_t SdFile::dirEntry(dir_t* dir); */ + uint8_t dirEntry(dir_t& dir) {return dirEntry(&dir);} // NOLINT + /** \deprecated Use: + * uint8_t SdFile::makeDir(SdFile* dir, const char* dirName); + */ + uint8_t makeDir(SdFile& dir, const char* dirName) { // NOLINT + return makeDir(&dir, dirName); + } + /** \deprecated Use: + * uint8_t SdFile::open(SdFile* dirFile, const char* fileName, uint8_t oflag); + */ + uint8_t open(SdFile& dirFile, // NOLINT + const char* fileName, uint8_t oflag) { + return open(&dirFile, fileName, oflag); + } + /** \deprecated Do not use in new apps */ + uint8_t open(SdFile& dirFile, const char* fileName) { // NOLINT + return open(dirFile, fileName, O_RDWR); + } + /** \deprecated Use: + * uint8_t SdFile::open(SdFile* dirFile, uint16_t index, uint8_t oflag); + */ + uint8_t open(SdFile& dirFile, uint16_t index, uint8_t oflag) { // NOLINT + return open(&dirFile, index, oflag); + } + /** \deprecated Use: uint8_t SdFile::openRoot(SdVolume* vol); */ + uint8_t openRoot(SdVolume& vol) {return openRoot(&vol);} // NOLINT + + /** \deprecated Use: int8_t SdFile::readDir(dir_t* dir); */ + int8_t readDir(dir_t& dir) {return readDir(&dir);} // NOLINT + /** \deprecated Use: + * static uint8_t SdFile::remove(SdFile* dirFile, const char* fileName); + */ + static uint8_t remove(SdFile& dirFile, const char* fileName) { // NOLINT + return remove(&dirFile, fileName); + } +//------------------------------------------------------------------------------ +// rest are private + private: + static void (*oldDateTime_)(uint16_t& date, uint16_t& time); // NOLINT + static void oldToNew(uint16_t* date, uint16_t* time) { + uint16_t d; + uint16_t t; + oldDateTime_(d, t); + *date = d; + *time = t; + } +#endif // ALLOW_DEPRECATED_FUNCTIONS + private: + // bits defined in flags_ + // should be 0XF + static uint8_t const F_OFLAG = (O_ACCMODE | O_APPEND | O_SYNC); + // available bits + static uint8_t const F_UNUSED = 0X30; + // use unbuffered SD read + static uint8_t const F_FILE_UNBUFFERED_READ = 0X40; + // sync of directory entry required + static uint8_t const F_FILE_DIR_DIRTY = 0X80; + +// make sure F_OFLAG is ok +#if ((F_UNUSED | F_FILE_UNBUFFERED_READ | F_FILE_DIR_DIRTY) & F_OFLAG) +#error flags_ bits conflict +#endif // flags_ bits + + // private data + uint8_t flags_; // See above for definition of flags_ bits + uint8_t type_; // type of file see above for values + uint32_t curCluster_; // cluster for current file position + uint32_t curPosition_; // current file position in bytes from beginning + uint32_t dirBlock_; // SD block that contains directory entry for file + uint8_t dirIndex_; // index of entry in dirBlock 0 <= dirIndex_ <= 0XF + uint32_t fileSize_; // file size in bytes + uint32_t firstCluster_; // first cluster of file + SdVolume* vol_; // volume where file is located + + // private functions + uint8_t addCluster(void); + uint8_t addDirCluster(void); + dir_t* cacheDirEntry(uint8_t action); + static void (*dateTime_)(uint16_t* date, uint16_t* time); + static uint8_t make83Name(const char* str, uint8_t* name); + uint8_t openCachedEntry(uint8_t cacheIndex, uint8_t oflags); + dir_t* readDirCache(void); +}; +//============================================================================== +// SdVolume class +/** + * \brief Cache for an SD data block + */ +union cache_t { + /** Used to access cached file data blocks. */ + uint8_t data[512]; + /** Used to access cached FAT16 entries. */ + uint16_t fat16[256]; + /** Used to access cached FAT32 entries. */ + uint32_t fat32[128]; + /** Used to access cached directory entries. */ + dir_t dir[16]; + /** Used to access a cached MasterBoot Record. */ + mbr_t mbr; + /** Used to access to a cached FAT boot sector. */ + fbs_t fbs; +}; +//------------------------------------------------------------------------------ +/** + * \class SdVolume + * \brief Access FAT16 and FAT32 volumes on SD and SDHC cards. + */ +class SdVolume { + public: + /** Create an instance of SdVolume */ + SdVolume(void) :allocSearchStart_(2), fatType_(0) {} + /** Clear the cache and returns a pointer to the cache. Used by the WaveRP + * recorder to do raw write to the SD card. Not for normal apps. + */ + static uint8_t* cacheClear(void) { + cacheFlush(); + cacheBlockNumber_ = 0XFFFFFFFF; + return cacheBuffer_.data; + } + /** + * Initialize a FAT volume. Try partition one first then try super + * floppy format. + * + * \param[in] dev The Sd2Card where the volume is located. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. Reasons for + * failure include not finding a valid partition, not finding a valid + * FAT file system or an I/O error. + */ + uint8_t init(Sd2Card* dev) { return init(dev, 1) ? true : init(dev, 0);} + uint8_t init(Sd2Card* dev, uint8_t part); + + // inline functions that return volume info + /** \return The volume's cluster size in blocks. */ + uint8_t blocksPerCluster(void) const {return blocksPerCluster_;} + /** \return The number of blocks in one FAT. */ + uint32_t blocksPerFat(void) const {return blocksPerFat_;} + /** \return The total number of clusters in the volume. */ + uint32_t clusterCount(void) const {return clusterCount_;} + /** \return The shift count required to multiply by blocksPerCluster. */ + uint8_t clusterSizeShift(void) const {return clusterSizeShift_;} + /** \return The logical block number for the start of file data. */ + uint32_t dataStartBlock(void) const {return dataStartBlock_;} + /** \return The number of FAT structures on the volume. */ + uint8_t fatCount(void) const {return fatCount_;} + /** \return The logical block number for the start of the first FAT. */ + uint32_t fatStartBlock(void) const {return fatStartBlock_;} + /** \return The FAT type of the volume. Values are 12, 16 or 32. */ + uint8_t fatType(void) const {return fatType_;} + /** \return The number of entries in the root directory for FAT16 volumes. */ + uint32_t rootDirEntryCount(void) const {return rootDirEntryCount_;} + /** \return The logical block number for the start of the root directory + on FAT16 volumes or the first cluster number on FAT32 volumes. */ + uint32_t rootDirStart(void) const {return rootDirStart_;} + /** return a pointer to the Sd2Card object for this volume */ + static Sd2Card* sdCard(void) {return sdCard_;} +//------------------------------------------------------------------------------ +#if ALLOW_DEPRECATED_FUNCTIONS + // Deprecated functions - suppress cpplint warnings with NOLINT comment + /** \deprecated Use: uint8_t SdVolume::init(Sd2Card* dev); */ + uint8_t init(Sd2Card& dev) {return init(&dev);} // NOLINT + + /** \deprecated Use: uint8_t SdVolume::init(Sd2Card* dev, uint8_t vol); */ + uint8_t init(Sd2Card& dev, uint8_t part) { // NOLINT + return init(&dev, part); + } +#endif // ALLOW_DEPRECATED_FUNCTIONS +//------------------------------------------------------------------------------ + private: + // Allow SdFile access to SdVolume private data. + friend class SdFile; + + // value for action argument in cacheRawBlock to indicate read from cache + static uint8_t const CACHE_FOR_READ = 0; + // value for action argument in cacheRawBlock to indicate cache dirty + static uint8_t const CACHE_FOR_WRITE = 1; + + static cache_t cacheBuffer_; // 512 byte cache for device blocks + static uint32_t cacheBlockNumber_; // Logical number of block in the cache + static Sd2Card* sdCard_; // Sd2Card object for cache + static uint8_t cacheDirty_; // cacheFlush() will write block if true + static uint32_t cacheMirrorBlock_; // block number for mirror FAT +// + uint32_t allocSearchStart_; // start cluster for alloc search + uint8_t blocksPerCluster_; // cluster size in blocks + uint32_t blocksPerFat_; // FAT size in blocks + uint32_t clusterCount_; // clusters in one FAT + uint8_t clusterSizeShift_; // shift to convert cluster count to block count + uint32_t dataStartBlock_; // first data block number + uint8_t fatCount_; // number of FATs on volume + uint32_t fatStartBlock_; // start block for first FAT + uint8_t fatType_; // volume type (12, 16, OR 32) + uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir + uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 + //---------------------------------------------------------------------------- + uint8_t allocContiguous(uint32_t count, uint32_t* curCluster); + uint8_t blockOfCluster(uint32_t position) const { + return (position >> 9) & (blocksPerCluster_ - 1);} + uint32_t clusterStartBlock(uint32_t cluster) const { + return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} + uint32_t blockNumber(uint32_t cluster, uint32_t position) const { + return clusterStartBlock(cluster) + blockOfCluster(position);} + static uint8_t cacheFlush(void); + static uint8_t cacheRawBlock(uint32_t blockNumber, uint8_t action); + static void cacheSetDirty(void) {cacheDirty_ |= CACHE_FOR_WRITE;} + static uint8_t cacheZeroBlock(uint32_t blockNumber); + uint8_t chainSize(uint32_t beginCluster, uint32_t* size) const; + uint8_t fatGet(uint32_t cluster, uint32_t* value) const; + uint8_t fatPut(uint32_t cluster, uint32_t value); + uint8_t fatPutEOC(uint32_t cluster) { + return fatPut(cluster, 0x0FFFFFFF); + } + uint8_t freeChain(uint32_t cluster); + uint8_t isEOC(uint32_t cluster) const { + return cluster >= (fatType_ == 16 ? FAT16EOC_MIN : FAT32EOC_MIN); + } + uint8_t readBlock(uint32_t block, uint8_t* dst) { + return sdCard_->readBlock(block, dst);} + uint8_t readData(uint32_t block, uint16_t offset, + uint16_t count, uint8_t* dst) { + return sdCard_->readData(block, offset, count, dst); + } + uint8_t writeBlock(uint32_t block, const uint8_t* dst) { + return sdCard_->writeBlock(block, dst); + } +}; +#endif // SdFat_h diff --git a/books/pdummies/Libraries/SD/utility/SdFatUtil.h b/books/pdummies/Libraries/SD/utility/SdFatUtil.h new file mode 100755 index 0000000..83f753e --- /dev/null +++ b/books/pdummies/Libraries/SD/utility/SdFatUtil.h @@ -0,0 +1,74 @@ +/* Arduino SdFat Library + * Copyright (C) 2008 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdFatUtil_h +#define SdFatUtil_h +/** + * \file + * Useful utility functions. + */ +#if ARDUINO >= 100 + #include "Arduino.h" +#else + #include "WProgram.h" + #include +#endif +/** Store and print a string in flash memory.*/ +#define PgmPrint(x) SerialPrint_P(PSTR(x)) +/** Store and print a string in flash memory followed by a CR/LF.*/ +#define PgmPrintln(x) SerialPrintln_P(PSTR(x)) +/** Defined so doxygen works for function definitions. */ +#define NOINLINE __attribute__((noinline)) +//------------------------------------------------------------------------------ +/** Return the number of bytes currently free in RAM. */ +static int FreeRam(void) { + extern int __bss_end; + extern int* __brkval; + int free_memory; + if (reinterpret_cast(__brkval) == 0) { + // if no heap use from end of bss section + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(&__bss_end); + } else { + // use from top of stack to heap + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(__brkval); + } + return free_memory; +} +//------------------------------------------------------------------------------ +/** + * %Print a string in flash memory to the serial port. + * + * \param[in] str Pointer to string stored in flash memory. + */ +static NOINLINE void SerialPrint_P(PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) Serial.print(c); +} +//------------------------------------------------------------------------------ +/** + * %Print a string in flash memory followed by a CR/LF. + * + * \param[in] str Pointer to string stored in flash memory. + */ +static NOINLINE void SerialPrintln_P(PGM_P str) { + SerialPrint_P(str); + Serial.println(); +} +#endif // #define SdFatUtil_h diff --git a/books/pdummies/Libraries/SD/utility/SdFatmainpage.h b/books/pdummies/Libraries/SD/utility/SdFatmainpage.h new file mode 100755 index 0000000..d26cb85 --- /dev/null +++ b/books/pdummies/Libraries/SD/utility/SdFatmainpage.h @@ -0,0 +1,202 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ + +/** +\mainpage Arduino SdFat Library +
Copyright © 2009 by William Greiman +
+ +\section Intro Introduction +The Arduino SdFat Library is a minimal implementation of FAT16 and FAT32 +file systems on SD flash memory cards. Standard SD and high capacity +SDHC cards are supported. + +The SdFat only supports short 8.3 names. + +The main classes in SdFat are Sd2Card, SdVolume, and SdFile. + +The Sd2Card class supports access to standard SD cards and SDHC cards. Most +applications will only need to call the Sd2Card::init() member function. + +The SdVolume class supports FAT16 and FAT32 partitions. Most applications +will only need to call the SdVolume::init() member function. + +The SdFile class provides file access functions such as open(), read(), +remove(), write(), close() and sync(). This class supports access to the root +directory and subdirectories. + +A number of example are provided in the SdFat/examples folder. These were +developed to test SdFat and illustrate its use. + +SdFat was developed for high speed data recording. SdFat was used to implement +an audio record/play class, WaveRP, for the Adafruit Wave Shield. This +application uses special Sd2Card calls to write to contiguous files in raw mode. +These functions reduce write latency so that audio can be recorded with the +small amount of RAM in the Arduino. + +\section SDcard SD\SDHC Cards + +Arduinos access SD cards using the cards SPI protocol. PCs, Macs, and +most consumer devices use the 4-bit parallel SD protocol. A card that +functions well on A PC or Mac may not work well on the Arduino. + +Most cards have good SPI read performance but cards vary widely in SPI +write performance. Write performance is limited by how efficiently the +card manages internal erase/remapping operations. The Arduino cannot +optimize writes to reduce erase operations because of its limit RAM. + +SanDisk cards generally have good write performance. They seem to have +more internal RAM buffering than other cards and therefore can limit +the number of flash erase operations that the Arduino forces due to its +limited RAM. + +\section Hardware Hardware Configuration + +SdFat was developed using an + Adafruit Industries + Wave Shield. + +The hardware interface to the SD card should not use a resistor based level +shifter. SdFat sets the SPI bus frequency to 8 MHz which results in signal +rise times that are too slow for the edge detectors in many newer SD card +controllers when resistor voltage dividers are used. + +The 5 to 3.3 V level shifter for 5 V Arduinos should be IC based like the +74HC4050N based circuit shown in the file SdLevel.png. The Adafruit Wave Shield +uses a 74AHC125N. Gravitech sells SD and MicroSD Card Adapters based on the +74LCX245. + +If you are using a resistor based level shifter and are having problems try +setting the SPI bus frequency to 4 MHz. This can be done by using +card.init(SPI_HALF_SPEED) to initialize the SD card. + +\section comment Bugs and Comments + +If you wish to report bugs or have comments, send email to fat16lib@sbcglobal.net. + +\section SdFatClass SdFat Usage + +SdFat uses a slightly restricted form of short names. +Only printable ASCII characters are supported. No characters with code point +values greater than 127 are allowed. Space is not allowed even though space +was allowed in the API of early versions of DOS. + +Short names are limited to 8 characters followed by an optional period (.) +and extension of up to 3 characters. The characters may be any combination +of letters and digits. The following special characters are also allowed: + +$ % ' - _ @ ~ ` ! ( ) { } ^ # & + +Short names are always converted to upper case and their original case +value is lost. + +\note + The Arduino Print class uses character +at a time writes so it was necessary to use a \link SdFile::sync() sync() \endlink +function to control when data is written to the SD card. + +\par +An application which writes to a file using \link Print::print() print()\endlink, +\link Print::println() println() \endlink +or \link SdFile::write write() \endlink must call \link SdFile::sync() sync() \endlink +at the appropriate time to force data and directory information to be written +to the SD Card. Data and directory information are also written to the SD card +when \link SdFile::close() close() \endlink is called. + +\par +Applications must use care calling \link SdFile::sync() sync() \endlink +since 2048 bytes of I/O is required to update file and +directory information. This includes writing the current data block, reading +the block that contains the directory entry for update, writing the directory +block back and reading back the current data block. + +It is possible to open a file with two or more instances of SdFile. A file may +be corrupted if data is written to the file by more than one instance of SdFile. + +\section HowTo How to format SD Cards as FAT Volumes + +You should use a freshly formatted SD card for best performance. FAT +file systems become slower if many files have been created and deleted. +This is because the directory entry for a deleted file is marked as deleted, +but is not deleted. When a new file is created, these entries must be scanned +before creating the file, a flaw in the FAT design. Also files can become +fragmented which causes reads and writes to be slower. + +Microsoft operating systems support removable media formatted with a +Master Boot Record, MBR, or formatted as a super floppy with a FAT Boot Sector +in block zero. + +Microsoft operating systems expect MBR formatted removable media +to have only one partition. The first partition should be used. + +Microsoft operating systems do not support partitioning SD flash cards. +If you erase an SD card with a program like KillDisk, Most versions of +Windows will format the card as a super floppy. + +The best way to restore an SD card's format is to use SDFormatter +which can be downloaded from: + +http://www.sdcard.org/consumers/formatter/ + +SDFormatter aligns flash erase boundaries with file +system structures which reduces write latency and file system overhead. + +SDFormatter does not have an option for FAT type so it may format +small cards as FAT12. + +After the MBR is restored by SDFormatter you may need to reformat small +cards that have been formatted FAT12 to force the volume type to be FAT16. + +If you reformat the SD card with an OS utility, choose a cluster size that +will result in: + +4084 < CountOfClusters && CountOfClusters < 65525 + +The volume will then be FAT16. + +If you are formatting an SD card on OS X or Linux, be sure to use the first +partition. Format this partition with a cluster count in above range. + +\section References References + +Adafruit Industries: + +http://www.adafruit.com/ + +http://www.ladyada.net/make/waveshield/ + +The Arduino site: + +http://www.arduino.cc/ + +For more information about FAT file systems see: + +http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + +For information about using SD cards as SPI devices see: + +http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf + +The ATmega328 datasheet: + +http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf + + + */ diff --git a/books/pdummies/Libraries/SD/utility/SdFile.cpp b/books/pdummies/Libraries/SD/utility/SdFile.cpp new file mode 100755 index 0000000..a90ee1d --- /dev/null +++ b/books/pdummies/Libraries/SD/utility/SdFile.cpp @@ -0,0 +1,1276 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +#include +#if ARDUINO >= 100 + #include "Arduino.h" +#else + #include "WProgram.h" +#endif +//------------------------------------------------------------------------------ +// callback function for date/time +void (*SdFile::dateTime_)(uint16_t* date, uint16_t* time) = NULL; + +#if ALLOW_DEPRECATED_FUNCTIONS +// suppress cpplint warnings with NOLINT comment +void (*SdFile::oldDateTime_)(uint16_t& date, uint16_t& time) = NULL; // NOLINT +#endif // ALLOW_DEPRECATED_FUNCTIONS +//------------------------------------------------------------------------------ +// add a cluster to a file +uint8_t SdFile::addCluster() { + if (!vol_->allocContiguous(1, &curCluster_)) return false; + + // if first cluster of file link to directory entry + if (firstCluster_ == 0) { + firstCluster_ = curCluster_; + flags_ |= F_FILE_DIR_DIRTY; + } + return true; +} +//------------------------------------------------------------------------------ +// Add a cluster to a directory file and zero the cluster. +// return with first block of cluster in the cache +uint8_t SdFile::addDirCluster(void) { + if (!addCluster()) return false; + + // zero data in cluster insure first cluster is in cache + uint32_t block = vol_->clusterStartBlock(curCluster_); + for (uint8_t i = vol_->blocksPerCluster_; i != 0; i--) { + if (!SdVolume::cacheZeroBlock(block + i - 1)) return false; + } + // Increase directory file size by cluster size + fileSize_ += 512UL << vol_->clusterSizeShift_; + return true; +} +//------------------------------------------------------------------------------ +// cache a file's directory entry +// return pointer to cached entry or null for failure +dir_t* SdFile::cacheDirEntry(uint8_t action) { + if (!SdVolume::cacheRawBlock(dirBlock_, action)) return NULL; + return SdVolume::cacheBuffer_.dir + dirIndex_; +} +//------------------------------------------------------------------------------ +/** + * Close a file and force cached data and directory information + * to be written to the storage device. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include no file is open or an I/O error. + */ +uint8_t SdFile::close(void) { + if (!sync())return false; + type_ = FAT_FILE_TYPE_CLOSED; + return true; +} +//------------------------------------------------------------------------------ +/** + * Check for contiguous file and return its raw block range. + * + * \param[out] bgnBlock the first block address for the file. + * \param[out] endBlock the last block address for the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include file is not contiguous, file has zero length + * or an I/O error occurred. + */ +uint8_t SdFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { + // error if no blocks + if (firstCluster_ == 0) return false; + + for (uint32_t c = firstCluster_; ; c++) { + uint32_t next; + if (!vol_->fatGet(c, &next)) return false; + + // check for contiguous + if (next != (c + 1)) { + // error if not end of chain + if (!vol_->isEOC(next)) return false; + *bgnBlock = vol_->clusterStartBlock(firstCluster_); + *endBlock = vol_->clusterStartBlock(c) + + vol_->blocksPerCluster_ - 1; + return true; + } + } +} +//------------------------------------------------------------------------------ +/** + * Create and open a new contiguous file of a specified size. + * + * \note This function only supports short DOS 8.3 names. + * See open() for more information. + * + * \param[in] dirFile The directory where the file will be created. + * \param[in] fileName A valid DOS 8.3 file name. + * \param[in] size The desired file size. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include \a fileName contains + * an invalid DOS 8.3 file name, the FAT volume has not been initialized, + * a file is already open, the file already exists, the root + * directory is full or an I/O error. + * + */ +uint8_t SdFile::createContiguous(SdFile* dirFile, + const char* fileName, uint32_t size) { + // don't allow zero length file + if (size == 0) return false; + if (!open(dirFile, fileName, O_CREAT | O_EXCL | O_RDWR)) return false; + + // calculate number of clusters needed + uint32_t count = ((size - 1) >> (vol_->clusterSizeShift_ + 9)) + 1; + + // allocate clusters + if (!vol_->allocContiguous(count, &firstCluster_)) { + remove(); + return false; + } + fileSize_ = size; + + // insure sync() will update dir entry + flags_ |= F_FILE_DIR_DIRTY; + return sync(); +} +//------------------------------------------------------------------------------ +/** + * Return a files directory entry + * + * \param[out] dir Location for return of the files directory entry. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::dirEntry(dir_t* dir) { + // make sure fields on SD are correct + if (!sync()) return false; + + // read entry + dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + if (!p) return false; + + // copy to caller's struct + memcpy(dir, p, sizeof(dir_t)); + return true; +} +//------------------------------------------------------------------------------ +/** + * Format the name field of \a dir into the 13 byte array + * \a name in standard 8.3 short name format. + * + * \param[in] dir The directory structure containing the name. + * \param[out] name A 13 byte char array for the formatted name. + */ +void SdFile::dirName(const dir_t& dir, char* name) { + uint8_t j = 0; + for (uint8_t i = 0; i < 11; i++) { + if (dir.name[i] == ' ')continue; + if (i == 8) name[j++] = '.'; + name[j++] = dir.name[i]; + } + name[j] = 0; +} +//------------------------------------------------------------------------------ +/** List directory contents to Serial. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + * + * \param[in] indent Amount of space before file name. Used for recursive + * list to indicate subdirectory level. + */ +void SdFile::ls(uint8_t flags, uint8_t indent) { + dir_t* p; + + rewind(); + while ((p = readDirCache())) { + // done if past last used entry + if (p->name[0] == DIR_NAME_FREE) break; + + // skip deleted entry and entries for . and .. + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + + // only list subdirectories and files + if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; + + // print any indent spaces + for (int8_t i = 0; i < indent; i++) Serial.print(' '); + + // print file name with possible blank fill + printDirName(*p, flags & (LS_DATE | LS_SIZE) ? 14 : 0); + + // print modify date/time if requested + if (flags & LS_DATE) { + printFatDate(p->lastWriteDate); + Serial.print(' '); + printFatTime(p->lastWriteTime); + } + // print size if requested + if (!DIR_IS_SUBDIR(p) && (flags & LS_SIZE)) { + Serial.print(' '); + Serial.print(p->fileSize); + } + Serial.println(); + + // list subdirectory content if requested + if ((flags & LS_R) && DIR_IS_SUBDIR(p)) { + uint16_t index = curPosition()/32 - 1; + SdFile s; + if (s.open(this, index, O_READ)) s.ls(flags, indent + 2); + seekSet(32 * (index + 1)); + } + } +} +//------------------------------------------------------------------------------ +// format directory name field from a 8.3 name string +uint8_t SdFile::make83Name(const char* str, uint8_t* name) { + uint8_t c; + uint8_t n = 7; // max index for part before dot + uint8_t i = 0; + // blank fill name and extension + while (i < 11) name[i++] = ' '; + i = 0; + while ((c = *str++) != '\0') { + if (c == '.') { + if (n == 10) return false; // only one dot allowed + n = 10; // max index for full 8.3 name + i = 8; // place for extension + } else { + // illegal FAT characters + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + uint8_t b; + while ((b = pgm_read_byte(p++))) if (b == c) return false; + // check size and only allow ASCII printable characters + if (i > n || c < 0X21 || c > 0X7E)return false; + // only upper case allowed in 8.3 names - convert lower to upper + name[i++] = c < 'a' || c > 'z' ? c : c + ('A' - 'a'); + } + } + // must have a file name, extension is optional + return name[0] != ' '; +} +//------------------------------------------------------------------------------ +/** Make a new directory. + * + * \param[in] dir An open SdFat instance for the directory that will containing + * the new directory. + * + * \param[in] dirName A valid 8.3 DOS name for the new directory. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include this SdFile is already open, \a dir is not a + * directory, \a dirName is invalid or already exists in \a dir. + */ +uint8_t SdFile::makeDir(SdFile* dir, const char* dirName) { + dir_t d; + + // create a normal file + if (!open(dir, dirName, O_CREAT | O_EXCL | O_RDWR)) return false; + + // convert SdFile to directory + flags_ = O_READ; + type_ = FAT_FILE_TYPE_SUBDIR; + + // allocate and zero first cluster + if (!addDirCluster())return false; + + // force entry to SD + if (!sync()) return false; + + // cache entry - should already be in cache due to sync() call + dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) return false; + + // change directory entry attribute + p->attributes = DIR_ATT_DIRECTORY; + + // make entry for '.' + memcpy(&d, p, sizeof(d)); + for (uint8_t i = 1; i < 11; i++) d.name[i] = ' '; + d.name[0] = '.'; + + // cache block for '.' and '..' + uint32_t block = vol_->clusterStartBlock(firstCluster_); + if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) return false; + + // copy '.' to block + memcpy(&SdVolume::cacheBuffer_.dir[0], &d, sizeof(d)); + + // make entry for '..' + d.name[1] = '.'; + if (dir->isRoot()) { + d.firstClusterLow = 0; + d.firstClusterHigh = 0; + } else { + d.firstClusterLow = dir->firstCluster_ & 0XFFFF; + d.firstClusterHigh = dir->firstCluster_ >> 16; + } + // copy '..' to block + memcpy(&SdVolume::cacheBuffer_.dir[1], &d, sizeof(d)); + + // set position after '..' + curPosition_ = 2 * sizeof(d); + + // write first block + return SdVolume::cacheFlush(); +} +//------------------------------------------------------------------------------ +/** + * Open a file or directory by name. + * + * \param[in] dirFile An open SdFat instance for the directory containing the + * file to be opened. + * + * \param[in] fileName A valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * O_READ - Open for reading. + * + * O_RDONLY - Same as O_READ. + * + * O_WRITE - Open for writing. + * + * O_WRONLY - Same as O_WRITE. + * + * O_RDWR - Open for reading and writing. + * + * O_APPEND - If set, the file offset shall be set to the end of the + * file prior to each write. + * + * O_CREAT - If the file exists, this flag has no effect except as noted + * under O_EXCL below. Otherwise, the file shall be created + * + * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. + * + * O_SYNC - Call sync() after each write. This flag should not be used with + * write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. + * These functions do character at a time writes so sync() will be called + * after each byte. + * + * O_TRUNC - If the file exists and is a regular file, and the file is + * successfully opened and is not read only, its length shall be truncated to 0. + * + * \note Directory files must be opened read only. Write and truncation is + * not allowed for directory files. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include this SdFile is already open, \a difFile is not + * a directory, \a fileName is invalid, the file does not exist + * or can't be opened in the access mode specified by oflag. + */ +uint8_t SdFile::open(SdFile* dirFile, const char* fileName, uint8_t oflag) { + uint8_t dname[11]; + dir_t* p; + + // error if already open + if (isOpen())return false; + + if (!make83Name(fileName, dname)) return false; + vol_ = dirFile->vol_; + dirFile->rewind(); + + // bool for empty entry found + uint8_t emptyFound = false; + + // search for file + while (dirFile->curPosition_ < dirFile->fileSize_) { + uint8_t index = 0XF & (dirFile->curPosition_ >> 5); + p = dirFile->readDirCache(); + if (p == NULL) return false; + + if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { + // remember first empty slot + if (!emptyFound) { + emptyFound = true; + dirIndex_ = index; + dirBlock_ = SdVolume::cacheBlockNumber_; + } + // done if no entries follow + if (p->name[0] == DIR_NAME_FREE) break; + } else if (!memcmp(dname, p->name, 11)) { + // don't open existing file if O_CREAT and O_EXCL + if ((oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) return false; + + // open found file + return openCachedEntry(0XF & index, oflag); + } + } + // only create file if O_CREAT and O_WRITE + if ((oflag & (O_CREAT | O_WRITE)) != (O_CREAT | O_WRITE)) return false; + + // cache found slot or add cluster if end of file + if (emptyFound) { + p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) return false; + } else { + if (dirFile->type_ == FAT_FILE_TYPE_ROOT16) return false; + + // add and zero cluster for dirFile - first cluster is in cache for write + if (!dirFile->addDirCluster()) return false; + + // use first entry in cluster + dirIndex_ = 0; + p = SdVolume::cacheBuffer_.dir; + } + // initialize as empty file + memset(p, 0, sizeof(dir_t)); + memcpy(p->name, dname, 11); + + // set timestamps + if (dateTime_) { + // call user function + dateTime_(&p->creationDate, &p->creationTime); + } else { + // use default date/time + p->creationDate = FAT_DEFAULT_DATE; + p->creationTime = FAT_DEFAULT_TIME; + } + p->lastAccessDate = p->creationDate; + p->lastWriteDate = p->creationDate; + p->lastWriteTime = p->creationTime; + + // force write of entry to SD + if (!SdVolume::cacheFlush()) return false; + + // open entry in cache + return openCachedEntry(dirIndex_, oflag); +} +//------------------------------------------------------------------------------ +/** + * Open a file by index. + * + * \param[in] dirFile An open SdFat instance for the directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. + * + * See open() by fileName for definition of flags and return values. + * + */ +uint8_t SdFile::open(SdFile* dirFile, uint16_t index, uint8_t oflag) { + // error if already open + if (isOpen())return false; + + // don't open existing file if O_CREAT and O_EXCL - user call error + if ((oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) return false; + + vol_ = dirFile->vol_; + + // seek to location of entry + if (!dirFile->seekSet(32 * index)) return false; + + // read entry into cache + dir_t* p = dirFile->readDirCache(); + if (p == NULL) return false; + + // error if empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_FREE || + p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { + return false; + } + // open cached entry + return openCachedEntry(index & 0XF, oflag); +} +//------------------------------------------------------------------------------ +// open a cached directory entry. Assumes vol_ is initializes +uint8_t SdFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { + // location of entry in cache + dir_t* p = SdVolume::cacheBuffer_.dir + dirIndex; + + // write or truncate is an error for a directory or read-only file + if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { + if (oflag & (O_WRITE | O_TRUNC)) return false; + } + // remember location of directory entry on SD + dirIndex_ = dirIndex; + dirBlock_ = SdVolume::cacheBlockNumber_; + + // copy first cluster number for directory fields + firstCluster_ = (uint32_t)p->firstClusterHigh << 16; + firstCluster_ |= p->firstClusterLow; + + // make sure it is a normal file or subdirectory + if (DIR_IS_FILE(p)) { + fileSize_ = p->fileSize; + type_ = FAT_FILE_TYPE_NORMAL; + } else if (DIR_IS_SUBDIR(p)) { + if (!vol_->chainSize(firstCluster_, &fileSize_)) return false; + type_ = FAT_FILE_TYPE_SUBDIR; + } else { + return false; + } + // save open flags for read/write + flags_ = oflag & (O_ACCMODE | O_SYNC | O_APPEND); + + // set to start of file + curCluster_ = 0; + curPosition_ = 0; + + // truncate file to zero length if requested + if (oflag & O_TRUNC) return truncate(0); + return true; +} +//------------------------------------------------------------------------------ +/** + * Open a volume's root directory. + * + * \param[in] vol The FAT volume containing the root directory to be opened. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the FAT volume has not been initialized + * or it a FAT12 volume. + */ +uint8_t SdFile::openRoot(SdVolume* vol) { + // error if file is already open + if (isOpen()) return false; + + if (vol->fatType() == 16) { + type_ = FAT_FILE_TYPE_ROOT16; + firstCluster_ = 0; + fileSize_ = 32 * vol->rootDirEntryCount(); + } else if (vol->fatType() == 32) { + type_ = FAT_FILE_TYPE_ROOT32; + firstCluster_ = vol->rootDirStart(); + if (!vol->chainSize(firstCluster_, &fileSize_)) return false; + } else { + // volume is not initialized or FAT12 + return false; + } + vol_ = vol; + // read only + flags_ = O_READ; + + // set to start of file + curCluster_ = 0; + curPosition_ = 0; + + // root has no directory entry + dirBlock_ = 0; + dirIndex_ = 0; + return true; +} +//------------------------------------------------------------------------------ +/** %Print the name field of a directory entry in 8.3 format to Serial. + * + * \param[in] dir The directory structure containing the name. + * \param[in] width Blank fill name if length is less than \a width. + */ +void SdFile::printDirName(const dir_t& dir, uint8_t width) { + uint8_t w = 0; + for (uint8_t i = 0; i < 11; i++) { + if (dir.name[i] == ' ')continue; + if (i == 8) { + Serial.print('.'); + w++; + } +#if ARDUINO >= 100 + Serial.write(dir.name[i]); +#else + Serial.print(dir.name[i]); +#endif + w++; + } + if (DIR_IS_SUBDIR(&dir)) { + Serial.print('/'); + w++; + } + while (w < width) { + Serial.print(' '); + w++; + } +} +//------------------------------------------------------------------------------ +/** %Print a directory date field to Serial. + * + * Format is yyyy-mm-dd. + * + * \param[in] fatDate The date field from a directory entry. + */ +void SdFile::printFatDate(uint16_t fatDate) { + Serial.print(FAT_YEAR(fatDate)); + Serial.print('-'); + printTwoDigits(FAT_MONTH(fatDate)); + Serial.print('-'); + printTwoDigits(FAT_DAY(fatDate)); +} +//------------------------------------------------------------------------------ +/** %Print a directory time field to Serial. + * + * Format is hh:mm:ss. + * + * \param[in] fatTime The time field from a directory entry. + */ +void SdFile::printFatTime(uint16_t fatTime) { + printTwoDigits(FAT_HOUR(fatTime)); + Serial.print(':'); + printTwoDigits(FAT_MINUTE(fatTime)); + Serial.print(':'); + printTwoDigits(FAT_SECOND(fatTime)); +} +//------------------------------------------------------------------------------ +/** %Print a value as two digits to Serial. + * + * \param[in] v Value to be printed, 0 <= \a v <= 99 + */ +void SdFile::printTwoDigits(uint8_t v) { + char str[3]; + str[0] = '0' + v/10; + str[1] = '0' + v % 10; + str[2] = 0; + Serial.print(str); +} +//------------------------------------------------------------------------------ +/** + * Read data from a file starting at the current position. + * + * \param[out] buf Pointer to the location that will receive the data. + * + * \param[in] nbyte Maximum number of bytes to read. + * + * \return For success read() returns the number of bytes read. + * A value less than \a nbyte, including zero, will be returned + * if end of file is reached. + * If an error occurs, read() returns -1. Possible errors include + * read() called before a file has been opened, corrupt file system + * or an I/O error occurred. + */ +int16_t SdFile::read(void* buf, uint16_t nbyte) { + uint8_t* dst = reinterpret_cast(buf); + + // error if not open or write only + if (!isOpen() || !(flags_ & O_READ)) return -1; + + // max bytes left in file + if (nbyte > (fileSize_ - curPosition_)) nbyte = fileSize_ - curPosition_; + + // amount left to read + uint16_t toRead = nbyte; + while (toRead > 0) { + uint32_t block; // raw device block number + uint16_t offset = curPosition_ & 0X1FF; // offset in block + if (type_ == FAT_FILE_TYPE_ROOT16) { + block = vol_->rootDirStart() + (curPosition_ >> 9); + } else { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + if (offset == 0 && blockOfCluster == 0) { + // start of new cluster + if (curPosition_ == 0) { + // use first cluster in file + curCluster_ = firstCluster_; + } else { + // get next cluster from FAT + if (!vol_->fatGet(curCluster_, &curCluster_)) return -1; + } + } + block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + } + uint16_t n = toRead; + + // amount to be read from current block + if (n > (512 - offset)) n = 512 - offset; + + // no buffering needed if n == 512 or user requests no buffering + if ((unbufferedRead() || n == 512) && + block != SdVolume::cacheBlockNumber_) { + if (!vol_->readData(block, offset, n, dst)) return -1; + dst += n; + } else { + // read block to cache and copy data to caller + if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) return -1; + uint8_t* src = SdVolume::cacheBuffer_.data + offset; + uint8_t* end = src + n; + while (src != end) *dst++ = *src++; + } + curPosition_ += n; + toRead -= n; + } + return nbyte; +} +//------------------------------------------------------------------------------ +/** + * Read the next directory entry from a directory file. + * + * \param[out] dir The dir_t struct that will receive the data. + * + * \return For success readDir() returns the number of bytes read. + * A value of zero will be returned if end of file is reached. + * If an error occurs, readDir() returns -1. Possible errors include + * readDir() called before a directory has been opened, this is not + * a directory file or an I/O error occurred. + */ +int8_t SdFile::readDir(dir_t* dir) { + int8_t n; + // if not a directory file or miss-positioned return an error + if (!isDir() || (0X1F & curPosition_)) return -1; + + while ((n = read(dir, sizeof(dir_t))) == sizeof(dir_t)) { + // last entry if DIR_NAME_FREE + if (dir->name[0] == DIR_NAME_FREE) break; + // skip empty entries and entry for . and .. + if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; + // return if normal file or subdirectory + if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; + } + // error, end of file, or past last entry + return n < 0 ? -1 : 0; +} +//------------------------------------------------------------------------------ +// Read next directory entry into the cache +// Assumes file is correctly positioned +dir_t* SdFile::readDirCache(void) { + // error if not directory + if (!isDir()) return NULL; + + // index of entry in cache + uint8_t i = (curPosition_ >> 5) & 0XF; + + // use read to locate and cache block + if (read() < 0) return NULL; + + // advance to next entry + curPosition_ += 31; + + // return pointer to entry + return (SdVolume::cacheBuffer_.dir + i); +} +//------------------------------------------------------------------------------ +/** + * Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file read-only, is a directory, + * or an I/O error occurred. + */ +uint8_t SdFile::remove(void) { + // free any clusters - will fail if read-only or directory + if (!truncate(0)) return false; + + // cache directory entry + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // mark entry deleted + d->name[0] = DIR_NAME_DELETED; + + // set this SdFile closed + type_ = FAT_FILE_TYPE_CLOSED; + + // write entry to SD + return SdVolume::cacheFlush(); +} +//------------------------------------------------------------------------------ +/** + * Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \param[in] dirFile The directory that contains the file. + * \param[in] fileName The name of the file to be removed. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file is a directory, is read only, + * \a dirFile is not a directory, \a fileName is not found + * or an I/O error occurred. + */ +uint8_t SdFile::remove(SdFile* dirFile, const char* fileName) { + SdFile file; + if (!file.open(dirFile, fileName, O_WRITE)) return false; + return file.remove(); +} +//------------------------------------------------------------------------------ +/** Remove a directory file. + * + * The directory file will be removed only if it is empty and is not the + * root directory. rmDir() follows DOS and Windows and ignores the + * read-only attribute for the directory. + * + * \note This function should not be used to delete the 8.3 version of a + * directory that has a long name. For example if a directory has the + * long name "New folder" you should not delete the 8.3 name "NEWFOL~1". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file is not a directory, is the root + * directory, is not empty, or an I/O error occurred. + */ +uint8_t SdFile::rmDir(void) { + // must be open subdirectory + if (!isSubDir()) return false; + + rewind(); + + // make sure directory is empty + while (curPosition_ < fileSize_) { + dir_t* p = readDirCache(); + if (p == NULL) return false; + // done if past last used entry + if (p->name[0] == DIR_NAME_FREE) break; + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + // error not empty + if (DIR_IS_FILE_OR_SUBDIR(p)) return false; + } + // convert empty directory to normal file for remove + type_ = FAT_FILE_TYPE_NORMAL; + flags_ |= O_WRITE; + return remove(); +} +//------------------------------------------------------------------------------ +/** Recursively delete a directory and all contained files. + * + * This is like the Unix/Linux 'rm -rf *' if called with the root directory + * hence the name. + * + * Warning - This will remove all contents of the directory including + * subdirectories. The directory will then be removed if it is not root. + * The read-only attribute for files will be ignored. + * + * \note This function should not be used to delete the 8.3 version of + * a directory that has a long name. See remove() and rmDir(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::rmRfStar(void) { + rewind(); + while (curPosition_ < fileSize_) { + SdFile f; + + // remember position + uint16_t index = curPosition_/32; + + dir_t* p = readDirCache(); + if (!p) return false; + + // done if past last entry + if (p->name[0] == DIR_NAME_FREE) break; + + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + + // skip if part of long file name or volume label in root + if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; + + if (!f.open(this, index, O_READ)) return false; + if (f.isSubDir()) { + // recursively delete + if (!f.rmRfStar()) return false; + } else { + // ignore read-only + f.flags_ |= O_WRITE; + if (!f.remove()) return false; + } + // position to next entry if required + if (curPosition_ != (32*(index + 1))) { + if (!seekSet(32*(index + 1))) return false; + } + } + // don't try to delete root + if (isRoot()) return true; + return rmDir(); +} +//------------------------------------------------------------------------------ +/** + * Sets a file's position. + * + * \param[in] pos The new position in bytes from the beginning of the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::seekSet(uint32_t pos) { + // error if file not open or seek past end of file + if (!isOpen() || pos > fileSize_) return false; + + if (type_ == FAT_FILE_TYPE_ROOT16) { + curPosition_ = pos; + return true; + } + if (pos == 0) { + // set position to start of file + curCluster_ = 0; + curPosition_ = 0; + return true; + } + // calculate cluster index for cur and new position + uint32_t nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); + uint32_t nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); + + if (nNew < nCur || curPosition_ == 0) { + // must follow chain from first cluster + curCluster_ = firstCluster_; + } else { + // advance from curPosition + nNew -= nCur; + } + while (nNew--) { + if (!vol_->fatGet(curCluster_, &curCluster_)) return false; + } + curPosition_ = pos; + return true; +} +//------------------------------------------------------------------------------ +/** + * The sync() call causes all modified data and directory fields + * to be written to the storage device. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include a call to sync() before a file has been + * opened or an I/O error. + */ +uint8_t SdFile::sync(void) { + // only allow open files and directories + if (!isOpen()) return false; + + if (flags_ & F_FILE_DIR_DIRTY) { + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // do not set filesize for dir files + if (!isDir()) d->fileSize = fileSize_; + + // update first cluster fields + d->firstClusterLow = firstCluster_ & 0XFFFF; + d->firstClusterHigh = firstCluster_ >> 16; + + // set modify time if user supplied a callback date/time function + if (dateTime_) { + dateTime_(&d->lastWriteDate, &d->lastWriteTime); + d->lastAccessDate = d->lastWriteDate; + } + // clear directory dirty + flags_ &= ~F_FILE_DIR_DIRTY; + } + return SdVolume::cacheFlush(); +} +//------------------------------------------------------------------------------ +/** + * Set a file's timestamps in its directory entry. + * + * \param[in] flags Values for \a flags are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * T_ACCESS - Set the file's last access date. + * + * T_CREATE - Set the file's creation date and time. + * + * T_WRITE - Set the file's last write/modification date and time. + * + * \param[in] year Valid range 1980 - 2107 inclusive. + * + * \param[in] month Valid range 1 - 12 inclusive. + * + * \param[in] day Valid range 1 - 31 inclusive. + * + * \param[in] hour Valid range 0 - 23 inclusive. + * + * \param[in] minute Valid range 0 - 59 inclusive. + * + * \param[in] second Valid range 0 - 59 inclusive + * + * \note It is possible to set an invalid date since there is no check for + * the number of days in a month. + * + * \note + * Modify and access timestamps may be overwritten if a date time callback + * function has been set by dateTimeCallback(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, + uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + if (!isOpen() + || year < 1980 + || year > 2107 + || month < 1 + || month > 12 + || day < 1 + || day > 31 + || hour > 23 + || minute > 59 + || second > 59) { + return false; + } + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + uint16_t dirDate = FAT_DATE(year, month, day); + uint16_t dirTime = FAT_TIME(hour, minute, second); + if (flags & T_ACCESS) { + d->lastAccessDate = dirDate; + } + if (flags & T_CREATE) { + d->creationDate = dirDate; + d->creationTime = dirTime; + // seems to be units of 1/100 second not 1/10 as Microsoft states + d->creationTimeTenths = second & 1 ? 100 : 0; + } + if (flags & T_WRITE) { + d->lastWriteDate = dirDate; + d->lastWriteTime = dirTime; + } + SdVolume::cacheSetDirty(); + return sync(); +} +//------------------------------------------------------------------------------ +/** + * Truncate a file to a specified length. The current file position + * will be maintained if it is less than or equal to \a length otherwise + * it will be set to end of file. + * + * \param[in] length The desired length for the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include file is read only, file is a directory, + * \a length is greater than the current file size or an I/O error occurs. + */ +uint8_t SdFile::truncate(uint32_t length) { +// error if not a normal file or read-only + if (!isFile() || !(flags_ & O_WRITE)) return false; + + // error if length is greater than current size + if (length > fileSize_) return false; + + // fileSize and length are zero - nothing to do + if (fileSize_ == 0) return true; + + // remember position for seek after truncation + uint32_t newPos = curPosition_ > length ? length : curPosition_; + + // position to last cluster in truncated file + if (!seekSet(length)) return false; + + if (length == 0) { + // free all clusters + if (!vol_->freeChain(firstCluster_)) return false; + firstCluster_ = 0; + } else { + uint32_t toFree; + if (!vol_->fatGet(curCluster_, &toFree)) return false; + + if (!vol_->isEOC(toFree)) { + // free extra clusters + if (!vol_->freeChain(toFree)) return false; + + // current cluster is end of chain + if (!vol_->fatPutEOC(curCluster_)) return false; + } + } + fileSize_ = length; + + // need to update directory entry + flags_ |= F_FILE_DIR_DIRTY; + + if (!sync()) return false; + + // set file to correct position + return seekSet(newPos); +} +//------------------------------------------------------------------------------ +/** + * Write data to an open file. + * + * \note Data is moved to the cache but may not be written to the + * storage device until sync() is called. + * + * \param[in] buf Pointer to the location of the data to be written. + * + * \param[in] nbyte Number of bytes to write. + * + * \return For success write() returns the number of bytes written, always + * \a nbyte. If an error occurs, write() returns -1. Possible errors + * include write() is called before a file has been opened, write is called + * for a read-only file, device is full, a corrupt file system or an I/O error. + * + */ +#if ARDUINO >= 100 +size_t SdFile::write(const void* buf, uint16_t nbyte) { +#else +int16_t SdFile::write(const void* buf, uint16_t nbyte) { +#endif + // convert void* to uint8_t* - must be before goto statements + const uint8_t* src = reinterpret_cast(buf); + + // number of bytes left to write - must be before goto statements + uint16_t nToWrite = nbyte; + + // error if not a normal file or is read-only + if (!isFile() || !(flags_ & O_WRITE)) goto writeErrorReturn; + + // seek to end of file if append flag + if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { + if (!seekEnd()) goto writeErrorReturn; + } + + while (nToWrite > 0) { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + uint16_t blockOffset = curPosition_ & 0X1FF; + if (blockOfCluster == 0 && blockOffset == 0) { + // start of new cluster + if (curCluster_ == 0) { + if (firstCluster_ == 0) { + // allocate first cluster of file + if (!addCluster()) goto writeErrorReturn; + } else { + curCluster_ = firstCluster_; + } + } else { + uint32_t next; + if (!vol_->fatGet(curCluster_, &next)) return false; + if (vol_->isEOC(next)) { + // add cluster if at end of chain + if (!addCluster()) goto writeErrorReturn; + } else { + curCluster_ = next; + } + } + } + // max space in block + uint16_t n = 512 - blockOffset; + + // lesser of space and amount to write + if (n > nToWrite) n = nToWrite; + + // block for data write + uint32_t block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + if (n == 512) { + // full block - don't need to use cache + // invalidate cache if block is in cache + if (SdVolume::cacheBlockNumber_ == block) { + SdVolume::cacheBlockNumber_ = 0XFFFFFFFF; + } + if (!vol_->writeBlock(block, src)) goto writeErrorReturn; + src += 512; + } else { + if (blockOffset == 0 && curPosition_ >= fileSize_) { + // start of new block don't need to read into cache + if (!SdVolume::cacheFlush()) goto writeErrorReturn; + SdVolume::cacheBlockNumber_ = block; + SdVolume::cacheSetDirty(); + } else { + // rewrite part of block + if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) { + goto writeErrorReturn; + } + } + uint8_t* dst = SdVolume::cacheBuffer_.data + blockOffset; + uint8_t* end = dst + n; + while (dst != end) *dst++ = *src++; + } + nToWrite -= n; + curPosition_ += n; + } + if (curPosition_ > fileSize_) { + // update fileSize and insure sync will update dir entry + fileSize_ = curPosition_; + flags_ |= F_FILE_DIR_DIRTY; + } else if (dateTime_ && nbyte) { + // insure sync will update modified date and time + flags_ |= F_FILE_DIR_DIRTY; + } + + if (flags_ & O_SYNC) { + if (!sync()) goto writeErrorReturn; + } + return nbyte; + + writeErrorReturn: + // return for write error + writeError = true; + return -1; +} +//------------------------------------------------------------------------------ +/** + * Write a byte to a file. Required by the Arduino Print class. + * + * Use SdFile::writeError to check for errors. + */ +#if ARDUINO >= 100 +size_t SdFile::write(uint8_t b) { + return write(&b, 1); +} +#else +void SdFile::write(uint8_t b) { + write(&b, 1); +} +#endif +//------------------------------------------------------------------------------ +/** + * Write a string to a file. Used by the Arduino Print class. + * + * Use SdFile::writeError to check for errors. + */ +#if ARDUINO >= 100 +size_t SdFile::write(const char* str) { + return write(str, strlen(str)); +} +#else +void SdFile::write(const char* str) { + write(str, strlen(str)); +} +#endif +//------------------------------------------------------------------------------ +/** + * Write a PROGMEM string to a file. + * + * Use SdFile::writeError to check for errors. + */ +void SdFile::write_P(PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) write(c); +} +//------------------------------------------------------------------------------ +/** + * Write a PROGMEM string followed by CR/LF to a file. + * + * Use SdFile::writeError to check for errors. + */ +void SdFile::writeln_P(PGM_P str) { + write_P(str); + println(); +} diff --git a/books/pdummies/Libraries/SD/utility/SdInfo.h b/books/pdummies/Libraries/SD/utility/SdInfo.h new file mode 100755 index 0000000..bc4c613 --- /dev/null +++ b/books/pdummies/Libraries/SD/utility/SdInfo.h @@ -0,0 +1,232 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#ifndef SdInfo_h +#define SdInfo_h +#include +// Based on the document: +// +// SD Specifications +// Part 1 +// Physical Layer +// Simplified Specification +// Version 2.00 +// September 25, 2006 +// +// www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf +//------------------------------------------------------------------------------ +// SD card commands +/** GO_IDLE_STATE - init card in spi mode if CS low */ +uint8_t const CMD0 = 0X00; +/** SEND_IF_COND - verify SD Memory Card interface operating condition.*/ +uint8_t const CMD8 = 0X08; +/** SEND_CSD - read the Card Specific Data (CSD register) */ +uint8_t const CMD9 = 0X09; +/** SEND_CID - read the card identification information (CID register) */ +uint8_t const CMD10 = 0X0A; +/** SEND_STATUS - read the card status register */ +uint8_t const CMD13 = 0X0D; +/** READ_BLOCK - read a single data block from the card */ +uint8_t const CMD17 = 0X11; +/** WRITE_BLOCK - write a single data block to the card */ +uint8_t const CMD24 = 0X18; +/** WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION */ +uint8_t const CMD25 = 0X19; +/** ERASE_WR_BLK_START - sets the address of the first block to be erased */ +uint8_t const CMD32 = 0X20; +/** ERASE_WR_BLK_END - sets the address of the last block of the continuous + range to be erased*/ +uint8_t const CMD33 = 0X21; +/** ERASE - erase all previously selected blocks */ +uint8_t const CMD38 = 0X26; +/** APP_CMD - escape for application specific command */ +uint8_t const CMD55 = 0X37; +/** READ_OCR - read the OCR register of a card */ +uint8_t const CMD58 = 0X3A; +/** SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be + pre-erased before writing */ +uint8_t const ACMD23 = 0X17; +/** SD_SEND_OP_COMD - Sends host capacity support information and + activates the card's initialization process */ +uint8_t const ACMD41 = 0X29; +//------------------------------------------------------------------------------ +/** status for card in the ready state */ +uint8_t const R1_READY_STATE = 0X00; +/** status for card in the idle state */ +uint8_t const R1_IDLE_STATE = 0X01; +/** status bit for illegal command */ +uint8_t const R1_ILLEGAL_COMMAND = 0X04; +/** start data token for read or write single block*/ +uint8_t const DATA_START_BLOCK = 0XFE; +/** stop token for write multiple blocks*/ +uint8_t const STOP_TRAN_TOKEN = 0XFD; +/** start data token for write multiple blocks*/ +uint8_t const WRITE_MULTIPLE_TOKEN = 0XFC; +/** mask for data response tokens after a write block operation */ +uint8_t const DATA_RES_MASK = 0X1F; +/** write data accepted token */ +uint8_t const DATA_RES_ACCEPTED = 0X05; +//------------------------------------------------------------------------------ +typedef struct CID { + // byte 0 + uint8_t mid; // Manufacturer ID + // byte 1-2 + char oid[2]; // OEM/Application ID + // byte 3-7 + char pnm[5]; // Product name + // byte 8 + unsigned prv_m : 4; // Product revision n.m + unsigned prv_n : 4; + // byte 9-12 + uint32_t psn; // Product serial number + // byte 13 + unsigned mdt_year_high : 4; // Manufacturing date + unsigned reserved : 4; + // byte 14 + unsigned mdt_month : 4; + unsigned mdt_year_low :4; + // byte 15 + unsigned always1 : 1; + unsigned crc : 7; +}cid_t; +//------------------------------------------------------------------------------ +// CSD for version 1.00 cards +typedef struct CSDV1 { + // byte 0 + unsigned reserved1 : 6; + unsigned csd_ver : 2; + // byte 1 + uint8_t taac; + // byte 2 + uint8_t nsac; + // byte 3 + uint8_t tran_speed; + // byte 4 + uint8_t ccc_high; + // byte 5 + unsigned read_bl_len : 4; + unsigned ccc_low : 4; + // byte 6 + unsigned c_size_high : 2; + unsigned reserved2 : 2; + unsigned dsr_imp : 1; + unsigned read_blk_misalign :1; + unsigned write_blk_misalign : 1; + unsigned read_bl_partial : 1; + // byte 7 + uint8_t c_size_mid; + // byte 8 + unsigned vdd_r_curr_max : 3; + unsigned vdd_r_curr_min : 3; + unsigned c_size_low :2; + // byte 9 + unsigned c_size_mult_high : 2; + unsigned vdd_w_cur_max : 3; + unsigned vdd_w_curr_min : 3; + // byte 10 + unsigned sector_size_high : 6; + unsigned erase_blk_en : 1; + unsigned c_size_mult_low : 1; + // byte 11 + unsigned wp_grp_size : 7; + unsigned sector_size_low : 1; + // byte 12 + unsigned write_bl_len_high : 2; + unsigned r2w_factor : 3; + unsigned reserved3 : 2; + unsigned wp_grp_enable : 1; + // byte 13 + unsigned reserved4 : 5; + unsigned write_partial : 1; + unsigned write_bl_len_low : 2; + // byte 14 + unsigned reserved5: 2; + unsigned file_format : 2; + unsigned tmp_write_protect : 1; + unsigned perm_write_protect : 1; + unsigned copy : 1; + unsigned file_format_grp : 1; + // byte 15 + unsigned always1 : 1; + unsigned crc : 7; +}csd1_t; +//------------------------------------------------------------------------------ +// CSD for version 2.00 cards +typedef struct CSDV2 { + // byte 0 + unsigned reserved1 : 6; + unsigned csd_ver : 2; + // byte 1 + uint8_t taac; + // byte 2 + uint8_t nsac; + // byte 3 + uint8_t tran_speed; + // byte 4 + uint8_t ccc_high; + // byte 5 + unsigned read_bl_len : 4; + unsigned ccc_low : 4; + // byte 6 + unsigned reserved2 : 4; + unsigned dsr_imp : 1; + unsigned read_blk_misalign :1; + unsigned write_blk_misalign : 1; + unsigned read_bl_partial : 1; + // byte 7 + unsigned reserved3 : 2; + unsigned c_size_high : 6; + // byte 8 + uint8_t c_size_mid; + // byte 9 + uint8_t c_size_low; + // byte 10 + unsigned sector_size_high : 6; + unsigned erase_blk_en : 1; + unsigned reserved4 : 1; + // byte 11 + unsigned wp_grp_size : 7; + unsigned sector_size_low : 1; + // byte 12 + unsigned write_bl_len_high : 2; + unsigned r2w_factor : 3; + unsigned reserved5 : 2; + unsigned wp_grp_enable : 1; + // byte 13 + unsigned reserved6 : 5; + unsigned write_partial : 1; + unsigned write_bl_len_low : 2; + // byte 14 + unsigned reserved7: 2; + unsigned file_format : 2; + unsigned tmp_write_protect : 1; + unsigned perm_write_protect : 1; + unsigned copy : 1; + unsigned file_format_grp : 1; + // byte 15 + unsigned always1 : 1; + unsigned crc : 7; +}csd2_t; +//------------------------------------------------------------------------------ +// union of old and new style CSD register +union csd_t { + csd1_t v1; + csd2_t v2; +}; +#endif // SdInfo_h diff --git a/books/pdummies/Libraries/SD/utility/SdVolume.cpp b/books/pdummies/Libraries/SD/utility/SdVolume.cpp new file mode 100755 index 0000000..e053bee --- /dev/null +++ b/books/pdummies/Libraries/SD/utility/SdVolume.cpp @@ -0,0 +1,295 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +//------------------------------------------------------------------------------ +// raw block cache +// init cacheBlockNumber_to invalid SD block number +uint32_t SdVolume::cacheBlockNumber_ = 0XFFFFFFFF; +cache_t SdVolume::cacheBuffer_; // 512 byte cache for Sd2Card +Sd2Card* SdVolume::sdCard_; // pointer to SD card object +uint8_t SdVolume::cacheDirty_ = 0; // cacheFlush() will write block if true +uint32_t SdVolume::cacheMirrorBlock_ = 0; // mirror block for second FAT +//------------------------------------------------------------------------------ +// find a contiguous group of clusters +uint8_t SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { + // start of group + uint32_t bgnCluster; + + // flag to save place to start next search + uint8_t setStart; + + // set search start cluster + if (*curCluster) { + // try to make file contiguous + bgnCluster = *curCluster + 1; + + // don't save new start location + setStart = false; + } else { + // start at likely place for free cluster + bgnCluster = allocSearchStart_; + + // save next search start if one cluster + setStart = 1 == count; + } + // end of group + uint32_t endCluster = bgnCluster; + + // last cluster of FAT + uint32_t fatEnd = clusterCount_ + 1; + + // search the FAT for free clusters + for (uint32_t n = 0;; n++, endCluster++) { + // can't find space checked all clusters + if (n >= clusterCount_) return false; + + // past end - start from beginning of FAT + if (endCluster > fatEnd) { + bgnCluster = endCluster = 2; + } + uint32_t f; + if (!fatGet(endCluster, &f)) return false; + + if (f != 0) { + // cluster in use try next cluster as bgnCluster + bgnCluster = endCluster + 1; + } else if ((endCluster - bgnCluster + 1) == count) { + // done - found space + break; + } + } + // mark end of chain + if (!fatPutEOC(endCluster)) return false; + + // link clusters + while (endCluster > bgnCluster) { + if (!fatPut(endCluster - 1, endCluster)) return false; + endCluster--; + } + if (*curCluster != 0) { + // connect chains + if (!fatPut(*curCluster, bgnCluster)) return false; + } + // return first cluster number to caller + *curCluster = bgnCluster; + + // remember possible next free cluster + if (setStart) allocSearchStart_ = bgnCluster + 1; + + return true; +} +//------------------------------------------------------------------------------ +uint8_t SdVolume::cacheFlush(void) { + if (cacheDirty_) { + if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) { + return false; + } + // mirror FAT tables + if (cacheMirrorBlock_) { + if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) { + return false; + } + cacheMirrorBlock_ = 0; + } + cacheDirty_ = 0; + } + return true; +} +//------------------------------------------------------------------------------ +uint8_t SdVolume::cacheRawBlock(uint32_t blockNumber, uint8_t action) { + if (cacheBlockNumber_ != blockNumber) { + if (!cacheFlush()) return false; + if (!sdCard_->readBlock(blockNumber, cacheBuffer_.data)) return false; + cacheBlockNumber_ = blockNumber; + } + cacheDirty_ |= action; + return true; +} +//------------------------------------------------------------------------------ +// cache a zero block for blockNumber +uint8_t SdVolume::cacheZeroBlock(uint32_t blockNumber) { + if (!cacheFlush()) return false; + + // loop take less flash than memset(cacheBuffer_.data, 0, 512); + for (uint16_t i = 0; i < 512; i++) { + cacheBuffer_.data[i] = 0; + } + cacheBlockNumber_ = blockNumber; + cacheSetDirty(); + return true; +} +//------------------------------------------------------------------------------ +// return the size in bytes of a cluster chain +uint8_t SdVolume::chainSize(uint32_t cluster, uint32_t* size) const { + uint32_t s = 0; + do { + if (!fatGet(cluster, &cluster)) return false; + s += 512UL << clusterSizeShift_; + } while (!isEOC(cluster)); + *size = s; + return true; +} +//------------------------------------------------------------------------------ +// Fetch a FAT entry +uint8_t SdVolume::fatGet(uint32_t cluster, uint32_t* value) const { + if (cluster > (clusterCount_ + 1)) return false; + uint32_t lba = fatStartBlock_; + lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; + if (lba != cacheBlockNumber_) { + if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; + } + if (fatType_ == 16) { + *value = cacheBuffer_.fat16[cluster & 0XFF]; + } else { + *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; + } + return true; +} +//------------------------------------------------------------------------------ +// Store a FAT entry +uint8_t SdVolume::fatPut(uint32_t cluster, uint32_t value) { + // error if reserved cluster + if (cluster < 2) return false; + + // error if not in FAT + if (cluster > (clusterCount_ + 1)) return false; + + // calculate block address for entry + uint32_t lba = fatStartBlock_; + lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; + + if (lba != cacheBlockNumber_) { + if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; + } + // store entry + if (fatType_ == 16) { + cacheBuffer_.fat16[cluster & 0XFF] = value; + } else { + cacheBuffer_.fat32[cluster & 0X7F] = value; + } + cacheSetDirty(); + + // mirror second FAT + if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; + return true; +} +//------------------------------------------------------------------------------ +// free a cluster chain +uint8_t SdVolume::freeChain(uint32_t cluster) { + // clear free cluster location + allocSearchStart_ = 2; + + do { + uint32_t next; + if (!fatGet(cluster, &next)) return false; + + // free cluster + if (!fatPut(cluster, 0)) return false; + + cluster = next; + } while (!isEOC(cluster)); + + return true; +} +//------------------------------------------------------------------------------ +/** + * Initialize a FAT volume. + * + * \param[in] dev The SD card where the volume is located. + * + * \param[in] part The partition to be used. Legal values for \a part are + * 1-4 to use the corresponding partition on a device formatted with + * a MBR, Master Boot Record, or zero if the device is formatted as + * a super floppy with the FAT boot sector in block zero. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. Reasons for + * failure include not finding a valid partition, not finding a valid + * FAT file system in the specified partition or an I/O error. + */ +uint8_t SdVolume::init(Sd2Card* dev, uint8_t part) { + uint32_t volumeStartBlock = 0; + sdCard_ = dev; + // if part == 0 assume super floppy with FAT boot sector in block zero + // if part > 0 assume mbr volume with partition table + if (part) { + if (part > 4)return false; + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; + part_t* p = &cacheBuffer_.mbr.part[part-1]; + if ((p->boot & 0X7F) !=0 || + p->totalSectors < 100 || + p->firstSector == 0) { + // not a valid partition + return false; + } + volumeStartBlock = p->firstSector; + } + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; + bpb_t* bpb = &cacheBuffer_.fbs.bpb; + if (bpb->bytesPerSector != 512 || + bpb->fatCount == 0 || + bpb->reservedSectorCount == 0 || + bpb->sectorsPerCluster == 0) { + // not valid FAT volume + return false; + } + fatCount_ = bpb->fatCount; + blocksPerCluster_ = bpb->sectorsPerCluster; + + // determine shift that is same as multiply by blocksPerCluster_ + clusterSizeShift_ = 0; + while (blocksPerCluster_ != (1 << clusterSizeShift_)) { + // error if not power of 2 + if (clusterSizeShift_++ > 7) return false; + } + blocksPerFat_ = bpb->sectorsPerFat16 ? + bpb->sectorsPerFat16 : bpb->sectorsPerFat32; + + fatStartBlock_ = volumeStartBlock + bpb->reservedSectorCount; + + // count for FAT16 zero for FAT32 + rootDirEntryCount_ = bpb->rootDirEntryCount; + + // directory start for FAT16 dataStart for FAT32 + rootDirStart_ = fatStartBlock_ + bpb->fatCount * blocksPerFat_; + + // data start for FAT16 and FAT32 + dataStartBlock_ = rootDirStart_ + ((32 * bpb->rootDirEntryCount + 511)/512); + + // total blocks for FAT16 or FAT32 + uint32_t totalBlocks = bpb->totalSectors16 ? + bpb->totalSectors16 : bpb->totalSectors32; + // total data blocks + clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); + + // divide by cluster size to get cluster count + clusterCount_ >>= clusterSizeShift_; + + // FAT type is determined by cluster count + if (clusterCount_ < 4085) { + fatType_ = 12; + } else if (clusterCount_ < 65525) { + fatType_ = 16; + } else { + rootDirStart_ = bpb->fat32RootCluster; + fatType_ = 32; + } + return true; +} diff --git a/books/pdummies/Libraries/Sha/debugstuff.c b/books/pdummies/Libraries/Sha/debugstuff.c new file mode 100644 index 0000000..9124402 --- /dev/null +++ b/books/pdummies/Libraries/Sha/debugstuff.c @@ -0,0 +1,14 @@ +#include + +void debug(uint8_t c) { + while (!(UCSR0A & _BV(UDRE0))); + UDR0=c; +} +void debugHH(uint8_t c) { + debug("0123456789abcdef"[c>>4]); + debug("0123456789abcdef"[c&15]); +} +void debugStr(char *s) { + uint8_t c; + while (c=*s++) debug(c); +} diff --git a/books/pdummies/Libraries/Sha/examples/hmacsha256test/hmacsha256test.pde b/books/pdummies/Libraries/Sha/examples/hmacsha256test/hmacsha256test.pde new file mode 100644 index 0000000..61238fc --- /dev/null +++ b/books/pdummies/Libraries/Sha/examples/hmacsha256test/hmacsha256test.pde @@ -0,0 +1,102 @@ +#include "sha256.h" + +uint8_t hmacKey1[]={ + 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b +}; +uint8_t hmacKey2[]={ + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19 +}; +uint8_t hmacKey3[]={ + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa +}; +uint8_t hmacKey4[]={ + 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c +}; +uint8_t hmacKey5[]={ + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa +}; + +void printHash(uint8_t* hash) { + int i; + for (i=0; i<32; i++) { + Serial.print("0123456789abcdef"[hash[i]>>4]); + Serial.print("0123456789abcdef"[hash[i]&0xf]); + } + Serial.println(); +} + +void setup() { + uint8_t* hash; + uint32_t a; + + Serial.begin(9600); + + // HMAC tests + Serial.println("Test: RFC4231 4.2"); + Serial.println("Expect:b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey1,20); + Sha256.print("Hi There"); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.3"); + Serial.println("Expect:5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"); + Serial.print("Result:"); + Sha256.initHmac((uint8_t*)"Jefe",4); + Sha256.print("what do ya want for nothing?"); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.4"); + Serial.println("Expect:773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey3,20); + for (a=0; a<50; a++) Sha256.write(0xdd); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.5"); + Serial.println("Expect:82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey2,25); + for (a=0; a<50; a++) Sha256.write(0xcd); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.6"); + Serial.println("Expect:a3b6167473100ee06e0c796c2955552b-------------------------------"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey4,20); + Sha256.print("Test With Truncation"); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.7"); + Serial.println("Expect:60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey5,131); + Sha256.print("Test Using Larger Than Block-Size Key - Hash Key First"); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.8"); + Serial.println("Expect:9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey5,131); + Sha256.print("This is a test using a larger than block-size key and a larger than " + "block-size data. The key needs to be hashed before being used by the HMAC algorithm."); + printHash(Sha256.resultHmac()); + Serial.println(); + +} + +void loop() { +} \ No newline at end of file diff --git a/books/pdummies/Libraries/Sha/examples/sha1test/sha1test.pde b/books/pdummies/Libraries/Sha/examples/sha1test/sha1test.pde new file mode 100644 index 0000000..e257e46 --- /dev/null +++ b/books/pdummies/Libraries/Sha/examples/sha1test/sha1test.pde @@ -0,0 +1,113 @@ +#include "sha1.h" + +void printHash(uint8_t* hash) { + int i; + for (i=0; i<20; i++) { + Serial.print("0123456789abcdef"[hash[i]>>4]); + Serial.print("0123456789abcdef"[hash[i]&0xf]); + } + Serial.println(); +} + +uint8_t hmacKey1[]={ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f +}; +uint8_t hmacKey2[]={ + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, + 0x40,0x41,0x42,0x43 +}; +uint8_t hmacKey3[]={ + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, + 0xb0,0xb1,0xb2,0xb3 +}; +uint8_t hmacKey4[]={ + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, + 0xa0 +}; + + +void setup() { + uint8_t* hash; + uint32_t a; + + Serial.begin(9600); + + // SHA tests + Serial.println("Test: FIPS 180-2 C.1 and RFC3174 7.3 TEST1"); + Serial.println("Expect:a9993e364706816aba3e25717850c26c9cd0d89d"); + Serial.print("Result:"); + Sha1.init(); + Sha1.print("abc"); + printHash(Sha1.result()); + Serial.println(); + + Serial.println("Test: FIPS 180-2 C.2 and RFC3174 7.3 TEST2"); + Serial.println("Expect:84983e441c3bd26ebaae4aa1f95129e5e54670f1"); + Serial.print("Result:"); + Sha1.init(); + Sha1.print("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"); + printHash(Sha1.result()); + Serial.println(); + + Serial.println("Test: RFC3174 7.3 TEST4"); + Serial.println("Expect:dea356a2cddd90c7a7ecedc5ebb563934f460452"); + Serial.print("Result:"); + Sha1.init(); + for (a=0; a<80; a++) Sha1.print("01234567"); + printHash(Sha1.result()); + Serial.println(); + + // HMAC tests + Serial.println("Test: FIPS 198a A.1"); + Serial.println("Expect:4f4ca3d5d68ba7cc0a1208c9c61e9c5da0403c0a"); + Serial.print("Result:"); + Sha1.initHmac(hmacKey1,64); + Sha1.print("Sample #1"); + printHash(Sha1.resultHmac()); + Serial.println(); + + Serial.println("Test: FIPS 198a A.2"); + Serial.println("Expect:0922d3405faa3d194f82a45830737d5cc6c75d24"); + Serial.print("Result:"); + Sha1.initHmac(hmacKey2,20); + Sha1.print("Sample #2"); + printHash(Sha1.resultHmac()); + Serial.println(); + + Serial.println("Test: FIPS 198a A.3"); + Serial.println("Expect:bcf41eab8bb2d802f3d05caf7cb092ecf8d1a3aa"); + Serial.print("Result:"); + Sha1.initHmac(hmacKey3,100); + Sha1.print("Sample #3"); + printHash(Sha1.resultHmac()); + Serial.println(); + + Serial.println("Test: FIPS 198a A.4"); + Serial.println("Expect:9ea886efe268dbecce420c7524df32e0751a2a26"); + Serial.print("Result:"); + Sha1.initHmac(hmacKey4,49); + Sha1.print("Sample #4"); + printHash(Sha1.resultHmac()); + Serial.println(); + + // Long tests + Serial.println("Test: FIPS 180-2 C.3 and RFC3174 7.3 TEST3 (Processing 1000000 characters. This will take a while.)"); + Serial.println("Expect:34aa973cd4c4daa4f61eeb2bdbad27316534016f"); + Serial.print("Result:"); + Sha1.init(); + for (a=0; a<1000000; a++) Sha1.write('a'); + printHash(Sha1.result()); +} + +void loop() { +} \ No newline at end of file diff --git a/books/pdummies/Libraries/Sha/examples/sha256test/sha256test.pde b/books/pdummies/Libraries/Sha/examples/sha256test/sha256test.pde new file mode 100644 index 0000000..0da6bfa --- /dev/null +++ b/books/pdummies/Libraries/Sha/examples/sha256test/sha256test.pde @@ -0,0 +1,126 @@ +#include "sha256.h" + +uint8_t hmacKey1[]={ + 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b +}; +uint8_t hmacKey2[]={ + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19 +}; +uint8_t hmacKey3[]={ + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa +}; +uint8_t hmacKey4[]={ + 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c +}; +uint8_t hmacKey5[]={ + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, + 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa +}; + +void printHash(uint8_t* hash) { + int i; + for (i=0; i<32; i++) { + Serial.print("0123456789abcdef"[hash[i]>>4]); + Serial.print("0123456789abcdef"[hash[i]&0xf]); + } + Serial.println(); +} + +void setup() { + uint8_t* hash; + uint32_t a; + + Serial.begin(9600); + + // SHA tests + Serial.println("Test: FIPS 180-2 B.1"); + Serial.println("Expect:ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"); + Serial.print("Result:"); + Sha256.init(); + Sha256.print("abc"); + printHash(Sha256.result()); + Serial.println(); + + Serial.println("Test: FIPS 180-2 B.2"); + Serial.println("Expect:248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"); + Serial.print("Result:"); + Sha256.init(); + Sha256.print("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"); + printHash(Sha256.result()); + Serial.println(); + + // HMAC tests + Serial.println("Test: RFC4231 4.2"); + Serial.println("Expect:b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey1,20); + Sha256.print("Hi There"); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.3"); + Serial.println("Expect:5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"); + Serial.print("Result:"); + Sha256.initHmac((uint8_t*)"Jefe",4); + Sha256.print("what do ya want for nothing?"); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.4"); + Serial.println("Expect:773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey3,20); + for (a=0; a<50; a++) Sha256.write(0xdd); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.5"); + Serial.println("Expect:82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey2,25); + for (a=0; a<50; a++) Sha256.write(0xcd); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.6"); + Serial.println("Expect:a3b6167473100ee06e0c796c2955552b-------------------------------"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey4,20); + Sha256.print("Test With Truncation"); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.7"); + Serial.println("Expect:60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey5,131); + Sha256.print("Test Using Larger Than Block-Size Key - Hash Key First"); + printHash(Sha256.resultHmac()); + Serial.println(); + + Serial.println("Test: RFC4231 4.8"); + Serial.println("Expect:9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2"); + Serial.print("Result:"); + Sha256.initHmac(hmacKey5,131); +// Sha256.print("This is a test using a larger than block-size key and a larger than " +// "block-size data. The key needs to be hashed before being used by the HMAC algorithm."); + printHash(Sha256.resultHmac()); + Serial.println(); + + // Long tests + Serial.println("Test: FIPS 180-2 B.3 (Processing 1000000 characters. This will take a while.)"); + Serial.println("Expect:cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0"); + Serial.print("Result:"); + Sha256.init(); + for (a=0; a<1000000; a++) Sha256.write('a'); + printHash(Sha256.result()); +} + +void loop() { +} \ No newline at end of file diff --git a/books/pdummies/Libraries/Sha/keywords.txt b/books/pdummies/Libraries/Sha/keywords.txt new file mode 100644 index 0000000..dac05a8 --- /dev/null +++ b/books/pdummies/Libraries/Sha/keywords.txt @@ -0,0 +1,24 @@ +####################################### +# Syntax Coloring Map For DmxSimple +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### +Sha1 KEYWORD1 +Sha256 KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +init KEYWORD2 +initHmac KEYWORD2 +add KEYWORD2 +result KEYWORD2 +resultHmac KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/books/pdummies/Libraries/Sha/readme.txt b/books/pdummies/Libraries/Sha/readme.txt new file mode 100644 index 0000000..d1e48f8 --- /dev/null +++ b/books/pdummies/Libraries/Sha/readme.txt @@ -0,0 +1,22 @@ +SHA implements secure hash functions that can be used for cryptography, data integrity and security purposes. + +Sha covers the following standards: + SHA-1 (FIPS 180-2) + SHA-256 (FIPS 180-2) + HMAC-SHA-1 (FIPS 198a) + HMAC-SHA-256 (FIPS 198a) + +What is a hash function? + A hash function takes a message, and generates a number. + A good hash function has the following properties: + The number is large enough that you will never find two messages with the same number (a 'collision') + It is computationally unfeasible to extract message information from its hash (without trying every possible combination) + A small (1 bit) change in the message will produce a huge (approximately half of all bits) change in the hash. + Fast to calculate + + SHA is slower than simple hashes (eg. parity), but has very high security - high enough to be used in currency transactions and confidential documents. + SHA-1 is currently secure, but there is some suggestion it may not be for much longer. + SHA-256 is slightly slower, but has higher security. + +What is an HMAC? + HMACs are Hashed Message Authentication Codes. Using them, it is possible to prove that you have a secret key without actually disclosing it. diff --git a/books/pdummies/Libraries/Sha/sha1.cpp b/books/pdummies/Libraries/Sha/sha1.cpp new file mode 100644 index 0000000..2855575 --- /dev/null +++ b/books/pdummies/Libraries/Sha/sha1.cpp @@ -0,0 +1,160 @@ +#include +#include +#include +#include "sha1.h" + +#include "debugstuff.c" + +#define SHA1_K0 0x5a827999 +#define SHA1_K20 0x6ed9eba1 +#define SHA1_K40 0x8f1bbcdc +#define SHA1_K60 0xca62c1d6 + +uint8_t sha1InitState[] PROGMEM = { + 0x01,0x23,0x45,0x67, // H0 + 0x89,0xab,0xcd,0xef, // H1 + 0xfe,0xdc,0xba,0x98, // H2 + 0x76,0x54,0x32,0x10, // H3 + 0xf0,0xe1,0xd2,0xc3 // H4 +}; + +void Sha1Class::init(void) { + memcpy_P(state.b,sha1InitState,HASH_LENGTH); + byteCount = 0; + bufferOffset = 0; +} + +uint32_t Sha1Class::rol32(uint32_t number, uint8_t bits) { + return ((number << bits) | (number >> (32-bits))); +} + +void Sha1Class::hashBlock() { + // SHA1 only for now + uint8_t i; + uint32_t a,b,c,d,e,t; + + a=state.w[0]; + b=state.w[1]; + c=state.w[2]; + d=state.w[3]; + e=state.w[4]; + for (i=0; i<80; i++) { + if (i>=16) { + t = buffer.w[(i+13)&15] ^ buffer.w[(i+8)&15] ^ buffer.w[(i+2)&15] ^ buffer.w[i&15]; + buffer.w[i&15] = rol32(t,1); + } + if (i<20) { + t = (d ^ (b & (c ^ d))) + SHA1_K0; + } else if (i<40) { + t = (b ^ c ^ d) + SHA1_K20; + } else if (i<60) { + t = ((b & c) | (d & (b | c))) + SHA1_K40; + } else { + t = (b ^ c ^ d) + SHA1_K60; + } + t+=rol32(a,5) + e + buffer.w[i&15]; + e=d; + d=c; + c=rol32(b,30); + b=a; + a=t; + } + state.w[0] += a; + state.w[1] += b; + state.w[2] += c; + state.w[3] += d; + state.w[4] += e; +} + +void Sha1Class::addUncounted(uint8_t data) { + buffer.b[bufferOffset ^ 3] = data; + bufferOffset++; + if (bufferOffset == BLOCK_LENGTH) { + hashBlock(); + bufferOffset = 0; + } +} + +size_t Sha1Class::write(uint8_t data) { + ++byteCount; + addUncounted(data); + return 1; +} + +void Sha1Class::pad() { + // Implement SHA-1 padding (fips180-2 §5.1.1) + + // Pad with 0x80 followed by 0x00 until the end of the block + addUncounted(0x80); + while (bufferOffset != 56) addUncounted(0x00); + + // Append length in the last 8 bytes + addUncounted(0); // We're only using 32 bit lengths + addUncounted(0); // But SHA-1 supports 64 bit lengths + addUncounted(0); // So zero pad the top bits + addUncounted(byteCount >> 29); // Shifting to multiply by 8 + addUncounted(byteCount >> 21); // as SHA-1 supports bitstreams as well as + addUncounted(byteCount >> 13); // byte. + addUncounted(byteCount >> 5); + addUncounted(byteCount << 3); +} + + +uint8_t* Sha1Class::result(void) { + // Pad to complete the last block + pad(); + + // Swap byte order back + for (int i=0; i<5; i++) { + uint32_t a,b; + a=state.w[i]; + b=a<<24; + b|=(a<<8) & 0x00ff0000; + b|=(a>>8) & 0x0000ff00; + b|=a>>24; + state.w[i]=b; + } + + // Return pointer to hash (20 characters) + return state.b; +} + + +#define HMAC_IPAD 0x36 +#define HMAC_OPAD 0x5c + + + +void Sha1Class::initHmac(const uint8_t* key, int keyLength) { + uint8_t i; + memset(keyBuffer,0,BLOCK_LENGTH); + if (keyLength > BLOCK_LENGTH) { + // Hash long keys + init(); + for (;keyLength--;) write(*key++); + memcpy(keyBuffer,result(),HASH_LENGTH); + } else { + // Block length keys are used as is + memcpy(keyBuffer,key,keyLength); + } + //for (i=0; i +#include "Print.h" + +#define HASH_LENGTH 20 +#define BLOCK_LENGTH 64 + +union _buffer { + uint8_t b[BLOCK_LENGTH]; + uint32_t w[BLOCK_LENGTH/4]; +}; +union _state { + uint8_t b[HASH_LENGTH]; + uint32_t w[HASH_LENGTH/4]; +}; + +class Sha1Class : public Print +{ + public: + void init(void); + void initHmac(const uint8_t* secret, int secretLength); + uint8_t* result(void); + uint8_t* resultHmac(void); + virtual size_t write(uint8_t); + using Print::write; + private: + void pad(); + void addUncounted(uint8_t data); + void hashBlock(); + uint32_t rol32(uint32_t number, uint8_t bits); + _buffer buffer; + uint8_t bufferOffset; + _state state; + uint32_t byteCount; + uint8_t keyBuffer[BLOCK_LENGTH]; + uint8_t innerHash[HASH_LENGTH]; + +}; +extern Sha1Class Sha1; + +#endif diff --git a/books/pdummies/Libraries/Sha/sha256.cpp b/books/pdummies/Libraries/Sha/sha256.cpp new file mode 100644 index 0000000..71e9ec5 --- /dev/null +++ b/books/pdummies/Libraries/Sha/sha256.cpp @@ -0,0 +1,176 @@ +#include +#include +#include +#include "sha256.h" + +//#include "debugstuff.c" + +uint32_t sha256K[] PROGMEM = { + 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5, + 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174, + 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da, + 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967, + 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85, + 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070, + 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3, + 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 +}; + +#define BUFFER_SIZE 64 + +uint8_t sha256InitState[] PROGMEM = { + 0x67,0xe6,0x09,0x6a, // H0 + 0x85,0xae,0x67,0xbb, // H1 + 0x72,0xf3,0x6e,0x3c, // H2 + 0x3a,0xf5,0x4f,0xa5, // H3 + 0x7f,0x52,0x0e,0x51, // H4 + 0x8c,0x68,0x05,0x9b, // H5 + 0xab,0xd9,0x83,0x1f, // H6 + 0x19,0xcd,0xe0,0x5b // H7 +}; + +void Sha256Class::init(void) { + memcpy_P(state.b,sha256InitState,32); + byteCount = 0; + bufferOffset = 0; +} + +uint32_t Sha256Class::ror32(uint32_t number, uint8_t bits) { + return ((number << (32-bits)) | (number >> bits)); +} + +void Sha256Class::hashBlock() { + // Sha256 only for now + uint8_t i; + uint32_t a,b,c,d,e,f,g,h,t1,t2; + + a=state.w[0]; + b=state.w[1]; + c=state.w[2]; + d=state.w[3]; + e=state.w[4]; + f=state.w[5]; + g=state.w[6]; + h=state.w[7]; + + for (i=0; i<64; i++) { + if (i>=16) { + t1 = buffer.w[i&15] + buffer.w[(i-7)&15]; + t2 = buffer.w[(i-2)&15]; + t1 += ror32(t2,17) ^ ror32(t2,19) ^ (t2>>10); + t2 = buffer.w[(i-15)&15]; + t1 += ror32(t2,7) ^ ror32(t2,18) ^ (t2>>3); + buffer.w[i&15] = t1; + } + t1 = h; + t1 += ror32(e,6) ^ ror32(e,11) ^ ror32(e,25); // ∑1(e) + t1 += g ^ (e & (g ^ f)); // Ch(e,f,g) + t1 += pgm_read_dword(sha256K+i); // Ki + t1 += buffer.w[i&15]; // Wi + t2 = ror32(a,2) ^ ror32(a,13) ^ ror32(a,22); // ∑0(a) + t2 += ((b & c) | (a & (b | c))); // Maj(a,b,c) + h=g; g=f; f=e; e=d+t1; d=c; c=b; b=a; a=t1+t2; + } + state.w[0] += a; + state.w[1] += b; + state.w[2] += c; + state.w[3] += d; + state.w[4] += e; + state.w[5] += f; + state.w[6] += g; + state.w[7] += h; +} + +void Sha256Class::addUncounted(uint8_t data) { + buffer.b[bufferOffset ^ 3] = data; + bufferOffset++; + if (bufferOffset == BUFFER_SIZE) { + hashBlock(); + bufferOffset = 0; + } +} + +size_t Sha256Class::write(uint8_t data) { + ++byteCount; + addUncounted(data); + return 1; +} + +void Sha256Class::pad() { + // Implement SHA-256 padding (fips180-2 §5.1.1) + + // Pad with 0x80 followed by 0x00 until the end of the block + addUncounted(0x80); + while (bufferOffset != 56) addUncounted(0x00); + + // Append length in the last 8 bytes + addUncounted(0); // We're only using 32 bit lengths + addUncounted(0); // But SHA-1 supports 64 bit lengths + addUncounted(0); // So zero pad the top bits + addUncounted(byteCount >> 29); // Shifting to multiply by 8 + addUncounted(byteCount >> 21); // as SHA-1 supports bitstreams as well as + addUncounted(byteCount >> 13); // byte. + addUncounted(byteCount >> 5); + addUncounted(byteCount << 3); +} + + +uint8_t* Sha256Class::result(void) { + // Pad to complete the last block + pad(); + + // Swap byte order back + for (int i=0; i<8; i++) { + uint32_t a,b; + a=state.w[i]; + b=a<<24; + b|=(a<<8) & 0x00ff0000; + b|=(a>>8) & 0x0000ff00; + b|=a>>24; + state.w[i]=b; + } + + // Return pointer to hash (20 characters) + return state.b; +} + + +#define HMAC_IPAD 0x36 +#define HMAC_OPAD 0x5c + +uint8_t keyBuffer[BLOCK_LENGTH]; // K0 in FIPS-198a +uint8_t innerHash[HASH_LENGTH]; + +void Sha256Class::initHmac(const uint8_t* key, int keyLength) { + uint8_t i; + memset(keyBuffer,0,BLOCK_LENGTH); + if (keyLength > BLOCK_LENGTH) { + // Hash long keys + init(); + for (;keyLength--;) write(*key++); + memcpy(keyBuffer,result(),HASH_LENGTH); + } else { + // Block length keys are used as is + memcpy(keyBuffer,key,keyLength); + } + //for (i=0; i +#include "Print.h" + +#define HASH_LENGTH 32 +#define BLOCK_LENGTH 64 + +union _buffer { + uint8_t b[BLOCK_LENGTH]; + uint32_t w[BLOCK_LENGTH/4]; +}; +union _state { + uint8_t b[HASH_LENGTH]; + uint32_t w[HASH_LENGTH/4]; +}; + +class Sha256Class : public Print +{ + public: + void init(void); + void initHmac(const uint8_t* secret, int secretLength); + uint8_t* result(void); + uint8_t* resultHmac(void); + virtual size_t write(uint8_t); + using Print::write; + private: + void pad(); + void addUncounted(uint8_t data); + void hashBlock(); + uint32_t ror32(uint32_t number, uint8_t bits); + _buffer buffer; + uint8_t bufferOffset; + _state state; + uint32_t byteCount; + uint8_t keyBuffer[BLOCK_LENGTH]; + uint8_t innerHash[HASH_LENGTH]; +}; +extern Sha256Class Sha256; + +#endif diff --git a/books/pdummies/Libraries/Time/DateStrings.cpp b/books/pdummies/Libraries/Time/DateStrings.cpp new file mode 100755 index 0000000..7610c8f --- /dev/null +++ b/books/pdummies/Libraries/Time/DateStrings.cpp @@ -0,0 +1,80 @@ +/* DateStrings.cpp + * Definitions for date strings for use with the Time library + * + * No memory is consumed in the sketch if your code does not call any of the string methods + * You can change the text of the strings, make sure the short strings are each exactly 3 characters + * the long strings can be any length up to the constant dt_MAX_STRING_LEN defined in Time.h + * + */ + +#include +#include "Time.h" + +// the short strings for each day or month must be exactly dt_SHORT_STR_LEN +#define dt_SHORT_STR_LEN 3 // the length of short strings + +static char buffer[dt_MAX_STRING_LEN+1]; // must be big enough for longest string and the terminating null + +char monthStr1[] PROGMEM = "January"; +char monthStr2[] PROGMEM = "February"; +char monthStr3[] PROGMEM = "March"; +char monthStr4[] PROGMEM = "April"; +char monthStr5[] PROGMEM = "May"; +char monthStr6[] PROGMEM = "June"; +char monthStr7[] PROGMEM = "July"; +char monthStr8[] PROGMEM = "August"; +char monthStr9[] PROGMEM = "September"; +char monthStr10[] PROGMEM = "October"; +char monthStr11[] PROGMEM = "November"; +char monthStr12[] PROGMEM = "December"; + +PGM_P monthNames_P[] PROGMEM = +{ + "",monthStr1,monthStr2,monthStr3,monthStr4,monthStr5,monthStr6, + monthStr7,monthStr8,monthStr9,monthStr10,monthStr11,monthStr12 +}; + +char monthShortNames_P[] PROGMEM = "ErrJanFebMarAprMayJunJulAugSepOctNovDec"; + +char dayStr0[] PROGMEM = "Err"; +char dayStr1[] PROGMEM = "Sunday"; +char dayStr2[] PROGMEM = "Monday"; +char dayStr3[] PROGMEM = "Tuesday"; +char dayStr4[] PROGMEM = "Wednesday"; +char dayStr5[] PROGMEM = "Thursday"; +char dayStr6[] PROGMEM = "Friday"; +char dayStr7[] PROGMEM = "Saturday"; + +PGM_P dayNames_P[] PROGMEM = { dayStr0,dayStr1,dayStr2,dayStr3,dayStr4,dayStr5,dayStr6,dayStr7}; +char dayShortNames_P[] PROGMEM = "ErrSunMonTueWedThrFriSat"; + +/* functions to return date strings */ + +char* monthStr(uint8_t month) +{ + strcpy_P(buffer, (PGM_P)pgm_read_word(&(monthNames_P[month]))); + return buffer; +} + +char* monthShortStr(uint8_t month) +{ + for (int i=0; i < dt_SHORT_STR_LEN; i++) + buffer[i] = pgm_read_byte(&(monthShortNames_P[i+ (month*dt_SHORT_STR_LEN)])); + buffer[dt_SHORT_STR_LEN] = 0; + return buffer; +} + +char* dayStr(uint8_t day) +{ + strcpy_P(buffer, (PGM_P)pgm_read_word(&(dayNames_P[day]))); + return buffer; +} + +char* dayShortStr(uint8_t day) +{ + uint8_t index = day*dt_SHORT_STR_LEN; + for (int i=0; i < dt_SHORT_STR_LEN; i++) + buffer[i] = pgm_read_byte(&(dayShortNames_P[index + i])); + buffer[dt_SHORT_STR_LEN] = 0; + return buffer; +} diff --git a/books/pdummies/Libraries/Time/Examples/Processing/SyncArduinoClock/SyncArduinoClock.pde b/books/pdummies/Libraries/Time/Examples/Processing/SyncArduinoClock/SyncArduinoClock.pde new file mode 100644 index 0000000..4c74d4b --- /dev/null +++ b/books/pdummies/Libraries/Time/Examples/Processing/SyncArduinoClock/SyncArduinoClock.pde @@ -0,0 +1,70 @@ +/** + * SyncArduinoClock. + * + * portIndex must be set to the port connected to the Arduino + * + * The current time is sent in response to request message from Arduino + * or by clicking the display window + * + * The time message is 11 ASCII text characters; a header (the letter 'T') + * followed by the ten digit system time (unix time) + */ + + +import processing.serial.*; + +public static final short portIndex = 1; // select the com port, 0 is the first port +public static final char TIME_HEADER = 'T'; //header byte for arduino serial time message +public static final char TIME_REQUEST = 7; // ASCII bell character +public static final char LF = 10; // ASCII linefeed +public static final char CR = 13; // ASCII linefeed +Serial myPort; // Create object from Serial class + +void setup() { + size(200, 200); + println(Serial.list()); + println(" Connecting to -> " + Serial.list()[portIndex]); + myPort = new Serial(this,Serial.list()[portIndex], 9600); +} + +void draw() +{ + if ( myPort.available() > 0) { // If data is available, + char val = char(myPort.read()); // read it and store it in val + if(val == TIME_REQUEST){ + long t = getTimeNow(); + sendTimeMessage(TIME_HEADER, t); + } + else + { + if(val == LF) + ; //igonore + else if(val == CR) + println(); + else + print(val); // echo everying but time request + } + } +} + +void mousePressed() { + sendTimeMessage( TIME_HEADER, getTimeNow()); +} + + +void sendTimeMessage(char header, long time) { + String timeStr = String.valueOf(time); + myPort.write(header); // send header and time to arduino + myPort.write(timeStr); +} + +long getTimeNow(){ + // java time is in ms, we want secs + GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(new Date()); + int tzo = cal.get(Calendar.ZONE_OFFSET); + int dst = cal.get(Calendar.DST_OFFSET); + long now = (cal.getTimeInMillis() / 1000) ; + now = now + (tzo/1000) + (dst/1000); + return now; +} diff --git a/books/pdummies/Libraries/Time/Examples/Processing/SyncArduinoClock/readme.txt b/books/pdummies/Libraries/Time/Examples/Processing/SyncArduinoClock/readme.txt new file mode 100644 index 0000000..985bd80 --- /dev/null +++ b/books/pdummies/Libraries/Time/Examples/Processing/SyncArduinoClock/readme.txt @@ -0,0 +1,9 @@ +SyncArduinoClock is a Processing sketch that responds to Arduino requests for +time synchronization messages. + +The portIndex must be set the Serial port connected to Arduino. + +Download TimeSerial.pde onto Arduino and you should see the time +message displayed when you run SyncArduinoClock in Processing. +The Arduino time is set from the time on your computer through the +Processing sketch. \ No newline at end of file diff --git a/books/pdummies/Libraries/Time/Examples/TimeGPS/TimeGPS.pde b/books/pdummies/Libraries/Time/Examples/TimeGPS/TimeGPS.pde new file mode 100644 index 0000000..1c7b25e --- /dev/null +++ b/books/pdummies/Libraries/Time/Examples/TimeGPS/TimeGPS.pde @@ -0,0 +1,82 @@ +/* + * TimeGPS.pde + * example code illustrating time synced from a GPS + * + */ + +#include +#include //http://arduiniana.org/libraries/TinyGPS/ +#include //http://arduiniana.org/libraries/newsoftserial/ +// GPS and NewSoftSerial libraries are the work of Mikal Hart + +TinyGPS gps; +NewSoftSerial serial_gps = NewSoftSerial(3, 2); // receive on pin 3 + +const int offset = 1; // offset hours from gps time (UTC) +time_t prevDisplay = 0; // when the digital clock was displayed + +void setup() +{ + Serial.begin(9600); + serial_gps.begin(4800); + Serial.println("Waiting for GPS time ... "); + setSyncProvider(gpsTimeSync); +} + +void loop() +{ + while (serial_gps.available()) + { + gps.encode(serial_gps.read()); // process gps messages + } + if(timeStatus()!= timeNotSet) + { + if( now() != prevDisplay) //update the display only if the time has changed + { + prevDisplay = now(); + digitalClockDisplay(); + } + } +} + +void digitalClockDisplay(){ + // digital clock display of the time + Serial.print(hour()); + printDigits(minute()); + printDigits(second()); + Serial.print(" "); + Serial.print(day()); + Serial.print(" "); + Serial.print(month()); + Serial.print(" "); + Serial.print(year()); + Serial.println(); +} + +void printDigits(int digits){ + // utility function for digital clock display: prints preceding colon and leading 0 + Serial.print(":"); + if(digits < 10) + Serial.print('0'); + Serial.print(digits); +} + +time_t gpsTimeSync(){ + // returns time if avail from gps, else returns 0 + unsigned long fix_age = 0 ; + gps.get_datetime(NULL,NULL, &fix_age); + unsigned long time_since_last_fix; + if(fix_age < 1000) + return gpsTimeToArduinoTime(); // return time only if updated recently by gps + return 0; +} + +time_t gpsTimeToArduinoTime(){ + // returns time_t from gps date and time with the given offset hours + tmElements_t tm; + int year; + gps.crack_datetime(&year, &tm.Month, &tm.Day, &tm.Hour, &tm.Minute, &tm.Second, NULL, NULL); + tm.Year = year - 1970; + time_t time = makeTime(tm); + return time + (offset * SECS_PER_HOUR); +} diff --git a/books/pdummies/Libraries/Time/Examples/TimeNTP/TimeNTP.pde b/books/pdummies/Libraries/Time/Examples/TimeNTP/TimeNTP.pde new file mode 100755 index 0000000..11927c6 --- /dev/null +++ b/books/pdummies/Libraries/Time/Examples/TimeNTP/TimeNTP.pde @@ -0,0 +1,120 @@ +/* + * Time_NTP.pde + * Example showing time sync to NTP time source + * + * This sketch uses the Ethenet library with the user contributed UdpBytewise extension + */ + +#include +#include +#include // UDP library from: bjoern@cs.stanford.edu 12/30/2008 +#if UDP_TX_PACKET_MAX_SIZE <64 || UDP_RX_PACKET_MAX_SIZE < 64 +#error : UDP packet size to small - modify UdpBytewise.h to set buffers to 64 bytes +#endif +/* + * + * You may need to modify the UdpBytewise.h library to allow enough space in the buffers for the NTP packets. + * Open up UdpBytewse.h and set the following buffers to 64 bytes: + * #define UDP_TX_PACKET_MAX_SIZE 64 + * #define UDP_RX_PACKET_MAX_SIZE 64 + */ + + +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +byte ip[] = { 192, 168, 1, 44 }; // set the IP address to an unused address on your network + +byte SNTP_server_IP[] = { 192, 43, 244, 18}; // time.nist.gov +//byte SNTP_server_IP[] = { 130,149,17,21}; // ntps1-0.cs.tu-berlin.de +//byte SNTP_server_IP[] = { 192,53,103,108}; // ptbtime1.ptb.de + + +time_t prevDisplay = 0; // when the digital clock was displayed +const long timeZoneOffset = 0L; // set this to the offset in seconds to your local time; + +void setup() +{ + Serial.begin(9600); + Ethernet.begin(mac,ip); + Serial.println("waiting for sync"); + setSyncProvider(getNtpTime); + while(timeStatus()== timeNotSet) + ; // wait until the time is set by the sync provider +} + +void loop() +{ + if( now() != prevDisplay) //update the display only if the time has changed + { + prevDisplay = now(); + digitalClockDisplay(); + } +} + +void digitalClockDisplay(){ + // digital clock display of the time + Serial.print(hour()); + printDigits(minute()); + printDigits(second()); + Serial.print(" "); + Serial.print(day()); + Serial.print(" "); + Serial.print(month()); + Serial.print(" "); + Serial.print(year()); + Serial.println(); +} + +void printDigits(int digits){ + // utility function for digital clock display: prints preceding colon and leading 0 + Serial.print(":"); + if(digits < 10) + Serial.print('0'); + Serial.print(digits); +} + +/*-------- NTP code ----------*/ + +unsigned long getNtpTime() +{ + sendNTPpacket(SNTP_server_IP); + delay(1000); + if ( UdpBytewise.available() ) { + for(int i=0; i < 40; i++) + UdpBytewise.read(); // ignore every field except the time + const unsigned long seventy_years = 2208988800UL + timeZoneOffset; + return getUlong() - seventy_years; + } + return 0; // return 0 if unable to get the time +} + +unsigned long sendNTPpacket(byte *address) +{ + UdpBytewise.begin(123); + UdpBytewise.beginPacket(address, 123); + UdpBytewise.write(B11100011); // LI, Version, Mode + UdpBytewise.write(0); // Stratum + UdpBytewise.write(6); // Polling Interval + UdpBytewise.write(0xEC); // Peer Clock Precision + write_n(0, 8); // Root Delay & Root Dispersion + UdpBytewise.write(49); + UdpBytewise.write(0x4E); + UdpBytewise.write(49); + UdpBytewise.write(52); + write_n(0, 32); //Reference and time stamps + UdpBytewise.endPacket(); +} + +unsigned long getUlong() +{ + unsigned long ulong = (unsigned long)UdpBytewise.read() << 24; + ulong |= (unsigned long)UdpBytewise.read() << 16; + ulong |= (unsigned long)UdpBytewise.read() << 8; + ulong |= (unsigned long)UdpBytewise.read(); + return ulong; +} + +void write_n(int what, int how_many) +{ + for( int i = 0; i < how_many; i++ ) + UdpBytewise.write(what); +} diff --git a/books/pdummies/Libraries/Time/Examples/TimeRTC/TimeRTC.pde b/books/pdummies/Libraries/Time/Examples/TimeRTC/TimeRTC.pde new file mode 100644 index 0000000..1a1ed80 --- /dev/null +++ b/books/pdummies/Libraries/Time/Examples/TimeRTC/TimeRTC.pde @@ -0,0 +1,47 @@ +/* + * TimeRTC.pde + * example code illustrating Time library with Real Time Clock. + * + */ + +#include +#include +#include // a basic DS1307 library that returns time as a time_t + +void setup() { + Serial.begin(9600); + setSyncProvider(RTC.get); // the function to get the time from the RTC + if(timeStatus()!= timeSet) + Serial.println("Unable to sync with the RTC"); + else + Serial.println("RTC has set the system time"); +} + +void loop() +{ + digitalClockDisplay(); + delay(1000); +} + +void digitalClockDisplay(){ + // digital clock display of the time + Serial.print(hour()); + printDigits(minute()); + printDigits(second()); + Serial.print(" "); + Serial.print(day()); + Serial.print(" "); + Serial.print(month()); + Serial.print(" "); + Serial.print(year()); + Serial.println(); +} + +void printDigits(int digits){ + // utility function for digital clock display: prints preceding colon and leading 0 + Serial.print(":"); + if(digits < 10) + Serial.print('0'); + Serial.print(digits); +} + diff --git a/books/pdummies/Libraries/Time/Examples/TimeRTCLog/TimeRTCLog.pde b/books/pdummies/Libraries/Time/Examples/TimeRTCLog/TimeRTCLog.pde new file mode 100644 index 0000000..76ed17d --- /dev/null +++ b/books/pdummies/Libraries/Time/Examples/TimeRTCLog/TimeRTCLog.pde @@ -0,0 +1,106 @@ +/* + * TimeRTCLogger.pde + * example code illustrating adding and subtracting Time. + * + * this sketch logs pin state change events + * the time of the event and time since the previous event is calculated and sent to the serial port. + */ + +#include +#include +#include // a basic DS1307 library that returns time as a time_t + +const int nbrInputPins = 6; // monitor 6 digital pins +const int inputPins[nbrInputPins] = {2,3,4,5,6,7}; // pins to monitor +boolean state[nbrInputPins] ; // the state of the monitored pins +time_t prevEventTime[nbrInputPins] ; // the time of the previous event + +void setup() { + Serial.begin(9600); + setSyncProvider(RTC.get); // the function to sync the time from the RTC + for(int i=0; i < nbrInputPins; i++){ + pinMode( inputPins[i], INPUT); + // digitalWrite( inputPins[i], HIGH); // uncomment these lines if + // state[i] = HIGH; // pull-up resistors are wanted + } +} + +void loop() +{ + for(int i=0; i < nbrInputPins; i++) + { + boolean val = digitalRead(inputPins[i]); + if(val != state[i]) + { + time_t duration = 0; // the time since the previous event + state[i] = val; + time_t timeNow = now(); + if(prevEventTime[i] > 0) + // if this was not the first state change, calculate the time from the previous change + duration = duration = timeNow - prevEventTime[i]; + logEvent(inputPins[i], val, timeNow, duration ); // log the event + prevEventTime[i] = timeNow; // store the time for this event + } + } +} + +void logEvent( int pin, boolean state, time_t timeNow, time_t duration) +{ + Serial.print("Pin "); + Serial.print(pin); + if( state == HIGH) + Serial.print(" went High at "); + else + Serial.print(" went Low at "); + showTime(timeNow); + if(duration > 0){ + // only display duration if greater than 0 + Serial.print(", Duration was "); + showDuration(duration); + } + Serial.println(); +} + + +void showTime(time_t t){ + // display the given time + Serial.print(hour(t)); + printDigits(minute(t)); + printDigits(second(t)); + Serial.print(" "); + Serial.print(day(t)); + Serial.print(" "); + Serial.print(month(t)); + Serial.print(" "); + Serial.print(year(t)); +} + +void printDigits(int digits){ + // utility function for digital clock display: prints preceding colon and leading 0 + Serial.print(":"); + if(digits < 10) + Serial.print('0'); + Serial.print(digits); +} + +void showDuration(time_t duration){ +// prints the duration in days, hours, minutes and seconds + if(duration >= SECS_PER_DAY){ + Serial.print(duration / SECS_PER_DAY); + Serial.print(" day(s) "); + duration = duration % SECS_PER_DAY; + } + if(duration >= SECS_PER_HOUR){ + Serial.print(duration / SECS_PER_HOUR); + Serial.print(" hour(s) "); + duration = duration % SECS_PER_HOUR; + } + if(duration >= SECS_PER_MIN){ + Serial.print(duration / SECS_PER_MIN); + Serial.print(" minute(s) "); + duration = duration % SECS_PER_MIN; + } + Serial.print(duration); + Serial.print(" second(s) "); +} + diff --git a/books/pdummies/Libraries/Time/Examples/TimeRTCSet/TimeRTCSet.pde b/books/pdummies/Libraries/Time/Examples/TimeRTCSet/TimeRTCSet.pde new file mode 100644 index 0000000..48b696c --- /dev/null +++ b/books/pdummies/Libraries/Time/Examples/TimeRTCSet/TimeRTCSet.pde @@ -0,0 +1,82 @@ +/* + * TimeRTCSet.pde + * example code illustrating Time library with Real Time Clock. + * + * RTC clock is set in response to serial port time message + * A Processing example sketch to set the time is inclided in the download + */ + +#include +#include +#include // a basic DS1307 library that returns time as a time_t + + +void setup() { + Serial.begin(9600); + setSyncProvider(RTC.get); // the function to get the time from the RTC + if(timeStatus()!= timeSet) + Serial.println("Unable to sync with the RTC"); + else + Serial.println("RTC has set the system time"); +} + +void loop() +{ + if(Serial.available()) + { + time_t t = processSyncMessage(); + if(t >0) + { + RTC.set(t); // set the RTC and the system time to the received value + setTime(t); + } + } + digitalClockDisplay(); + delay(1000); +} + +void digitalClockDisplay(){ + // digital clock display of the time + Serial.print(hour()); + printDigits(minute()); + printDigits(second()); + Serial.print(" "); + Serial.print(day()); + Serial.print(" "); + Serial.print(month()); + Serial.print(" "); + Serial.print(year()); + Serial.println(); +} + +void printDigits(int digits){ + // utility function for digital clock display: prints preceding colon and leading 0 + Serial.print(":"); + if(digits < 10) + Serial.print('0'); + Serial.print(digits); +} + +/* code to process time sync messages from the serial port */ +#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits +#define TIME_HEADER 'T' // Header tag for serial time sync message + +time_t processSyncMessage() { + // return the time if a valid sync message is received on the serial port. + while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits + char c = Serial.read() ; + Serial.print(c); + if( c == TIME_HEADER ) { + time_t pctime = 0; + for(int i=0; i < TIME_MSG_LEN -1; i++){ + c = Serial.read(); + if( c >= '0' && c <= '9'){ + pctime = (10 * pctime) + (c - '0') ; // convert digits to a number + } + } + return pctime; + } + } + return 0; +} + diff --git a/books/pdummies/Libraries/Time/Examples/TimeSerial/TimeSerial.pde b/books/pdummies/Libraries/Time/Examples/TimeSerial/TimeSerial.pde new file mode 100644 index 0000000..55c67a6 --- /dev/null +++ b/books/pdummies/Libraries/Time/Examples/TimeSerial/TimeSerial.pde @@ -0,0 +1,82 @@ +/* + * TimeSerial.pde + * example code illustrating Time library set through serial port messages. + * + * Messages consist of the letter T followed by ten digit time (as seconds since Jan 1 1970) + * you can send the text on the next line using Serial Monitor to set the clock to noon Jan 1 2010 + T1262347200 + * + * A Processing example sketch to automatically send the messages is inclided in the download + */ + +#include + +#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits +#define TIME_HEADER 'T' // Header tag for serial time sync message +#define TIME_REQUEST 7 // ASCII bell character requests a time sync message + +void setup() { + Serial.begin(9600); + setSyncProvider( requestSync); //set function to call when sync required + Serial.println("Waiting for sync message"); +} + +void loop(){ + if(Serial.available() ) + { + processSyncMessage(); + } + if(timeStatus()!= timeNotSet) + { + digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh + digitalClockDisplay(); + } + delay(1000); +} + +void digitalClockDisplay(){ + // digital clock display of the time + Serial.print(hour()); + printDigits(minute()); + printDigits(second()); + Serial.print(" "); + Serial.print(day()); + Serial.print(" "); + Serial.print(month()); + Serial.print(" "); + Serial.print(year()); + Serial.println(); +} + +void printDigits(int digits){ + // utility function for digital clock display: prints preceding colon and leading 0 + Serial.print(":"); + if(digits < 10) + Serial.print('0'); + Serial.print(digits); +} + +void processSyncMessage() { + // if time sync available from serial port, update time and return true + while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits + char c = Serial.read() ; + Serial.print(c); + if( c == TIME_HEADER ) { + time_t pctime = 0; + for(int i=0; i < TIME_MSG_LEN -1; i++){ + c = Serial.read(); + if( c >= '0' && c <= '9'){ + pctime = (10 * pctime) + (c - '0') ; // convert digits to a number + } + } + setTime(pctime); // Sync Arduino clock to the time received on the serial port + } + } +} + +time_t requestSync() +{ + Serial.print(TIME_REQUEST,BYTE); + return 0; // the time will be sent later in response to serial mesg +} + diff --git a/books/pdummies/Libraries/Time/Examples/TimeSerialDateStrings/TimeSerialDateStrings.pde b/books/pdummies/Libraries/Time/Examples/TimeSerialDateStrings/TimeSerialDateStrings.pde new file mode 100644 index 0000000..dcff97e --- /dev/null +++ b/books/pdummies/Libraries/Time/Examples/TimeSerialDateStrings/TimeSerialDateStrings.pde @@ -0,0 +1,80 @@ +/* + * TimeSerialDateStrings.pde + * example code illustrating Time library date strings + * + * This sketch adds date string functionality to TimeSerial.pde + * + */ + +#include + +#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits +#define TIME_HEADER 'T' // Header tag for serial time sync message +#define TIME_REQUEST 7 // ASCII bell character requests a time sync message + +void setup() { + Serial.begin(9600); + setSyncProvider( requestSync); //set function to call when sync required + Serial.println("Waiting for sync message"); +} + +void loop(){ + if(Serial.available() ) + { + processSyncMessage(); + } + if(timeStatus()!= timeNotSet) + { + digitalClockDisplay(); + } + delay(1000); +} + +void digitalClockDisplay(){ + // digital clock display of the time + Serial.print(hour()); + printDigits(minute()); + printDigits(second()); + Serial.print(" "); + Serial.print(dayStr(weekday())); + Serial.print(" "); + Serial.print(day()); + Serial.print(" "); + Serial.print(monthShortStr(month())); + Serial.print(" "); + Serial.print(year()); + Serial.println(); +} + +void printDigits(int digits){ + // utility function for digital clock display: prints preceding colon and leading 0 + Serial.print(":"); + if(digits < 10) + Serial.print('0'); + Serial.print(digits); +} + +void processSyncMessage() { + // if time sync available from serial port, update time and return true + while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits + char c = Serial.read() ; + Serial.print(c); + if( c == TIME_HEADER ) { + time_t pctime = 0; + for(int i=0; i < TIME_MSG_LEN -1; i++){ + c = Serial.read(); + if( c >= '0' && c <= '9'){ + pctime = (10 * pctime) + (c - '0') ; // convert digits to a number + } + } + setTime(pctime); // Sync Arduino clock to the time received on the serial port + } + } +} + +time_t requestSync() +{ + Serial.print(TIME_REQUEST,BYTE); + return 0; // the time will be sent later in response to serial mesg +} + diff --git a/books/pdummies/Libraries/Time/Readme.txt b/books/pdummies/Libraries/Time/Readme.txt new file mode 100755 index 0000000..22bc4aa --- /dev/null +++ b/books/pdummies/Libraries/Time/Readme.txt @@ -0,0 +1,131 @@ +Readme file for Arduino Time Library + +Time is a library that provides timekeeping functionality for Arduino. + +The code is derived from the Playground DateTime library but is updated +to provide an API that is more flexable and easier to use. + +A primary goal was to enable date and time functionality that can be used with +a variety of external time sources with minimum differences required in sketch logic. + +Example sketches illustrate how similar sketch code can be used with: a Real Time Clock, +internet NTP time service, GPS time data, and Serial time messages from a computer +for time synchronization. + +The functions available in the library include: + +hour(); // the hour now (0-23) +minute(); // the minute now (0-59) +second(); // the second now (0-59) +day(); // the day now (1-31) +weekday(); // day of the week, Sunday is day 0 +month(); // the month now (1-12) +year(); // the full four digit year: (2009, 2010 etc) + +there are also functions to return the hour in 12 hour format +hourFormat12(); // the hour now in 12 hour format +isAM(); // returns true if time now is AM +isPM(); // returns true if time now is PM + +now(); // returns the current time as seconds since Jan 1 1970 + +The time and date functions can take an optional parameter for the time. This prevents +errors if the time rolls over between elements. For example, if a new minute begins +between getting the minute and second, the values will be inconsistent. Using the +following functions eliminates this probglem + time_t t = now(); // store the current time in time variable t + hour(t); // returns the hour for the given time t + minute(t); // returns the minute for the given time t + second(t); // returns the second for the given time t + day(t); // the day for the given time t + weekday(t); // day of the week for the given time t + month(t); // the month for the given time t + year(t); // the year for the given time t + + +Functions for managing the timer services are: +setTime(t); // set the system time to the give time t +setTime(hr,min,sec,day,mnth,yr); // alternative to above, yr is 2 or 4 digit yr (2010 or 10 sets year to 2010) +adjustTime(adjustment); // adjust system time by adding the adjustment value + +timeStatus(); // indicates if time has been set and recently synchronized + // returns one of the following enumerations: + timeNotSet // the time has never been set, the clock started at Jan 1 1970 + timeNeedsSync // the time had been set but a sync attempt did not succeed + timeSet // the time is set and is synced +Time and Date values are not valid if the status is timeNotSet. Otherwise values can be used but +the returned time may have drifted if the status is timeNeedsSync. + +setSyncProvider(getTimeFunction); // set the external time provider +setSyncInterval(interval); // set the number of seconds between re-sync + + +There are many convenience macros in the time.h file for time constants and conversion of time units. + +To use the library, copy the download to the Library directory. + +The Time directory contains the Time library and some example sketches +illustrating how the library can be used with various time sources: + +- TimeSerial.pde shows Arduino as a clock without external hardware. + It is synchronized by time messages sent over the serial port. + A companion Processing sketch will automatically provide these messages + if it is running and connected to the Arduino serial port. + +- TimeSerialDateStrings.pde adds day and month name strings to the sketch above + Short (3 character) and long strings are available to print the days of + the week and names of the months. + +- TimeRTC uses a DS1307 real time clock to provide time synchronization. + A basic RTC library named DS1307RTC is included in the download. + To run this sketch the DS1307RTC library must be installed. + +- TimeRTCSet is similar to the above and adds the ability to set the Real Time Clock + +- TimeRTCLog demonstrates how to calculate the difference between times. + It is a vary simple logger application that monitors events on digtial pins + and prints (to the serial port) the time of an event and the time period since the previous event. + +- TimeNTP uses the Arduino Ethernet shield to access time using the internet NTP time service. + The NTP protocol uses UDP and the UdpBytewise library is required, see: + http://bitbucket.org/bjoern/arduino_osc/src/14667490521f/libraries/Ethernet/ + +-TimeGPS gets time from a GPS + This requires the TinyGPS and NewSoftSerial libraries from Mikal Hart: + http://arduiniana.org/libraries/TinyGPS and http://arduiniana.org/libraries/newsoftserial/ + +Differences between this code and the playground DateTime library +although the Time library is based on the DateTime codebase, the API has changed. +Changes in the Time library API: +- time elements are functions returning int (they are variables in DateTime) +- Years start from 1970 +- days of the week and months start from 1 (they start from 0 in DateTime) +- DateStrings do not require a seperate library +- time elements can be accessed non-atomically (in DateTime they are always atomic) +- function added to automatically sync time with extrnal source +- localTime and maketime parameters changed, localTime renamed to breakTime + +Technical notes: + +Internal system time is based on the standard Unix time_t. +The value is the number of seconds since Jan 1 1970. +System time begins at zero when the sketch starts. + +The internal time can be automatically synchronized at regular intervals to an external time source. +This is enabled by calling the setSyncProvider(provider) function - the provider argument is +the address of a function that returns the current time as a time_t. +See the sketches in the examples directory for usage. + +The default interval for re-syncing the time is 5 minutes but can be changed by calling the +setSyncInterval( interval) method to set the number of seconds between re-sync attempts. + +The Time library defines a structure for holding time elements that is a compact version of the C tm structure. +All the members of the Arduino tm structure are bytes and the year is offset from 1970. +Convenience macros provide conversion to and from the Arduino format. + +Low level functions to convert between system time and individual time elements are provided: + breakTime( time, &tm); // break time_t into elements stored in tm struct + makeTime( &tm); // return time_t from elements stored in tm struct + +The DS1307RTC library included in the download provides an example of how a time provider +can use the low level functions to interface with the Time library. \ No newline at end of file diff --git a/books/pdummies/Libraries/Time/Time.cpp b/books/pdummies/Libraries/Time/Time.cpp new file mode 100755 index 0000000..5807311 --- /dev/null +++ b/books/pdummies/Libraries/Time/Time.cpp @@ -0,0 +1,307 @@ +/* + time.c - low level time and date functions + Copyright (c) Michael Margolis 2009 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + 6 Jan 2010 - initial release + 12 Feb 2010 - fixed leap year calculation error + 1 Nov 2010 - fixed setTime bug (thanks to Korman for this) +*/ + +#if defined(ARDUINO) && ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#endif + +#include "Time.h" + +static tmElements_t tm; // a cache of time elements +static time_t cacheTime; // the time the cache was updated +static time_t syncInterval = 300; // time sync will be attempted after this many seconds + +void refreshCache( time_t t){ + if( t != cacheTime) + { + breakTime(t, tm); + cacheTime = t; + } +} + +int hour() { // the hour now + return hour(now()); +} + +int hour(time_t t) { // the hour for the given time + refreshCache(t); + return tm.Hour; +} + +int hourFormat12() { // the hour now in 12 hour format + return hourFormat12(now()); +} + +int hourFormat12(time_t t) { // the hour for the given time in 12 hour format + refreshCache(t); + if( tm.Hour == 0 ) + return 12; // 12 midnight + else if( tm.Hour > 12) + return tm.Hour - 12 ; + else + return tm.Hour ; +} + +uint8_t isAM() { // returns true if time now is AM + return !isPM(now()); +} + +uint8_t isAM(time_t t) { // returns true if given time is AM + return !isPM(t); +} + +uint8_t isPM() { // returns true if PM + return isPM(now()); +} + +uint8_t isPM(time_t t) { // returns true if PM + return (hour(t) >= 12); +} + +int minute() { + return minute(now()); +} + +int minute(time_t t) { // the minute for the given time + refreshCache(t); + return tm.Minute; +} + +int second() { + return second(now()); +} + +int second(time_t t) { // the second for the given time + refreshCache(t); + return tm.Second; +} + +int day(){ + return(day(now())); +} + +int day(time_t t) { // the day for the given time (0-6) + refreshCache(t); + return tm.Day; +} + +int weekday() { // Sunday is day 1 + return weekday(now()); +} + +int weekday(time_t t) { + refreshCache(t); + return tm.Wday; +} + +int month(){ + return month(now()); +} + +int month(time_t t) { // the month for the given time + refreshCache(t); + return tm.Month; +} + +int year() { // as in Processing, the full four digit year: (2009, 2010 etc) + return year(now()); +} + +int year(time_t t) { // the year for the given time + refreshCache(t); + return tmYearToCalendar(tm.Year); +} + +/*============================================================================*/ +/* functions to convert to and from system time */ +/* These are for interfacing with time serivces and are not normally needed in a sketch */ + +// leap year calulator expects year argument as years offset from 1970 +#define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) + +static const uint8_t monthDays[]={31,28,31,30,31,30,31,31,30,31,30,31}; // API starts months from 1, this array starts from 0 + +void breakTime(time_t time, tmElements_t &tm){ +// break the given time_t into time components +// this is a more compact version of the C library localtime function +// note that year is offset from 1970 !!! + + uint8_t year; + uint8_t month, monthLength; + unsigned long days; + + tm.Second = time % 60; + time /= 60; // now it is minutes + tm.Minute = time % 60; + time /= 60; // now it is hours + tm.Hour = time % 24; + time /= 24; // now it is days + tm.Wday = ((time + 4) % 7) + 1; // Sunday is day 1 + + year = 0; + days = 0; + while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { + year++; + } + tm.Year = year; // year is offset from 1970 + + days -= LEAP_YEAR(year) ? 366 : 365; + time -= days; // now it is days in this year, starting at 0 + + days=0; + month=0; + monthLength=0; + for (month=0; month<12; month++) { + if (month==1) { // february + if (LEAP_YEAR(year)) { + monthLength=29; + } else { + monthLength=28; + } + } else { + monthLength = monthDays[month]; + } + + if (time >= monthLength) { + time -= monthLength; + } else { + break; + } + } + tm.Month = month + 1; // jan is month 1 + tm.Day = time + 1; // day of month +} + +time_t makeTime(tmElements_t &tm){ +// assemble time elements into time_t +// note year argument is offset from 1970 (see macros in time.h to convert to other formats) +// previous version used full four digit year (or digits since 2000),i.e. 2009 was 2009 or 9 + + int i; + time_t seconds; + + // seconds from 1970 till 1 jan 00:00:00 of the given year + seconds= tm.Year*(SECS_PER_DAY * 365); + for (i = 0; i < tm.Year; i++) { + if (LEAP_YEAR(i)) { + seconds += SECS_PER_DAY; // add extra days for leap years + } + } + + // add days for this year, months start from 1 + for (i = 1; i < tm.Month; i++) { + if ( (i == 2) && LEAP_YEAR(tm.Year)) { + seconds += SECS_PER_DAY * 29; + } else { + seconds += SECS_PER_DAY * monthDays[i-1]; //monthDay array starts from 0 + } + } + seconds+= (tm.Day-1) * SECS_PER_DAY; + seconds+= tm.Hour * SECS_PER_HOUR; + seconds+= tm.Minute * SECS_PER_MIN; + seconds+= tm.Second; + return seconds; +} +/*=====================================================*/ +/* Low level system time functions */ + +static time_t sysTime = 0; +static time_t prevMillis = 0; +static time_t nextSyncTime = 0; +static timeStatus_t Status = timeNotSet; + +getExternalTime getTimePtr; // pointer to external sync function +//setExternalTime setTimePtr; // not used in this version + +#ifdef TIME_DRIFT_INFO // define this to get drift data +time_t sysUnsyncedTime = 0; // the time sysTime unadjusted by sync +#endif + + +time_t now(){ + while( millis() - prevMillis >= 1000){ + sysTime++; + prevMillis += 1000; +#ifdef TIME_DRIFT_INFO + sysUnsyncedTime++; // this can be compared to the synced time to measure long term drift +#endif + } + if(nextSyncTime <= sysTime){ + if(getTimePtr != 0){ + time_t t = getTimePtr(); + if( t != 0) + setTime(t); + else + Status = (Status == timeNotSet) ? timeNotSet : timeNeedsSync; + } + } + return sysTime; +} + +void setTime(time_t t){ +#ifdef TIME_DRIFT_INFO + if(sysUnsyncedTime == 0) + sysUnsyncedTime = t; // store the time of the first call to set a valid Time +#endif + + sysTime = t; + nextSyncTime = t + syncInterval; + Status = timeSet; + prevMillis = millis(); // restart counting from now (thanks to Korman for this fix) +} + +void setTime(int hr,int min,int sec,int dy, int mnth, int yr){ + // year can be given as full four digit year or two digts (2010 or 10 for 2010); + //it is converted to years since 1970 + if( yr > 99) + yr = yr - 1970; + else + yr += 30; + tm.Year = yr; + tm.Month = mnth; + tm.Day = dy; + tm.Hour = hr; + tm.Minute = min; + tm.Second = sec; + setTime(makeTime(tm)); +} + +void adjustTime(long adjustment){ + sysTime += adjustment; +} + +timeStatus_t timeStatus(){ // indicates if time has been set and recently synchronized + return Status; +} + +void setSyncProvider( getExternalTime getTimeFunction){ + getTimePtr = getTimeFunction; + nextSyncTime = sysTime; + now(); // this will sync the clock +} + +void setSyncInterval(time_t interval){ // set the number of seconds between re-sync + syncInterval = interval; +} diff --git a/books/pdummies/Libraries/Time/Time.h b/books/pdummies/Libraries/Time/Time.h new file mode 100755 index 0000000..5ffd3bd --- /dev/null +++ b/books/pdummies/Libraries/Time/Time.h @@ -0,0 +1,116 @@ +/* + time.h - low level time and date functions +*/ + +#ifndef _Time_h +#define _Time_h + +#include + +typedef unsigned long time_t; + +typedef enum {timeNotSet, timeNeedsSync, timeSet +} timeStatus_t ; + +typedef enum { + dowInvalid, dowSunday, dowMonday, dowTuesday, dowWednesday, dowThursday, dowFriday, dowSaturday +} timeDayOfWeek_t; + +typedef enum { + tmSecond, tmMinute, tmHour, tmWday, tmDay,tmMonth, tmYear, tmNbrFields +} tmByteFields; + +typedef struct { + uint8_t Second; + uint8_t Minute; + uint8_t Hour; + uint8_t Wday; // day of week, sunday is day 1 + uint8_t Day; + uint8_t Month; + uint8_t Year; // offset from 1970; +} tmElements_t, TimeElements, *tmElementsPtr_t; + +//convenience macros to convert to and from tm years +#define tmYearToCalendar(Y) ((Y) + 1970) // full four digit year +#define CalendarYrToTm(Y) ((Y) - 1970) +#define tmYearToY2k(Y) ((Y) - 30) // offset is from 2000 +#define y2kYearToTm(Y) ((Y) + 30) + +typedef time_t(*getExternalTime)(); +//typedef void (*setExternalTime)(const time_t); // not used in this version + + +/*==============================================================================*/ +/* Useful Constants */ +#define SECS_PER_MIN (60UL) +#define SECS_PER_HOUR (3600UL) +#define SECS_PER_DAY (SECS_PER_HOUR * 24UL) +#define DAYS_PER_WEEK (7UL) +#define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK) +#define SECS_PER_YEAR (SECS_PER_WEEK * 52UL) +#define SECS_YR_2000 (946684800UL) // the time at the start of y2k + +/* Useful Macros for getting elapsed time */ +#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN) +#define numberOfMinutes(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN) +#define numberOfHours(_time_) (( _time_% SECS_PER_DAY) / SECS_PER_HOUR) +#define dayOfWeek(_time_) ((( _time_ / SECS_PER_DAY + 4) % DAYS_PER_WEEK)+1) // 1 = Sunday +#define elapsedDays(_time_) ( _time_ / SECS_PER_DAY) // this is number of days since Jan 1 1970 +#define elapsedSecsToday(_time_) (_time_ % SECS_PER_DAY) // the number of seconds since last midnight +#define previousMidnight(_time_) (( _time_ / SECS_PER_DAY) * SECS_PER_DAY) // time at the start of the given day +#define nextMidnight(_time_) ( previousMidnight(_time_) + SECS_PER_DAY ) // time at the end of the given day +#define elapsedSecsThisWeek(_time_) (elapsedSecsToday(_time_) + (dayOfWeek(_time_) * SECS_PER_DAY) ) + +/* Useful Macros for converting elapsed time to a time_t */ +#define minutesToTime_t ((M)) ( (M) * SECS_PER_MIN) +#define hoursToTime_t ((H)) ( (H) * SECS_PER_HOUR) +#define daysToTime_t ((H)) ( (D) * SECS_PER_DAY) +#define weeksToTime_t ((W)) ( (W) * SECS_PER_WEEK) + +/*============================================================================*/ +/* time and date functions */ +int hour(); // the hour now +int hour(time_t t); // the hour for the given time +int hourFormat12(); // the hour now in 12 hour format +int hourFormat12(time_t t); // the hour for the given time in 12 hour format +uint8_t isAM(); // returns true if time now is AM +uint8_t isAM(time_t t); // returns true the given time is AM +uint8_t isPM(); // returns true if time now is PM +uint8_t isPM(time_t t); // returns true the given time is PM +int minute(); // the minute now +int minute(time_t t); // the minute for the given time +int second(); // the second now +int second(time_t t); // the second for the given time +int day(); // the day now +int day(time_t t); // the day for the given time +int weekday(); // the weekday now (Sunday is day 1) +int weekday(time_t t); // the weekday for the given time +int month(); // the month now (Jan is month 1) +int month(time_t t); // the month for the given time +int year(); // the full four digit year: (2009, 2010 etc) +int year(time_t t); // the year for the given time + +time_t now(); // return the current time as seconds since Jan 1 1970 +void setTime(time_t t); +void setTime(int hr,int min,int sec,int day, int month, int yr); +void adjustTime(long adjustment); + +/* date strings */ +#define dt_MAX_STRING_LEN 9 // length of longest date string (excluding terminating null) +char* monthStr(uint8_t month); +char* dayStr(uint8_t day); +char* monthShortStr(uint8_t month); +char* dayShortStr(uint8_t day); + +/* time sync functions */ +timeStatus_t timeStatus(); // indicates if time has been set and recently synchronized +void setSyncProvider( getExternalTime getTimeFunction); // identify the external time provider +void setSyncInterval(time_t interval); // set the number of seconds between re-sync + +/* low level functions to convert to and from system time */ +void breakTime(time_t time, tmElements_t &tm); // break time_t into elements +time_t makeTime(tmElements_t &tm); // convert time elements into time_t + + +#endif /* _Time_h */ + diff --git a/books/pdummies/Libraries/Time/keywords.txt b/books/pdummies/Libraries/Time/keywords.txt new file mode 100644 index 0000000..f921672 --- /dev/null +++ b/books/pdummies/Libraries/Time/keywords.txt @@ -0,0 +1,33 @@ +####################################### +# Syntax Coloring Map For Time +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### +time_t KEYWORD1 +####################################### +# Methods and Functions (KEYWORD2) +####################################### +now KEYWORD2 +second KEYWORD2 +minute KEYWORD2 +hour KEYWORD2 +day KEYWORD2 +month KEYWORD2 +year KEYWORD2 +isAM KEYWORD2 +isPM KEYWORD2 +weekday KEYWORD2 +setTime KEYWORD2 +adjustTime KEYWORD2 +setSyncProvider KEYWORD2 +setSyncInteval KEYWORD2 +timeStatus KEYWORD2 +####################################### +# Instances (KEYWORD2) +####################################### + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/books/pdummies/Libraries/Twitter/Twitter.cpp b/books/pdummies/Libraries/Twitter/Twitter.cpp new file mode 100644 index 0000000..1b8156b --- /dev/null +++ b/books/pdummies/Libraries/Twitter/Twitter.cpp @@ -0,0 +1,729 @@ +/* + * Twitter.cpp + * + * Author: Markku Rossi + * + * Copyright (c) 2011-2012 Markku Rossi + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + * . + * + */ + +#include "Twitter.h" + +const static char hex_table[] PROGMEM = "0123456789ABCDEF"; +const static char base64_table[] PROGMEM += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +const static char s_jan[] PROGMEM = "Jan"; +const static char s_feb[] PROGMEM = "Feb"; +const static char s_mar[] PROGMEM = "Mar"; +const static char s_apr[] PROGMEM = "Apr"; +const static char s_may[] PROGMEM = "May"; +const static char s_jun[] PROGMEM = "Jun"; +const static char s_jul[] PROGMEM = "Jul"; +const static char s_aug[] PROGMEM = "Aug"; +const static char s_sep[] PROGMEM = "Sep"; +const static char s_oct[] PROGMEM = "Oct"; +const static char s_nov[] PROGMEM = "Nov"; +const static char s_dec[] PROGMEM = "Dec"; + +const static char *months[] PROGMEM = + { + s_jan, s_feb, s_mar, s_apr, s_may, s_jun, + s_jul, s_aug, s_sep, s_oct, s_nov, s_dec, + }; + +Twitter::Twitter(char *buffer, size_t buffer_len) + : basetime(0L), + last_millis(0L), + timestamp(0), + buffer(buffer), + buffer_len(buffer_len), + server(0), + uri(0), + port(0) +{ +} + +void +Twitter::set_twitter_endpoint(const prog_char server[], const prog_char uri[], + IPAddress ip, uint16_t port, bool proxy) +{ + this->server = server; + this->uri = uri; + this->ip = ip; + this->port = port; + + this->proxy = proxy ? 1 : 0; +} + +void +Twitter::set_client_id(const prog_char consumer_key[], + const prog_char consumer_secret[]) +{ + this->consumer_key = consumer_key; + this->consumer_secret = consumer_secret; +} + +void +Twitter::set_account_id(const prog_char access_token[], + const prog_char token_secret[]) +{ + this->access_token.pgm = access_token; + this->token_secret.pgm = token_secret; + + this->access_token_pgm = 1; +} + +void +Twitter::set_account_id(int access_token, int token_secret) +{ + this->access_token.eeprom = access_token; + this->token_secret.eeprom = token_secret; + + this->access_token_pgm = 0; +} + +bool +Twitter::is_ready(void) +{ + if (basetime) + return true; + + return query_time(); +} + +unsigned long +Twitter::get_time(void) +{ + unsigned long now = millis(); + + if (now < last_millis) + /* Our internal clock wrapped around. */ + basetime += 0xffffffffL / 1000L; + + last_millis = now; + + return basetime + now / 1000L; +} + +bool +Twitter::query_time(void) +{ + EthernetClient http; + + if (!http.connect(ip, port)) + { + println(PSTR("query_time: could not connect to server")); + return false; + } + + http_print(&http, PSTR("HEAD ")); + + if (proxy) + { + http_print(&http, PSTR("http://")); + http_print(&http, server); + } + + http_println(&http, PSTR("/ HTTP/1.1")); + + http_print(&http, PSTR("Host: ")); + http_print(&http, server); + http_newline(&http); + + http_println(&http, PSTR("Connection: close")); + + http_newline(&http); + + while (http.connected()) + { + if (!read_line(&http, buffer, buffer_len)) + break; + + if (buffer[0] == '\0') + break; + + if (process_date_header(buffer)) + break; + } + + http.stop(); + + return basetime != 0L; +} + +bool +Twitter::process_date_header(char *buffer) +{ + if ((buffer[0] != 'D' && buffer[0] != 'd') + || (buffer[1] != 'A' && buffer[1] != 'a') + || (buffer[2] != 'T' && buffer[2] != 't') + || (buffer[3] != 'E' && buffer[3] != 'e') + || (buffer[4] != ':')) + return false; + + unsigned long now = parse_date(buffer + 5); + + if (now != 0) + { + /* We managed to parse the date header, now update system + basetime. */ + last_millis = millis(); + basetime = now - last_millis / 1000L; + } + + return true; +} + +long +Twitter::parse_date(char *date) +{ + tmElements_t tm; + char *cp; + char *end; + + memset(&tm, 0, sizeof(tm)); + + /* We could use sscanf to parse the date string but it adds 26 bytes + to our SRAM consumption so let's use this adhoc parser. */ + + for (cp = date; *cp && *cp != ','; cp++) + ; + + if (*cp != ',') + return 0; + + tm.Day = strtol(++cp, &end, 10); + + if (end == cp) + return 0; + + cp = end; + + for (; *cp && *cp == ' '; cp++) + ; + if (!*cp) + return 0; + + tm.Month = parse_month(cp, &end); + if (tm.Month <= 0) + return 0; + + cp = end + 1; + + tm.Year = strtol(cp, &end, 10) - 1970; + + if (end == cp) + return 0; + + cp = end + 1; + + tm.Hour = strtol(cp, &end, 10); + + if (end == cp) + return 0; + + cp = end + 1; + + tm.Minute = strtol(cp, &end, 10); + + if (end == cp) + return 0; + + cp = end + 1; + + tm.Second = strtol(cp, &end, 10); + + if (end == cp) + return 0; + + return makeTime(tm); +} + +int +Twitter::parse_month(char *str, char **end) +{ + char *cp; + int i; + + for (cp = str; *cp && *cp != ' '; cp++) + ; + + if (!*cp) + return 0; + + *cp = '\0'; + + *end = cp; + + for (i = 0; i < 12; i++) + if (strcmp_P(str, (char *) pgm_read_word(&(months[i]))) == 0) + return i + 1; + + return 0; +} + +bool +Twitter::post_status(const char *message) +{ + char *cp; + int i; + + timestamp = get_time(); + create_nonce(); + + compute_authorization(message); + + /* Post message to twitter. */ + + EthernetClient http; + + if (!http.connect(ip, port)) + { + println(PSTR("Could not connect to server")); + return false; + } + + http_print(&http, PSTR("POST ")); + + if (proxy) + { + http_print(&http, PSTR("http://")); + http_print(&http, server); + } + + http_print(&http, uri); + http_println(&http, PSTR(" HTTP/1.1")); + + http_print(&http, PSTR("Host: ")); + http_print(&http, server); + http_newline(&http); + + http_println(&http, + PSTR("Content-Type: application/x-www-form-urlencoded")); + http_println(&http, PSTR("Connection: close")); + + /* Authorization header. */ + http_print(&http, PSTR("Authorization: OAuth oauth_consumer_key=\"")); + + url_encode_pgm(buffer, consumer_key); + http.write(buffer); + + http_print(&http, PSTR("\",oauth_signature_method=\"HMAC-SHA1")); + http_print(&http, PSTR("\",oauth_timestamp=\"")); + + sprintf(buffer, "%ld", timestamp); + http.write(buffer); + + http_print(&http, PSTR("\",oauth_nonce=\"")); + + hex_encode(buffer, nonce, sizeof(nonce)); + http.write(buffer); + + http_print(&http, PSTR("\",oauth_version=\"1.0\",oauth_token=\"")); + + if (access_token_pgm) + url_encode_pgm(buffer, access_token.pgm); + else + url_encode_eeprom(buffer, access_token.eeprom); + + http.write(buffer); + + http_print(&http, PSTR("\",oauth_signature=\"")); + + cp = base64_encode(buffer, signature, HASH_LENGTH); + url_encode(cp + 1, buffer); + + http.write(cp + 1); + + http_println(&http, PSTR("\"")); + + /* Encode content. */ + cp = url_encode(buffer, "status"); + *cp++ = '='; + cp = url_encode(cp, message); + + int content_length = cp - buffer; + sprintf(cp + 1, "%d", content_length); + + http_print(&http, PSTR("Content-Length: ")); + http.write(cp + 1); + http_newline(&http); + + /* Header-body separator. */ + http_newline(&http); + + /* And finally content. */ + http.write(buffer); + + /* Read response status line. */ + if (!read_line(&http, buffer, buffer_len) || buffer[0] == '\0') + { + http.stop(); + return false; + } + + int response_code; + + /* HTTP/1.1 200 Success */ + for (i = 0; buffer[i] && buffer[i] != ' '; i++) + ; + if (buffer[i]) + response_code = atoi(buffer + i + 1); + else + response_code = 0; + + bool success = (200 <= response_code && response_code < 300); + + if (!success) + Serial.println(buffer); + + /* Skip header. */ + while (true) + { + if (!read_line(&http, buffer, buffer_len)) + { + http.stop(); + return false; + } + + if (buffer[0] == '\0') + break; + + /* Update our system basetime from the response `Date' + header. */ + process_date_header(buffer); + } + + /* Handle content. */ + while (http.connected()) + { + while (http.available() > 0) + { + uint8_t byte = http.read(); + + if (!success) + Serial.write(byte); + } + delay(100); + } + + http.stop(); + + if (!success) + println(PSTR("")); + + return success; +} + +char * +Twitter::url_encode(char *buffer, char ch) +{ + if ('0' <= ch && ch <= '9' + || 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' + || ch == '-' || ch == '.' || ch == '_' || ch == '~') + { + *buffer++ = ch; + } + else + { + int val = ((int) ch) & 0xff; + + snprintf(buffer, 4, "%%%02X", val); + buffer += 3; + } + + *buffer = '\0'; + + return buffer; +} + +char * +Twitter::url_encode(char *buffer, const char *data) +{ + char ch; + + while ((ch = *data++)) + buffer = url_encode(buffer, ch); + + return buffer; +} + +char * +Twitter::url_encode_pgm(char *buffer, const prog_char data[]) +{ + char ch; + + while ((ch = pgm_read_byte(data++))) + buffer = url_encode(buffer, ch); + + return buffer; +} + +char * +Twitter::url_encode_eeprom(char *buffer, int address) +{ + char ch; + + while ((ch = EEPROM.read(address++))) + buffer = url_encode(buffer, ch); + + return buffer; +} + +char * +Twitter::hex_encode(char *buffer, const uint8_t *data, size_t data_len) +{ + size_t i; + + for (i = 0; i < data_len; i++) + { + *buffer++ = (char) pgm_read_byte(hex_table + (data[i] >> 4)); + *buffer++ = (char) pgm_read_byte(hex_table + (data[i] & 0x0f)); + } + + *buffer = '\0'; + + return buffer; +} + +char * +Twitter::base64_encode(char *buffer, const uint8_t *data, size_t data_len) +{ + int i, len; + + for (i = 0, len = data_len; len > 0; i += 3, len -= 3) + { + unsigned long val; + + val = (unsigned long) data[i] << 16; + if (len > 1) + val |= (unsigned long) data[i + 1] << 8; + if (len > 2) + val |= data[i + 2]; + + *buffer++ = (char) pgm_read_byte(base64_table + (val >> 18)); + *buffer++ = (char) pgm_read_byte(base64_table + ((val >> 12) & 0x3f)); + *buffer++ = (char) pgm_read_byte(base64_table + ((val >> 6) & 0x3f)); + *buffer++ = (char) pgm_read_byte(base64_table + (val & 0x3f)); + } + + for (; len < 0; len++) + buffer[len] = '='; + + *buffer = '\0'; + + return buffer; +} + +void +Twitter::create_nonce(void) +{ + int i; + + /* Nonce must be unique for the request timestamp value, so let's + use the timestamp as our random seed. */ + srandom(timestamp); + + for (i = 0; i < sizeof(nonce); i++) + nonce[i] = (uint8_t) random(); +} + +void +Twitter::compute_authorization(const char *message) +{ + char *cp = buffer; + + /* Compute key and init HMAC. */ + + cp = url_encode_pgm(buffer, consumer_secret); + *cp++ = '&'; + + if (access_token_pgm) + cp = url_encode_pgm(cp, token_secret.pgm); + else + cp = url_encode_eeprom(cp, token_secret.eeprom); + + Sha1.initHmac((uint8_t *) buffer, cp - buffer); + + auth_add_pgm(PSTR("POST&http%3A%2F%2F")); + auth_add_pgm(server); + + url_encode_pgm(buffer, uri); + auth_add(buffer); + + auth_add('&'); + + auth_add_pgm(PSTR("oauth_consumer_key")); + auth_add_value_separator(); + url_encode_pgm(buffer, consumer_key); + auth_add(buffer); + + cp = hex_encode(buffer, nonce, sizeof(nonce)); + + auth_add_param(PSTR("oauth_nonce"), buffer, cp + 1); + + auth_add_param(PSTR("oauth_signature_method"), "HMAC-SHA1", buffer); + + sprintf(buffer, "%ld", timestamp); + auth_add_param(PSTR("oauth_timestamp"), buffer, cp + 1); + + auth_add_param_separator(); + + auth_add_pgm(PSTR("oauth_token")); + auth_add_value_separator(); + if (access_token_pgm) + url_encode_pgm(buffer, access_token.pgm); + else + url_encode_eeprom(buffer, access_token.eeprom); + auth_add(buffer); + + auth_add_param(PSTR("oauth_version"), "1.0", buffer); + + cp = url_encode(buffer, message); + auth_add_param(PSTR("status"), buffer, cp + 1); + + signature = Sha1.resultHmac(); +} + +void +Twitter::auth_add(char ch) +{ + Sha1.write(ch); +} + +void +Twitter::auth_add(const char *str) +{ + Sha1.print(str); +} + +void +Twitter::auth_add_pgm(const prog_char str[]) +{ + uint8_t c; + + while ((c = pgm_read_byte(str++))) + Sha1.write(c); +} + +void +Twitter::auth_add_param(const prog_char key[], const char *value, char *workbuf) +{ + /* Add separator. We know that this method is not used to add the + first parameter. */ + auth_add_param_separator(); + + auth_add_pgm(key); + + auth_add_value_separator(); + + url_encode(workbuf, value); + auth_add(workbuf); +} + +void +Twitter::auth_add_param_separator(void) +{ + auth_add_pgm(PSTR("%26")); +} + +void +Twitter::auth_add_value_separator(void) +{ + auth_add_pgm(PSTR("%3D")); +} + +void +Twitter::http_print(Client *client, const prog_char str[]) +{ + uint8_t c; + + if (!client || !str) + return; + + while ((c = pgm_read_byte(str++))) + client->write(c); +} + +void +Twitter::http_println(Client *client, const prog_char str[]) +{ + http_print(client, str); + http_newline(client); +} + +void +Twitter::http_newline(Client *client) +{ + client->write('\r'); + client->write('\n'); +} + +void +Twitter::println(const prog_char str[]) +{ + uint8_t c; + + if (!str) + return; + + while ((c = pgm_read_byte(str++))) + Serial.write(c); + + Serial.write('\r'); + Serial.write('\n'); +} + +bool +Twitter::read_line(Client *client, char *buffer, size_t buflen) +{ + size_t pos = 0; + + while (client->connected()) + { + while (client->available() > 0) + { + uint8_t byte = client->read(); + + if (byte == '\n') + { + /* EOF found. */ + if (pos < buflen) + { + if (pos > 0 && buffer[pos - 1] == '\r') + pos--; + + buffer[pos] = '\0'; + } + else + { + buffer[buflen - 1] = '\0'; + } + + return true; + } + + if (pos < buflen) + buffer[pos++] = byte; + } + + delay(100); + } + + return false; +} diff --git a/books/pdummies/Libraries/Twitter/Twitter.h b/books/pdummies/Libraries/Twitter/Twitter.h new file mode 100644 index 0000000..a9dde87 --- /dev/null +++ b/books/pdummies/Libraries/Twitter/Twitter.h @@ -0,0 +1,269 @@ +/* -*- c++ -*- + * + * Twitter.h + * + * Author: Markku Rossi + * + * Copyright (c) 2011-2012 Markku Rossi + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + * . + * + */ + +#ifndef TWITTER_H +#define TWITTER_H + +#if defined(ARDUINO) && ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#endif + +#include +#include +#include +#include +#include + +class Twitter +{ +public: + + /* Constructs a new Twitter instance with the work buffer `buffer', + `buffer_len'. */ + Twitter(char *buffer, size_t buffer_len); + + /* Set the Twitter API endpoint configuration. + + The argument `server' specifies the fully qualified server name + (e.g. `api.twitter.com'). The argument `uri' contains the API + URI at the server (e.g. `/1/statuses/update.json'). + + The arguments `ip', `port' specify the HTTP connection end-point. + If the argument `proxy' is false, the connection end-point must + be the Twitter server. If the argument `proxy' is true, the + connection end-point must be specify you HTTP proxy server to use + for the operation. The `ip' array must remain valid as long as + this twitter instance is used; the method does not copy the `ip' + argument but stores a pointer to the provided value. */ + void set_twitter_endpoint(const prog_char server[], const prog_char uri[], + IPAddress ip, uint16_t port, bool proxy); + + /* Set the client application identification to `consumer_key', + `consumer_secret'. */ + void set_client_id(const prog_char consumer_key[], + const prog_char consumer_secret[]); + + /* Set the twitter account identification to program memory data + `access_token', `token_secret. */ + void set_account_id(const prog_char access_token[], + const prog_char token_secret[]); + + /* Set the twitter account identification to EEPROM memory data + `access_token', `token_secret'. */ + void set_account_id(int access_token, int token_secret); + + /* Tests if this twitter instance is ready for twitter + communication. The method returns true if twitter messages can + be sent and false if the twitter instance is still initializing. + You should keep calling this method from your loop() and do your + twitter interactions when this method returns true. */ + bool is_ready(void); + + /* Gets the current UTC time. The twitter module queries and + maintains the UTC time based on server HTTP `Date' response + header. The method returns the current UTC Unix time in seconds, + or 0 if the time has not been resolved yet. This will return a + non-zero value after init() has returned true. */ + unsigned long get_time(void); + + /* Post status message `message' to twitter. The message must be + UTF-8 encoded. The method returns true if the status message was + posted and false on error. */ + bool post_status(const char *message); + + /* URL encode character `ch' into the buffer `buffer'. The method + returns a pointer to the next byte after the encoded value. */ + static char *url_encode(char *buffer, char ch); + + /* URL encode c-string `data' into the buffer `buffer'. The method + returns a pointer to the next byte after the encoded value. */ + static char *url_encode(char *buffer, const char *data); + + /* URL encode program memory c-string `data' into the buffer + `buffer'. The method returns a pointer to the next byte after + the encoded value. */ + static char *url_encode_pgm(char *buffer, const prog_char data[]); + + /* URL encode EEPROM memory c-string that starts from address + `address' into the buffer `buffer'. The method returns a pointer + to the next byte after the encoded value. */ + static char *url_encode_eeprom(char *buffer, int address); + + /* Hex encode binary data `data', `data_len' into the buffer + `buffer'. The method returns a pointer to the next byte after + the encoded value. */ + static char *hex_encode(char *buffer, const uint8_t *data, size_t data_len); + + /* Base64 encode binary data `data', `data_len' into the buffer + `buffer'. The method returns a pointer to the next byte after + the encoded value. */ + static char *base64_encode(char *buffer, const uint8_t *data, + size_t data_len); + +private: + + /* Create a random nonce into the member `nonce. The method uses + `timestamp' as its random seed so you must set it before calling + this method. */ + void create_nonce(void); + + /* Compute OAuth signature for the status message `message'. The + method uses the current state from consumer and access tokens and + from `timestamp' and `nonce' member. The computed signature will + remain in the global `Sha1' instance and is pointed by + `signature'. You must not use the `Sha1' instance before you + have consumed value. */ + void compute_authorization(const char *message); + + /* Add character `ch' into the authorization signature hmac. */ + void auth_add(char ch); + + /* Add string `str' into the authorization signature hmac. */ + void auth_add(const char *str); + + /* Add program memory string `str' into the authorization signature + hmac. */ + void auth_add_pgm(const prog_char str[]); + + /* Add request parameter `key', `value' into the authorization + signature hmac. The argument `workbuf' specifies a working + buffer for the method. */ + void auth_add_param(const char *key, const char *value, char *workbuf); + + /* Add authorization parameter separator into the authorization + signature hmac. */ + void auth_add_param_separator(void); + + /* Add request key-value separator into the authorization signature + hmac. */ + void auth_add_value_separator(void); + + /* Print program memory string `str' to the output stream of the + HTTP client `client'. */ + static void http_print(Client *client, const prog_char str[]); + + /* Print program memory string `str' and line separator string to + the output stream of the HTTP client `client'. */ + static void http_println(Client *client, const prog_char str[]); + + /* Print line separator string to the output stream of the HTTP + client `client'. */ + static void http_newline(Client *client); + + /* Print the argument program memory string to serial output. */ + static void println(const prog_char str[]); + + /* Read a line from the connection `client' into the buffer `buffer' + that has `buflen' bytes of space. The method returns true if a + line was read and false on error. */ + static bool read_line(Client *client, char *buffer, size_t buflen); + + /* Queries the current time with a HEAD request to the server. The + method returns true if the time was retrieved and false on + error. */ + bool query_time(void); + + /* Process the response header line `buffer' and update the system + `basetime' if the header is a HTTP Date header. The method + returns true if the header line was a `Date' header and false + otherwise. */ + bool process_date_header(char *buffer); + + /* Parse the value of the HTTP Date header `date'. The method + returns the Unix time value in seconds or 0 if the header could + not be parsed. */ + long parse_date(char *date); + + /* Parse month name `str' and return its number (1-12). The method + returns a pointer to the end of the parsed month in `end'. The + method returns 0 if the month could not be parsed. */ + int parse_month(char *str, char **end); + + /* The base timestamp for current time computation. */ + unsigned long basetime; + + /* Last milliseconds from the system clock. */ + unsigned long last_millis; + + /* Flags. */ + + /* Is the provided HTTP end point a HTTP proxy or the Twitter + server? */ + unsigned int proxy : 1; + + /* Is access token in PGM or in EEPROM? */ + unsigned int access_token_pgm : 1; + + /* Random nonce for the OAuth request. */ + uint8_t nonce[8]; + + /* Request timestamp as Unix time. */ + unsigned long timestamp; + + /* This points to Sha1 so don't touch it before you have consumed + the value. */ + uint8_t *signature; + + /* Work buffer. */ + char *buffer; + + /* The size of the work buffer `buffer'. */ + size_t buffer_len; + + /* Twitter server host name. */ + const prog_char *server; + + /* Twitter API URI at the server. */ + const prog_char *uri; + + /* An IP address to connnect to. */ + IPAddress ip; + + /* TCP port number to connnect to. */ + uint16_t port; + + /* Application consumer key. */ + const prog_char *consumer_key; + + /* Application consumer secret. */ + const prog_char *consumer_secret; + + /* Twitter account access token. */ + union + { + const prog_char *pgm; + int eeprom; + } access_token; + + /* Twitter account access token secret. */ + union + { + const prog_char *pgm; + int eeprom; + } token_secret; +}; + +#endif /* not TWITTER_H */ diff --git a/books/pdummies/Libraries/xively/.gitignore b/books/pdummies/Libraries/xively/.gitignore new file mode 100755 index 0000000..3a6e755 --- /dev/null +++ b/books/pdummies/Libraries/xively/.gitignore @@ -0,0 +1 @@ +examples/*/build-* diff --git a/books/pdummies/Libraries/xively/.travis.yml b/books/pdummies/Libraries/xively/.travis.yml new file mode 100755 index 0000000..8398717 --- /dev/null +++ b/books/pdummies/Libraries/xively/.travis.yml @@ -0,0 +1,21 @@ +language: python +before_script: + - "curl -s http://arduino.googlecode.com/files/arduino-${ARDUINO_IDE_VERSION}-linux64.tgz | sudo tar xz -C /opt" + - "git clone -q https://github.com/errordeveloper/hwci-scripts ../hwci-scripts && ../hwci-scripts/bin/setup.sh" + - "git clone -q https://github.com/amcewen/HttpClient ../HttpClient" +script: + - "for e in `ls -d examples/*/` \ + ;do env \ + USER_LIB_PATH=$PWD/../ \ + ARDUINO_DIR=/opt/arduino-${ARDUINO_IDE_VERSION} \ + ../hwci-scripts/bin/arduino_make.sh -C $e \ + && echo pass:$e >> results \ + || echo fail:$e >> results \ + ;done" + - "cat results" + - "cut -d: -f1 results | sort | uniq -c" + - "test `grep -c fail results` -eq 0" + +env: + - ARDUINO_IDE_VERSION='1.0.2' + - ARDUINO_IDE_VERSION='1.0.3' diff --git a/books/pdummies/Libraries/xively/CountingStream.h b/books/pdummies/Libraries/xively/CountingStream.h new file mode 100755 index 0000000..98812ec --- /dev/null +++ b/books/pdummies/Libraries/xively/CountingStream.h @@ -0,0 +1,8 @@ +#include + +class CountingStream : public Print +{ + virtual size_t write(uint8_t) { return 1; }; + virtual size_t write(const uint8_t *buffer, size_t size) { return size; }; +}; + diff --git a/books/pdummies/Libraries/xively/README.md b/books/pdummies/Libraries/xively/README.md new file mode 100755 index 0000000..ebdca52 --- /dev/null +++ b/books/pdummies/Libraries/xively/README.md @@ -0,0 +1,140 @@ +#Xively Arduino library + +A library for Arduino to make it easier to talk to Xively. + +_This library requires [_HTTP Client_](https://github.com/amcewen/HttpClient)._ + +##Features + + 1. Generic functions for: + - Uploading datapoints + - Downloading datapoints + 2. Compatible with: + - Arduino Ethernet shield + - Arduino Ethernet board + - Arduino Wifi shield + - WiFly shield + +##For a Quickstart Example +Look no further! If you want a quick example, connect your Arduino board to your computer and an ethernet cable and try out one of the examples included with this library. + +>In Arduino, go to Files > Examples and choose DatastreamUpload or DatastreamDownload from the xively-arduino library folder + +##Setup Your Sketch + +**1. Specify your API key and Feed ID** +```c +char xivelyKey[] = "YOUR_XIVELY_API_KEY"; +// Should be something like "HsNiCoe_Es2YYWltKeRFPZL2xhqSAKxIV21aV3lTL2h5OD0g" +#define FEED_ID XXXXXX +// The 3 to 6-digit number (like 504 or 104097), that identifies the Xively Feed you're using +``` + +**2. Create IDs for your datastreams as `char` arrays (or `String` objects for a `String` datastream)** + +In Xively, the name of a datastream is known as the **Stream ID**. In the example below, we'll give the datastreams names by setting their **Stream IDs** as "humidity", "temperature", "my_thoughts_on_the_temperature" and "more_thoughts". + +```c +// For datastreams of floats: +char myFloatStream[] = "humidity"; +// For datastreams of ints: +char myIntStream[] = "temperature"; +// For datastreams of Strings: +String myStringStream("my_thoughts_on_the_temperature"); +// For datastreams of char buffers: +char myCharBufferStream[] = "more_thoughts"; // ID of the array +const int bufferSize = 140; // size of the array +char bufferValue[bufferSize]; // the array of chars itself +``` + +`String` datastreams and `char` buffer datastreams are similar: both will be able to send strings to Xively datastreams. For beginners, using `String` datastreams will be fine much of the time. + +Using char buffers reduces the memory footprint of your sketch by not requiring the String library. Also, using char buffers allows you to specify exactly how much memory is used for a datapoint, so you don't accidentally overflow the Arduino's mem capacity with a huge string datapoint. It's a little bit harder to understand for beginners -- consult XivelyDatastream.cpp for info. + +**3. Create an array of `XivelyDatastream` objects** + +```c +XivelyDatastream datastreams[] = { + // Float datastreams are set up like this: + XivelyDatastream(myFloatStream, strlen(myFloatStream), DATASTREAM_FLOAT), + // Int datastreams are set up like this: + XivelyDatastream(myIntStream, strlen(myIntStream), DATASTREAM_INT), + // String datastreams are set up like this: + XivelyDatastream(myStringStream, DATASTREAM_STRING), + // Char buffer datastreams are set up like this: + XivelyDatastream(myCharBufferStream, strlen(myCharBufferStream), DATASTREAM_BUFFER, bufferValue, bufferSize), +}; +``` + +`XivelyDatastream` objects can contains some or all of the following variables, depending on what type of datapoints are in the datastream (see above example for which are required): + +| | Variable | Type | Description | +|---|---|:---:|---| +| 1 | aIdBuffer | char*|`char` array containing the ID of the datastream +| 2 | aIdBufferLength | int |for `int` or `float` datastreams only: the number of `char` in the datastream's ID +| 3 | aType | int |**0** or DATASTREAM_STRING for a String; **1** or DATASTREAM_BUFFER for a char buffer; **2** or DATASTREAM_INT for an int; **3** or DATASTREAM_FLOAT for a float +| 4 | aValueBuffer | char* | A `char` array, _aValueBufferLength_ elements long +| 5 | aValueBufferLength | int | The number of elements in the `char` array + + +**4. Last, wrap this array of `XivelyDatastream` objects into a `XivelyFeed`** + +Unlike the **Stream ID**, which is what a _Datastream's_ name is stored as, the **ID** of a _Feed_ is a number which is used to uniquely identify which Xively Feed you are addressing. For example, a Feed **ID** of 504 would mean that you were using the feed at xively.com/feeds/504. + +```c +XivelyFeed feed(FEED_ID, datastreams, 4); +``` + +| | Variable | Type | Description | +|---|---|:---:|---| +| 1 | aID | unsigned long | The Feed's **ID**, as defined at the top of your sketch +| 2 | aDatastreams | XivelyDatastream* |Your `XivelyDatastream` array +| 3 | aDatastreamsCount | int | How many datastreams are in the array + +**5. Instantiate the library's Xively client** + +Connecting by ethernet: + +>If you're using the Ethernet library: +```c +EthernetClient client; +XivelyClient xivelyclient(client); +``` + + +If you're on wireless, be sure to enter your SSID and password as the library requires, and then: +>If you're using the built-in WiFi library: +```c +WiFiClient client; +XivelyClient xivelyclient(client); +``` + +--- +>If you're using the [Sparkfun WiFly] [1] library: +```c +WiFlyClient client; +XivelyClient xivelyclient(client); +``` +[1]: https://github.com/jmr13031/WiFly-Shield + +##Sending and Retrieving Xively Datapoints + +###Read a Datapoint +```c +Serial.print("My return is: "); + +float float_value = datastreams[0].getFloat(); // Retrieve the latest datapoint in a float datastream +int int_value = datastreams[1].getInt(); // Retrieve the latest datapoint in an int datastream +String string_value = datastreams[2].getString(); // Retrieve the latest datapoint in a String datastream +char[140] char_buffer = datastreams[3].getBuffer(); // Retrieve the latest datapoint in a char buffer datastream +``` + +###Update a Datapoint + +The library makes it easy to upload data as strings or numbers. +```c +datastreams[0].setFloat(1.5); // Push a float datapoint +datastreams[1].setInt(23); // Push an int datapoint +datastreams[2].setString("Pretty comfy temperature"); // Push a String datapoint +datastreams[3].setBuffer("But quite dry"); // Push a char buffer datapoint +``` diff --git a/books/pdummies/Libraries/xively/Xively.h b/books/pdummies/Libraries/xively/Xively.h new file mode 100755 index 0000000..3eb3e21 --- /dev/null +++ b/books/pdummies/Libraries/xively/Xively.h @@ -0,0 +1,5 @@ + +#include +#include +#include + diff --git a/books/pdummies/Libraries/xively/XivelyClient.cpp b/books/pdummies/Libraries/xively/XivelyClient.cpp new file mode 100755 index 0000000..da94b9e --- /dev/null +++ b/books/pdummies/Libraries/xively/XivelyClient.cpp @@ -0,0 +1,172 @@ +#include +#include +#include + +XivelyClient::XivelyClient(Client& aClient) + : _client(aClient) +{ +} + +int XivelyClient::put(XivelyFeed& aFeed, const char* aApiKey) +{ + HttpClient http(_client); + char path[30]; + buildPath(path, aFeed.id(), "json"); + http.beginRequest(); + int ret = http.put("api.xively.com", path); + if (ret == 0) + { + http.sendHeader("X-ApiKey", aApiKey); + http.sendHeader("User-Agent", "Xively-Arduino-Lib/1.0"); + + CountingStream countingStream; // Used to work out how long that data will be + for (int i =kCalculateDataLength; i <= kSendData; i++) + { + Print* s; + int len =0; + if (i == kCalculateDataLength) + { + s = &countingStream; + } + else + { + s = &http; + } + len = s->print(aFeed); + if (i == kCalculateDataLength) + { + // We now know how long the data will be... + http.sendHeader("Content-Length", len); + } + } + // Now we're done sending the request + http.endRequest(); + + ret = http.responseStatusCode(); + if ((ret < 200) || (ret > 299)) + { + // It wasn't a successful response, ensure it's -ve so the error is easy to spot + if (ret > 0) + { + ret = ret * -1; + } + } + http.flush(); + http.stop(); + } + return ret; +} + +void XivelyClient::buildPath(char* aDest, unsigned long aFeedId, const char* aFormat) +{ + char idstr[12]; + strcpy(aDest, "/v2/feeds/"); + char* p = &idstr[10]; + idstr[11] = 0; + for(*p--=aFeedId%10+0x30;aFeedId/=10;*p--=aFeedId%10+0x30); + strcat(aDest, p+1); + strcat(aDest, "."); + strcat(aDest, aFormat); +} + +int XivelyClient::get(XivelyFeed& aFeed, const char* aApiKey) +{ + HttpClient http(_client); + char path[30]; + buildPath(path, aFeed.id(), "csv"); + http.beginRequest(); + int ret = http.get("api.xively.com", path); + if (ret == 0) + { + http.sendHeader("X-ApiKey", aApiKey); + http.sendHeader("User-Agent", "Xively-Arduino-Lib/1.0"); + http.endRequest(); + + ret = http.responseStatusCode(); + if ((ret < 200) || (ret > 299)) + { + // It wasn't a successful response, ensure it's -ve so the error is easy to spot + if (ret > 0) + { + ret = ret * -1; + } + } + else + { + http.skipResponseHeaders(); + // Now we need to run through each line, looking to see if it matches one + // of the given datastreams. + // So that we don't use any more memory than necessary, we'll keep track + // of which character we're up to in the ID string, and have a bit-field + // of the remaining datastreams that match. This limits us (if we use + // and unsigned long) to 32 datastreams in a feed, but that's probably ok + int idIdx = 0; + unsigned long idBitfield = 0; + for (int i =0; i < aFeed.size(); i++) + { + idBitfield |= 1 << i; + } + // As long as we've got bitfields to read +// FIXME Need to time out if this hangs for too long + while ((http.available() || http.connected())) + { + if (http.available()) + { + char next = http.read(); + switch (next) + { + case ',': + // We've reached the end of the ID string, see if it matches any of the + // datastreams in the feed + // But first skip the updated time, to get to the value + http.find(","); + for (int i =0; i < aFeed.size(); i++) + { + if ((idBitfield & 1< +#include + +class XivelyClient +{ +public: + XivelyClient(Client& aClient); + + int get(XivelyFeed& aFeed, const char* aApiKey); + int put(XivelyFeed& aFeed, const char* aApiKey); + +protected: + static const int kCalculateDataLength =0; + static const int kSendData =1; + void buildPath(char* aDest, unsigned long aFeedId, const char* aFormat); + + Client& _client; +}; + +#endif diff --git a/books/pdummies/Libraries/xively/XivelyDatastream.cpp b/books/pdummies/Libraries/xively/XivelyDatastream.cpp new file mode 100755 index 0000000..b5a94e7 --- /dev/null +++ b/books/pdummies/Libraries/xively/XivelyDatastream.cpp @@ -0,0 +1,204 @@ +#include +// FIXME Only needed until readStringUntil is available in Stream +#include + +XivelyDatastream::XivelyDatastream(String& aId, int aType) + : _idType(DATASTREAM_STRING), _valueType(aType), _idString(aId) +{ +} + +XivelyDatastream::XivelyDatastream(char* aIdBuffer, int aIdBufferSize, int aType) + : _idType(DATASTREAM_BUFFER), _valueType(aType), _idString(), _valueString() +{ + _idBuffer._buffer = aIdBuffer; + _idBuffer._bufferSize = aIdBufferSize; +} + +XivelyDatastream::XivelyDatastream(char* aIdBuffer, int aIdBufferSize, int aType, char* aValueBuffer, int aValueBufferSize) + : _idType(DATASTREAM_BUFFER), _valueType(aType) +{ + _idBuffer._buffer = aIdBuffer; + _idBuffer._bufferSize = aIdBufferSize; + _value._valueBuffer._buffer = aValueBuffer; + _value._valueBuffer._bufferSize = aValueBufferSize; +} + +int XivelyDatastream::updateValue(Stream& aStream) +{ + switch (_valueType) + { + case DATASTREAM_INT: + _value._valueInt = aStream.parseInt(); + break; + case DATASTREAM_FLOAT: + _value._valueFloat = aStream.parseFloat(); + break; + case DATASTREAM_BUFFER: + { + int len = aStream.readBytesUntil('\n', _value._valueBuffer._buffer, _value._valueBuffer._bufferSize); + _value._valueBuffer._buffer[len] = '\0'; + } + break; + case DATASTREAM_STRING: + // FIXME Change this to use readStringUntil once that's in the core + // FIMXE and remove the timedRead method in here then too + _valueString = ""; + int c = timedRead(aStream); + while (c >= 0 && c != '\n') + { + _valueString += (char)c; + c = timedRead(aStream); + } + break; + }; +} + +int XivelyDatastream::timedRead(Stream& aStream) +{ + int c; + long _startMillis = millis(); + do { + c = aStream.read(); + if (c >= 0) return c; + } while(millis() - _startMillis < 10000UL); + return -1; // -1 indicates timeout +} + + +void XivelyDatastream::setInt(int aValue) +{ + if (_valueType == DATASTREAM_INT) + { + _value._valueInt = aValue; + } +} + +void XivelyDatastream::setFloat(float aValue) +{ + if (_valueType == DATASTREAM_FLOAT) + { + _value._valueFloat = aValue; + } +} + +void XivelyDatastream::setString(String& aValue) +{ + if (_valueType == DATASTREAM_STRING) + { + _valueString = aValue; + } +} + +void XivelyDatastream::setBuffer(const char* aBuffer) +{ + if (_valueType == DATASTREAM_BUFFER) + { + strncpy(_value._valueBuffer._buffer, aBuffer, _value._valueBuffer._bufferSize); + } +} + +int XivelyDatastream::getInt() +{ + if (_valueType == DATASTREAM_INT) + { + return _value._valueInt; + } + else + { + return 0; + } +} + +float XivelyDatastream::getFloat() +{ + if (_valueType == DATASTREAM_FLOAT) + { + return _value._valueFloat; + } + else + { + return 0.0; + } +} + +String& XivelyDatastream::getString() +{ + return _valueString; +} + +char* XivelyDatastream::getBuffer() +{ + if (_valueType == DATASTREAM_BUFFER) + { + return _value._valueBuffer._buffer; + } + else + { + return NULL; + } +} + +size_t XivelyDatastream::printTo(Print& aPrint) const +{ + size_t count =0; + count += aPrint.print("{ \"id\" : \""); + if (_idType == DATASTREAM_STRING) + { + count += aPrint.print(_idString); + } + else + { + count += aPrint.print(_idBuffer._buffer); + } + count += aPrint.print("\", \"current_value\" : \""); + switch (_valueType) + { + case DATASTREAM_STRING: + count += aPrint.print(_valueString); + break; + case DATASTREAM_BUFFER: + count += aPrint.print(_value._valueBuffer._buffer); + break; + case DATASTREAM_INT: + count += aPrint.print(_value._valueInt); + break; + case DATASTREAM_FLOAT: + count += aPrint.print(_value._valueFloat); + break; + }; + count += aPrint.print("\" }"); + return count; +} + +#if 0 +DatastreamBufferInt::DatastreamBufferInt(char* aId, int aIdLength, int aValue) + : _id(aId), _idLength(aIdLength), _value(aValue) +{}; + +size_t DatastreamBufferInt::printTo(Print& aPrint) const +{ + size_t count =0; + count += aPrint.print("\"id\" : \""); + count += aPrint.print(_id); + count += aPrint.print("\", \"current_value\" : \""); + count += aPrint.print(_value); + count += aPrint.print("\""); + return count; +} + +DatastreamStringString::DatastreamStringString(String aId, String aValue) + : _id(aId), _value(aValue) +{}; + +size_t DatastreamStringString::printTo(Print& aPrint) const +{ + // Output the datastream in JSON + size_t count =0; + count += aPrint.print("\"id\" : \""); + count += aPrint.print(_id); + count += aPrint.print("\", \"current_value\" : \""); + count += aPrint.print(_value); + count += aPrint.print("\""); + return count; +} +#endif diff --git a/books/pdummies/Libraries/xively/XivelyDatastream.h b/books/pdummies/Libraries/xively/XivelyDatastream.h new file mode 100755 index 0000000..62af191 --- /dev/null +++ b/books/pdummies/Libraries/xively/XivelyDatastream.h @@ -0,0 +1,52 @@ +#ifndef XIVELY_DATASTREAM_H +#define XIVELY_DATASTREAM_H + +#include +#include + +#define DATASTREAM_STRING 0 +#define DATASTREAM_BUFFER 1 +#define DATASTREAM_INT 2 +#define DATASTREAM_FLOAT 3 + +class XivelyDatastream : public Printable { + friend class XivelyClient; + + typedef struct { + char* _buffer; + int _bufferSize; + } tBuffer; +public: + + XivelyDatastream(String& aId, int aType); + XivelyDatastream(char* aIdBuffer, int aIdBufferLength, int aType); + XivelyDatastream(char* aIdBuffer, int aIdBufferLength, int aType, char* aValueBuffer, int aValueBufferLength); + int updateValue(Stream& aStream); + void setInt(int aValue); + void setFloat(float aValue); + void setString(String& aValue); + void setBuffer(const char* aValue); + String& getString(); + int getInt(); + float getFloat(); + char* getBuffer(); + virtual size_t printTo(Print&) const; +protected: + int idLength() { return (_idType == DATASTREAM_STRING ? _idString.length() : strlen(_idBuffer._buffer)); }; + char idChar(int idx) { return (_idType == DATASTREAM_STRING ? _idString[idx] : (idx > strlen(_idBuffer._buffer) ? '\0' : _idBuffer._buffer[idx])); }; + // FIXME Only needed until readStringUntil is available in core + int timedRead(Stream& aStream); + + int _idType; + String _idString; + tBuffer _idBuffer; + int _valueType; + String _valueString; + union { + tBuffer _valueBuffer; + int _valueInt; + float _valueFloat; + } _value; +}; + +#endif diff --git a/books/pdummies/Libraries/xively/XivelyFeed.cpp b/books/pdummies/Libraries/xively/XivelyFeed.cpp new file mode 100755 index 0000000..cab7f64 --- /dev/null +++ b/books/pdummies/Libraries/xively/XivelyFeed.cpp @@ -0,0 +1,33 @@ +#include + +XivelyFeed::XivelyFeed(unsigned long aID, XivelyDatastream* aDatastreams, int aDatastreamsCount) + : _id(aID), _datastreams(aDatastreams), _datastreamsCount(aDatastreamsCount) +{ + //strcpy(_id, aID); +} + +size_t XivelyFeed::printTo(Print& aPrint) const +{ + int len = 0; + len += aPrint.println("{"); + len += aPrint.println("\"version\":\"1.0.0\","); + len += aPrint.println("\"datastreams\" : ["); + for (int j =0; j < _datastreamsCount; j++) + { + len += aPrint.print(_datastreams[j]); + if (j == _datastreamsCount-1) + { + // Last time through + len += aPrint.println(); + } + else + { + len += aPrint.println(","); + } + } + len += aPrint.println("]"); + len += aPrint.println("}"); + return len; +} + + diff --git a/books/pdummies/Libraries/xively/XivelyFeed.h b/books/pdummies/Libraries/xively/XivelyFeed.h new file mode 100755 index 0000000..5ef6501 --- /dev/null +++ b/books/pdummies/Libraries/xively/XivelyFeed.h @@ -0,0 +1,25 @@ + +#ifndef XIVELY_FEED_H +#define XIVELY_FEED_H + +#include +#include +#include + +class XivelyFeed : public Printable +{ +public: + XivelyFeed(unsigned long aID, XivelyDatastream* aDatastreams, int aDatastreamsCount); + + virtual size_t printTo(Print&) const; + unsigned long id() { return _id; }; + int size() { return _datastreamsCount; }; + XivelyDatastream& operator[] (unsigned i) { return _datastreams[i]; }; +protected: + unsigned long _id; + XivelyDatastream* _datastreams; + int _datastreamsCount; +}; + +#endif + diff --git a/books/pdummies/Libraries/xively/examples/DatastreamDownload/DatastreamDownload.ino b/books/pdummies/Libraries/xively/examples/DatastreamDownload/DatastreamDownload.ino new file mode 100755 index 0000000..1fa7451 --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/DatastreamDownload/DatastreamDownload.ino @@ -0,0 +1,55 @@ +#include +#include +#include +#include + +// MAC address for your Ethernet shield +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +// Your Xively key to let you upload data +char xivelyKey[] = "YOUR_XIVELY_API_KEY"; + +// Define the string for our datastream ID +char temperatureId[] = "temperature"; + +XivelyDatastream datastreams[] = { + XivelyDatastream(temperatureId, strlen(temperatureId), DATASTREAM_FLOAT), +}; +// Finally, wrap the datastreams into a feed +XivelyFeed feed(15552, datastreams, 1 /* number of datastreams */); + +EthernetClient client; +XivelyClient xivelyclient(client); + +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + + Serial.println("Reading from Xively example"); + Serial.println(); + + while (Ethernet.begin(mac) != 1) + { + Serial.println("Error getting IP address via DHCP, trying again..."); + delay(15000); + } +} + +void loop() { + int ret = xivelyclient.get(feed, xivelyKey); + Serial.print("xivelyclient.get returned "); + Serial.println(ret); + + if (ret > 0) + { + Serial.println("Datastream is..."); + Serial.println(feed[0]); + + Serial.print("Temperature is: "); + Serial.println(feed[0].getFloat()); + } + + Serial.println(); + delay(15000UL); +} + diff --git a/books/pdummies/Libraries/xively/examples/DatastreamDownload/DatastreamDownload.ino.old b/books/pdummies/Libraries/xively/examples/DatastreamDownload/DatastreamDownload.ino.old new file mode 100755 index 0000000..64a7b59 --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/DatastreamDownload/DatastreamDownload.ino.old @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +// MAC address for your Ethernet shield +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + + delay(500); + Serial.println("Starting Temperature to Pachube..."); + + while (Ethernet.begin(mac) != 1) + { + Serial.println("Error getting IP address via DHCP, trying again..."); + delay(15000); + } +} + +void loop() { + // Simple putting a single datastream... + char my_id1[12] = "temperature"; + float my_value1; + char my_id2[9] = "humidity"; + char my_value2[140]; // enough space to store the string we get back if we're doing a get + + Datastream datastreams[] = { + Datastream(my_id2, strlen(my_id2), DATASTREAM_FLOAT), + Datastream(my_id1, strlen(my_id1), DATASTREAM_BUFFER, my_value2, 140 /* amount of space in my_value2 */) + }; + PachubeFeed feed(15552, datastreams, 2 /* number of datastreams */); + + strcpy(my_value2, "hello"); + + EthernetClient c; + PachubeClient pc(c); + + int ret = pc.put(feed, "xW0uK8RZ-SrBgxH0-wO2MguKXdGDwMFjXGiOA6EB9KQ"); + Serial.print("pc.put returned "); + Serial.println(ret); + + Serial.println(); + delay(1500); +} diff --git a/books/pdummies/Libraries/xively/examples/DatastreamDownload/Makefile b/books/pdummies/Libraries/xively/examples/DatastreamDownload/Makefile new file mode 100755 index 0000000..0bcf4cc --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/DatastreamDownload/Makefile @@ -0,0 +1,5 @@ +BOARD_TAG = uno +ARDUINO_PORT = /dev/cu.usb* +ARDUINO_LIBS = Ethernet Ethernet/utility SPI HttpClient xively-arduino + +include Arduino.mk diff --git a/books/pdummies/Libraries/xively/examples/DatastreamUpload/DatastreamUpload.ino b/books/pdummies/Libraries/xively/examples/DatastreamUpload/DatastreamUpload.ino new file mode 100755 index 0000000..cf7e21e --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/DatastreamUpload/DatastreamUpload.ino @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +// MAC address for your Ethernet shield +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +// Your Xively key to let you upload data +char xivelyKey[] = "YOUR_XIVELY_API_KEY"; + +// Analog pin which we're monitoring (0 and 1 are used by the Ethernet shield) +int sensorPin = 2; + +// Define the strings for our datastream IDs +char sensorId[] = "sensor_reading"; +XivelyDatastream datastreams[] = { + XivelyDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT), +}; +// Finally, wrap the datastreams into a feed +XivelyFeed feed(15552, datastreams, 1 /* number of datastreams */); + +EthernetClient client; +XivelyClient xivelyclient(client); + +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + + Serial.println("Starting single datastream upload to Xively..."); + Serial.println(); + + while (Ethernet.begin(mac) != 1) + { + Serial.println("Error getting IP address via DHCP, trying again..."); + delay(15000); + } +} + +void loop() { + int sensorValue = analogRead(sensorPin); + datastreams[0].setFloat(sensorValue); + + Serial.print("Read sensor value "); + Serial.println(datastreams[0].getFloat()); + + Serial.println("Uploading it to Xively"); + int ret = xivelyclient.put(feed, xivelyKey); + Serial.print("xivelyclient.put returned "); + Serial.println(ret); + + Serial.println(); + delay(15000); +} diff --git a/books/pdummies/Libraries/xively/examples/DatastreamUpload/Makefile b/books/pdummies/Libraries/xively/examples/DatastreamUpload/Makefile new file mode 100755 index 0000000..0bcf4cc --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/DatastreamUpload/Makefile @@ -0,0 +1,5 @@ +BOARD_TAG = uno +ARDUINO_PORT = /dev/cu.usb* +ARDUINO_LIBS = Ethernet Ethernet/utility SPI HttpClient xively-arduino + +include Arduino.mk diff --git a/books/pdummies/Libraries/xively/examples/MultipleDatastreamsUpload/Makefile b/books/pdummies/Libraries/xively/examples/MultipleDatastreamsUpload/Makefile new file mode 100755 index 0000000..0bcf4cc --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/MultipleDatastreamsUpload/Makefile @@ -0,0 +1,5 @@ +BOARD_TAG = uno +ARDUINO_PORT = /dev/cu.usb* +ARDUINO_LIBS = Ethernet Ethernet/utility SPI HttpClient xively-arduino + +include Arduino.mk diff --git a/books/pdummies/Libraries/xively/examples/MultipleDatastreamsUpload/MultipleDatastreamsUpload.ino b/books/pdummies/Libraries/xively/examples/MultipleDatastreamsUpload/MultipleDatastreamsUpload.ino new file mode 100755 index 0000000..af001b2 --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/MultipleDatastreamsUpload/MultipleDatastreamsUpload.ino @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +// MAC address for your Ethernet shield +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +// Your Xively key to let you upload data +char xivelyKey[] = "YOUR_API_KEY"; + +// Analog pin which we're monitoring (0 and 1 are used by the Ethernet shield) +int sensorPin = 2; + +// Define the strings for our datastream IDs +char sensorId[] = "sensor_reading"; +char bufferId[] = "info_message"; +String stringId("random_string"); +const int bufferSize = 140; +char bufferValue[bufferSize]; // enough space to store the string we're going to send +XivelyDatastream datastreams[] = { + XivelyDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT), + XivelyDatastream(bufferId, strlen(bufferId), DATASTREAM_BUFFER, bufferValue, bufferSize), + XivelyDatastream(stringId, DATASTREAM_STRING) +}; +// Finally, wrap the datastreams into a feed +XivelyFeed feed(15552, datastreams, 3 /* number of datastreams */); + +EthernetClient client; +XivelyClient xivelyclient(client); + +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + + Serial.println("Starting multiple datastream upload to Xively..."); + Serial.println(); + + while (Ethernet.begin(mac) != 1) + { + Serial.println("Error getting IP address via DHCP, trying again..."); + delay(15000); + } +} + +void loop() { + int sensorValue = analogRead(sensorPin); + datastreams[0].setFloat(sensorValue); + + Serial.print("Read sensor value "); + Serial.println(datastreams[0].getFloat()); + + datastreams[1].setBuffer("a message to upload"); + Serial.print("Setting buffer value to:\n "); + Serial.println(datastreams[1].getBuffer()); + + // Pick a random number to send up in a string + String stringValue(random(100)); + stringValue += " is a random number"; + datastreams[2].setString(stringValue); + Serial.print("Setting string value to:\n "); + Serial.println(datastreams[2].getString()); + + Serial.println("Uploading it to Xively"); + int ret = xivelyclient.put(feed, xivelyKey); + Serial.print("xivelyclient.put returned "); + Serial.println(ret); + + Serial.println(); + delay(15000); +} + diff --git a/books/pdummies/Libraries/xively/examples/MultipleDatastreamsUpload/MultipleDatastreamsUpload.ino.old b/books/pdummies/Libraries/xively/examples/MultipleDatastreamsUpload/MultipleDatastreamsUpload.ino.old new file mode 100755 index 0000000..64a7b59 --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/MultipleDatastreamsUpload/MultipleDatastreamsUpload.ino.old @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +// MAC address for your Ethernet shield +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + + delay(500); + Serial.println("Starting Temperature to Pachube..."); + + while (Ethernet.begin(mac) != 1) + { + Serial.println("Error getting IP address via DHCP, trying again..."); + delay(15000); + } +} + +void loop() { + // Simple putting a single datastream... + char my_id1[12] = "temperature"; + float my_value1; + char my_id2[9] = "humidity"; + char my_value2[140]; // enough space to store the string we get back if we're doing a get + + Datastream datastreams[] = { + Datastream(my_id2, strlen(my_id2), DATASTREAM_FLOAT), + Datastream(my_id1, strlen(my_id1), DATASTREAM_BUFFER, my_value2, 140 /* amount of space in my_value2 */) + }; + PachubeFeed feed(15552, datastreams, 2 /* number of datastreams */); + + strcpy(my_value2, "hello"); + + EthernetClient c; + PachubeClient pc(c); + + int ret = pc.put(feed, "xW0uK8RZ-SrBgxH0-wO2MguKXdGDwMFjXGiOA6EB9KQ"); + Serial.print("pc.put returned "); + Serial.println(ret); + + Serial.println(); + delay(1500); +} diff --git a/books/pdummies/Libraries/xively/examples/WiFiDatastreamDownload/Makefile b/books/pdummies/Libraries/xively/examples/WiFiDatastreamDownload/Makefile new file mode 100755 index 0000000..648c658 --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/WiFiDatastreamDownload/Makefile @@ -0,0 +1,5 @@ +BOARD_TAG = uno +ARDUINO_PORT = /dev/cu.usb* +ARDUINO_LIBS = WiFi WiFi/utility SPI HttpClient xively-arduino + +include Arduino.mk diff --git a/books/pdummies/Libraries/xively/examples/WiFiDatastreamDownload/WiFiDatastreamDownload.ino b/books/pdummies/Libraries/xively/examples/WiFiDatastreamDownload/WiFiDatastreamDownload.ino new file mode 100755 index 0000000..d1f34eb --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/WiFiDatastreamDownload/WiFiDatastreamDownload.ino @@ -0,0 +1,79 @@ +#include +#include +#include +#include + +char ssid[] = "YourNetwork"; // your network SSID (name) +char pass[] = "password"; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key Index number (needed only for WEP) + +int status = WL_IDLE_STATUS; + +// Your Xively key to let you upload data +char xivelyKey[] = "YOUR_XIVELY_API_KEY"; + +// Define the string for our datastream ID +char temperatureId[] = "temperature"; + +XivelyDatastream datastreams[] = { + XivelyDatastream(temperatureId, strlen(temperatureId), DATASTREAM_FLOAT), +}; +// Finally, wrap the datastreams into a feed +XivelyFeed feed(15552, datastreams, 1 /* number of datastreams */); + +WiFiClient client; +XivelyClient xivelyclient(client); + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} + +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + + Serial.println("Reading from Xively example"); + Serial.println(); + + // attempt to connect to Wifi network: + while ( status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + status = WiFi.begin(ssid, pass); + // wait 10 seconds for connection: + delay(10000); + } + Serial.println("Connected to wifi"); + printWifiStatus(); +} + +void loop() { + int ret = xivelyclient.get(feed, xivelyKey); + Serial.print("xivelyclient.get returned "); + Serial.println(ret); + + if (ret > 0) + { + Serial.println("Datastream is..."); + Serial.println(feed[0]); + + Serial.print("Temperature is: "); + Serial.println(feed[0].getFloat()); + } + + Serial.println(); + delay(15000UL); +} diff --git a/books/pdummies/Libraries/xively/examples/WiFiDatastreamUpload/Makefile b/books/pdummies/Libraries/xively/examples/WiFiDatastreamUpload/Makefile new file mode 100755 index 0000000..648c658 --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/WiFiDatastreamUpload/Makefile @@ -0,0 +1,5 @@ +BOARD_TAG = uno +ARDUINO_PORT = /dev/cu.usb* +ARDUINO_LIBS = WiFi WiFi/utility SPI HttpClient xively-arduino + +include Arduino.mk diff --git a/books/pdummies/Libraries/xively/examples/WiFiDatastreamUpload/WiFiDatastreamUpload.ino b/books/pdummies/Libraries/xively/examples/WiFiDatastreamUpload/WiFiDatastreamUpload.ino new file mode 100755 index 0000000..419dec1 --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/WiFiDatastreamUpload/WiFiDatastreamUpload.ino @@ -0,0 +1,78 @@ +#include +#include +#include +#include + +char ssid[] = "YourNetwork"; // your network SSID (name) +char pass[] = "password"; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key Index number (needed only for WEP) + +int status = WL_IDLE_STATUS; + +// Your Xively key to let you upload data +char xivelyKey[] = "YOUR_API_KEY"; + +// Analog pin which we're monitoring (0 and 1 are used by the Ethernet shield) +int sensorPin = 2; + +// Define the strings for our datastream IDs +char sensorId[] = "sensor_reading"; +XivelyDatastream datastreams[] = { + XivelyDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT), +}; +// Finally, wrap the datastreams into a feed +XivelyFeed feed(15552, datastreams, 1 /* number of datastreams */); + +WiFiClient client; +XivelyClient xivelyclient(client); + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + + Serial.println("Starting single datastream upload to Xively..."); + Serial.println(); + + // attempt to connect to Wifi network: + while ( status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + status = WiFi.begin(ssid, pass); + // wait 10 seconds for connection: + delay(10000); + } + Serial.println("Connected to wifi"); + printWifiStatus(); +} + +void loop() { + int sensorValue = analogRead(sensorPin); + datastreams[0].setFloat(sensorValue); + + Serial.print("Read sensor value "); + Serial.println(datastreams[0].getFloat()); + + Serial.println("Uploading it to Xively"); + int ret = xivelyclient.put(feed, xivelyKey); + Serial.print("xivelyclient.put returned "); + Serial.println(ret); + + Serial.println(); + delay(15000); +} diff --git a/books/pdummies/Libraries/xively/examples/WiFiMultipleDatastreamsUpload/Makefile b/books/pdummies/Libraries/xively/examples/WiFiMultipleDatastreamsUpload/Makefile new file mode 100755 index 0000000..648c658 --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/WiFiMultipleDatastreamsUpload/Makefile @@ -0,0 +1,5 @@ +BOARD_TAG = uno +ARDUINO_PORT = /dev/cu.usb* +ARDUINO_LIBS = WiFi WiFi/utility SPI HttpClient xively-arduino + +include Arduino.mk diff --git a/books/pdummies/Libraries/xively/examples/WiFiMultipleDatastreamsUpload/WiFiMultipleDatastreamsUpload.ino b/books/pdummies/Libraries/xively/examples/WiFiMultipleDatastreamsUpload/WiFiMultipleDatastreamsUpload.ino new file mode 100755 index 0000000..b2871d6 --- /dev/null +++ b/books/pdummies/Libraries/xively/examples/WiFiMultipleDatastreamsUpload/WiFiMultipleDatastreamsUpload.ino @@ -0,0 +1,96 @@ +#include +#include +#include +#include + +char ssid[] = "YourNetwork"; // your network SSID (name) +char pass[] = "password"; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key Index number (needed only for WEP) + +int status = WL_IDLE_STATUS; + +// Your Xively key to let you upload data +char xivelyKey[] = "YOUR_API_KEY"; + +// Analog pin which we're monitoring (0 and 1 are used by the Ethernet shield) +int sensorPin = 2; + +// Define the strings for our datastream IDs +char sensorId[] = "sensor_reading"; +char bufferId[] = "info_message"; +String stringId("random_string"); +const int bufferSize = 140; +char bufferValue[bufferSize]; // enough space to store the string we're going to send +XivelyDatastream datastreams[] = { + XivelyDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT), + XivelyDatastream(bufferId, strlen(bufferId), DATASTREAM_BUFFER, bufferValue, bufferSize), + XivelyDatastream(stringId, DATASTREAM_STRING) +}; +// Finally, wrap the datastreams into a feed +XivelyFeed feed(15552, datastreams, 3 /* number of datastreams */); + +WiFiClient client; +XivelyClient xivelyclient(client); + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} + +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + + Serial.println("Starting multiple datastream upload to Xively..."); + Serial.println(); + + // attempt to connect to Wifi network: + while ( status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + status = WiFi.begin(ssid, pass); + // wait 10 seconds for connection: + delay(10000); + } + Serial.println("Connected to wifi"); + printWifiStatus(); +} + +void loop() { + int sensorValue = analogRead(sensorPin); + datastreams[0].setFloat(sensorValue); + + Serial.print("Read sensor value "); + Serial.println(datastreams[0].getFloat()); + + datastreams[1].setBuffer("a message to upload"); + Serial.print("Setting buffer value to:\n "); + Serial.println(datastreams[1].getBuffer()); + + // Pick a random number to send up in a string + String stringValue(random(100)); + stringValue += " is a random number"; + datastreams[2].setString(stringValue); + Serial.print("Setting string value to:\n "); + Serial.println(datastreams[2].getString()); + + Serial.println("Uploading it to Xively"); + int ret = xivelyclient.put(feed, xivelyKey); + Serial.print("xivelyclient.put returned "); + Serial.println(ret); + + Serial.println(); + delay(15000); +} diff --git a/books/pdummies/Libraries/xively/keywords.txt b/books/pdummies/Libraries/xively/keywords.txt new file mode 100755 index 0000000..d301182 --- /dev/null +++ b/books/pdummies/Libraries/xively/keywords.txt @@ -0,0 +1,36 @@ +####################################### +# Syntax Coloring Map For Xively +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Xively KEYWORD1 +XivelyClient KEYWORD1 +XivelyDatastream KEYWORD1 +XivelyFeed KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +get KEYWORD2 +put KEYWORD2 +updateValue KEYWORD2 +setFloat KEYWORD2 +setString KEYWORD2 +setBuffer KEYWORD2 +getFloat KEYWORD2 +getBuffer KEYWORD2 +getString KEYWORD2 +id KEYWORD2 +size KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### +DATASTREAM_STRING 0 LITERAL1 +DATASTREAM_BUFFER 1 LITERAL1 +DATASTREAM_FLOAT 2 LITERAL1 + diff --git a/books/pdummies/README.txt b/books/pdummies/README.txt new file mode 100755 index 0000000..2aa86a4 --- /dev/null +++ b/books/pdummies/README.txt @@ -0,0 +1,34 @@ +Arduino Projects for Dummies +by Brock Craft + + +Arduino Projects For Dummies - Code +v0.3 2/2/2015 + +Errata corrected: + * Fixed: Chapter 4 code: timeDelay changed to delayTime to be consistent with the text of the book. + +v0.2 26/2/2013 + +Errata corrected: + * Fixed: Chapter 4 code syntax: timeChanged = millis(); was not within if loop brackets + +------- +Example code from all of the chapters is in this collection of files, +including intermediate stages of the code for testing. + +The Libraries folder contains libraries you will need for some of +the projects. Place each of the folders in the Libraries folders your /libraries/ folder on your computer. +You may need to create the libraries subfolder if it's your first library. +Then restart the IDE. + +Additional Credits: +-Matrix display code adapted from oomlout.co.uk. +-IRremote library for the Arduino by Ken Shirriff. +-Adafruit GPS library written by Limor Fried/Ladyada for Adafruit Industries. + BSD license, check license.txt for more information +-Twitter LIbrary by Markku Rossi +-Cosm code written by Adrian McEwen with modifications by Sam Mulube + + + diff --git a/lezioni/.elettronica-argomenti.swp b/lezioni/.elettronica-argomenti.swp new file mode 100644 index 0000000..60cefc7 Binary files /dev/null and b/lezioni/.elettronica-argomenti.swp differ diff --git a/lezioni/elettronica-argomenti b/lezioni/elettronica-argomenti new file mode 100644 index 0000000..9af00ed --- /dev/null +++ b/lezioni/elettronica-argomenti @@ -0,0 +1,28 @@ + + + + +elettricita' : spostamento di carica per unita' di tempo. ampee / culomb. Metafora anelli di una catena. +voltaggio: differenza di potenziale, metafora con pressione acqua. 1 joule / ampere (joule e' un newton / metro), oppure W = I * V. + +Specificare che la rete e' corrente alternata e che noi lavoreremo solo con corrente continua. Anzi meno: massimo 12v. Anzi ancora meno: 5v. + +Sicurezza: shock azzard: elettrocuzione, contrazioni muscolari e bruciature (joule). AC -> spasmi, DC -> bruciature. +Usare solo USB e batterie, e batterie possono surriscaldarsi e esplodere. Usare occhiali per saldature. Lipo pericolose, no aerei (UPS 747 3 piloti morti). + +Circuito elettrico: isempre tre elementi, flusso di elettroni, carico, circuito aperto e chiuso, corto circuito. +Legge di Ohm, unita' di misura e sottomultipli: ma, mv, kohms. Usare sempre gli interi nei colcoli. + +Resistenze: mix chimico tra conduttore e semiconduttore. Limitano il passaggio di corrente. Ppi usati nei divisori di voltaggio e con i condensatori. +Leggere le resistenze, 4 bande e 5 bande, non esistono tutti i valori ma una scleta ristretta (12 i piu' comuni, E12, o E24). Calcolatore online: digi-key, 5 band resistor calulator . + +Power = V*I , dissipazione della resistenza. +Resistivita' come prodotto tra Lunghezza * Sessione, usarlo per spiegare effetti di serie e parallelo delle resistenze. + +Parallelo: fare i casi speciali di resistenze di pari valore, due valori con formula semplificata (R1 * R2) / (R1 + R2), per multipli valori usare la calcolatrice con formula standard ( 1 ) / (1 / (R1)) + (1 / (R2)) ... +Che sarebbe la formula per sommare la conduttanza. + + +REsistori + +LED: https://learn.adafruit.com/all-about-leds/overview diff --git a/lezioni/lezioni b/lezioni/lezioni new file mode 100644 index 0000000..99fefe7 --- /dev/null +++ b/lezioni/lezioni @@ -0,0 +1,36 @@ + +HW caratteristico: +- piezo per melodie: http://www.banggood.com/10Pcs-5V-Electromagnetic-Active-Buzzer-Continuous-Beep-Continuously-p-943524.html + - http://www.arduino.cc/en/Tutorial/PlayMelody + + +- illuminare vari led con un potenziometro / trimmercontrollo + + +- register shifter: http://www.banggood.com/25Pcs-SN74HC595N-74HC595-74HC595N-HC595-DIP-16-8-Bit-Shift-Register-IC-p-917428.html + - http://arduino.cc/en/tutorial/ShiftOut + + - + +Read Serial with linux: +https://wiki.archlinux.org/index.php/arduino#Accessing_serial +Note: As autoreset on serial connection is activated by default on most boards, you need to disable this feature if you want to communicate directly with your board with the last command instead of a terminal emulator (arduino IDE, screen, picocom...). If you have a Leonardo board, you are not concerned by this, because it does not autoreset. If you have a Uno board, connect a 10 µF capacitor between the RESET and GND pins. If you have another board, connect a 120 ohms resistor between the RESET and 5V pins. + +stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts + + +- Blog in italiano: http://arduinoprincipiante.blogspot.it + + +Pullup / down resistors: http://playground.arduino.cc/CommonTopics/PullUpDownResistor +- http://www.microcontroller.it/Tutorials/Elettronica/pullup.htm +- Vcc = collector = positive + Vss = source = negative + MEglio quella dell'altro sito + + +- http://tronixstuff.com/tutorials/ +- http://www.baeyens.it/eclipse/stable-linux.html + + +- i2c SPI http://www.bitwizard.nl/wiki/index.php/SPI_versus_I2C_protocols diff --git a/lezioni/ordine_argomenti b/lezioni/ordine_argomenti new file mode 100644 index 0000000..cc24045 --- /dev/null +++ b/lezioni/ordine_argomenti @@ -0,0 +1,98 @@ + + +Introduzione... +Architettura elaboratore: processore - memoria - storaggio - input -autput. Bus di comunicazione: seriali. Cenni a USB iclient / HOST. +Software, Sistemi operativi, compilazione (e interpreti), architetture. +Classi di elaboratori. MCU e CPU. + +Esercizio Blink, 4 parti: commenti dichiarazioni setup loop. + istruzioni e sequenze di istruzioni. +Istruzione termina con puntoe virgola. +Partire dalla funzione digitalWrite, modificare i tempi e ripetere: sequenze di istruzioni. +Variabili: impostare i tempi con una variabile. +Fare una funzione per rapido - lento, guardare loop() e setup() +Setup() symbolic constant /usr/share/arduino/hardware/arduino/cores/arduino/Arduino.h + +Informatica: automatismi per operazioni ripetitive. +Introdurre un ciclo while() con un iteratore, ragionare sulla gestione dell'iteratore, scope, introdurre ciclo for (esercizio blinks/blink_4) + +Introdurre un LED e un resistore: circuiti elettrici, introduzione. +Breadboard, jumpers, colore per cavi. + +impostare una nuova funzione per tempi e led: argomenti. + +...diventa ripetitivo: serve qualcosa per cambiare il flusso di esecuzione: cicli condizionali (e poi iterativi). +(Fare prima seriali per vedere tipi e operatori?): naaa + + Input base per accendere un LED (senza bottone, col jumper), input libero: se non e' collegato a +5 o a ground e' come una antenna. +Magari introdurre seriali per fare il debuggin e leggere i valori del bottone. +Seriali: instanziare con Serial.Begin(), print - println e flush() del buffer. + + Usare un bottone e una resistenza: pull up e pull down, ciclo IF, invertire il circuito del bottone: confronto con cambio software per introdurre elettronica digitale. +Stato di un bottone. + +PWM, fatto con intervalli di un millisecondo, cenno a delayMicroseconds(), introdurre i PWM automatici: base con un byte per luminosita': cicli iterativi. Partire da while, variabile contatore e iteratore, e poi fori ternario. +Fare una funziona Flash(int numero-di-accensioni, int delayTime). +Sequenza di istruzioni - > funzione : esercizio per blink con ripetizioni lunghe / corte in base a parametro funzione con ciclo iterattivo for. +Funzione per aumentare diminuire luminosita'. +PWM con LED RGB. + +Programmazione: vedere come stiamo con operatori e data types. +Direttive per preprocesor: # define - # if defined - per DEBUG +Usare seriale per aritmetica. + +Input: bouncing e state: elettronica digitale. (serie di esercizi in "basic") +http://www.ikalogic.com/de-bouncing-circuits/ +(guardare arduino for dummies) +Analog input con un potenziometro. +Usare map() per ricalibrare una lettura. +Usare map() e poi una divusuione *4 oer mappare un range 1024 -> 256 su PWM. + + +Seriali: scrivere e debugging. + +Motore a spazzole, transistor e diodo. +- Accendere e spegnere un motore, +- usare un ciclo FOR per PWM, +- potenziometro per variare PWM (con debuggin seriale) +- impostare vaore minimo per motore (da usare con analoglWrite) + + +Servo: descrizione / caratteristiche base (vedi guida) +Fare i due sketch di esempio: ciclio FOR e Knob. +- C: caricare librerie + + +Piezo +Descrizione del funzionamento, melodie di esempio (mario tunes!). +Arduino dev: utilizzare sketch su piu' tabs (include): percorsi <> "" +Programmazione: array, strutture dati. +Pitch follower - sensore luminose connesso a piezo. Ricordarsi di calibrare il sensore con map(). +Usare un piezo come input - knock (descrivere come le dimensioni influenzano la sensibilita', esistono piezo costruiti espressamente per input - flex). Occhio alla sensibilita'. + + + + +Ottimizzazione: multitasking con millis() al posto di delay(), +Debouncing, gestione stato di un bottone, arrotondamento su media della lettura di un sensore, calibrazione di sensori. Calibrazione automatica in un range di tempo durante il setup(). + + +INPUT_PULLUP: bottone senza resistenza come input. + +--- Shift register: binario - decimale -esadecimale. Circuiti semi-permaneti su mini breadboard, piu' listati per stesso circuito. + +Avanzati +=========== + +Interrupts: http://gammon.com.au/interrupts +Usati per l'input dell'utente, servono per intercettare eventi e non per fare cambiamenti. Uso di ``volatile`` per le variabili con IRS. Usare un timer per interrupts. + +Timers: possono essere usati per PWM con periodo diverso da 500hz, possono avere una risoluzione di 1024. + +Powermanagement: ridurre i consumi abbassando la frequenza operativa, spegnere parti della MCU (poco utile: 1.4ma di risparmio con tutto spento), mettere tutto in sleep mode: narcoleptic, delay() che manda in sleep in MCU. +Usare un digitalWrite() per fornire 5v a un sensore (es fotocellula) solo quando andiamo a fare una lettura con alanogRead(), poi tornare a spegnerlo. + +Memoria: controllare l'utilizzo della memoria con la libreria MemoryFree. +Usare constanti e bytes, rimuovere chiamate a Serial.println() (500bytes) con #IF DEBUG . Programmare arduino senza il bootloader salva un paio di KB. + + diff --git a/lezioni/prima_lezione b/lezioni/prima_lezione new file mode 100644 index 0000000..2a1f6fb --- /dev/null +++ b/lezioni/prima_lezione @@ -0,0 +1,78 @@ +Linux +======================================== + +Free software, RPi e altri usano linux, embedded usa linux. +Possiamo condividere il software (PXE linux, installation party). +Portabilita', multiarch, flessibilita'. +Assolutamente vietato software pirata. + +HardWare +========= + +Illustrare la scatola hardwar con i componenti. +Arduino, Breadboard e componenti. + +ATmega32 MCU, IC montato DIP / DLP (dual in line package) e non SMD (surface mounted), sostituibile. 20 / 22 pin utilizzabili: 14 digital in/outi (6PWM), 6 analog input, USB, 2 ICSP, reset button. + +Power: via USB, via l'entrata regolata (7-12v) con protezione di reverse polarity, i connettori power Vin non sono protetti. + +4 LED: power , RX, TX, LED (13 con resistenza). + + +Architettura di un elaboratore +======================================== + +CPU - RAM - HD STORAGE +CPU - BIT (word) e frequenza, features: multitasking + +INPUT e OUTPUT = PC: tastiera monitor + rete USB BT... + + +MCU: tutto integrato nel IC +INPUT OUTPUT: 20 {22) pin , 14 input / output, 6 analog input 10bit resolution *1024 values , 6 PWM output (8bit resolution). +Communication: serial in / outi (UART TTL), I2C + SPI (sarebbero i 2 pin MISO MOSI in piu' per arrivare a 22). +- http://arduino.cc/en/Main/arduinoBoardUno + +Differenze: interazione con perifieriche (USB), multitasking. +Software: sistema operativo. RPi e' un sistema linux. +- Comparativa tra vari arduino: http://arduino.cc/en/Products.Compare + +Linux desktop +============== +- https://www.kde.org/announcements/4.2/desktop.php +Menu start +krunner = operazioni - percorsi files - single click +Muovere finestre [ALT] + LEft - resize con Right +Snap: trscinare finestre ai bordi +Shade : attivarlo con doppio click - cercare hover in krunner +Desktop virtuali [CTRL] + num +Expose ( [CTRL] F10) - alt tab +Dolphin +Effetti + +Software +======================================== + +Compilazione - sorgente (passaggi vari: precompilatore, linker) -> codice oggetto specifioc per CPU / Architettura. Upload (burn) codice su flash di arduino via USB. Poi USB come seriale (non possono lavorare assieme). + + +ARduino IDE: sistema integrato. +Utilizzare IDE. + +Tools -> serial / board + +Barra strumenti - Short cuts +Ctrl + R Verify +Ctrl + U Upload +Ctrl + Shift + M Serial Monitor +Contestuale: cerca nella guida + +Upload -> LED: rx tx power led + +-> BLink -> GO TO -> Argomenti_lezione + +Show and tell +======================================== + +Portare ATtiny, arduino nini e rpi. https://www.banggood.com/buy/Attiny.html +Magari un paio delle piccole breadboard, anche shields. diff --git a/lezioni/ricettario.rst b/lezioni/ricettario.rst new file mode 100644 index 0000000..e4d44ad --- /dev/null +++ b/lezioni/ricettario.rst @@ -0,0 +1,21 @@ +Ricettario +=============== + +Risorse utili per le lezioni su Arduino. + +Language reference +------------------ + +- http://arduino.cc/en/Reference/HomePage + +Data Types +------------ + +- http://playground.arduino.cc/Code/DatatypePractices +- https://learn.sparkfun.com/tutorials/data-types-in-arduino + + +Motor Transistor +----------------- + +- https://learn.adafruit.com/adafruit-arduino-lesson-13-dc-motors/transistors diff --git a/lezioni/seconda_lezione b/lezioni/seconda_lezione new file mode 100644 index 0000000..e90d2ae --- /dev/null +++ b/lezioni/seconda_lezione @@ -0,0 +1,35 @@ +Linux desktop +============== +- https://www.kde.org/announcements/4.2/desktop.php +Menu start +krunner = operazioni - percorsi files - single click +Muovere finestre [ALT] + LEft - resize con Right +Snap: trscinare finestre ai bordi +Shade : attivarlo con doppio click - cercare hover in krunner +Desktop virtuali [CTRL] + num +Expose ( [CTRL] F10) - alt tab +Dolphin +Effetti + +Software +======================================== + +Compilazione - sorgente (passaggi vari: precompilatore, linker) -> +codice oggetto specifioc per CPU / Architettura. Upload (burn) +codice su flash di arduino via USB. Poi USB come seriale (non possono lavorare assieme). + + +ARduino IDE: sistema integrato. +Utilizzare IDE. + +Tools -> serial / board + +Barra strumenti - Short cuts +Ctrl + R Verify +Ctrl + U Upload +Ctrl + Shift + M Serial Monitor +Contestuale: cerca nella guida + +Upload -> LED: rx tx power led + +-> BLink -> GO TO -> Argomenti_lezione diff --git a/programming_sketchbook/ultrasonic_distance/sketch.properties b/programming_sketchbook/ultrasonic_distance/sketch.properties new file mode 100644 index 0000000..8630fa2 --- /dev/null +++ b/programming_sketchbook/ultrasonic_distance/sketch.properties @@ -0,0 +1,2 @@ +mode.id=processing.mode.java.JavaMode +mode=Java diff --git a/programming_sketchbook/ultrasonic_distance/ultrasonic_distance.pde b/programming_sketchbook/ultrasonic_distance/ultrasonic_distance.pde new file mode 100644 index 0000000..7740eb6 --- /dev/null +++ b/programming_sketchbook/ultrasonic_distance/ultrasonic_distance.pde @@ -0,0 +1,128 @@ +/* The following Processing Sketch was created by ScottC on + the 10 Nov 2012 : http://arduinobasics.blogspot.com/ + + Inspired by this Processing sketch by Daniel Shiffman: + http://processing.org/learning/basics/sinewave.html + +*/ +import processing.serial.*; + + +int numOfShapes = 60; // Number of squares to display on screen +int shapeSpeed = 2; // Speed at which the shapes move to new position + // 2 = Fastest, Larger numbers are slower + +//Global Variables +Square[] mySquares = new Square[numOfShapes]; +int shapeSize, distance; +String comPortString; +Serial myPort; + +/* -----------------------Setup ---------------------------*/ +void setup(){ + size(displayWidth,displayHeight); //Use entire screen size. + smooth(); // draws all shapes with smooth edges. + + /* Calculate the size of the squares and initialise the Squares array */ + shapeSize = (width/numOfShapes); + for(int i = 0; i0; i--){ + /* Use the previous square's position as a target */ + targetY=mySquares[i-1].getY(); + oldY=mySquares[i].getY(); + + if(abs(oldY-targetY)<2){ + newY=targetY; //This helps to line them up + }else{ + //calculate the new position of the square + newY=oldY-((oldY-targetY)/shapeSpeed); + } + //Set the new position of the square + mySquares[i].setY(newY); + + /*Calculate the colour of the square based on its + position on the screen */ + blueVal = int(map(newY,0,height,0,255)); + redVal = 255-blueVal; + fill(redVal,0,blueVal); + + /* Draw the square on the screen */ + rect(mySquares[i].getX(), mySquares[i].getY(),shapeSize,shapeSize); + } +} + +/* ---------------------sketchFullScreen---------------------------*/ +// This puts processing into Full Screen Mode +boolean sketchFullScreen() { + return true; +} + +/* ---------------------CLASS: Square ---------------------------*/ +class Square{ + int xPosition, yPosition; + + Square(int xPos, int yPos){ + xPosition = xPos; + yPosition = yPos; + } + + int getX(){ + return xPosition; + } + + int getY(){ + return yPosition; + } + + void setY(int yPos){ + yPosition = yPos; + } +} diff --git a/schemi/display_lcd_due_righe.fzz b/schemi/display_lcd_due_righe.fzz new file mode 100644 index 0000000..7d87642 Binary files /dev/null and b/schemi/display_lcd_due_righe.fzz differ diff --git a/schemi/display_lcd_due_righe_bb.png b/schemi/display_lcd_due_righe_bb.png new file mode 100644 index 0000000..0a91a0d Binary files /dev/null and b/schemi/display_lcd_due_righe_bb.png differ diff --git a/serial-linux b/serial-linux new file mode 100644 index 0000000..4b1c0a7 --- /dev/null +++ b/serial-linux @@ -0,0 +1,28 @@ +Read Serial with linux: +https://wiki.archlinux.org/index.php/arduino#Accessing_serial +Note: As autoreset on serial connection is activated by default on most boards, you need to disable this feature if you want to communicate directly with your board with the last command instead of a terminal emulator (arduino IDE, screen, picocom...). If you have a Leonardo board, you are not concerned by this, because it does not autoreset. If you have a Uno board, connect a 10 µF capacitor between the RESET and GND pins. If you have another board, connect a 120 ohms resistor between the RESET and 5V pins. + +stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts + + +Oppure dopo il stty fare un +cat prova + + + sul quale si puo' fare un tail -f + ---------- + attaching to a serial tty + In GNU Screen, you can connect to a serial device (screen -r /dev/ttyS0 115200). Tmux does not support this feature. + +si puo' anche usare screen: + +screen /dev/ttyACM0 9600 + +Magic codes are [CTR]A -- d n a " + +----- +See also http://playground.arduino.cc/Interfacing/LinuxTTY + diff --git a/sfinge/accessori.rst b/sfinge/accessori.rst new file mode 100644 index 0000000..9b7763d --- /dev/null +++ b/sfinge/accessori.rst @@ -0,0 +1,136 @@ +=============== +Lista materiali +=============== + + + :Author: Andrea Manni + :Version: 1.1 + + +Materiali e accessori utili per i primi esperimenti di elettronica. + +Multimetro +================== + +Per un multimetro economico assicurarsi di controllare: + +- Tipo di batterie: se' e' particolarmente piccolo puo' usare delle batterie non standard *che possono costare piu' del multimetro!* +- Che abbia lo spegnimento automatico in idle, altrimenti sicuramente scaricherete batterie inutilmente. +- Che abbia o meno il test di continuita'. +- Che sia autorange. Per un principiante puo' essere *istruttivo* avere un multimetro non-autorange. + +Alcuni multimetri economici: + +- Modello piu' economico, da 5.5 euro, senza test di continuita': http://www.banggood.com/Wholesale-DT-830B-Screen-Digital-Multimeter-Volt-Ohm-Meter-Ammeter-p-50035.html +- Modello da 8 euro con test di continuita': http://www.banggood.com/Wholesale-XL830L-LCD-Digital-Voltmeter-Ohmmeter-Ammeter-OHM-Multimeter-Tester-p-28399.html +- Modello avanzato da 26 euro, autorange http://www.banggood.com/LCD-Auto-Range-Digital-Multimeter-Capacitance-Resistance-Tester-p-907724.html + + +Accessori +------------- + +Torna utile avere una coppia di sonde a morsetti (alligatori) da usare direttamente su una bradboard: http://www.banggood.com/Alligator-Test-Lead-Clip-To-Banana-Plug-Probe-Cable-for-Multimeters-p-923387.html + +- Pinzette: http://www.banggood.com/6pcs-Black-Antistatic-Plastic-Tweezers-Heat-Resistant-Repair-Tool-p-930332.html + + +Alimentatori +============== + +Per tutti i primi esperimenti si consiglia di utilizzare esclusivamente l'alimentazione USB (5v 500ma) dell'arduino. Alimentatori autonomi possono essere: + +- http://www.banggood.com/Wholesale-Universal-EU-AC-Power-Adapter-USB-Charger-For-Cellphone-Smartphone-p-41600.html +- 3ampere *dichiarati* http://www.banggood.com/7-Ports-USB-2_0-Hub-with-3_0mAh-110~240V-AC-Adapter-Extreme-Edition-p-84821.html + + +Alimentatore regolabile +------------------------ + +Per vattaggi superiori puo' far comodo un alimentatore regolabile: + +- http://www.banggood.com/XY-309-Adjustable-Voltage-Regulator-Adapter-1_5V-3V-4_5V-6V-9V-12V-1A-p-960781.html +- Max 300mA a 12V : http://www.amazon.it/Ansmann-Alimentatore-Elettrico-Universale-Multicolore/dp/B002TPY1VS/ref=pd_cp_pc_3 + + +Un alimentatore da banco regolabile sarebbe l'ideale: http://www.banggood.com/CPS-3205-0-32V-0-5A-Portable-Adjustable-DC-Power-Supply-110V220V-p-934530.html?bid=8081 + + +Do it yourself +~~~~~~~~~~~~~~~~~~ + +Alimentatori regolabili in kit di montaggio. + +- http://www.banggood.com/DIY-LM317-Adjustable-Voltage-Power-Supply-Board-Learning-Kit-With-Case-p-964548.html + + +Questo richiedono un trasformatore a 5-35vv, anche quello di un computer portatile dovrebbe andare. + +- http://www.banggood.com/DIY-LM317-Adjustable-Regulated-Voltage-Module-Suite-Kit-DCAC-Input-p-931239.html +- http://www.banggood.com/0_36-Inch-Digital-Voltmeter-200V-Voltage-Meter-LED-Panel-Meter-3-Wire-p-933756.html + + + + +Batterie +------------- + +Si possono raggiungere vattaggi superiori ai 5v della presa USB utilizzando delle batterie (preferibilmente ricaricabili) in serie, magari con uno step down per maggiore precisione sul voltaggio fornito. La sola scheda arduino puo' essere alimetata tramite la plug rotonda con 7-12v . + +- http://www.banggood.com/6-x-AA-Battery-Case-Storage-Holder-With-DC2_1-Power-Jack-For-Arduino-p-76402.html +- http://www.banggood.com/12V-8-x-AA-Battery-Clip-Slot-Holder-Stack-Box-Case-6-Inch-Leads-Wire-p-80721.html + + +Arduino puo' essere alimentata con una powerbank: http://www.banggood.com/2600mAh-External-Battery-Charger-USB-Power-Bank-For-iPhone-Tablet-p-81079.html + + + +Attrezzi +==================== + +- http://www.banggood.com/5-Inch-BOSI-High-Carbon-Steel-Sharp-Mouth-Mini-Plier-BS203065-p-76972.html +- http://www.banggood.com/6pcs-Black-Antistatic-Plastic-Tweezers-Heat-Resistant-Repair-Tool-p-930332.html +- http://www.banggood.com/0_2-3mm2-Adjustable-Cable-Wire-Stripper-Crimper-Cutter-Stripping-Tool-p-911903.html + + +Saldatori +----------- + +Per il corso di base non serve un saldatorea, si lavora con la bradboard e jumpers. Al bisogno potete connettere direttamente molti componenti (es um potenziometro, piezo) inserendo i loro piedini direttamente in jumpers femmina-maschio: http://www.banggood.com/40pcs-20cm-Male-to-Female-Jumper-Jump-Cable-Wire-For-Arduino-p-75613.html . + +Ai principianti si sconsiglia di improvvisare senza la supervisione di un esperto, si consiglia una stazione saldante con supporto solido per il saldatore (altrimenti rischiate di farvi del male una volta entrato in temperatura!) con potenza regolabile, punte sostituibili, spugnetta. Con marchio CEE. qualcosa simile a http://ecx.images-amazon.com/images/I/41GKe13xwFL._SY300_.jpg . + +- http://www.banggood.com/Sucking-Vacuum-Desoldering-Pump-Solder-Sucker-Remover-Tool-p-932434.html + + +Contenitori +============= + +- http://www.banggood.com/Wholesale-15-or-24-or-36-Grid-Clear-Adjustable-Jewelry-Bead-Organizer-Box-Storage-Container-Case-p-59083.html +- http://www.banggood.com/25-Compartment-Sewing-Machine-Bobbins-Case-Organizer-Storage-p-954356.html +- http://www.banggood.com/8-Compartments-Storage-Plastic-Electronics-Tool-Gadgets-Box-Case-p-913527.html + - http://www.banggood.com/123-p-954357.html + +Suggerimento: se dovete comprare chip / componenti delicati acquistante anche una scatola: i componenti verranno probabilmente spediti dentro la scatola. + + +PrefBoard +========== + +I circuiti creati su BradBoard possono essere ricreati stabilmente su schede preforate: + +- http://www.banggood.com/5Pcs-4060mm-FR-4-Double-Side-Prototype-PCB-Printed-Circuit-Board-p-962243.html +- http://www.banggood.com/5Pcs-70x90mm-DIY-Soldering-Prototype-Copper-PCB-Printed-Circuit-Board-p-929776.html + +Accessori +=============== + +Third Hand: Utile per tenere fermi i coponenti in fase di saldature, esiste con lente di ingrandimento integrata (scomodoa!). + +- http://www.hobbyking.com/hobbyking/store/uh_viewItem.asp?idProduct=54736 + + +- Porta viti magnetizzato: http://www.hobbyking.com/hobbyking/store/__46550__Magnetic_screws_parts_Tray_EU_Warehouse_.html +- Penna telescopica raccogli viti: http://www.hobbyking.com/hobbyking/store/__36331__Telescopic_Magnetic_Pick_up_Tool_EU_Warehouse_.html +- Attrezzi vari (di qualita' molto variabile!) http://www.hobbyking.com/hobbyking/store/__178__157__Tools-Hand_Tools.html + + diff --git a/sfinge/lezioni.rst b/sfinge/lezioni.rst new file mode 100644 index 0000000..ac5dba7 --- /dev/null +++ b/sfinge/lezioni.rst @@ -0,0 +1,399 @@ +=================================== +Argomenti per Lezioni Arduino Base +=================================== + + + :Author: Andrea Manni + :Copyright: GFDL + :Version: 0.1 + + +Appunti e materiali per le lezioni del corso base su Arduino e Raspberry Pi. Questo documento e' da considerarsi come una traccia degli argomenti considerati e non il manuale definitivo delle lezioni. + + +.. sectnum:: + +.. contents:: Indice degli argomenti +.. |date| date:: + +Generato il |date| con: http://docutils.sourceforge.net/rst.html + + +Il corso +========== + +Il corso di base di Arduino e' rivolto a chi si approccia per la prima volta al mondo dei makers, proponendosi di fornire le basi di elettronica, informatica e programmazione sia per orientarsi che per una prima interazione nell'innovativo mondo dell'elettronica digitale. + +Obbiettivo del corso e' partire dalla piattaforma Arduino come primo approccio all'elettronica digitale, lavorare su quelle basi di elettronica, informatica e programmazione che permetteranno poi di sviluppare anche sulle altre soluzioni come RasPi. Le varie tematiche verranno affrontate dagli studenti con prototipi funzionanti, circuiti elettrici nei quali vari tipi di sensori saranno connessi al microcontroller Arduino che elaborera' questi dati per poi interagire con il mondo reale comandando vari tipi di attuatori (ad es. motori, luci LED, altoparlanti). + +Contesto +------------ + +Negli anni recenti molto e' cambiato nel panorama dell'elettronica, la contaminazione con gli ambienti aperti del settore informatico e la disponibilita' di sistemi miniaturizzati a basso costo ha reso disponibili nuove piattaforme come Arduino o RaspBerryPi, soluzioni economiche e flessibili. + +Grazie a queste ed altre tecnologie e alla cultura dei Makers oggi sono alla portata dell'hobbista soluzioni che, per via degli alti costi e dell'esclusivita' delle varie implementazioni, fino a pochi anni fa erano esclusiva dell'automazione industriale. + +Il Free Software, Open Source e Open Hardware, Crowdfounding hanno rivoluzionato l'elettronica con una serie di dispositivi che hanno portato la creativita' elettronica nella disponibilita' dei makers, partendo dai micro cotroller piu' semplici ed economici come Arduino fino a veri e propri micro computer come Raspberry Pi basati su Gnu/Linux. Soluzioni flessibili ed economiche che a loro volta permettono la costruzione di nuovi strumenti come le stampanti 3D, offrendo ad un vasto pubblico la possibilita' di dedicarsi a robotica, domotica, veicoli autonomi. Una nuova generazione di harware aperto da rendere *smart* con il software libero, per costruirsi oggetti sempre piu' connessi tra loro e ricchi di funzionalita'. + +Finalita' +----------- + +Tutta questa flessibilita' e disponibilita' puo' pero' disorientare chi si approccia a queste tecnologie, sia chi e' ai primi passi che coloro che magari hanno precedenti esperienze con solo alcune delle discipline che si amalgamano con Arduino. Scopo del corso e' quindi stabilire delle fondamenta di informatica e elettronica per poi poter crescere sia con Arduino che indirizzarsi verso le alre soluzioni. + + +Durante lo svolgimento del corso i partecipanti impareranno a programmare in Arduino C in ambiente Gnu/Linux utilizzando una breadboard e diversi input/output. + + +Introduzione +================ + +- Cos'e' un microcontroller (tutto compreso, memoria calcolo inputr-outpt)/ attuatore +- Cenni alle classi di elaboratori +- Cos'e' l'informatica e la programmazione +- Elettronica e elettronica digitale + +Perche' l'informatica ha bisogno di un attuatore: interazione con il reale. +Elettronica digitale: vantaggi di usare un software (esempio di un bottone, logica booleana): cablatura istantanea, aggiunta di features. + + +Avvertenze +--------------- + +Precauzioni per non danneggiare la scheda durante l'uso: + + +* Applicare materiale isolante (fondo in polistirolo) sotto alla scheda. +* Applicare isolante al connettore USB per staccare il cavo senza statica. +* Solo la porta 13 ha una resistenza integrata, per tutte le altre usare una resistenza da ~300. +* Non usare Arduino come un trasformatore! + + +Blink +-------- + +Analisi di un sketch: + +- Struttura (setup, loop, input output) +- Fondamenti di programmazione: i 4 elementi base (fare descrizione completa dopo aver fatto cicli - INPUT). + +- Dichiarazione di variabili: LED +- Funzioni per cambio di stato: digitalWrite / delay - output + + +Pratica +~~~~~~~~~ + +# Fare accendere il LED per 1/10 di secondo +# Far spegnere il LED per 1/10 di s. + +Descrivere una istruzione + + +* Far accendere il LED per 1/10 di secondo e un secondo + +Questa e' una sequenza di istruzioni, accenno alle funzioni, es delay() . + + + + +Verifica e compilazione +------------------------ + +Codice sorgente e codice oggetto, compilazione del codice. +Controllo formale, preprocessor (#define constantName value). + +Eseguire procedure manualmente con makefile, visualizzazione codice oggetto. + + + +Input +===== + +Pin in modalita' input: leggere ground e +5 (con buffer di protezione: se il pin e' OUTPUT LOW e viene attacato a +5 va in corto!). +Pin fluttante, pull up e down con cavo. Metafora palo con fulmini e messa a terra. +Esempio con un input, primo esempio con un bottone che fa accendere un LED. + + +Invertire il circuito del bottone / parametro della luminosita' per spiegare i *vantaggi dell'elettronica digitale* rispetto a elettronica "cablata" (cenni a PWM, varie letture degli eventi di *click*). + +Cicli Condizionali +---------------------- + +Eventualmente usare un generatore random (esercizio per testa / croce) per introdurre i cicli condizionali. + + +State +------ + +Definire il concetto di state e stateless, sketch con iterruttore. Logica combinativa e logica sequenziale. Es. firewall IP, NAT machine. +Utilizzare PULLUP per poi usare resistenza interna. + + +INPUT_PULLUP +------------ + +Utilizzare la resistenza interna da 20Hohms di Arduino. + + +Ottimizzazioni +--------------- + +.. NOTE:: + Questa parte andra' affrontata dopo i motori (servo inclusi). + + +De-bouncing, multitasking con millis(), identificare il cambio di stato. + + +Sensori: dilatare i tempi di lettura, utilizzare valori medi di piu' letture (smoothing), calibrazione dei sensori utilizzando seriale e riferimenti. + + + +Eventuali +~~~~~~~~~~ + +Trasformazioni di input: da sensore luminoso a piezo: Pitch follower + + + +Analisi ulteriore +================== + +Introdurre i data types + + +Cicli iterativi: for - while + + +Seriali +======== + +Inviare dati via seriale per debugging. + +Output +======== + +LED, motori, servomotori, piezo, seriale. + +PWM +----------- + +Esempio con un ''byte'' di ''brightness++" per aumentare la luminosita' di un LED. +Introdurre eventualmente i cicli ''for'' . + +RGB LED +~~~~~~~~~ + +Utilizzare un LED RGB. Eventualmente introdurre esadecimali. Sketch con cicli iterativi e uno con input via seriale. + +ShiftRegister +~~~~~~~~~~~~~~~ + +Eventuale: utiulizzare uno shift register per aumentare le porte di uscita con LED. La realizzazione del circuito e' relativamente laboriosa, eventualmente portarne uno gia' fatto. Usare piu' listati (4 disponbili) sullo stesso circuito, ottimo per i binari. + +Funzioni +----------- + +Creare una funzione con un ciclo for per aumentare / diminuire la luminosita' in base a un parametro passato alla funzione. + + + +Piezo +------- + +Emettere suoni e melodie tramite un trasduttore piezoelettrico. +- Onde sonore: frequenze e pitch. +- Sketch di esempi in Digital + + +(Sketches in multiple tabs, array). +Pitch follower: trasformazione input di un sensore photo -> onde sonore tramite piezo. + + +Calibrare l'input +------------------ + +Calibrare l'input di un potenziometro / sensore: identificare valori minimi, massimi, offset e stabilire una formula: ''Range = (1024 - offset) * 1024 / (1024 - offset) '' . + +Utilizzare ''map()'' per fare la stessa cosa. Caso specifico: inversione tra ''1024 <-> 256'' : usare un fattore 4. + + +Usare un sensore di luminosita' +------------------------------- + +Utilizzare come sorgente di input la resistenza rilevata da un sensore di luminosita', mappare l'input del sensore su un LED PWM / seriale. + + + + +Motori +======== + +Utilizzo di un motore 5v ~14mAh direttamente su Arduino tramite un transistor e diodo. Variare la velocita' tramite PWM e un ciclo for, utilizzare un potenziometro come input analogico per variare la velocita', trovare il valore minimo di carico per attivare il motore tramite debugging seriale. + + +Servo motori +-------------- + +Differenze rispetto a un motore DC, scopi di utilizzo. +Caratteristiche: coppia, velocita', peso, alimentazione. +Funzionamento: analogici e digitali, riduttori plastici e metallici, bearings. + +Sketch Base e Knob. Utilizzare librerie esterne. + +- http://handyboard.com/hb/faq/hardware-faqs/dc-vs-servo/ + + +Motori passo-passo +----------------------- + +Funzionamento, caratteristiche di utilizzo (consumo - coppia), campi di utilizzo (automazione power tools), differenze rispetto a servo (controllo posizione) e motori normali. + + +Motori brushless +----------------- + +Differenze e caratteristiche rispetto ai motori a spazzole. +Uso di una ESC, BEC. + + +Caratteristiche generali +------------------------- + +Potenza, KV, voltaggio utilizzabile, ampere massimi, potenza / peso, efficienza. + + + +Elettronica di base +===================== + +Si dovranno introdurre: + +- Legge di Ohm +- Serie e parallelo, in particolare per batterie e resistenze +- Caratteristiche e uso dei LED: come calcolare resistenze necessarie +- Uso di transistor per motori DC + + +Eventuale: saldature +-------------------- + +Guida di base alle piccole saldature: cavi intrecciato, cavi dritti, PCB. Dissaldare. + + +Approfondimenti +------------------ + +Resistenze: resistivita' in base a sezione e lunghezza: effetti su seriale e parallelo. +(Fisica) Semiconduttori: resistenze -> diodi -> transistor : cenni sul funzionamento in base ai possibili range di spostamento degli elettroni. + + +RaspberryPi +============= + +TODO: la sezione su Rpi e' al momento in sviluppo! + +- Differenze tra Rpi e Arduino +- interazione tra i due +- Quando usare Arduino o Rpi + + +Linux +======= + +Argomenti specifici per utilizzare integrare Arduino in ambiente Linux. + +- Installazione +- Leggere informazioni da seriale (redirezione INPUT, verso un file, screen), mandare informazioni (echo, cat) +- Eventuale: editor alternativi, compilazione e upload manuale (creare un make file). +- Seriale: lettura, loggin, scrittura. + + + +Sketch +----------- + +Installare sketch per Arduino. + +- http://webtechie.be/2014/05/08/scratch-and-arduino-on-linux/ +- http://s4a.cat/ + + +Materiali consigliati +======================== + +Materiali e strumenti utili per gli studenti: +- Multimetro +- Cacciavite piatto +- Nastro isolante +- Helping hand (senza lente di ingrandimento) +- Trasformatore regolabile 3-12v + + +Bibliografia +============ + +Testi consigliati, non richiesti. + + +Arduino +--------- + +- Arduino for Dummies : Come primo testo per principianti +- Programming Arduino Next Steps: Going Further with Sketches : secondo testo +- Arduino Projects for dummies : altro testo per progetti +- Beginning C for Arduino: Learn C Programming for the Arduino +- Practical Electronics for Inventors + +Elettronica +------------ + +- Electronics for Dummies : primo testo semplice introduttivo +- Electronics All-in-One For Dummies : secondo testo / piu' approfondito +- Practical Electronics for Inventors : testo piu' avanzato + +Programmazione +---------------- + +- Beginning C for Arduino: Learn C Programming for the Arduino +- The C Programming Language, 2nd Edition +- How to Think Like a Computer Scientist: Learning with Python +- Beginning Python: From Novice to Professional + +Risorse on line +---------------- + +- http://arduino.cc/en/Reference/HomePage +- http://www.ladyada.net/learn/arduino/index.html +- https://learn.adafruit.com/series/learn-arduino +- https://wiki.archlinux.org/index.php/arduino +- http://arduinoprincipiante.blogspot.it/2013/04/presentazione.html +- http://tronixstuff.com/tutorials/ +- http://arduino-info.wikispaces.com/ + + + + +Utilizzi +--------- + +- Input tramite manipolazione oggetti fisici. +- Stazioni per rilevamento dati: metereologiche, movimento. +- Attuatori per controllo numerico applicato a vari strumenti (stampanti 3D, frese , laser). +- Device per lettura di sensori da utilizzare con smartphones - computer +- Adattatore per sensori verso IoT +- Attuatore per device IoT: arduino - WiFi - rele' = accensione / spegnimento +- RFID per device domestici: smartphone in contesti diversi = diversi profili +- Interfaccia input per tutti gli scenari in cui non si puo' usare un touch screen / tastiera +- Domotica: irrigazione, controllo temperatura ambienti e acqua. +- Robotica: integrazione di apparecchiature di sorveglianza, robot domestici (aspirapolvere) e da giardino (macchine agricole unmanned in miniatura). +- Controllo droni, gyro, GPS, viewpoint. Ardupilot http://diydrones.com/notes/ArduPilot +- Prototipi per macchine di dimensioni performance superiori. + + +Progetti +---------- + +- Chorus – United Visual Artists: http://www.elmsly.com/Chorus-United-Visual-Artists +- Ardupilot http://diydrones.com/notes/ArduPilot + diff --git a/sfinge/lista.rst b/sfinge/lista.rst new file mode 100644 index 0000000..c36b825 --- /dev/null +++ b/sfinge/lista.rst @@ -0,0 +1,139 @@ +=============== +Lista materiali +=============== + + + :Author: Andrea Manni + :Version: 1.2 + + +Elenco dei materiali per corsi su Arduino per 20 studenti. Molti dei componenti vengono venduti a prezzi ridotti in quantitativi di *20x - 10x - 5x*: si consiglia quindi di cercare un'offerta per un ordine cumulativo con altri studenti, con cui dividere le spese di spedizione. Sono comunque generalmente disponibili anche singolarmente: cercare per il nome del prodotto per vedere i formati disponibili. + +Kit Completi +============= +La selezione di singoli elementi risulta piu' economica rispetto all'acquisto di kit completi e permette di evitare materiali non necessari. +I kit completi restano comunque una soluzione semplificata nel caso di acuisto singolo: + +- http://www.banggood.com/Electronics-Fans-Components-Package-Element-Parts-Kit-Set-For-Arduino-p-949423.html?bid=7532 +- http://www.banggood.com/Basic-Starter-Learning-Kit-UNO-For-Arduino-Basics-p-934217.html +- http://www.banggood.com/Arduino-Compatible-UNO-R3-Starter-Kit-Set-Upgraded-Version-With-RFID-p-908543.html + +Arduino Board +============== + +- [Numero di studenti +20%] x http://www.banggood.com/Wholesale-Arduino-Compatible-R3-UNO-ATmega16U2-AVR-USB-Board-p-68537.html Arduino con MCU ATmega328 DIP (sostituibile in caso di rottura) e cavo USB + +- http://www.banggood.com/UNO-R3-ATmega328P-Development-Board-For-Arduino-No-Cable-p-964163.html Ardiono SMD (chip non removibile) senza cavo USB (c'e' anche con cavo disponibile) + +Eventualmente un paio di nano: http://www.banggood.com/5Pcs-ATmega328P-Arduino-Compatible-Nano-V3-Improved-Version-With-USB-p-951782.html + +.. note:: potrebbero far comodo un po' di mini breadboard per le nano: http://www.banggood.com/5Pcs-Blue-170-Holes-Mini-Solderless-Prototype-Breadboard-For-Arduino-p-950717.html + + +Altre schede +-------------- +Schede differenti dalla Arduino Uno (non sono necessarie per il corso) per chi volesse provare altro. + +- Arduino Mega: http://www.banggood.com/Mega2560-R3-ATmega2560-16AU-Control-Board-With-USB-Cable-For-Arduino-p-73020.html +- Arduino nano: http://www.banggood.com/5Pcs-ATmega328P-Arduino-Compatible-Nano-V3-Improved-Version-With-USB-p-951782.html +- Arduino Yun Shield, richiede un Arduino: http://www.seeedstudio.com/depot/Yun-Shield-p-1930.html +- http://www.banggood.com/Digispark-Kickstarter-USB-Development-Board-For-ATTINY85-Arduino-p-953375.html + + +Basic: +============== + +I pacchi con centinaia di resistenze (o condensatori) sono molto economici ma contengono molti elementi raramente utilizzati. Assicurarsi di avere una scorta ulteriore di resistenza da 320 - 1k -10k ohms. + +- http://www.banggood.com/Wholesale-New-Best-selling-2500-PCS-50-values-1-or-4W-0_25W-1-pencent-Metal-Film-Resistor-Kit-p-40424.html + +- x2 http://www.banggood.com/500Pcs-3MM-LED-Diode-Kit-Mixed-Color-Red-Green-Yellow-Blue-White-p-960644.html +- http://www.banggood.com/20Pcs-RGB-LED-Diode-8mm-RedGreenBlue-4-Pin-Light-Emitting-Diode-p-962534.html + +- x2 http://www.banggood.com/100pcs-Mini-Micro-Momentary-Tactile-Tact-Switch-Push-Button-DIP-P4-p-917570.html + + +Sensors: +============== + +- http://www.banggood.com/10-Pcs-NTC-Thermistor-Temperature-Sensor-10K-OHM-MF52-103-3435-1-p-932790.html +- http://www.banggood.com/20pcs-5mm-GL5549-Photo-Light-Sensitive-Resistor-CDS-Photoresistor-p-911331.html + +Infrared: +-------------- +Questi non sono sicuri, cercare se c'e' una coppia gia' pronta o qualcosa di piu' semplice. L'idea e' di avere qualcosa di semplice per fare una connessione tipo seriale 1->1 . + +- http://www.banggood.com/10Pcs-KY-022-Infrared-IR-Transmitter-Sensor-Module-For-Arduino-p-954587.html +- http://www.banggood.com/KY-022-Infrared-IR-Sensor-Receiver-Module-For-Arduino-p-916178.html + + +Wireless: +============== + +- 2x (anche uno solo: un rx / tx per studente) http://www.banggood.com/10Pcs-433Mhz-RF-Transmitter-With-Receiver-Kit-For-Arduino-MCU-Wireless-p-951029.html + +Breadboard +============== + +- http://www.banggood.com/120pcs-20cm-Color-Breadboard-Jumper-Cable-Wire-Combination-For-Arduino-p-944970.html +- 2x http://www.banggood.com/10Pcs-8_5-x-5_5cm-White-400-Holes-Solderless-Breadboard-For-Arduino-p-951142.html +- http://www.banggood.com/400Pcs-6cm-Breadboard-Jumper-Cable-Electronic-Wires-Black-Red-Colour-p-949895.html +- 2x http://www.banggood.com/40-x-10cm-Male-To-Female-Dupont-Jumper-Wires-Calbe-2_54mm-p-89707.html + + +Non previsti i kit di ponticelli tipo: http://www.banggood.com/140pcs-U-Shape-Solderless-Breadboard-Jumper-Cable-Wire-Arduino-Shield-p-78680.html : costano relativamente molto. Eventualmente si trovano nel set + breadboard: http://www.banggood.com/140Pcs-U-Shape-Solderless-Jumper-Cable-400-Tie-Points-Breadboard-p-957991.html . + +Utili: +============== + +- http://www.banggood.com/100-Pcs-2_54mm-Dupont-Jumper-Wire-Cable-Male-Pin-Connector-Terminal-p-918553.html +- http://img.banggood.com/thumb/gallery/upload/2012/chenjianwei/SKU094628.1.jpg + + + +Vari: +============== + +- Potenziometri (AnalogRead, meglio dei trimmer!) http://www.banggood.com/5Pcs-200V-0_2W-10K-Ohm-Potentiometers-Single-Linear-p-961348.html +- diodi: http://www.banggood.com/10-Pcs-NTC-Thermistor-Temperature-Sensor-10K-OHM-MF52-103-3435-1-p-932790.html +- Transistor http://www.banggood.com/100Pcs-MOTON-3Pin-2N2222A-2N2222-Transistor-40V-300MHz-600mA-p-943227.html +- 2x http://www.banggood.com/10Pcs-5V-Electromagnetic-Active-Buzzer-Continuous-Beep-Continuously-p-943524.html +- Capacitator: http://www.banggood.com/1000pcs-50V-1pF-To-100nF-50-Value-Ceramic-Capacitor-Assorted-Set-Kit-p-922776.html + +- Trimmer (in alternativa ai potenziometri) http://www.banggood.com/20Pcs-6mm-10K-OHM-Trimpot-Trimmer-Pot-Variable-Resistor-Horizontal-p-953377.html +- Shifter http://www.banggood.com/25Pcs-SN74HC595N-74HC595-74HC595N-HC595-DIP-16-8-Bit-Shift-Register-IC-p-917428.html + +- http://www.banggood.com/4-x-3-Matrix-12-Key-Array-Membrane-Switch-Keypad-Keyboard-For-Arduino-p-87370.html +- http://www.banggood.com/FT232RL-FTDI-USB-To-TTL-Serial-Converter-Adapter-Module-For-Arduino-p-917226.html Questo potrebbe non finzionare facilmente con Windows. +- http://www.banggood.com/20Pcs-Through-Hole-DC-50V-O_5A-1P2T-SPDT-Slide-Switch-SS12F44-p-943929.html + +Eventuali +-------------- + +Accessori spesso usati in vari tutorials. + +- http://www.banggood.com/MAX7219-Dot-Matrix-MCU-LED-Display-Control-Module-Kit-For-Arduino-p-915478.html +- http://www.banggood.com/4-Bits-Digital-Tube-LED-Display-Module-Board-For-Arduino-p-931236.html + +Schede preforate +------------------ + +- http://www.banggood.com/buy/Printed-Circuit-Board-Prototype.html +- http://www.banggood.com/5Pcs-70x90mm-DIY-Soldering-Prototype-Copper-PCB-Printed-Circuit-Board-p-929776.html +- http://www.banggood.com/5Pcs-4060mm-FR-4-Double-Side-Prototype-PCB-Printed-Circuit-Board-p-962243.html + + +Display +============= + +- 2x16 NON I2C http://www.banggood.com/10-x-1602-Character-LCD-Display-Module-Blue-Blacklight-p-75047.html +- I2c 2x16 http://www.banggood.com/IIC-I2C-1602-Blue-Backlight-LCD-Display-Module-For-Arduino-p-950726.html +- Interfaccia I2C per display a 16pin: http://www.banggood.com/IIC-or-I2C-or-TWI-or-SP-Serial-Interface-Module-Port-For-5V-Arduino-1602LCD-p-80365.html +- 4x20 I2C: http://www.banggood.com/IIC-or-I2C-2004-204-20-x-4-Character-LCD-Display-Module-Yellow-Green-p-908821.html + + +Costosi ma d'effetto: +--------------------- + +- http://www.banggood.com/5Pcs-Infrared-IR-Receiver-Module-Wireless-Control-Kit-For-Arduino-p-953342.html + diff --git a/sfinge/lista.rst_old b/sfinge/lista.rst_old new file mode 100644 index 0000000..6e18383 --- /dev/null +++ b/sfinge/lista.rst_old @@ -0,0 +1,84 @@ +Lista materiali +=============== + +Stima per 20 studenti, in caso dividere quantita' proposte. +Componenti in alternativa a kit completi: +- http://www.banggood.com/Basic-Starter-Learning-Kit-UNO-For-Arduino-Basics-p-934217.html +- http://www.banggood.com/Arduino-Compatible-UNO-R3-Starter-Kit-Set-Upgraded-Version-With-RFID-p-908543.html + +Arduino Board +------------- +Si era parlato di una scheda Uno "standard": non SMD e con cavo USB: 5.91e + +- [Numero di stidenti +20%] x http://www.banggood.com/Wholesale-Arduino-Compatible-R3-UNO-ATmega16U2-AVR-USB-Board-p-68537.html + +Eventualmente un paio di nano: http://img.banggood.com/thumb/gallery/2014/xiemeijuan/10/5XSKU157951/SKU157951aa.jpg +Nota: potrebbero far comodo un po' di mini breadboard per le nano: http://www.banggood.com/5Pcs-Blue-170-Holes-Mini-Solderless-Prototype-Breadboard-For-Arduino-p-950717.html + +Basic: +------ + +- http://www.banggood.com/Wholesale-New-Best-selling-2500-PCS-50-values-1-or-4W-0_25W-1-pencent-Metal-Film-Resistor-Kit-p-40424.html + +- x2 http://www.banggood.com/500Pcs-3MM-LED-Diode-Kit-Mixed-Color-Red-Green-Yellow-Blue-White-p-960644.html +- http://www.banggood.com/20Pcs-RGB-LED-Diode-8mm-RedGreenBlue-4-Pin-Light-Emitting-Diode-p-962534.html + +- x2 http://www.banggood.com/100pcs-Mini-Micro-Momentary-Tactile-Tact-Switch-Push-Button-DIP-P4-p-917570.html + + +Sensors: +-------- + +- http://www.banggood.com/10-Pcs-NTC-Thermistor-Temperature-Sensor-10K-OHM-MF52-103-3435-1-p-932790.html +- http://www.banggood.com/20pcs-5mm-GL5549-Photo-Light-Sensitive-Resistor-CDS-Photoresistor-p-911331.html +Infrared: +- http://www.banggood.com/10Pcs-KY-022-Infrared-IR-Transmitter-Sensor-Module-For-Arduino-p-954587.html +- http://www.banggood.com/KY-022-Infrared-IR-Sensor-Receiver-Module-For-Arduino-p-916178.html + + +Wireless: +---------- + +- 2x (anche uno solo: un rx / tx per studente) http://www.banggood.com/10Pcs-433Mhz-RF-Transmitter-With-Receiver-Kit-For-Arduino-MCU-Wireless-p-951029.html +- + +Breadboard +---------- + +- http://www.banggood.com/120pcs-20cm-Color-Breadboard-Jumper-Cable-Wire-Combination-For-Arduino-p-944970.html +- 2x http://www.banggood.com/10Pcs-8_5-x-5_5cm-White-400-Holes-Solderless-Breadboard-For-Arduino-p-951142.html +- http://www.banggood.com/400Pcs-6cm-Breadboard-Jumper-Cable-Electronic-Wires-Black-Red-Colour-p-949895.html +-2x http://www.banggood.com/40-x-10cm-Male-To-Female-Dupont-Jumper-Wires-Calbe-2_54mm-p-89707.html + + + +Utili: +------ + +- http://www.banggood.com/100-Pcs-2_54mm-Dupont-Jumper-Wire-Cable-Male-Pin-Connector-Terminal-p-918553.html + + + +Vari: +------ + +- diodi: http://www.banggood.com/10-Pcs-NTC-Thermistor-Temperature-Sensor-10K-OHM-MF52-103-3435-1-p-932790.html +- Transistor http://www.banggood.com/100Pcs-MOTON-3Pin-2N2222A-2N2222-Transistor-40V-300MHz-600mA-p-943227.html +- 2x http://www.banggood.com/10Pcs-5V-Electromagnetic-Active-Buzzer-Continuous-Beep-Continuously-p-943524.html +- Capacitator: http://www.banggood.com/1000pcs-50V-1pF-To-100nF-50-Value-Ceramic-Capacitor-Assorted-Set-Kit-p-922776.html + +- Trimmer (potenziometri) http://www.banggood.com/20Pcs-6mm-10K-OHM-Trimpot-Trimmer-Pot-Variable-Resistor-Horizontal-p-953377.html +- Shifter (non saprei se usarlo, pero' costa poco...) http://www.banggood.com/25Pcs-SN74HC595N-74HC595-74HC595N-HC595-DIP-16-8-Bit-Shift-Register-IC-p-917428.html + +Costosi ma d'effetto: +--------------------- + +- http://www.banggood.com/5Pcs-Infrared-IR-Receiver-Module-Wireless-Control-Kit-For-Arduino-p-953342.html +- + +TODO +----- + +- Cercare potenziometri +- Vedere se servono altri transistor +- diff --git a/sheets/ATmega320.png b/sheets/ATmega320.png new file mode 100644 index 0000000..02ab179 Binary files /dev/null and b/sheets/ATmega320.png differ diff --git a/sheets/BC337-16_to_BC338-40.pdf b/sheets/BC337-16_to_BC338-40.pdf new file mode 100644 index 0000000..33c1b59 Binary files /dev/null and b/sheets/BC337-16_to_BC338-40.pdf differ diff --git a/sheets/LCD_2_righe b/sheets/LCD_2_righe new file mode 100644 index 0000000..64344fa --- /dev/null +++ b/sheets/LCD_2_righe @@ -0,0 +1,7 @@ + + +Ha l'alimentazione doppia all'inizio: +- http://www.mauroalfieri.it/elettronica/tutorial-lcd-acm1602b-con-arduino.html + + +Il pin 5 va a positivo diff --git a/sheets/arduino_pins_simple.png b/sheets/arduino_pins_simple.png new file mode 100644 index 0000000..6a82d14 Binary files /dev/null and b/sheets/arduino_pins_simple.png differ diff --git a/sheets/bc547b_a16_small_transistor.pdf b/sheets/bc547b_a16_small_transistor.pdf new file mode 100644 index 0000000..5c572db Binary files /dev/null and b/sheets/bc547b_a16_small_transistor.pdf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope MPU3050.rar b/sheets/gyro/GY-52 Three-axis gyroscope MPU3050.rar new file mode 100644 index 0000000..c4a92c2 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope MPU3050.rar differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/AN-MPU-30x0EVB-00_v2-0.pdf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/AN-MPU-30x0EVB-00_v2-0.pdf new file mode 100644 index 0000000..134a32a Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/AN-MPU-30x0EVB-00_v2-0.pdf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/PS-MPU-3000A.pdf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/PS-MPU-3000A.pdf new file mode 100644 index 0000000..051f369 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/PS-MPU-3000A.pdf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/RM-MPU-3000A.pdf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/RM-MPU-3000A.pdf new file mode 100644 index 0000000..f292f26 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/RM-MPU-3000A.pdf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/eb_armat91_xxaxx_b%20rev%201.2.pdf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/eb_armat91_xxaxx_b%20rev%201.2.pdf new file mode 100644 index 0000000..81a3561 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Data sheet and reference documents/eb_armat91_xxaxx_b%20rev%201.2.pdf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/51MCU-CODE/STC-MPU-3050.txt b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/51MCU-CODE/STC-MPU-3050.txt new file mode 100644 index 0000000..4a0b6d3 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/51MCU-CODE/STC-MPU-3050.txt @@ -0,0 +1,374 @@ + +//*************************************** +// GY-52 MPU3050 IIC²âÊÔ³ÌÐò +// ʹÓõ¥Æ¬»úSTC89C51 +// ¾§Õñ£º11.0592M +// ÏÔʾ£ºLCD1602 +// ±àÒë»·¾³ Keil uVision2 +// ²Î¿¼ºê¾§ÍøÕ¾24c04ͨÐųÌÐò +// ʱ¼ä£º2011Äê9ÔÂ1ÈÕ +// QQ£º531389319 +//**************************************** +#include +#include //Keil library +#include //Keil library +#include +#define uchar unsigned char +#define uint unsigned int +#define DataPort P0 //LCD1602Êý¾Ý¶Ë¿Ú +sbit SCL=P1^0; //IICʱÖÓÒý½Å¶¨Òå +sbit SDA=P1^1; //IICÊý¾ÝÒý½Å¶¨Òå +sbit LCM_RS=P2^0; //LCD1602ÃüÁî¶Ë¿Ú +sbit LCM_RW=P2^1; //LCD1602ÃüÁî¶Ë¿Ú +sbit LCM_EN=P2^2; //LCD1602ÃüÁî¶Ë¿Ú + +//¶¨ÒåMPU3050ÄÚ²¿µØÖ·******************** +#define WHO 0x00 +#define SMPL 0x15 +#define DLPF 0x16 +#define INT_C 0x17 +#define INT_S 0x1A +#define TMP_H 0x1B +#define TMP_L 0x1C +#define GX_H 0x1D +#define GX_L 0x1E +#define GY_H 0x1F +#define GY_L 0x20 +#define GZ_H 0x21 +#define GZ_L 0x22 +#define PWR_M 0x3E +//**************************** + +#define SlaveAddress 0xD0 //¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALT ADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä + +typedef unsigned char BYTE; +typedef unsigned short WORD; + +uchar dis[4]; //ÏÔʾÊý×é +BYTE BUF[8]; //½ÓÊÕÊý¾Ý»º´æÇø +int dis_data; //±äÁ¿ +int Temperature,Temp_h,Temp_l; +void delay(unsigned int k); +void InitLcd(); //³õʼ»¯lcd1602 +void InitMPU3050(); //³õʼ»¯MPU3050 + +void WriteDataLCM(uchar dataW); +void WriteCommandLCM(uchar CMD,uchar Attribc); +void DisplayOneChar(uchar X,uchar Y,uchar DData); +void DisplayListChar(uchar X,uchar Y,uchar *DData,L); + +void Single_WriteMPU3050(uchar REG_Address,uchar REG_data); //µ¥¸öдÈëÊý¾Ý +uchar Single_ReadMPU3050(uchar REG_Address); //µ¥¸ö¶ÁÈ¡ÄÚ²¿¼Ä´æÆ÷Êý¾Ý + +//****************************************Ä£ÄâIICʹÓú¯Êý +void Delay5us(); +void MPU3050_Start(); +void MPU3050_Stop(); +void MPU3050_SendACK(bit ack); +bit MPU3050_RecvACK(); +void MPU3050_SendByte(BYTE dat); +BYTE MPU3050_RecvByte(); +void MPU3050_ReadPage(); +void MPU3050_WritePage(); +//**************************************** +void display_x(); +void display_y(); +void display_z(); + +//**************************************** + +void lcd_printf(uchar *s,int temp_data) +{ + if(temp_data<0){ + temp_data=-temp_data; + *s='-'; + } + else *s=' '; + *++s =temp_data/100+0x30; + temp_data=temp_data%100; //È¡ÓàÔËËã + *++s =temp_data/10+0x30; + temp_data=temp_data%10; //È¡ÓàÔËËã + *++s =temp_data+0x30; +} + +/*******************************/ +void delay(unsigned int k) +{ +unsigned int i,j; +for(i=0;i0x2F8 JTAG>TotalIRLen = 9, IRPrint = 0x0011 >0x30 JTAG> >0x210 JTAG> >0x38 JTAG> >0xF0 JTAG> >0x80 JTAG> >0x230 JTAG> >0x200 JTAG> >0xE0 JTAG> >0xE0 JTAG>Found Cortex-M3 r1p1, Little endian. >0x80 JTAG> >0x170 JTAG> >0xE0 JTAG> >0x170 JTAG> >0xE0 JTAG>TPIU fitted. >0xE0 JTAG> >0xE0 JTAG> FPUnit: 6 code (BP) slots and 2 literal slots >0xE0 JTAG> ScanLen=9 NumDevices=2 aId[0]=0x3BA00477 aIrRead[0]=0 aScanLen[0]=0 aScanRead[0]=0 (0055ms, 0449ms total) +T0C08 000:523 JLINKARM_JTAG_GetDeviceID(DeviceIndex = 0) returns 0x3BA00477 (0000ms, 0504ms total) +T0C08 000:523 JLINKARM_JTAG_GetDeviceInfo(DeviceIndex = 0) returns 0x00 (0000ms, 0504ms total) +T0C08 000:523 JLINKARM_JTAG_GetDeviceID(DeviceIndex = 1) returns 0x16410041 (0000ms, 0504ms total) +T0C08 000:523 JLINKARM_JTAG_GetDeviceInfo(DeviceIndex = 1) returns 0x00 (0000ms, 0504ms total) +T0C08 000:523 JLINKARM_ReadMem (0xE00FF000, 0x0018 Bytes, ...) -- CPU is running >0x270 JTAG> -- Data: 03 F0 F0 FF 03 20 F0 FF 03 30 F0 FF 03 10 F0 FF ... returns 0x00 (0003ms, 0504ms total) +T0C08 000:526 JLINKARM_ReadMemU32(0xE000ED00, 0x0001 Items, ...) -- CPU is running >0x170 JTAG> -- Data: 31 C2 1F 41 returns 0x01 (0002ms, 0507ms total) +T0C08 000:528 JLINKARM_Halt() >0x170 JTAG> >0xE0 JTAG> >0xEF8 JTAG> returns 0x00 (0009ms, 0509ms total) +T0C08 000:537 JLINKARM_IsHalted() >0x110 JTAG> returns TRUE (0003ms, 0518ms total) +T0C08 000:540 JLINKARM_ReadMemU32(0xE000EDF0, 0x0001 Items, ...) >0x170 JTAG> -- Data: 03 00 03 00 returns 0x01 (0002ms, 0518ms total) +T0C08 000:542 JLINKARM_WriteU32(0xE000EDF0, 0xA05F0003) >0x170 JTAG> returns 0x00 (0002ms, 0520ms total) +T0C08 000:544 JLINKARM_WriteU32(0xE000EDFC, 0x01000000) >0x170 JTAG> returns 0x00 (0002ms, 0522ms total) +T0C08 000:546 JLINKARM_ReadMemU32(0xE0002000, 0x0001 Items, ...) >0x170 JTAG> -- Data: 60 02 00 00 returns 0x01 (0002ms, 0524ms total) +T0C08 000:548 JLINKARM_ReadMemU32(0xE0001000, 0x0001 Items, ...) >0x170 JTAG> -- Data: 00 00 00 40 returns 0x01 (0002ms, 0526ms total) + + JLINKARM_AddMirrorAreaEx(Addr = 0x00000000, Size = 0x00000000) (0000ms, 0000ms total) + JLINKARM_GetHWStatus(...) returns 0x00 (0001ms, 0528ms total) +T0C08 000:556 JLINKARM_GetNumBPUnits(Type = 0xFFFFFF00) >0x2F8 JTAG>TotalIRLen = 9, IRPrint = 0x0011 >0x30 JTAG> >0x210 JTAG> >0x38 JTAG> >0xF0 JTAG> >0x80 JTAG> >0x230 JTAG> >0x200 JTAG> >0xE0 JTAG> >0xE0 JTAG>Found Cortex-M3 r1p1, Little endian. >0x80 JTAG> >0x170 JTAG> >0xE0 JTAG> >0xE0 JTAG>TPIU fitted. >0xE0 JTAG> >0xE0 JTAG> FPUnit: 6 code (BP) slots and 2 literal slots >0xE0 JTAG> returns 0x06 (0050ms, 0529ms total) +T0C08 000:606 JLINKARM_GetNumBPUnits(Type = 0xF0) returns 0x800 (0000ms, 0579ms total) +T0C08 000:606 JLINKARM_GetNumWPUnits() returns 0x04 (0000ms, 0579ms total) +T0C08 000:608 JLINKARM_GetSpeed() returns 0x7D0 (0000ms, 0579ms total) +T0C08 000:610 JLINKARM_ReadMemU32(0xE000E004, 0x0001 Items, ...) >0x180 JTAG> -- Data: 01 00 00 00 returns 0x01 (0002ms, 0580ms total) +T0C08 000:612 JLINKARM_WriteMem(0xE0001000, 0x001C Bytes, ...) -- Data: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >0x290 JTAG> returns 0x1C (0003ms, 0582ms total) +T0C08 000:615 JLINKARM_ReadMem (0xE0001000, 0x001C Bytes, ...) >0x290 JTAG> -- Data: 01 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 ... returns 0x00 (0003ms, 0585ms total) +T0C08 000:618 JLINKARM_SetResetType(JLINKARM_RESET_TYPE_NORMAL) returns JLINKARM_RESET_TYPE_NORMAL (0000ms, 0588ms total) +T0C08 000:618 JLINKARM_Reset() >0x2F8 JTAG>TotalIRLen = 9, IRPrint = 0x0011 >0x30 JTAG> >0x210 JTAG> >0x38 JTAG> >0xF0 JTAG> >0x80 JTAG> >0x230 JTAG> >0x200 JTAG> >0xE0 JTAG> >0xE0 JTAG>Found Cortex-M3 r1p1, Little endian. >0x80 JTAG> >0x170 JTAG> >0xE0 JTAG> >0xE0 JTAG>TPIU fitted. >0xE0 JTAG> >0xE0 JTAG> FPUnit: 6 code (BP) slots and 2 literal slots >0xE0 JTAG> >0x180 JTAG> >0x170 JTAG> >0x1A0 JTAG> >0xE0 JTAG> >0xE0 JTAG> >0x170 JTAG> >0x170 JTAG> >0xE0 JTAG> >0xE0 JTAG> >0x170 JTAG> >0xE0 JTAG> + >0xEF8 JTAG> >0x110 JTAG> (0083ms, 0588ms total) +T0C08 000:701 JLINKARM_Halt() >0xE0 JTAG> returns 0x00 (0002ms, 0671ms total) +T0C08 000:703 JLINKARM_IsHalted() >0xE0 JTAG> returns TRUE (0002ms, 0673ms total) +T0C08 000:707 JLINKARM_WriteMem(0x20000000, 0x0164 Bytes, ...) -- Data: 00 BE 0A E0 0D 78 2D 06 68 40 08 24 40 00 00 D3 ... >0x11F0 JTAG> returns 0x164 (0006ms, 0673ms total) +T0C08 000:713 JLINKARM_ReadMem (0x20000000, 0x0164 Bytes, ...) >0x1340 JTAG> -- Updating C cache (384 bytes @ 0x20000000) -- Read from C cache (356 bytes @ 0x20000000) -- Data: 00 BE 0A E0 0D 78 2D 06 68 40 08 24 40 00 00 D3 ... returns 0x00 (0006ms, 0679ms total) +T0C08 000:719 JLINKARM_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 0685ms total) +T0C08 000:719 JLINKARM_WriteReg(R1, 0x007A1200) returns 0x00 (0000ms, 0685ms total) +T0C08 000:719 JLINKARM_WriteReg(R2, 0x00000001) returns 0x00 (0000ms, 0685ms total) +T0C08 000:719 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0685ms total) +T0C08 000:719 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0685ms total) +T0C08 000:719 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0685ms total) +T0C08 000:719 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0685ms total) +T0C08 000:719 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0685ms total) +T0C08 000:719 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0685ms total) +T0C08 000:719 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0001ms, 0685ms total) +T0C08 000:720 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_WriteReg(R15, 0x20000038) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0686ms total) +T0C08 000:720 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) >0x170 JTAG> returns 0x00000001 (0002ms, 0686ms total) +T0C08 000:722 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0057ms, 0688ms total) +T0C08 000:779 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0010ms, 0745ms total) +T0C08 000:789 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0745ms total) +T0C08 000:789 JLINKARM_ClrBPEx(BPHandle = 0x00000001) returns 0x00 (0000ms, 0745ms total) +T0C08 000:789 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0745ms total) +T0C08 000:794 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0001ms, 0745ms total) +T0C08 000:795 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0746ms total) +T0C08 000:795 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0746ms total) +T0C08 000:795 JLINKARM_WriteReg(R15, 0x20000020) returns 0x00 (0000ms, 0746ms total) +T0C08 000:795 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0746ms total) +T0C08 000:795 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0746ms total) +T0C08 000:795 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0746ms total) +T0C08 000:795 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0746ms total) +T0C08 000:795 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000002 (0000ms, 0746ms total) +T0C08 000:795 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0029ms, 0746ms total) +T0C08 000:824 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 0775ms total) +T0C08 000:833 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_ClrBPEx(BPHandle = 0x00000002) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_ReadReg(R0) returns 0x00000001 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(R15, 0x200000B6) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000003 (0000ms, 0775ms total) +T0C08 000:833 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0026ms, 0775ms total) +T0C08 000:859 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 0801ms total) +T0C08 000:911 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0010ms, 0801ms total) +T0C08 000:921 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0801ms total) +T0C08 000:921 JLINKARM_ClrBPEx(BPHandle = 0x00000003) returns 0x00 (0000ms, 0801ms total) +T0C08 000:921 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 0801ms total) +T0C08 000:921 JLINKARM_WriteReg(R0, 0x08000400) returns 0x00 (0000ms, 0801ms total) +T0C08 000:921 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0801ms total) +T0C08 000:921 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0801ms total) +T0C08 000:921 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0001ms, 0801ms total) +T0C08 000:922 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(R15, 0x20000020) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000004 (0000ms, 0802ms total) +T0C08 000:922 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0026ms, 0802ms total) +T0C08 000:948 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0020ms, 0828ms total) +T0C08 000:968 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_ClrBPEx(BPHandle = 0x00000004) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_ReadReg(R0) returns 0x00000001 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R0, 0x08000400) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 0828ms total) +T0C08 000:968 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0001ms, 0828ms total) +T0C08 000:969 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0829ms total) +T0C08 000:969 JLINKARM_WriteReg(R15, 0x200000B6) returns 0x00 (0000ms, 0829ms total) +T0C08 000:969 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0829ms total) +T0C08 000:969 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0829ms total) +T0C08 000:969 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0829ms total) +T0C08 000:969 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0829ms total) +T0C08 000:969 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000005 (0000ms, 0829ms total) +T0C08 000:969 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0023ms, 0829ms total) +T0C08 000:992 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 0852ms total) +T0C08 001:045 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0010ms, 0852ms total) +T0C08 001:055 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0852ms total) +T0C08 001:055 JLINKARM_ClrBPEx(BPHandle = 0x00000005) returns 0x00 (0000ms, 0852ms total) +T0C08 001:055 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R0, 0x08000800) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(R15, 0x20000020) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000006 (0000ms, 0852ms total) +T0C08 001:056 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0026ms, 0852ms total) +T0C08 001:082 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 0878ms total) +T0C08 001:091 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_ClrBPEx(BPHandle = 0x00000006) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_ReadReg(R0) returns 0x00000001 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R0, 0x08000800) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0878ms total) +T0C08 001:091 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0001ms, 0878ms total) +T0C08 001:092 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0879ms total) +T0C08 001:092 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0879ms total) +T0C08 001:092 JLINKARM_WriteReg(R15, 0x200000B6) returns 0x00 (0000ms, 0879ms total) +T0C08 001:092 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0879ms total) +T0C08 001:092 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0879ms total) +T0C08 001:092 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0879ms total) +T0C08 001:092 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0879ms total) +T0C08 001:092 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000007 (0000ms, 0879ms total) +T0C08 001:092 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0025ms, 0879ms total) +T0C08 001:117 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 0904ms total) +T0C08 001:170 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 0904ms total) +T0C08 001:179 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0904ms total) +T0C08 001:179 JLINKARM_ClrBPEx(BPHandle = 0x00000007) returns 0x00 (0000ms, 0904ms total) +T0C08 001:179 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R0, 0x08000C00) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(R15, 0x20000020) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0904ms total) +T0C08 001:180 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0001ms, 0904ms total) +T0C08 001:181 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0905ms total) +T0C08 001:181 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0905ms total) +T0C08 001:181 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000008 (0000ms, 0905ms total) +T0C08 001:181 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0026ms, 0905ms total) +T0C08 001:207 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 0931ms total) +T0C08 001:216 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_ClrBPEx(BPHandle = 0x00000008) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_ReadReg(R0) returns 0x00000001 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R0, 0x08000C00) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0931ms total) +T0C08 001:216 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0931ms total) +T0C08 001:217 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 0932ms total) +T0C08 001:217 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0932ms total) +T0C08 001:217 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0932ms total) +T0C08 001:217 JLINKARM_WriteReg(R15, 0x200000B6) returns 0x00 (0000ms, 0932ms total) +T0C08 001:217 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0932ms total) +T0C08 001:217 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0932ms total) +T0C08 001:217 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0932ms total) +T0C08 001:217 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0932ms total) +T0C08 001:217 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000009 (0000ms, 0932ms total) +T0C08 001:217 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0025ms, 0932ms total) +T0C08 001:242 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 0957ms total) +T0C08 001:295 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 0957ms total) +T0C08 001:304 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0957ms total) +T0C08 001:304 JLINKARM_ClrBPEx(BPHandle = 0x00000009) returns 0x00 (0000ms, 0957ms total) +T0C08 001:304 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R0, 0x08001000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(R15, 0x20000020) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000A (0000ms, 0957ms total) +T0C08 001:305 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0026ms, 0957ms total) +T0C08 001:331 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 0983ms total) +T0C08 001:340 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_ClrBPEx(BPHandle = 0x0000000A) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_ReadReg(R0) returns 0x00000001 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R0, 0x08001000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(R15, 0x200000B6) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 0983ms total) +T0C08 001:340 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 0983ms total) +T0C08 001:341 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000B (0000ms, 0984ms total) +T0C08 001:341 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0027ms, 0984ms total) +T0C08 001:368 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0003ms, 1011ms total) +T0C08 001:422 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1011ms total) +T0C08 001:431 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1011ms total) +T0C08 001:431 JLINKARM_ClrBPEx(BPHandle = 0x0000000B) returns 0x00 (0000ms, 1011ms total) +T0C08 001:431 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R0, 0x08001400) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(R15, 0x20000020) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000C (0000ms, 1011ms total) +T0C08 001:432 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0027ms, 1011ms total) +T0C08 001:459 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1038ms total) +T0C08 001:468 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_ClrBPEx(BPHandle = 0x0000000C) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_ReadReg(R0) returns 0x00000001 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R0, 0x08001400) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1038ms total) +T0C08 001:468 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0001ms, 1038ms total) +T0C08 001:469 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1039ms total) +T0C08 001:469 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1039ms total) +T0C08 001:469 JLINKARM_WriteReg(R15, 0x200000B6) returns 0x00 (0000ms, 1039ms total) +T0C08 001:469 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1039ms total) +T0C08 001:469 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1039ms total) +T0C08 001:469 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1039ms total) +T0C08 001:469 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1039ms total) +T0C08 001:469 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000D (0000ms, 1039ms total) +T0C08 001:469 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0026ms, 1039ms total) +T0C08 001:495 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1065ms total) +T0C08 001:548 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1065ms total) +T0C08 001:557 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1065ms total) +T0C08 001:557 JLINKARM_ClrBPEx(BPHandle = 0x0000000D) returns 0x00 (0000ms, 1065ms total) +T0C08 001:557 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R0, 0x08001800) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(R15, 0x20000020) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000E (0000ms, 1065ms total) +T0C08 001:558 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0031ms, 1065ms total) +T0C08 001:589 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0011ms, 1096ms total) +T0C08 001:600 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1096ms total) +T0C08 001:600 JLINKARM_ClrBPEx(BPHandle = 0x0000000E) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_ReadReg(R0) returns 0x00000001 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R0, 0x08001800) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(R15, 0x200000B6) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1096ms total) +T0C08 001:601 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000F (0001ms, 1096ms total) +T0C08 001:602 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0025ms, 1097ms total) +T0C08 001:627 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1122ms total) +T0C08 001:680 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1122ms total) +T0C08 001:689 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1122ms total) +T0C08 001:689 JLINKARM_ClrBPEx(BPHandle = 0x0000000F) returns 0x00 (0000ms, 1122ms total) +T0C08 001:689 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R0, 0x00000001) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(R15, 0x2000006A) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000010 (0000ms, 1122ms total) +T0C08 001:690 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0027ms, 1122ms total) +T0C08 001:717 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0011ms, 1149ms total) +T0C08 001:728 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1149ms total) +T0C08 001:728 JLINKARM_ClrBPEx(BPHandle = 0x00000010) returns 0x00 (0000ms, 1149ms total) +T0C08 001:728 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1149ms total) +T0C08 001:932 JLINKARM_WriteMem(0x20000000, 0x0164 Bytes, ...) -- Data: 00 BE 0A E0 0D 78 2D 06 68 40 08 24 40 00 00 D3 ... >0x11F0 JTAG> returns 0x164 (0006ms, 1149ms total) +T0C08 001:938 JLINKARM_ReadMem (0x20000000, 0x0164 Bytes, ...) >0x1340 JTAG> -- Updating C cache (384 bytes @ 0x20000000) -- Read from C cache (356 bytes @ 0x20000000) -- Data: 00 BE 0A E0 0D 78 2D 06 68 40 08 24 40 00 00 D3 ... returns 0x00 (0007ms, 1155ms total) +T0C08 001:945 JLINKARM_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:945 JLINKARM_WriteReg(R1, 0x007A1200) returns 0x00 (0000ms, 1162ms total) +T0C08 001:945 JLINKARM_WriteReg(R2, 0x00000002) returns 0x00 (0000ms, 1162ms total) +T0C08 001:945 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:945 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(R15, 0x20000038) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1162ms total) +T0C08 001:946 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) >0x170 JTAG> returns 0x00000011 (0001ms, 1162ms total) +T0C08 001:948 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0029ms, 1164ms total) +T0C08 001:977 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1193ms total) +T0C08 001:986 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1193ms total) +T0C08 001:986 JLINKARM_ClrBPEx(BPHandle = 0x00000011) returns 0x00 (0001ms, 1193ms total) +T0C08 001:987 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1194ms total) +T0C08 001:987 JLINKARM_WriteMem(0x20000164, 0x0400 Bytes, ...) -- Data: 00 04 00 20 53 17 00 08 45 06 00 08 47 06 00 08 ... >0x3140 JTAG> returns 0x400 (0011ms, 1194ms total) +T0C08 001:998 JLINKARM_ReadMem (0x20000164, 0x0400 Bytes, ...) >0x3440 JTAG> -- Updating C cache (1088 bytes @ 0x20000140) -- Read from C cache (1024 bytes @ 0x20000164) -- Data: 00 04 00 20 53 17 00 08 45 06 00 08 47 06 00 08 ... returns 0x00 (0012ms, 1205ms total) +T0C08 002:010 JLINKARM_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R2, 0x20000164) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(R15, 0x200000F4) returns 0x00 (0000ms, 1217ms total) +T0C08 002:010 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0001ms, 1217ms total) +T0C08 002:011 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1218ms total) +T0C08 002:011 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1218ms total) +T0C08 002:011 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1218ms total) +T0C08 002:011 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000012 (0000ms, 1218ms total) +T0C08 002:011 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0031ms, 1218ms total) +T0C08 002:043 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1249ms total) +T0C08 002:096 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1249ms total) +T0C08 002:105 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1249ms total) +T0C08 002:105 JLINKARM_ClrBPEx(BPHandle = 0x00000012) returns 0x00 (0000ms, 1249ms total) +T0C08 002:105 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1249ms total) +T0C08 002:106 JLINKARM_WriteMem(0x20000164, 0x0400 Bytes, ...) -- Data: 00 00 18 20 8D F8 03 00 03 20 8D F8 02 00 69 46 ... >0x3140 JTAG> returns 0x400 (0012ms, 1249ms total) +T0C08 002:118 JLINKARM_ReadMem (0x20000164, 0x0400 Bytes, ...) >0x3440 JTAG> -- Updating C cache (1088 bytes @ 0x20000140) -- Read from C cache (1024 bytes @ 0x20000164) -- Data: 00 00 18 20 8D F8 03 00 03 20 8D F8 02 00 69 46 ... returns 0x00 (0012ms, 1261ms total) +T0C08 002:130 JLINKARM_WriteReg(R0, 0x08000400) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R2, 0x20000164) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(R15, 0x200000F4) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1273ms total) +T0C08 002:130 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0001ms, 1273ms total) +T0C08 002:131 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000013 (0000ms, 1274ms total) +T0C08 002:131 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0028ms, 1274ms total) +T0C08 002:159 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1302ms total) +T0C08 002:212 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1302ms total) +T0C08 002:221 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1302ms total) +T0C08 002:221 JLINKARM_ClrBPEx(BPHandle = 0x00000013) returns 0x00 (0000ms, 1302ms total) +T0C08 002:221 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1302ms total) +T0C08 002:222 JLINKARM_WriteMem(0x20000164, 0x0400 Bytes, ...) -- Data: 51 60 70 47 00 21 72 4A 20 32 11 70 70 4A 82 F8 ... >0x3140 JTAG> returns 0x400 (0012ms, 1302ms total) +T0C08 002:234 JLINKARM_ReadMem (0x20000164, 0x0400 Bytes, ...) >0x3440 JTAG> -- Updating C cache (1088 bytes @ 0x20000140) -- Read from C cache (1024 bytes @ 0x20000164) -- Data: 51 60 70 47 00 21 72 4A 20 32 11 70 70 4A 82 F8 ... returns 0x00 (0012ms, 1314ms total) +T0C08 002:246 JLINKARM_WriteReg(R0, 0x08000800) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R2, 0x20000164) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(R15, 0x200000F4) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000014 (0000ms, 1326ms total) +T0C08 002:246 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0033ms, 1326ms total) +T0C08 002:279 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0001ms, 1359ms total) +T0C08 002:331 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1359ms total) +T0C08 002:340 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1359ms total) +T0C08 002:340 JLINKARM_ClrBPEx(BPHandle = 0x00000014) returns 0x00 (0000ms, 1359ms total) +T0C08 002:340 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1359ms total) +T0C08 002:340 JLINKARM_WriteMem(0x20000164, 0x0400 Bytes, ...) -- Data: 4F F6 FD 73 1A 40 82 81 70 47 02 8A 4F F6 DF 73 ... >0x3140 JTAG> returns 0x400 (0013ms, 1359ms total) +T0C08 002:353 JLINKARM_ReadMem (0x20000164, 0x0400 Bytes, ...) >0x3440 JTAG> -- Updating C cache (1088 bytes @ 0x20000140) -- Read from C cache (1024 bytes @ 0x20000164) -- Data: 4F F6 FD 73 1A 40 82 81 70 47 02 8A 4F F6 DF 73 ... returns 0x00 (0012ms, 1372ms total) +T0C08 002:365 JLINKARM_WriteReg(R0, 0x08000C00) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R2, 0x20000164) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(R15, 0x200000F4) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000015 (0000ms, 1384ms total) +T0C08 002:365 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0035ms, 1384ms total) +T0C08 002:400 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1419ms total) +T0C08 002:452 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1419ms total) +T0C08 002:461 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1419ms total) +T0C08 002:461 JLINKARM_ClrBPEx(BPHandle = 0x00000015) returns 0x00 (0000ms, 1419ms total) +T0C08 002:461 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1419ms total) +T0C08 002:462 JLINKARM_WriteMem(0x20000164, 0x0400 Bytes, ...) -- Data: AB 42 20 D1 A5 00 4F F0 0F 0C 0C FA 05 F7 BE 43 ... >0x3140 JTAG> returns 0x400 (0012ms, 1419ms total) +T0C08 002:474 JLINKARM_ReadMem (0x20000164, 0x0400 Bytes, ...) >0x3440 JTAG> -- Updating C cache (1088 bytes @ 0x20000140) -- Read from C cache (1024 bytes @ 0x20000164) -- Data: AB 42 20 D1 A5 00 4F F0 0F 0C 0C FA 05 F7 BE 43 ... returns 0x00 (0013ms, 1431ms total) +T0C08 002:487 JLINKARM_WriteReg(R0, 0x08001000) returns 0x00 (0001ms, 1444ms total) +T0C08 002:488 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R2, 0x20000164) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(R15, 0x200000F4) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000016 (0000ms, 1445ms total) +T0C08 002:488 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0040ms, 1445ms total) +T0C08 002:528 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1485ms total) +T0C08 002:580 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0011ms, 1485ms total) +T0C08 002:591 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1485ms total) +T0C08 002:591 JLINKARM_ClrBPEx(BPHandle = 0x00000016) returns 0x00 (0000ms, 1485ms total) +T0C08 002:591 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1485ms total) +T0C08 002:591 JLINKARM_WriteMem(0x20000164, 0x0400 Bytes, ...) -- Data: 10 BD 2D E9 F0 41 04 46 0D 46 04 26 00 27 0F 20 ... >0x3140 JTAG> returns 0x400 (0013ms, 1485ms total) +T0C08 002:604 JLINKARM_ReadMem (0x20000164, 0x0400 Bytes, ...) >0x3440 JTAG> -- Updating C cache (1088 bytes @ 0x20000140) -- Read from C cache (1024 bytes @ 0x20000164) -- Data: 10 BD 2D E9 F0 41 04 46 0D 46 04 26 00 27 0F 20 ... returns 0x00 (0012ms, 1498ms total) +T0C08 002:616 JLINKARM_WriteReg(R0, 0x08001400) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R2, 0x20000164) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(R15, 0x200000F4) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000017 (0000ms, 1510ms total) +T0C08 002:616 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0030ms, 1510ms total) +T0C08 002:646 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1540ms total) +T0C08 002:698 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1540ms total) +T0C08 002:707 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1540ms total) +T0C08 002:707 JLINKARM_ClrBPEx(BPHandle = 0x00000017) returns 0x00 (0000ms, 1540ms total) +T0C08 002:707 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1540ms total) +T0C08 002:707 JLINKARM_WriteMem(0x20000164, 0x0400 Bytes, ...) -- Data: 03 49 4F F0 18 00 AB BE 70 47 00 00 09 00 00 00 ... >0x3140 JTAG> returns 0x400 (0012ms, 1540ms total) +T0C08 002:719 JLINKARM_ReadMem (0x20000164, 0x0400 Bytes, ...) >0x3440 JTAG> -- Updating C cache (1088 bytes @ 0x20000140) -- Read from C cache (1024 bytes @ 0x20000164) -- Data: 03 49 4F F0 18 00 AB BE 70 47 00 00 09 00 00 00 ... returns 0x00 (0012ms, 1552ms total) +T0C08 002:731 JLINKARM_WriteReg(R0, 0x08001800) returns 0x00 (0000ms, 1564ms total) +T0C08 002:731 JLINKARM_WriteReg(R1, 0x00000054) returns 0x00 (0000ms, 1564ms total) +T0C08 002:731 JLINKARM_WriteReg(R2, 0x20000164) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(R15, 0x200000F4) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000018 (0000ms, 1564ms total) +T0C08 002:732 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0029ms, 1564ms total) +T0C08 002:761 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1593ms total) +T0C08 002:814 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0010ms, 1593ms total) +T0C08 002:824 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_ClrBPEx(BPHandle = 0x00000018) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R0, 0x00000002) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R1, 0x00000054) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R2, 0x20000164) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(R15, 0x2000006A) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000019 (0000ms, 1593ms total) +T0C08 002:824 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0029ms, 1593ms total) +T0C08 002:853 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1622ms total) +T0C08 002:862 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1622ms total) +T0C08 002:862 JLINKARM_ClrBPEx(BPHandle = 0x00000019) returns 0x00 (0000ms, 1622ms total) +T0C08 002:862 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1622ms total) +T0C08 003:066 JLINKARM_WriteMem(0x20000000, 0x0164 Bytes, ...) -- Data: 00 BE 0A E0 0D 78 2D 06 68 40 08 24 40 00 00 D3 ... >0x11F0 JTAG> returns 0x164 (0005ms, 1623ms total) +T0C08 003:071 JLINKARM_ReadMem (0x20000000, 0x0164 Bytes, ...) >0x1340 JTAG> -- Updating C cache (384 bytes @ 0x20000000) -- Read from C cache (356 bytes @ 0x20000000) -- Data: 00 BE 0A E0 0D 78 2D 06 68 40 08 24 40 00 00 D3 ... returns 0x00 (0006ms, 1628ms total) +T0C08 003:077 JLINKARM_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R1, 0x007A1200) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R2, 0x00000003) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(R15, 0x20000038) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1634ms total) +T0C08 003:077 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) >0x170 JTAG> returns 0x0000001A (0003ms, 1634ms total) +T0C08 003:080 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0028ms, 1637ms total) +T0C08 003:108 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0010ms, 1665ms total) +T0C08 003:118 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_ClrBPEx(BPHandle = 0x0000001A) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R0, 0xFFFFFFFF) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R1, 0x08000000) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R2, 0x00001854) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R3, 0x04C11DB7) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1665ms total) +T0C08 003:118 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0001ms, 1665ms total) +T0C08 003:119 JLINKARM_WriteReg(R15, 0x20000002) returns 0x00 (0000ms, 1666ms total) +T0C08 003:119 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 1666ms total) +T0C08 003:119 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1666ms total) +T0C08 003:119 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1666ms total) +T0C08 003:119 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1666ms total) +T0C08 003:119 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000001B (0000ms, 1666ms total) +T0C08 003:119 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0029ms, 1666ms total) +T0C08 003:148 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1695ms total) +T0C08 003:200 JLINKARM_IsHalted() >0xE0 JTAG> returns FALSE (0002ms, 1695ms total) +T0C08 003:253 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0010ms, 1695ms total) +T0C08 003:263 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1695ms total) +T0C08 003:263 JLINKARM_ClrBPEx(BPHandle = 0x0000001B) returns 0x00 (0000ms, 1695ms total) +T0C08 003:263 JLINKARM_ReadReg(R0) returns 0xB9A36162 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R0, 0x00000003) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R1, 0x08000000) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R2, 0x00001854) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R3, 0x04C11DB7) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R9, 0x20000160) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R13, 0x20000800) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(R15, 0x2000006A) returns 0x00 (0000ms, 1695ms total) +T0C08 003:264 JLINKARM_WriteReg(XPSR, 0x01000000) returns 0x00 (0001ms, 1695ms total) +T0C08 003:265 JLINKARM_WriteReg(MSP, 0x20000800) returns 0x00 (0000ms, 1696ms total) +T0C08 003:265 JLINKARM_WriteReg(PSP, 0x20000800) returns 0x00 (0000ms, 1696ms total) +T0C08 003:265 JLINKARM_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 1696ms total) +T0C08 003:265 JLINKARM_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000001C (0000ms, 1696ms total) +T0C08 003:265 JLINKARM_Go() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x1C0 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x110 JTAG> >0x1A0 JTAG> >0x170 JTAG> (0027ms, 1696ms total) +T0C08 003:292 JLINKARM_IsHalted() >0xE0 JTAG> >0xEF8 JTAG> >0x1A0 JTAG> returns TRUE (0009ms, 1723ms total) +T0C08 003:301 JLINKARM_ReadReg(R15) returns 0x20000000 (0000ms, 1723ms total) +T0C08 003:301 JLINKARM_ClrBPEx(BPHandle = 0x0000001C) returns 0x00 (0000ms, 1723ms total) +T0C08 003:301 JLINKARM_ReadReg(R0) returns 0x00000000 (0000ms, 1723ms total) +T0C08 003:502 JLINKARM_WriteU32(0xE000EDFC, 0x00000000) >0x170 JTAG> returns 0x00 (0003ms, 1723ms total) +T0C08 003:505 JLINKARM_SetResetType(JLINKARM_RESET_TYPE_NORMAL) returns JLINKARM_RESET_TYPE_NORMAL (0000ms, 1726ms total) +T0C08 003:505 JLINKARM_Reset() >0x2F8 JTAG>TotalIRLen = 9, IRPrint = 0x0011 >0x30 JTAG> >0x210 JTAG> >0x38 JTAG> >0xF0 JTAG> >0x80 JTAG> >0x230 JTAG> >0x200 JTAG> >0xE0 JTAG> >0xE0 JTAG>Found Cortex-M3 r1p1, Little endian. >0x80 JTAG> >0x170 JTAG> >0xE0 JTAG> >0xE0 JTAG>TPIU fitted. >0xE0 JTAG> >0xE0 JTAG> FPUnit: 6 code (BP) slots and 2 literal slots >0xE0 JTAG> >0x180 JTAG> >0x170 JTAG> >0x1A0 JTAG> >0xE0 JTAG> >0xE0 JTAG> >0x170 JTAG> >0x170 JTAG> >0xE0 JTAG> >0xE0 JTAG> >0x170 JTAG> >0xE0 JTAG> + >0xEF8 JTAG> >0x110 JTAG> (0083ms, 1726ms total) +T0C08 003:589 JLINKARM_Close() >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> >0x170 JTAG> (0066ms, 1809ms total) diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/JLinkSettings.ini b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/JLinkSettings.ini new file mode 100644 index 0000000..28de79c --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/JLinkSettings.ini @@ -0,0 +1,17 @@ +[FLASH] +SkipProgOnCRCMatch = 1 +VerifyDownload = 1 +AllowCaching = 1 +EnableFlashDL = 2 +Override = 0 +Device="ADUC7020X62" +[BREAKPOINTS] +ShowInfoWin = 1 +EnableFlashBP = 2 +BPDuringExecution = 0 +[CPU] +OverrideMemMap = 0 +AllowSimulation = 1 +ScriptFile="" +[SWO] +SWOLogFile="" diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/core_cm3.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/core_cm3.c new file mode 100644 index 0000000..ea8cb1a --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/core_cm3.c @@ -0,0 +1,829 @@ +/****************************************************************************** + * @file: core_cm3.c + * @purpose: CMSIS Cortex-M3 Core Peripheral Access Layer Source File + * @version: V1.20 + * @date: 22. May 2009 + *---------------------------------------------------------------------------- + * + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * ARM Limited (ARM) is supplying this software for use with Cortex-Mx + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + + +#include + + +/* define compiler specific symbols */ +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for armcc */ + #define __INLINE __inline /*!< inline keyword for armcc */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for iarcc */ + #define __INLINE inline /*!< inline keyword for iarcc. Only avaiable in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for gcc */ + #define __INLINE inline /*!< inline keyword for gcc */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + + + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ + +/** + * @brief Return the Process Stack Pointer + * + * @param none + * @return uint32_t ProcessStackPointer + * + * Return the actual process stack pointer + */ +__ASM uint32_t __get_PSP(void) +{ + mrs r0, psp + bx lr +} + +/** + * @brief Set the Process Stack Pointer + * + * @param uint32_t Process Stack Pointer + * @return none + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +__ASM void __set_PSP(uint32_t topOfProcStack) +{ + msr psp, r0 + bx lr +} + +/** + * @brief Return the Main Stack Pointer + * + * @param none + * @return uint32_t Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +__ASM uint32_t __get_MSP(void) +{ + mrs r0, msp + bx lr +} + +/** + * @brief Set the Main Stack Pointer + * + * @param uint32_t Main Stack Pointer + * @return none + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +__ASM void __set_MSP(uint32_t mainStackPointer) +{ + msr msp, r0 + bx lr +} + +/** + * @brief Reverse byte order in unsigned short value + * + * @param uint16_t value to reverse + * @return uint32_t reversed value + * + * Reverse byte order in unsigned short value + */ +__ASM uint32_t __REV16(uint16_t value) +{ + rev16 r0, r0 + bx lr +} + +/** + * @brief Reverse byte order in signed short value with sign extension to integer + * + * @param int16_t value to reverse + * @return int32_t reversed value + * + * Reverse byte order in signed short value with sign extension to integer + */ +__ASM int32_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} + + +#if (__ARMCC_VERSION < 400000) + +/** + * @brief Remove the exclusive lock created by ldrex + * + * @param none + * @return none + * + * Removes the exclusive lock which is created by ldrex. + */ +__ASM void __CLREX(void) +{ + clrex +} + +/** + * @brief Return the Base Priority value + * + * @param none + * @return uint32_t BasePriority + * + * Return the content of the base priority register + */ +__ASM uint32_t __get_BASEPRI(void) +{ + mrs r0, basepri + bx lr +} + +/** + * @brief Set the Base Priority value + * + * @param uint32_t BasePriority + * @return none + * + * Set the base priority register + */ +__ASM void __set_BASEPRI(uint32_t basePri) +{ + msr basepri, r0 + bx lr +} + +/** + * @brief Return the Priority Mask value + * + * @param none + * @return uint32_t PriMask + * + * Return the state of the priority mask bit from the priority mask + * register + */ +__ASM uint32_t __get_PRIMASK(void) +{ + mrs r0, primask + bx lr +} + +/** + * @brief Set the Priority Mask value + * + * @param uint32_t PriMask + * @return none + * + * Set the priority mask bit in the priority mask register + */ +__ASM void __set_PRIMASK(uint32_t priMask) +{ + msr primask, r0 + bx lr +} + +/** + * @brief Return the Fault Mask value + * + * @param none + * @return uint32_t FaultMask + * + * Return the content of the fault mask register + */ +__ASM uint32_t __get_FAULTMASK(void) +{ + mrs r0, faultmask + bx lr +} + +/** + * @brief Set the Fault Mask value + * + * @param uint32_t faultMask value + * @return none + * + * Set the fault mask register + */ +__ASM void __set_FAULTMASK(uint32_t faultMask) +{ + msr faultmask, r0 + bx lr +} + +/** + * @brief Return the Control Register value + * + * @param none + * @return uint32_t Control value + * + * Return the content of the control register + */ +__ASM uint32_t __get_CONTROL(void) +{ + mrs r0, control + bx lr +} + +/** + * @brief Set the Control Register value + * + * @param uint32_t Control value + * @return none + * + * Set the control register + */ +__ASM void __set_CONTROL(uint32_t control) +{ + msr control, r0 + bx lr +} + +#endif /* __ARMCC_VERSION */ + + +#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ +#pragma diag_suppress=Pe940 + +/** + * @brief Return the Process Stack Pointer + * + * @param none + * @return uint32_t ProcessStackPointer + * + * Return the actual process stack pointer + */ +uint32_t __get_PSP(void) +{ + __ASM("mrs r0, psp"); + __ASM("bx lr"); +} + +/** + * @brief Set the Process Stack Pointer + * + * @param uint32_t Process Stack Pointer + * @return none + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +void __set_PSP(uint32_t topOfProcStack) +{ + __ASM("msr psp, r0"); + __ASM("bx lr"); +} + +/** + * @brief Return the Main Stack Pointer + * + * @param none + * @return uint32_t Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +uint32_t __get_MSP(void) +{ + __ASM("mrs r0, msp"); + __ASM("bx lr"); +} + +/** + * @brief Set the Main Stack Pointer + * + * @param uint32_t Main Stack Pointer + * @return none + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +void __set_MSP(uint32_t topOfMainStack) +{ + __ASM("msr msp, r0"); + __ASM("bx lr"); +} + +/** + * @brief Reverse byte order in unsigned short value + * + * @param uint16_t value to reverse + * @return uint32_t reversed value + * + * Reverse byte order in unsigned short value + */ +uint32_t __REV16(uint16_t value) +{ + __ASM("rev16 r0, r0"); + __ASM("bx lr"); +} + +/** + * @brief Reverse bit order of value + * + * @param uint32_t value to reverse + * @return uint32_t reversed value + * + * Reverse bit order of value + */ +uint32_t __RBIT(uint32_t value) +{ + __ASM("rbit r0, r0"); + __ASM("bx lr"); +} + +/** + * @brief LDR Exclusive + * + * @param uint8_t* address + * @return uint8_t value of (*address) + * + * Exclusive LDR command + */ +uint8_t __LDREXB(uint8_t *addr) +{ + __ASM("ldrexb r0, [r0]"); + __ASM("bx lr"); +} + +/** + * @brief LDR Exclusive + * + * @param uint16_t* address + * @return uint16_t value of (*address) + * + * Exclusive LDR command + */ +uint16_t __LDREXH(uint16_t *addr) +{ + __ASM("ldrexh r0, [r0]"); + __ASM("bx lr"); +} + +/** + * @brief LDR Exclusive + * + * @param uint32_t* address + * @return uint32_t value of (*address) + * + * Exclusive LDR command + */ +uint32_t __LDREXW(uint32_t *addr) +{ + __ASM("ldrex r0, [r0]"); + __ASM("bx lr"); +} + +/** + * @brief STR Exclusive + * + * @param uint8_t *address + * @param uint8_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +uint32_t __STREXB(uint8_t value, uint8_t *addr) +{ + __ASM("strexb r0, r0, [r1]"); + __ASM("bx lr"); +} + +/** + * @brief STR Exclusive + * + * @param uint16_t *address + * @param uint16_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +uint32_t __STREXH(uint16_t value, uint16_t *addr) +{ + __ASM("strexh r0, r0, [r1]"); + __ASM("bx lr"); +} + +/** + * @brief STR Exclusive + * + * @param uint32_t *address + * @param uint32_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +uint32_t __STREXW(uint32_t value, uint32_t *addr) +{ + __ASM("strex r0, r0, [r1]"); + __ASM("bx lr"); +} + +#pragma diag_default=Pe940 + + +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ + +/** + * @brief Return the Process Stack Pointer + * + * @param none + * @return uint32_t ProcessStackPointer + * + * Return the actual process stack pointer + */ +uint32_t __get_PSP(void) __attribute__( ( naked ) ); +uint32_t __get_PSP(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, psp\n\t" + "MOV r0, %0 \n\t" + "BX lr \n\t" : "=r" (result) ); + return(result); +} + + +/** + * @brief Set the Process Stack Pointer + * + * @param uint32_t Process Stack Pointer + * @return none + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) ); +void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n\t" + "BX lr \n\t" : : "r" (topOfProcStack) ); +} + +/** + * @brief Return the Main Stack Pointer + * + * @param none + * @return uint32_t Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +uint32_t __get_MSP(void) __attribute__( ( naked ) ); +uint32_t __get_MSP(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, msp\n\t" + "MOV r0, %0 \n\t" + "BX lr \n\t" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Main Stack Pointer + * + * @param uint32_t Main Stack Pointer + * @return none + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) ); +void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n\t" + "BX lr \n\t" : : "r" (topOfMainStack) ); +} + +/** + * @brief Return the Base Priority value + * + * @param none + * @return uint32_t BasePriority + * + * Return the content of the base priority register + */ +uint32_t __get_BASEPRI(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Base Priority value + * + * @param uint32_t BasePriority + * @return none + * + * Set the base priority register + */ +void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) ); +} + +/** + * @brief Return the Priority Mask value + * + * @param none + * @return uint32_t PriMask + * + * Return the state of the priority mask bit from the priority mask + * register + */ +uint32_t __get_PRIMASK(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Priority Mask value + * + * @param uint32_t PriMask + * @return none + * + * Set the priority mask bit in the priority mask register + */ +void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); +} + +/** + * @brief Return the Fault Mask value + * + * @param none + * @return uint32_t FaultMask + * + * Return the content of the fault mask register + */ +uint32_t __get_FAULTMASK(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Fault Mask value + * + * @param uint32_t faultMask value + * @return none + * + * Set the fault mask register + */ +void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); +} + +/** + * @brief Reverse byte order in integer value + * + * @param uint32_t value to reverse + * @return uint32_t reversed value + * + * Reverse byte order in integer value + */ +uint32_t __REV(uint32_t value) +{ + uint32_t result=0; + + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +/** + * @brief Reverse byte order in unsigned short value + * + * @param uint16_t value to reverse + * @return uint32_t reversed value + * + * Reverse byte order in unsigned short value + */ +uint32_t __REV16(uint16_t value) +{ + uint32_t result=0; + + __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +/** + * @brief Reverse byte order in signed short value with sign extension to integer + * + * @param int32_t value to reverse + * @return int32_t reversed value + * + * Reverse byte order in signed short value with sign extension to integer + */ +int32_t __REVSH(int16_t value) +{ + uint32_t result=0; + + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +/** + * @brief Reverse bit order of value + * + * @param uint32_t value to reverse + * @return uint32_t reversed value + * + * Reverse bit order of value + */ +uint32_t __RBIT(uint32_t value) +{ + uint32_t result=0; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +/** + * @brief LDR Exclusive + * + * @param uint8_t* address + * @return uint8_t value of (*address) + * + * Exclusive LDR command + */ +uint8_t __LDREXB(uint8_t *addr) +{ + uint8_t result=0; + + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + +/** + * @brief LDR Exclusive + * + * @param uint16_t* address + * @return uint16_t value of (*address) + * + * Exclusive LDR command + */ +uint16_t __LDREXH(uint16_t *addr) +{ + uint16_t result=0; + + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + +/** + * @brief LDR Exclusive + * + * @param uint32_t* address + * @return uint32_t value of (*address) + * + * Exclusive LDR command + */ +uint32_t __LDREXW(uint32_t *addr) +{ + uint32_t result=0; + + __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + +/** + * @brief STR Exclusive + * + * @param uint8_t *address + * @param uint8_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +uint32_t __STREXB(uint8_t value, uint8_t *addr) +{ + uint32_t result=0; + + __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + +/** + * @brief STR Exclusive + * + * @param uint16_t *address + * @param uint16_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +uint32_t __STREXH(uint16_t value, uint16_t *addr) +{ + uint32_t result=0; + + __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + +/** + * @brief STR Exclusive + * + * @param uint32_t *address + * @param uint32_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +uint32_t __STREXW(uint32_t value, uint32_t *addr) +{ + uint32_t result=0; + + __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + +/** + * @brief Return the Control Register value + * + * @param none + * @return uint32_t Control value + * + * Return the content of the control register + */ +uint32_t __get_CONTROL(void) +{ + uint32_t result=0; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + +/** + * @brief Set the Control Register value + * + * @param uint32_t Control value + * @return none + * + * Set the control register + */ +void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) ); +} + +#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + + + + + + + + + + + + + + + + + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/core_cm3.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/core_cm3.h new file mode 100644 index 0000000..b6f9696 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/core_cm3.h @@ -0,0 +1,1367 @@ +/****************************************************************************** + * @file: core_cm3.h + * @purpose: CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version: V1.20 + * @date: 22. May 2009 + *---------------------------------------------------------------------------- + * + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * ARM Limited (ARM) is supplying this software for use with Cortex-Mx + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CM3_CORE_H__ +#define __CM3_CORE_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +#define __CM3_CMSIS_VERSION_MAIN (0x01) /*!< [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x03) /*!< Cortex core */ + +/** + * Lint configuration \n + * ----------------------- \n + * + * The following Lint messages will be suppressed and not shown: \n + * \n + * --- Error 10: --- \n + * register uint32_t __regBasePri __asm("basepri"); \n + * Error 10: Expecting ';' \n + * \n + * --- Error 530: --- \n + * return(__regBasePri); \n + * Warning 530: Symbol '__regBasePri' (line 264) not initialized \n + * \n + * --- Error 550: --- \n + * __regBasePri = (basePri & 0x1ff); \n + * } \n + * Warning 550: Symbol '__regBasePri' (line 271) not accessed \n + * \n + * --- Error 754: --- \n + * uint32_t RESERVED0[24]; \n + * Info 754: local structure member '' (line 109, file ./cm3_core.h) not referenced \n + * \n + * --- Error 750: --- \n + * #define __CM3_CORE_H__ \n + * Info 750: local macro '__CM3_CORE_H__' (line 43, file./cm3_core.h) not referenced \n + * \n + * --- Error 528: --- \n + * static __INLINE void NVIC_DisableIRQ(uint32_t IRQn) \n + * Warning 528: Symbol 'NVIC_DisableIRQ(unsigned int)' (line 419, file ./cm3_core.h) not referenced \n + * \n + * --- Error 751: --- \n + * } InterruptType_Type; \n + * Info 751: local typedef 'InterruptType_Type' (line 170, file ./cm3_core.h) not referenced \n + * \n + * \n + * Note: To re-enable a Message, insert a space before 'lint' * \n + * + */ + +/*lint -save */ +/*lint -e10 */ +/*lint -e530 */ +/*lint -e550 */ +/*lint -e754 */ +/*lint -e750 */ +/*lint -e528 */ +/*lint -e751 */ + + +#include /* Include standard types */ + +#if defined (__ICCARM__) + #include /* IAR Intrinsics */ +#endif + + +#ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 4 /*!< standard definition for NVIC Priority Bits */ +#endif + + + + +/** + * IO definitions + * + * define access restrictions to peripheral registers + */ + +#ifdef __cplusplus +#define __I volatile /*!< defines 'read only' permissions */ +#else +#define __I volatile const /*!< defines 'read only' permissions */ +#endif +#define __O volatile /*!< defines 'write only' permissions */ +#define __IO volatile /*!< defines 'read / write' permissions */ + + + +/******************************************************************************* + * Register Abstraction + ******************************************************************************/ + + +/* System Reset */ +#define NVIC_VECTRESET 0 /*!< Vector Reset Bit */ +#define NVIC_SYSRESETREQ 2 /*!< System Reset Request */ +#define NVIC_AIRCR_VECTKEY (0x5FA << 16) /*!< AIRCR Key for write access */ +#define NVIC_AIRCR_ENDIANESS 15 /*!< Endianess */ + +/* Core Debug */ +#define CoreDebug_DEMCR_TRCENA (1 << 24) /*!< DEMCR TRCENA enable */ +#define ITM_TCR_ITMENA 1 /*!< ITM enable */ + + + + +/* memory mapping struct for Nested Vectored Interrupt Controller (NVIC) */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Interrupt Priority Register, 8Bit wide */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Software Trigger Interrupt Register */ +} NVIC_Type; + + +/* memory mapping struct for System Control Block */ +typedef struct +{ + __I uint32_t CPUID; /*!< CPU ID Base Register */ + __IO uint32_t ICSR; /*!< Interrupt Control State Register */ + __IO uint32_t VTOR; /*!< Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Application Interrupt / Reset Control Register */ + __IO uint32_t SCR; /*!< System Control Register */ + __IO uint32_t CCR; /*!< Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Hard Fault Status Register */ + __IO uint32_t DFSR; /*!< Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Mem Manage Address Register */ + __IO uint32_t BFAR; /*!< Bus Fault Address Register */ + __IO uint32_t AFSR; /*!< Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Processor Feature Register */ + __I uint32_t DFR; /*!< Debug Feature Register */ + __I uint32_t ADR; /*!< Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< ISA Feature Register */ +} SCB_Type; + + +/* memory mapping struct for SysTick */ +typedef struct +{ + __IO uint32_t CTRL; /*!< SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< SysTick Current Value Register */ + __I uint32_t CALIB; /*!< SysTick Calibration Register */ +} SysTick_Type; + + +/* memory mapping structur for ITM */ +typedef struct +{ + __O union + { + __O uint8_t u8; /*!< ITM Stimulus Port 8-bit */ + __O uint16_t u16; /*!< ITM Stimulus Port 16-bit */ + __O uint32_t u32; /*!< ITM Stimulus Port 32-bit */ + } PORT [32]; /*!< ITM Stimulus Port Registers */ + uint32_t RESERVED0[864]; + __IO uint32_t TER; /*!< ITM Trace Enable Register */ + uint32_t RESERVED1[15]; + __IO uint32_t TPR; /*!< ITM Trace Privilege Register */ + uint32_t RESERVED2[15]; + __IO uint32_t TCR; /*!< ITM Trace Control Register */ + uint32_t RESERVED3[29]; + __IO uint32_t IWR; /*!< ITM Integration Write Register */ + __IO uint32_t IRR; /*!< ITM Integration Read Register */ + __IO uint32_t IMCR; /*!< ITM Integration Mode Control Register */ + uint32_t RESERVED4[43]; + __IO uint32_t LAR; /*!< ITM Lock Access Register */ + __IO uint32_t LSR; /*!< ITM Lock Status Register */ + uint32_t RESERVED5[6]; + __I uint32_t PID4; /*!< ITM Product ID Registers */ + __I uint32_t PID5; + __I uint32_t PID6; + __I uint32_t PID7; + __I uint32_t PID0; + __I uint32_t PID1; + __I uint32_t PID2; + __I uint32_t PID3; + __I uint32_t CID0; + __I uint32_t CID1; + __I uint32_t CID2; + __I uint32_t CID3; +} ITM_Type; + + +/* memory mapped struct for Interrupt Type */ +typedef struct +{ + uint32_t RESERVED0; + __I uint32_t ICTR; /*!< Interrupt Control Type Register */ +#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) + __IO uint32_t ACTLR; /*!< Auxiliary Control Register */ +#else + uint32_t RESERVED1; +#endif +} InterruptType_Type; + + +/* Memory Protection Unit */ +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1) +typedef struct +{ + __I uint32_t TYPE; /*!< MPU Type Register */ + __IO uint32_t CTRL; /*!< MPU Control Register */ + __IO uint32_t RNR; /*!< MPU Region RNRber Register */ + __IO uint32_t RBAR; /*!< MPU Region Base Address Register */ + __IO uint32_t RASR; /*!< MPU Region Attribute and Size Register */ + __IO uint32_t RBAR_A1; /*!< MPU Alias 1 Region Base Address Register */ + __IO uint32_t RASR_A1; /*!< MPU Alias 1 Region Attribute and Size Register */ + __IO uint32_t RBAR_A2; /*!< MPU Alias 2 Region Base Address Register */ + __IO uint32_t RASR_A2; /*!< MPU Alias 2 Region Attribute and Size Register */ + __IO uint32_t RBAR_A3; /*!< MPU Alias 3 Region Base Address Register */ + __IO uint32_t RASR_A3; /*!< MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; +#endif + + +/* Core Debug Register */ +typedef struct +{ + __IO uint32_t DHCSR; /*!< Debug Halting Control and Status Register */ + __O uint32_t DCRSR; /*!< Debug Core Register Selector Register */ + __IO uint32_t DCRDR; /*!< Debug Core Register Data Register */ + __IO uint32_t DEMCR; /*!< Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + + +/* Memory mapping of Cortex-M3 Hardware */ +#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000) /*!< ITM Base Address */ +#define CoreDebug_BASE (0xE000EDF0) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00) /*!< System Control Block Base Address */ + +#define InterruptType ((InterruptType_Type *) SCS_BASE) /*!< Interrupt Type Register */ +#define SCB ((SCB_Type *) SCB_BASE) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE) /*!< ITM configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1) + #define MPU_BASE (SCS_BASE + 0x0D90) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type*) MPU_BASE) /*!< Memory Protection Unit */ +#endif + + + +/******************************************************************************* + * Hardware Abstraction Layer + ******************************************************************************/ + + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + + +/* ################### Compiler specific Intrinsics ########################### */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#define __enable_fault_irq __enable_fiq +#define __disable_fault_irq __disable_fiq + +#define __NOP __nop +#define __WFI __wfi +#define __WFE __wfe +#define __SEV __sev +#define __ISB() __isb(0) +#define __DSB() __dsb(0) +#define __DMB() __dmb(0) +#define __REV __rev +#define __RBIT __rbit +#define __LDREXB(ptr) ((unsigned char ) __ldrex(ptr)) +#define __LDREXH(ptr) ((unsigned short) __ldrex(ptr)) +#define __LDREXW(ptr) ((unsigned int ) __ldrex(ptr)) +#define __STREXB(value, ptr) __strex(value, ptr) +#define __STREXH(value, ptr) __strex(value, ptr) +#define __STREXW(value, ptr) __strex(value, ptr) + + +/* intrinsic unsigned long long __ldrexd(volatile void *ptr) */ +/* intrinsic int __strexd(unsigned long long val, volatile void *ptr) */ +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + + +/** + * @brief Return the Process Stack Pointer + * + * @param none + * @return uint32_t ProcessStackPointer + * + * Return the actual process stack pointer + */ +extern uint32_t __get_PSP(void); + +/** + * @brief Set the Process Stack Pointer + * + * @param uint32_t Process Stack Pointer + * @return none + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +extern void __set_PSP(uint32_t topOfProcStack); + +/** + * @brief Return the Main Stack Pointer + * + * @param none + * @return uint32_t Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +extern uint32_t __get_MSP(void); + +/** + * @brief Set the Main Stack Pointer + * + * @param uint32_t Main Stack Pointer + * @return none + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +extern void __set_MSP(uint32_t topOfMainStack); + +/** + * @brief Reverse byte order in unsigned short value + * + * @param uint16_t value to reverse + * @return uint32_t reversed value + * + * Reverse byte order in unsigned short value + */ +extern uint32_t __REV16(uint16_t value); + +/* + * @brief Reverse byte order in signed short value with sign extension to integer + * + * @param int16_t value to reverse + * @return int32_t reversed value + * + * Reverse byte order in signed short value with sign extension to integer + */ +extern int32_t __REVSH(int16_t value); + + +#if (__ARMCC_VERSION < 400000) + +/** + * @brief Remove the exclusive lock created by ldrex + * + * @param none + * @return none + * + * Removes the exclusive lock which is created by ldrex. + */ +extern void __CLREX(void); + +/** + * @brief Return the Base Priority value + * + * @param none + * @return uint32_t BasePriority + * + * Return the content of the base priority register + */ +extern uint32_t __get_BASEPRI(void); + +/** + * @brief Set the Base Priority value + * + * @param uint32_t BasePriority + * @return none + * + * Set the base priority register + */ +extern void __set_BASEPRI(uint32_t basePri); + +/** + * @brief Return the Priority Mask value + * + * @param none + * @return uint32_t PriMask + * + * Return the state of the priority mask bit from the priority mask + * register + */ +extern uint32_t __get_PRIMASK(void); + +/** + * @brief Set the Priority Mask value + * + * @param uint32_t PriMask + * @return none + * + * Set the priority mask bit in the priority mask register + */ +extern void __set_PRIMASK(uint32_t priMask); + +/** + * @brief Return the Fault Mask value + * + * @param none + * @return uint32_t FaultMask + * + * Return the content of the fault mask register + */ +extern uint32_t __get_FAULTMASK(void); + +/** + * @brief Set the Fault Mask value + * + * @param uint32_t faultMask value + * @return none + * + * Set the fault mask register + */ +extern void __set_FAULTMASK(uint32_t faultMask); + +/** + * @brief Return the Control Register value + * + * @param none + * @return uint32_t Control value + * + * Return the content of the control register + */ +extern uint32_t __get_CONTROL(void); + +/** + * @brief Set the Control Register value + * + * @param uint32_t Control value + * @return none + * + * Set the control register + */ +extern void __set_CONTROL(uint32_t control); + +#else /* (__ARMCC_VERSION >= 400000) */ + + +/** + * @brief Remove the exclusive lock created by ldrex + * + * @param none + * @return none + * + * Removes the exclusive lock which is created by ldrex. + */ +#define __CLREX __clrex + +/** + * @brief Return the Base Priority value + * + * @param none + * @return uint32_t BasePriority + * + * Return the content of the base priority register + */ +static __INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + +/** + * @brief Set the Base Priority value + * + * @param uint32_t BasePriority + * @return none + * + * Set the base priority register + */ +static __INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0x1ff); +} + +/** + * @brief Return the Priority Mask value + * + * @param none + * @return uint32_t PriMask + * + * Return the state of the priority mask bit from the priority mask + * register + */ +static __INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + +/** + * @brief Set the Priority Mask value + * + * @param uint32_t PriMask + * @return none + * + * Set the priority mask bit in the priority mask register + */ +static __INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + +/** + * @brief Return the Fault Mask value + * + * @param none + * @return uint32_t FaultMask + * + * Return the content of the fault mask register + */ +static __INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + +/** + * @brief Set the Fault Mask value + * + * @param uint32_t faultMask value + * @return none + * + * Set the fault mask register + */ +static __INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & 1); +} + +/** + * @brief Return the Control Register value + * + * @param none + * @return uint32_t Control value + * + * Return the content of the control register + */ +static __INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + +/** + * @brief Set the Control Register value + * + * @param uint32_t Control value + * @return none + * + * Set the control register + */ +static __INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + +#endif /* __ARMCC_VERSION */ + + + +#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#define __enable_irq __enable_interrupt /*!< global Interrupt enable */ +#define __disable_irq __disable_interrupt /*!< global Interrupt disable */ + +static __INLINE void __enable_fault_irq() { __ASM ("cpsie f"); } +static __INLINE void __disable_fault_irq() { __ASM ("cpsid f"); } + +#define __NOP __no_operation() /*!< no operation intrinsic in IAR Compiler */ +static __INLINE void __WFI() { __ASM ("wfi"); } +static __INLINE void __WFE() { __ASM ("wfe"); } +static __INLINE void __SEV() { __ASM ("sev"); } +static __INLINE void __CLREX() { __ASM ("clrex"); } + +/* intrinsic void __ISB(void) */ +/* intrinsic void __DSB(void) */ +/* intrinsic void __DMB(void) */ +/* intrinsic void __set_PRIMASK(); */ +/* intrinsic void __get_PRIMASK(); */ +/* intrinsic void __set_FAULTMASK(); */ +/* intrinsic void __get_FAULTMASK(); */ +/* intrinsic uint32_t __REV(uint32_t value); */ +/* intrinsic uint32_t __REVSH(uint32_t value); */ +/* intrinsic unsigned long __STREX(unsigned long, unsigned long); */ +/* intrinsic unsigned long __LDREX(unsigned long *); */ + + +/** + * @brief Return the Process Stack Pointer + * + * @param none + * @return uint32_t ProcessStackPointer + * + * Return the actual process stack pointer + */ +extern uint32_t __get_PSP(void); + +/** + * @brief Set the Process Stack Pointer + * + * @param uint32_t Process Stack Pointer + * @return none + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +extern void __set_PSP(uint32_t topOfProcStack); + +/** + * @brief Return the Main Stack Pointer + * + * @param none + * @return uint32_t Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +extern uint32_t __get_MSP(void); + +/** + * @brief Set the Main Stack Pointer + * + * @param uint32_t Main Stack Pointer + * @return none + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +extern void __set_MSP(uint32_t topOfMainStack); + +/** + * @brief Reverse byte order in unsigned short value + * + * @param uint16_t value to reverse + * @return uint32_t reversed value + * + * Reverse byte order in unsigned short value + */ +extern uint32_t __REV16(uint16_t value); + +/** + * @brief Reverse bit order of value + * + * @param uint32_t value to reverse + * @return uint32_t reversed value + * + * Reverse bit order of value + */ +extern uint32_t __RBIT(uint32_t value); + +/** + * @brief LDR Exclusive + * + * @param uint8_t* address + * @return uint8_t value of (*address) + * + * Exclusive LDR command + */ +extern uint8_t __LDREXB(uint8_t *addr); + +/** + * @brief LDR Exclusive + * + * @param uint16_t* address + * @return uint16_t value of (*address) + * + * Exclusive LDR command + */ +extern uint16_t __LDREXH(uint16_t *addr); + +/** + * @brief LDR Exclusive + * + * @param uint32_t* address + * @return uint32_t value of (*address) + * + * Exclusive LDR command + */ +extern uint32_t __LDREXW(uint32_t *addr); + +/** + * @brief STR Exclusive + * + * @param uint8_t *address + * @param uint8_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +extern uint32_t __STREXB(uint8_t value, uint8_t *addr); + +/** + * @brief STR Exclusive + * + * @param uint16_t *address + * @param uint16_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +extern uint32_t __STREXH(uint16_t value, uint16_t *addr); + +/** + * @brief STR Exclusive + * + * @param uint32_t *address + * @param uint32_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +extern uint32_t __STREXW(uint32_t value, uint32_t *addr); + + + +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +static __INLINE void __enable_irq() { __ASM volatile ("cpsie i"); } +static __INLINE void __disable_irq() { __ASM volatile ("cpsid i"); } + +static __INLINE void __enable_fault_irq() { __ASM volatile ("cpsie f"); } +static __INLINE void __disable_fault_irq() { __ASM volatile ("cpsid f"); } + +static __INLINE void __NOP() { __ASM volatile ("nop"); } +static __INLINE void __WFI() { __ASM volatile ("wfi"); } +static __INLINE void __WFE() { __ASM volatile ("wfe"); } +static __INLINE void __SEV() { __ASM volatile ("sev"); } +static __INLINE void __ISB() { __ASM volatile ("isb"); } +static __INLINE void __DSB() { __ASM volatile ("dsb"); } +static __INLINE void __DMB() { __ASM volatile ("dmb"); } +static __INLINE void __CLREX() { __ASM volatile ("clrex"); } + + +/** + * @brief Return the Process Stack Pointer + * + * @param none + * @return uint32_t ProcessStackPointer + * + * Return the actual process stack pointer + */ +extern uint32_t __get_PSP(void); + +/** + * @brief Set the Process Stack Pointer + * + * @param uint32_t Process Stack Pointer + * @return none + * + * Assign the value ProcessStackPointer to the MSP + * (process stack pointer) Cortex processor register + */ +extern void __set_PSP(uint32_t topOfProcStack); + +/** + * @brief Return the Main Stack Pointer + * + * @param none + * @return uint32_t Main Stack Pointer + * + * Return the current value of the MSP (main stack pointer) + * Cortex processor register + */ +extern uint32_t __get_MSP(void); + +/** + * @brief Set the Main Stack Pointer + * + * @param uint32_t Main Stack Pointer + * @return none + * + * Assign the value mainStackPointer to the MSP + * (main stack pointer) Cortex processor register + */ +extern void __set_MSP(uint32_t topOfMainStack); + +/** + * @brief Return the Base Priority value + * + * @param none + * @return uint32_t BasePriority + * + * Return the content of the base priority register + */ +extern uint32_t __get_BASEPRI(void); + +/** + * @brief Set the Base Priority value + * + * @param uint32_t BasePriority + * @return none + * + * Set the base priority register + */ +extern void __set_BASEPRI(uint32_t basePri); + +/** + * @brief Return the Priority Mask value + * + * @param none + * @return uint32_t PriMask + * + * Return the state of the priority mask bit from the priority mask + * register + */ +extern uint32_t __get_PRIMASK(void); + +/** + * @brief Set the Priority Mask value + * + * @param uint32_t PriMask + * @return none + * + * Set the priority mask bit in the priority mask register + */ +extern void __set_PRIMASK(uint32_t priMask); + +/** + * @brief Return the Fault Mask value + * + * @param none + * @return uint32_t FaultMask + * + * Return the content of the fault mask register + */ +extern uint32_t __get_FAULTMASK(void); + +/** + * @brief Set the Fault Mask value + * + * @param uint32_t faultMask value + * @return none + * + * Set the fault mask register + */ +extern void __set_FAULTMASK(uint32_t faultMask); + +/** + * @brief Return the Control Register value +* +* @param none +* @return uint32_t Control value + * + * Return the content of the control register + */ +extern uint32_t __get_CONTROL(void); + +/** + * @brief Set the Control Register value + * + * @param uint32_t Control value + * @return none + * + * Set the control register + */ +extern void __set_CONTROL(uint32_t control); + +/** + * @brief Reverse byte order in integer value + * + * @param uint32_t value to reverse + * @return uint32_t reversed value + * + * Reverse byte order in integer value + */ +extern uint32_t __REV(uint32_t value); + +/** + * @brief Reverse byte order in unsigned short value + * + * @param uint16_t value to reverse + * @return uint32_t reversed value + * + * Reverse byte order in unsigned short value + */ +extern uint32_t __REV16(uint16_t value); + +/* + * Reverse byte order in signed short value with sign extension to integer + * + * @param int16_t value to reverse + * @return int32_t reversed value + * + * @brief Reverse byte order in signed short value with sign extension to integer + */ +extern int32_t __REVSH(int16_t value); + +/** + * @brief Reverse bit order of value + * + * @param uint32_t value to reverse + * @return uint32_t reversed value + * + * Reverse bit order of value + */ +extern uint32_t __RBIT(uint32_t value); + +/** + * @brief LDR Exclusive + * + * @param uint8_t* address + * @return uint8_t value of (*address) + * + * Exclusive LDR command + */ +extern uint8_t __LDREXB(uint8_t *addr); + +/** + * @brief LDR Exclusive + * + * @param uint16_t* address + * @return uint16_t value of (*address) + * + * Exclusive LDR command + */ +extern uint16_t __LDREXH(uint16_t *addr); + +/** + * @brief LDR Exclusive + * + * @param uint32_t* address + * @return uint32_t value of (*address) + * + * Exclusive LDR command + */ +extern uint32_t __LDREXW(uint32_t *addr); + +/** + * @brief STR Exclusive + * + * @param uint8_t *address + * @param uint8_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +extern uint32_t __STREXB(uint8_t value, uint8_t *addr); + +/** + * @brief STR Exclusive + * + * @param uint16_t *address + * @param uint16_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +extern uint32_t __STREXH(uint16_t value, uint16_t *addr); + +/** + * @brief STR Exclusive + * + * @param uint32_t *address + * @param uint32_t value to store + * @return uint32_t successful / failed + * + * Exclusive STR command + */ +extern uint32_t __STREXW(uint32_t value, uint32_t *addr); + + +#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + + + +/* ########################## NVIC functions #################################### */ + + +/** + * @brief Set the Priority Grouping in NVIC Interrupt Controller + * + * @param uint32_t priority_grouping is priority grouping field + * @return none + * + * Set the priority grouping field using the required unlock sequence. + * The parameter priority_grouping is assigned to the field + * SCB->AIRCR [10:8] PRIGROUP field. Only values from 0..7 are used. + * In case of a conflict between priority grouping and available + * priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + */ +static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((0xFFFFU << 16) | (0x0F << 8)); /* clear bits to change */ + reg_value = ((reg_value | NVIC_AIRCR_VECTKEY | (PriorityGroupTmp << 8))); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + +/** + * @brief Get the Priority Grouping from NVIC Interrupt Controller + * + * @param none + * @return uint32_t priority grouping field + * + * Get the priority grouping from NVIC Interrupt Controller. + * priority grouping is SCB->AIRCR [10:8] PRIGROUP field. + */ +static __INLINE uint32_t NVIC_GetPriorityGrouping(void) +{ + return ((SCB->AIRCR >> 8) & 0x07); /* read priority grouping field */ +} + +/** + * @brief Enable Interrupt in NVIC Interrupt Controller + * + * @param IRQn_Type IRQn specifies the interrupt number + * @return none + * + * Enable a device specific interupt in the NVIC interrupt controller. + * The interrupt number cannot be a negative value. + */ +static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +} + +/** + * @brief Disable the interrupt line for external interrupt specified + * + * @param IRQn_Type IRQn is the positive number of the external interrupt + * @return none + * + * Disable a device specific interupt in the NVIC interrupt controller. + * The interrupt number cannot be a negative value. + */ +static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ +} + +/** + * @brief Read the interrupt pending bit for a device specific interrupt source + * + * @param IRQn_Type IRQn is the number of the device specifc interrupt + * @return uint32_t 1 if pending interrupt else 0 + * + * Read the pending register in NVIC and return 1 if its status is pending, + * otherwise it returns 0 + */ +static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ +} + +/** + * @brief Set the pending bit for an external interrupt + * + * @param IRQn_Type IRQn is the Number of the interrupt + * @return none + * + * Set the pending bit for the specified interrupt. + * The interrupt number cannot be a negative value. + */ +static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ +} + +/** + * @brief Clear the pending bit for an external interrupt + * + * @param IRQn_Type IRQn is the Number of the interrupt + * @return none + * + * Clear the pending bit for the specified interrupt. + * The interrupt number cannot be a negative value. + */ +static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + +/** + * @brief Read the active bit for an external interrupt + * + * @param IRQn_Type IRQn is the Number of the interrupt + * @return uint32_t 1 if active else 0 + * + * Read the active register in NVIC and returns 1 if its status is active, + * otherwise it returns 0. + */ +static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ +} + +/** + * @brief Set the priority for an interrupt + * + * @param IRQn_Type IRQn is the Number of the interrupt + * @param priority is the priority for the interrupt + * @return none + * + * Set the priority for the specified interrupt. The interrupt + * number can be positive to specify an external (device specific) + * interrupt, or negative to specify an internal (core) interrupt. \n + * + * Note: The priority cannot be set for every core interrupt. + */ +static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */ + else { + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ +} + +/** + * @brief Read the priority for an interrupt + * + * @param IRQn_Type IRQn is the Number of the interrupt + * @return uint32_t priority is the priority for the interrupt + * + * Read the priority for the specified interrupt. The interrupt + * number can be positive to specify an external (device specific) + * interrupt, or negative to specify an internal (core) interrupt. + * + * The returned priority value is automatically aligned to the implemented + * priority bits of the microcontroller. + * + * Note: The priority cannot be set for every core interrupt. + */ +static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M3 system interrupts */ + else { + return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** + * @brief Encode the priority for an interrupt + * + * @param uint32_t PriorityGroup is the used priority group + * @param uint32_t PreemptPriority is the preemptive priority value (starting from 0) + * @param uint32_t SubPriority is the sub priority value (starting from 0) + * @return uint32_t the priority for the interrupt + * + * Encode the priority for an interrupt with the given priority group, + * preemptive priority value and sub priority value. + * In case of a conflict between priority grouping and available + * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + * + * The returned priority value can be used for NVIC_SetPriority(...) function + */ +static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + return ( + ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | + ((SubPriority & ((1 << (SubPriorityBits )) - 1))) + ); +} + + +/** + * @brief Decode the priority of an interrupt + * + * @param uint32_t Priority the priority for the interrupt + * @param uint32_t PrioGroup is the used priority group + * @param uint32_t* pPreemptPrio is the preemptive priority value (starting from 0) + * @param uint32_t* pSubPrio is the sub priority value (starting from 0) + * @return none + * + * Decode an interrupt priority value with the given priority group to + * preemptive priority value and sub priority value. + * In case of a conflict between priority grouping and available + * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + * + * The priority value can be retrieved with NVIC_GetPriority(...) function + */ +static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); + *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); +} + + + +/* ################################## SysTick function ############################################ */ + +#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0) + +/* SysTick constants */ +#define SYSTICK_ENABLE 0 /* Config-Bit to start or stop the SysTick Timer */ +#define SYSTICK_TICKINT 1 /* Config-Bit to enable or disable the SysTick interrupt */ +#define SYSTICK_CLKSOURCE 2 /* Clocksource has the offset 2 in SysTick Control and Status Register */ +#define SYSTICK_MAXCOUNT ((1<<24) -1) /* SysTick MaxCount */ + +/** + * @brief Initialize and start the SysTick counter and its interrupt. + * + * @param uint32_t ticks is the number of ticks between two interrupts + * @return none + * + * Initialise the system tick timer and its interrupt and start the + * system tick timer / counter in free running mode to generate + * periodical interrupts. + */ +static __INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if (ticks > SYSTICK_MAXCOUNT) return (1); /* Reload value impossible */ + + SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ + SysTick->VAL = (0x00); /* Load the SysTick Counter Value */ + SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<AIRCR = (NVIC_AIRCR_VECTKEY | (SCB->AIRCR & (0x700)) | (1<DEMCR & CoreDebug_DEMCR_TRCENA) && + (ITM->TCR & ITM_TCR_ITMENA) && + (ITM->TER & (1UL << 0)) ) + { + while (ITM->PORT[0].u32 == 0); + ITM->PORT[0].u8 = (uint8_t) ch; + } + return (ch); +} + +#ifdef __cplusplus +} +#endif + +#endif /* __CM3_CORE_H__ */ + +/*lint -restore */ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_cl.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_cl.s new file mode 100644 index 0000000..28c8775 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_cl.s @@ -0,0 +1,364 @@ +;******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_cl.s +;* Author : MCD Application Team +;* Version : V3.1.2 +;* Date : 09/28/2009 +;* Description : STM32F10x Connectivity line devices vector table for RVMDK +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 and ADC2 + DCD CAN1_TX_IRQHandler ; CAN1 TX + DCD CAN1_RX0_IRQHandler ; CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C1 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC alarm through EXTI line + DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5 + DCD ETH_IRQHandler ; Ethernet + DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line + DCD CAN2_TX_IRQHandler ; CAN2 TX + DCD CAN2_RX0_IRQHandler ; CAN2 RX0 + DCD CAN2_RX1_IRQHandler ; CAN2 RX1 + DCD CAN2_SCE_IRQHandler ; CAN2 SCE + DCD OTG_FS_IRQHandler ; USB OTG FS +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT CAN1_TX_IRQHandler [WEAK] + EXPORT CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT OTG_FS_WKUP_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT TIM6_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT ETH_IRQHandler [WEAK] + EXPORT ETH_WKUP_IRQHandler [WEAK] + EXPORT CAN2_TX_IRQHandler [WEAK] + EXPORT CAN2_RX0_IRQHandler [WEAK] + EXPORT CAN2_RX1_IRQHandler [WEAK] + EXPORT CAN2_SCE_IRQHandler [WEAK] + EXPORT OTG_FS_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +CAN1_TX_IRQHandler +CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +OTG_FS_WKUP_IRQHandler +TIM5_IRQHandler +SPI3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +TIM6_IRQHandler +TIM7_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +ETH_IRQHandler +ETH_WKUP_IRQHandler +CAN2_TX_IRQHandler +CAN2_RX0_IRQHandler +CAN2_RX1_IRQHandler +CAN2_SCE_IRQHandler +OTG_FS_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE***** diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_hd.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_hd.s new file mode 100644 index 0000000..e7f99e2 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_hd.s @@ -0,0 +1,370 @@ +;******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_hd.s +;* Author : MCD Application Team +;* Version : V3.1.2 +;* Date : 09/28/2009 +;* Description : STM32F10x High Density Devices vector table for RVMDK +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Configure external SRAM mounted on STM3210E-EVAL board +;* to be used as data memory (optional, to be enabled by user) +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + +__initial_spTop EQU 0x20000400 ; stack used for SystemInit_ExtMemCtl + ; always internal RAM used + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_spTop ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + DCD TIM8_BRK_IRQHandler ; TIM8 Break + DCD TIM8_UP_IRQHandler ; TIM8 Update + DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation + DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare + DCD ADC3_IRQHandler ; ADC3 + DCD FSMC_IRQHandler ; FSMC + DCD SDIO_IRQHandler ; SDIO + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Dummy SystemInit_ExtMemCtl function +SystemInit_ExtMemCtl PROC + EXPORT SystemInit_ExtMemCtl [WEAK] + BX LR + ENDP + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + + LDR R0, = SystemInit_ExtMemCtl ; initialize external memory controller + BLX R0 + + LDR R1, = __initial_sp ; restore original stack pointer + MSR MSP, R1 + + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBWakeUp_IRQHandler [WEAK] + EXPORT TIM8_BRK_IRQHandler [WEAK] + EXPORT TIM8_UP_IRQHandler [WEAK] + EXPORT TIM8_TRG_COM_IRQHandler [WEAK] + EXPORT TIM8_CC_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT FSMC_IRQHandler [WEAK] + EXPORT SDIO_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT TIM6_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_5_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USB_HP_CAN1_TX_IRQHandler +USB_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +USBWakeUp_IRQHandler +TIM8_BRK_IRQHandler +TIM8_UP_IRQHandler +TIM8_TRG_COM_IRQHandler +TIM8_CC_IRQHandler +ADC3_IRQHandler +FSMC_IRQHandler +SDIO_IRQHandler +TIM5_IRQHandler +SPI3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +TIM6_IRQHandler +TIM7_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_5_IRQHandler + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE***** diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_ld.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_ld.s new file mode 100644 index 0000000..5c89784 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_ld.s @@ -0,0 +1,293 @@ +;******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_ld.s +;* Author : MCD Application Team +;* Version : V3.1.2 +;* Date : 09/28/2009 +;* Description : STM32F10x Low Density Devices vector table for RVMDK +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1_2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD 0 ; Reserved + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SPI1_IRQHandler ; SPI1 + DCD 0 ; Reserved + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD 0 ; Reserved + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBWakeUp_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USB_HP_CAN1_TX_IRQHandler +USB_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +SPI1_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +USBWakeUp_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE***** diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_md.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_md.s new file mode 100644 index 0000000..753cfe9 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/arm/startup_stm32f10x_md.s @@ -0,0 +1,303 @@ +;******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_md.s +;* Author : MCD Application Team +;* Version : V3.1.2 +;* Date : 09/28/2009 +;* Description : STM32F10x Medium Density Devices vector table for RVMDK +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1_2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_IRQHandler [WEAK] + EXPORT TIM1_UP_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBWakeUp_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USB_HP_CAN1_TX_IRQHandler +USB_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_IRQHandler +TIM1_UP_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTCAlarm_IRQHandler +USBWakeUp_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE***** diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_cl.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_cl.s new file mode 100644 index 0000000..621bf51 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_cl.s @@ -0,0 +1,464 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_cl.s + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief STM32F10x Connectivity line Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR + * address. + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ******************************************************************************* + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss + +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler + +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word CAN1_TX_IRQHandler + .word CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word OTG_FS_WKUP_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word ETH_IRQHandler + .word ETH_WKUP_IRQHandler + .word CAN2_TX_IRQHandler + .word CAN2_RX0_IRQHandler + .word CAN2_RX1_IRQHandler + .word CAN2_SCE_IRQHandler + .word OTG_FS_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x Connectivity line Devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler ,Default_Handler + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_hd.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_hd.s new file mode 100644 index 0000000..78c10c3 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_hd.s @@ -0,0 +1,483 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_hd.s + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief STM32F10x High Density Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address, + * - Configure external SRAM mounted on STM3210E-EVAL board + * to be used as data memory (optional, to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global SystemInit_ExtMemCtl_Dummy +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +.equ Initial_spTop, 0x20000400 +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is + required, then adjust the Register Addresses */ + bl SystemInit_ExtMemCtl +/* restore original stack pointer */ + LDR r0, =_estack + MSR msp, r0 +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief Dummy SystemInit_ExtMemCtl function + * @param None + * @retval : None +*/ + .section .text.SystemInit_ExtMemCtl_Dummy,"ax",%progbits +SystemInit_ExtMemCtl_Dummy: + bx lr + .size SystemInit_ExtMemCtl_Dummy, .-SystemInit_ExtMemCtl_Dummy + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word Initial_spTop + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word TIM8_BRK_IRQHandler + .word TIM8_UP_IRQHandler + .word TIM8_TRG_COM_IRQHandler + .word TIM8_CC_IRQHandler + .word ADC3_IRQHandler + .word FSMC_IRQHandler + .word SDIO_IRQHandler + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_5_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x1E0. This is for boot in RAM mode for + STM32F10x High Density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + + .weak TIM8_BRK_IRQHandler + .thumb_set TIM8_BRK_IRQHandler,Default_Handler + + .weak TIM8_UP_IRQHandler + .thumb_set TIM8_UP_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_IRQHandler + .thumb_set TIM8_TRG_COM_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_5_IRQHandler + .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler + + .weak SystemInit_ExtMemCtl + .thumb_set SystemInit_ExtMemCtl,SystemInit_ExtMemCtl_Dummy + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_ld.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_ld.s new file mode 100644 index 0000000..373f94c --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_ld.s @@ -0,0 +1,339 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_ld.s + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief STM32F10x Low Density Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address. + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + 0 + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + 0 + 0 + .word SPI1_IRQHandler + 0 + .word USART1_IRQHandler + .word USART2_IRQHandler + 0 + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32F10x Low Density devices.*/ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_md.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_md.s new file mode 100644 index 0000000..fef9978 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/gcc/startup_stm32f10x_md.s @@ -0,0 +1,355 @@ +/** + ****************************************************************************** + * @file startup_stm32f10x_md.s + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief STM32F10x Medium Density Devices vector table for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ******************************************************************************* + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTCAlarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32F10x Medium Density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_cl.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_cl.s new file mode 100644 index 0000000..42c5fd9 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_cl.s @@ -0,0 +1,498 @@ +;/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_cl.s +;* Author : MCD Application Team +;* Version : V3.1.2 +;* Date : 09/28/2009 +;* Description : STM32F10x Connectivity line devices vector table for +;* EWARM5.x toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;*******************************************************************************/ +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD __iar_program_start + + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 and ADC2 + DCD CAN1_TX_IRQHandler ; CAN1 TX + DCD CAN1_RX0_IRQHandler ; CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C1 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC alarm through EXTI line + DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5 + DCD ETH_IRQHandler ; Ethernet + DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line + DCD CAN2_TX_IRQHandler ; CAN2 TX + DCD CAN2_RX0_IRQHandler ; CAN2 RX0 + DCD CAN2_RX1_IRQHandler ; CAN2 RX1 + DCD CAN2_SCE_IRQHandler ; CAN2 SCE + DCD OTG_FS_IRQHandler ; USB OTG FS + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_TX_IRQHandler + B CAN1_TX_IRQHandler + + PUBWEAK CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX0_IRQHandler + B CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_IRQHandler + B TIM1_BRK_IRQHandler + + PUBWEAK TIM1_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_IRQHandler + B TIM1_UP_IRQHandler + + PUBWEAK TIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_IRQHandler + B TIM1_TRG_COM_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK OTG_FS_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +OTG_FS_WKUP_IRQHandler + B OTG_FS_WKUP_IRQHandler + + PUBWEAK TIM5_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM5_IRQHandler + B TIM5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK UART5_IRQHandler + SECTION .text:CODE:REORDER(1) +UART5_IRQHandler + B UART5_IRQHandler + + PUBWEAK TIM6_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_IRQHandler + B TIM6_IRQHandler + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + PUBWEAK DMA2_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + PUBWEAK ETH_IRQHandler + SECTION .text:CODE:REORDER(1) +ETH_IRQHandler + B ETH_IRQHandler + + PUBWEAK ETH_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +ETH_WKUP_IRQHandler + B ETH_WKUP_IRQHandler + + PUBWEAK CAN2_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN2_TX_IRQHandler + B CAN2_TX_IRQHandler + + PUBWEAK CAN2_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN2_RX0_IRQHandler + B CAN2_RX0_IRQHandler + + PUBWEAK CAN2_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN2_RX1_IRQHandler + B CAN2_RX1_IRQHandler + + PUBWEAK CAN2_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN2_SCE_IRQHandler + B CAN2_SCE_IRQHandler + + PUBWEAK OTG_FS_IRQHandler + SECTION .text:CODE:REORDER(1) +OTG_FS_IRQHandler + B OTG_FS_IRQHandler + + END +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_hd.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_hd.s new file mode 100644 index 0000000..5882cd5 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_hd.s @@ -0,0 +1,510 @@ +;/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_hd.s +;* Author : MCD Application Team +;* Version : V3.1.2 +;* Date : 09/28/2009 +;* Description : STM32F10x High Density Devices vector table for EWARM5.x +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR address, +;* - Configure external SRAM mounted on STM3210E-EVAL board +;* to be used as data memory (optional, to be enabled by user) +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;*******************************************************************************/ +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; ICODE is the same segment as cstartup. By placing __low_level_init + ;; in the same segment, we make sure it can be reached with BL. */ + + SECTION CSTACK:DATA:NOROOT(3) + SECTION .icode:CODE:NOROOT(2) + PUBLIC __low_level_init + + PUBWEAK SystemInit_ExtMemCtl + SECTION .text:CODE:REORDER(2) + THUMB +SystemInit_ExtMemCtl + BX LR + +__low_level_init: + + ;; Initialize hardware. + LDR R0, = SystemInit_ExtMemCtl ; initialize external memory controller + MOV R11, LR + BLX R0 + LDR R1, =sfe(CSTACK) ; restore original stack pointer + MSR MSP, R1 + MOV R0,#1 + ;; Return with BX to be independent of mode of caller + BX R11 + + ;; Forward declaration of sections. + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + PUBLIC __vector_table + + DATA +__intial_sp EQU 0x20000400 +__vector_table + DCD __intial_sp + DCD __iar_program_start + + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + DCD TIM8_BRK_IRQHandler ; TIM8 Break + DCD TIM8_UP_IRQHandler ; TIM8 Update + DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation + DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare + DCD ADC3_IRQHandler ; ADC3 + DCD FSMC_IRQHandler ; FSMC + DCD SDIO_IRQHandler ; SDIO + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USB_HP_CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_CAN1_TX_IRQHandler + B USB_HP_CAN1_TX_IRQHandler + + PUBWEAK USB_LP_CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_CAN1_RX0_IRQHandler + B USB_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_IRQHandler + B TIM1_BRK_IRQHandler + + PUBWEAK TIM1_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_IRQHandler + B TIM1_UP_IRQHandler + + PUBWEAK TIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_IRQHandler + B TIM1_TRG_COM_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBWakeUp_IRQHandler + SECTION .text:CODE:REORDER(1) +USBWakeUp_IRQHandler + B USBWakeUp_IRQHandler + + PUBWEAK TIM8_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_BRK_IRQHandler + B TIM8_BRK_IRQHandler + + PUBWEAK TIM8_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_UP_IRQHandler + B TIM8_UP_IRQHandler + + PUBWEAK TIM8_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_TRG_COM_IRQHandler + B TIM8_TRG_COM_IRQHandler + + PUBWEAK TIM8_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM8_CC_IRQHandler + B TIM8_CC_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK FSMC_IRQHandler + SECTION .text:CODE:REORDER(1) +FSMC_IRQHandler + B FSMC_IRQHandler + + PUBWEAK SDIO_IRQHandler + SECTION .text:CODE:REORDER(1) +SDIO_IRQHandler + B SDIO_IRQHandler + + PUBWEAK TIM5_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM5_IRQHandler + B TIM5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK UART5_IRQHandler + SECTION .text:CODE:REORDER(1) +UART5_IRQHandler + B UART5_IRQHandler + + PUBWEAK TIM6_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_IRQHandler + B TIM6_IRQHandler + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + PUBWEAK DMA2_Channel4_5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel4_5_IRQHandler + B DMA2_Channel4_5_IRQHandler + + + END + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_ld.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_ld.s new file mode 100644 index 0000000..13046d8 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_ld.s @@ -0,0 +1,357 @@ +;/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_ld.s +;* Author : MCD Application Team +;* Version : V3.1.2 +;* Date : 09/28/2009 +;* Description : STM32F10x Low Density Devices vector table for EWARM5.x +;* toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;*******************************************************************************/ +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD __iar_program_start + + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD 0 ; Reserved + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SPI1_IRQHandler ; SPI1 + DCD 0 ; Reserved + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD 0 ; Reserved + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USB_HP_CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_CAN1_TX_IRQHandler + B USB_HP_CAN1_TX_IRQHandler + + PUBWEAK USB_LP_CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_CAN1_RX0_IRQHandler + B USB_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_IRQHandler + B TIM1_BRK_IRQHandler + + PUBWEAK TIM1_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_IRQHandler + B TIM1_UP_IRQHandler + + PUBWEAK TIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_IRQHandler + B TIM1_TRG_COM_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBWakeUp_IRQHandler + SECTION .text:CODE:REORDER(1) +USBWakeUp_IRQHandler + B USBWakeUp_IRQHandler + + END +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_md.s b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_md.s new file mode 100644 index 0000000..e28a3ba --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/startup/iar/startup_stm32f10x_md.s @@ -0,0 +1,382 @@ +;/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** +;* File Name : startup_stm32f10x_md.s +;* Author : MCD Application Team +;* Version : V3.1.2 +;* Date : 09/28/2009 +;* Description : STM32F10x Medium Density Devices vector table for +;* EWARM5.x toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS +;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. +;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +;*******************************************************************************/ +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD __iar_program_start + + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX + DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD TIM1_BRK_IRQHandler ; TIM1 Break + DCD TIM1_UP_IRQHandler ; TIM1 Update + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USB_HP_CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_CAN1_TX_IRQHandler + B USB_HP_CAN1_TX_IRQHandler + + PUBWEAK USB_LP_CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_CAN1_RX0_IRQHandler + B USB_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK TIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_BRK_IRQHandler + B TIM1_BRK_IRQHandler + + PUBWEAK TIM1_UP_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_UP_IRQHandler + B TIM1_UP_IRQHandler + + PUBWEAK TIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_TRG_COM_IRQHandler + B TIM1_TRG_COM_IRQHandler + + PUBWEAK TIM1_CC_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM1_CC_IRQHandler + B TIM1_CC_IRQHandler + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBWakeUp_IRQHandler + SECTION .text:CODE:REORDER(1) +USBWakeUp_IRQHandler + B USBWakeUp_IRQHandler + + END +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/stm32f10x.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/stm32f10x.h new file mode 100644 index 0000000..5ddeba2 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/stm32f10x.h @@ -0,0 +1,7851 @@ +/** + ****************************************************************************** + * @file stm32f10x.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * This file contains all the peripheral register's definitions, bits + * definitions and memory mapping for STM32F10x Connectivity line, High + * density, Medium density and Low density devices. + ****************************************************************************** + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f10x + * @{ + */ + +#ifndef __STM32F10x_H +#define __STM32F10x_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup Library_configuration_section + * @{ + */ + +/* Uncomment the line below according to the target STM32 device used in your + application + */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_MD) && !defined (STM32F10X_HD) && !defined (STM32F10X_CL) + /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */ + /*#define STM32F10X_MD !< STM32F10X_MD: STM32 Medium density devices */ + #define STM32F10X_HD /*!< STM32F10X_HD: STM32 High density devices*/ + /*#define STM32F10X_CL !< STM32F10X_CL: STM32 Connectivity line devices */ +#endif +/* Tip: To avoid modifying this file each time you need to switch between these + devices, you can define the device in your toolchain compiler preprocessor. + + - Low density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 16 and 32 Kbytes. + - Medium density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 64 and 128 Kbytes. + - High density devices are STM32F101xx and STM32F103xx microcontrollers where + the Flash memory density ranges between 256 and 512 Kbytes. + - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers. + */ + +#if !defined USE_STDPERIPH_DRIVER +/** + * @brief Comment the line below if you will not use the peripherals drivers. + In this case, these drivers will not be included and the application code will + be based on direct access to peripherals registers + */ + #define USE_STDPERIPH_DRIVER +#endif + +/** + * @brief In the following line adjust the value of External High Speed oscillator (HSE) + used in your application + + Tip: To avoid modifying this file each time you need to use different HSE, you + can define the HSE value in your toolchain compiler preprocessor. + */ +#if !defined HSE_Value + #ifdef STM32F10X_CL + #define HSE_Value ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ + #else + #define HSE_Value ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ + #endif /* STM32F10X_CL */ +#endif /* HSE_Value */ + + +/** + * @brief In the following line adjust the External High Speed oscillator (HSE) Startup + Timeout value + */ +#define HSEStartUp_TimeOut ((uint16_t)0x0500) /*!< Time out for HSE start up */ + +#define HSI_Value ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ + +/** + * @brief STM32F10x Standard Peripheral Library version number + */ +#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:16] STM32F10x Standard Peripheral Library main version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x01) /*!< [15:8] STM32F10x Standard Peripheral Library sub1 version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x02) /*!< [7:0] STM32F10x Standard Peripheral Library sub2 version */ +#define __STM32F10X_STDPERIPH_VERSION ((__STM32F10X_STDPERIPH_VERSION_MAIN << 16)\ + | (__STM32F10X_STDPERIPH_VERSION_SUB1 << 8)\ + | __STM32F10X_STDPERIPH_VERSION_SUB2) + +/** + * @} + */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#define __MPU_PRESENT 0 /*!< STM32 does not provide an MPU */ +#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + +/** + * @brief STM32F10x Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** STM32 specific Interrupt Numbers *********************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMPER_IRQn = 2, /*!< Tamper Interrupt */ + RTC_IRQn = 3, /*!< RTC global Interrupt */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + +#ifdef STM32F10X_LD + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_LD */ + +#ifdef STM32F10X_MD + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_MD */ + +#ifdef STM32F10X_HD + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ + TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */ + TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ +#endif /* STM32F10X_HD */ + +#ifdef STM32F10X_CL + CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67 /*!< USB OTG FS global Interrupt */ +#endif /* STM32F10X_CL */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f10x.h" +#include + +/** @addtogroup Exported_types + * @{ + */ + +/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef const int32_t sc32; /*!< Read Only */ +typedef const int16_t sc16; /*!< Read Only */ +typedef const int8_t sc8; /*!< Read Only */ + +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef __I int32_t vsc32; /*!< Read Only */ +typedef __I int16_t vsc16; /*!< Read Only */ +typedef __I int8_t vsc8; /*!< Read Only */ + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef const uint32_t uc32; /*!< Read Only */ +typedef const uint16_t uc16; /*!< Read Only */ +typedef const uint8_t uc8; /*!< Read Only */ + +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef __I uint32_t vuc32; /*!< Read Only */ +typedef __I uint16_t vuc16; /*!< Read Only */ +typedef __I uint8_t vuc8; /*!< Read Only */ + +#ifndef __cplusplus +typedef enum {FALSE = 0, TRUE = !FALSE} bool; +#endif + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; + +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; +#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) + +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; + +/** + * @} + */ + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t SMPR1; + __IO uint32_t SMPR2; + __IO uint32_t JOFR1; + __IO uint32_t JOFR2; + __IO uint32_t JOFR3; + __IO uint32_t JOFR4; + __IO uint32_t HTR; + __IO uint32_t LTR; + __IO uint32_t SQR1; + __IO uint32_t SQR2; + __IO uint32_t SQR3; + __IO uint32_t JSQR; + __IO uint32_t JDR1; + __IO uint32_t JDR2; + __IO uint32_t JDR3; + __IO uint32_t JDR4; + __IO uint32_t DR; +} ADC_TypeDef; + +/** + * @brief Backup Registers + */ + +typedef struct +{ + uint32_t RESERVED0; + __IO uint16_t DR1; + uint16_t RESERVED1; + __IO uint16_t DR2; + uint16_t RESERVED2; + __IO uint16_t DR3; + uint16_t RESERVED3; + __IO uint16_t DR4; + uint16_t RESERVED4; + __IO uint16_t DR5; + uint16_t RESERVED5; + __IO uint16_t DR6; + uint16_t RESERVED6; + __IO uint16_t DR7; + uint16_t RESERVED7; + __IO uint16_t DR8; + uint16_t RESERVED8; + __IO uint16_t DR9; + uint16_t RESERVED9; + __IO uint16_t DR10; + uint16_t RESERVED10; + __IO uint16_t RTCCR; + uint16_t RESERVED11; + __IO uint16_t CR; + uint16_t RESERVED12; + __IO uint16_t CSR; + uint16_t RESERVED13[5]; + __IO uint16_t DR11; + uint16_t RESERVED14; + __IO uint16_t DR12; + uint16_t RESERVED15; + __IO uint16_t DR13; + uint16_t RESERVED16; + __IO uint16_t DR14; + uint16_t RESERVED17; + __IO uint16_t DR15; + uint16_t RESERVED18; + __IO uint16_t DR16; + uint16_t RESERVED19; + __IO uint16_t DR17; + uint16_t RESERVED20; + __IO uint16_t DR18; + uint16_t RESERVED21; + __IO uint16_t DR19; + uint16_t RESERVED22; + __IO uint16_t DR20; + uint16_t RESERVED23; + __IO uint16_t DR21; + uint16_t RESERVED24; + __IO uint16_t DR22; + uint16_t RESERVED25; + __IO uint16_t DR23; + uint16_t RESERVED26; + __IO uint16_t DR24; + uint16_t RESERVED27; + __IO uint16_t DR25; + uint16_t RESERVED28; + __IO uint16_t DR26; + uint16_t RESERVED29; + __IO uint16_t DR27; + uint16_t RESERVED30; + __IO uint16_t DR28; + uint16_t RESERVED31; + __IO uint16_t DR29; + uint16_t RESERVED32; + __IO uint16_t DR30; + uint16_t RESERVED33; + __IO uint16_t DR31; + uint16_t RESERVED34; + __IO uint16_t DR32; + uint16_t RESERVED35; + __IO uint16_t DR33; + uint16_t RESERVED36; + __IO uint16_t DR34; + uint16_t RESERVED37; + __IO uint16_t DR35; + uint16_t RESERVED38; + __IO uint16_t DR36; + uint16_t RESERVED39; + __IO uint16_t DR37; + uint16_t RESERVED40; + __IO uint16_t DR38; + uint16_t RESERVED41; + __IO uint16_t DR39; + uint16_t RESERVED42; + __IO uint16_t DR40; + uint16_t RESERVED43; + __IO uint16_t DR41; + uint16_t RESERVED44; + __IO uint16_t DR42; + uint16_t RESERVED45; +} BKP_TypeDef; + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; + __IO uint32_t TDTR; + __IO uint32_t TDLR; + __IO uint32_t TDHR; +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; + __IO uint32_t RDTR; + __IO uint32_t RDLR; + __IO uint32_t RDHR; +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; + __IO uint32_t FR2; +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; + __IO uint32_t MSR; + __IO uint32_t TSR; + __IO uint32_t RF0R; + __IO uint32_t RF1R; + __IO uint32_t IER; + __IO uint32_t ESR; + __IO uint32_t BTR; + uint32_t RESERVED0[88]; + CAN_TxMailBox_TypeDef sTxMailBox[3]; + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; + uint32_t RESERVED1[12]; + __IO uint32_t FMR; + __IO uint32_t FM1R; + uint32_t RESERVED2; + __IO uint32_t FS1R; + uint32_t RESERVED3; + __IO uint32_t FFA1R; + uint32_t RESERVED4; + __IO uint32_t FA1R; + uint32_t RESERVED5[8]; +#ifndef STM32F10X_CL + CAN_FilterRegister_TypeDef sFilterRegister[14]; +#else + CAN_FilterRegister_TypeDef sFilterRegister[28]; +#endif /* STM32F10X_CL */ +} CAN_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; + __IO uint8_t IDR; + uint8_t RESERVED0; + uint16_t RESERVED1; + __IO uint32_t CR; +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t SWTRIGR; + __IO uint32_t DHR12R1; + __IO uint32_t DHR12L1; + __IO uint32_t DHR8R1; + __IO uint32_t DHR12R2; + __IO uint32_t DHR12L2; + __IO uint32_t DHR8R2; + __IO uint32_t DHR12RD; + __IO uint32_t DHR12LD; + __IO uint32_t DHR8RD; + __IO uint32_t DOR1; + __IO uint32_t DOR2; +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; + __IO uint32_t CR; +}DBGMCU_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CCR; + __IO uint32_t CNDTR; + __IO uint32_t CPAR; + __IO uint32_t CMAR; +} DMA_Channel_TypeDef; + +typedef struct +{ + __IO uint32_t ISR; + __IO uint32_t IFCR; +} DMA_TypeDef; + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1[2]; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + uint32_t RESERVED8[567]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + uint32_t RESERVED9[9]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; + __IO uint32_t EMR; + __IO uint32_t RTSR; + __IO uint32_t FTSR; + __IO uint32_t SWIER; + __IO uint32_t PR; +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; + __IO uint32_t KEYR; + __IO uint32_t OPTKEYR; + __IO uint32_t SR; + __IO uint32_t CR; + __IO uint32_t AR; + __IO uint32_t RESERVED; + __IO uint32_t OBR; + __IO uint32_t WRPR; +} FLASH_TypeDef; + +/** + * @brief Option Bytes Registers + */ + +typedef struct +{ + __IO uint16_t RDP; + __IO uint16_t USER; + __IO uint16_t Data0; + __IO uint16_t Data1; + __IO uint16_t WRP0; + __IO uint16_t WRP1; + __IO uint16_t WRP2; + __IO uint16_t WRP3; +} OB_TypeDef; + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; + __IO uint32_t SR2; + __IO uint32_t PMEM2; + __IO uint32_t PATT2; + uint32_t RESERVED0; + __IO uint32_t ECCR2; +} FSMC_Bank2_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank3 + */ + +typedef struct +{ + __IO uint32_t PCR3; + __IO uint32_t SR3; + __IO uint32_t PMEM3; + __IO uint32_t PATT3; + uint32_t RESERVED0; + __IO uint32_t ECCR3; +} FSMC_Bank3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; + __IO uint32_t SR4; + __IO uint32_t PMEM4; + __IO uint32_t PATT4; + __IO uint32_t PIO4; +} FSMC_Bank4_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t CRL; + __IO uint32_t CRH; + __IO uint32_t IDR; + __IO uint32_t ODR; + __IO uint32_t BSRR; + __IO uint32_t BRR; + __IO uint32_t LCKR; +} GPIO_TypeDef; + +/** + * @brief Alternate Function I/O + */ + +typedef struct +{ + __IO uint32_t EVCR; + __IO uint32_t MAPR; + __IO uint32_t EXTICR[4]; +} AFIO_TypeDef; +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t OAR1; + uint16_t RESERVED2; + __IO uint16_t OAR2; + uint16_t RESERVED3; + __IO uint16_t DR; + uint16_t RESERVED4; + __IO uint16_t SR1; + uint16_t RESERVED5; + __IO uint16_t SR2; + uint16_t RESERVED6; + __IO uint16_t CCR; + uint16_t RESERVED7; + __IO uint16_t TRISE; + uint16_t RESERVED8; +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; + __IO uint32_t PR; + __IO uint32_t RLR; + __IO uint32_t SR; +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CSR; +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFGR; + __IO uint32_t CIR; + __IO uint32_t APB2RSTR; + __IO uint32_t APB1RSTR; + __IO uint32_t AHBENR; + __IO uint32_t APB2ENR; + __IO uint32_t APB1ENR; + __IO uint32_t BDCR; + __IO uint32_t CSR; +#ifdef STM32F10X_CL + __IO uint32_t AHBRSTR; + __IO uint32_t CFGR2; +#endif /* STM32F10X_CL */ +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint16_t CRH; + uint16_t RESERVED0; + __IO uint16_t CRL; + uint16_t RESERVED1; + __IO uint16_t PRLH; + uint16_t RESERVED2; + __IO uint16_t PRLL; + uint16_t RESERVED3; + __IO uint16_t DIVH; + uint16_t RESERVED4; + __IO uint16_t DIVL; + uint16_t RESERVED5; + __IO uint16_t CNTH; + uint16_t RESERVED6; + __IO uint16_t CNTL; + uint16_t RESERVED7; + __IO uint16_t ALRH; + uint16_t RESERVED8; + __IO uint16_t ALRL; + uint16_t RESERVED9; +} RTC_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; + __IO uint32_t CLKCR; + __IO uint32_t ARG; + __IO uint32_t CMD; + __I uint32_t RESPCMD; + __I uint32_t RESP1; + __I uint32_t RESP2; + __I uint32_t RESP3; + __I uint32_t RESP4; + __IO uint32_t DTIMER; + __IO uint32_t DLEN; + __IO uint32_t DCTRL; + __I uint32_t DCOUNT; + __I uint32_t STA; + __IO uint32_t ICR; + __IO uint32_t MASK; + uint32_t RESERVED0[2]; + __I uint32_t FIFOCNT; + uint32_t RESERVED1[13]; + __IO uint32_t FIFO; +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SR; + uint16_t RESERVED2; + __IO uint16_t DR; + uint16_t RESERVED3; + __IO uint16_t CRCPR; + uint16_t RESERVED4; + __IO uint16_t RXCRCR; + uint16_t RESERVED5; + __IO uint16_t TXCRCR; + uint16_t RESERVED6; + __IO uint16_t I2SCFGR; + uint16_t RESERVED7; + __IO uint16_t I2SPR; + uint16_t RESERVED8; +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SMCR; + uint16_t RESERVED2; + __IO uint16_t DIER; + uint16_t RESERVED3; + __IO uint16_t SR; + uint16_t RESERVED4; + __IO uint16_t EGR; + uint16_t RESERVED5; + __IO uint16_t CCMR1; + uint16_t RESERVED6; + __IO uint16_t CCMR2; + uint16_t RESERVED7; + __IO uint16_t CCER; + uint16_t RESERVED8; + __IO uint16_t CNT; + uint16_t RESERVED9; + __IO uint16_t PSC; + uint16_t RESERVED10; + __IO uint16_t ARR; + uint16_t RESERVED11; + __IO uint16_t RCR; + uint16_t RESERVED12; + __IO uint16_t CCR1; + uint16_t RESERVED13; + __IO uint16_t CCR2; + uint16_t RESERVED14; + __IO uint16_t CCR3; + uint16_t RESERVED15; + __IO uint16_t CCR4; + uint16_t RESERVED16; + __IO uint16_t BDTR; + uint16_t RESERVED17; + __IO uint16_t DCR; + uint16_t RESERVED18; + __IO uint16_t DMAR; + uint16_t RESERVED19; +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint16_t SR; + uint16_t RESERVED0; + __IO uint16_t DR; + uint16_t RESERVED1; + __IO uint16_t BRR; + uint16_t RESERVED2; + __IO uint16_t CR1; + uint16_t RESERVED3; + __IO uint16_t CR2; + uint16_t RESERVED4; + __IO uint16_t CR3; + uint16_t RESERVED5; + __IO uint16_t GTPR; + uint16_t RESERVED6; +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFR; + __IO uint32_t SR; +} WWDG_TypeDef; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ + +#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the alias region */ +#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the alias region */ + +#define SRAM_BASE ((uint32_t)0x20000000) /*!< Peripheral base address in the bit-band region */ +#define PERIPH_BASE ((uint32_t)0x40000000) /*!< SRAM base address in the bit-band region */ + +#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) +#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) +#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define TIM8_BASE (APB2PERIPH_BASE + 0x3400) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) +#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00) + +#define SDIO_BASE (PERIPH_BASE + 0x18000) + +#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) +#define DMA2_BASE (AHBPERIPH_BASE + 0x0400) +#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408) +#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C) +#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430) +#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444) +#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458) +#define RCC_BASE (AHBPERIPH_BASE + 0x1000) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) + +#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */ +#define OB_BASE ((uint32_t)0x1FFFF800) /*!< Flash Option Bytes base address */ + +#define ETH_BASE (AHBPERIPH_BASE + 0x8000) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100) +#define ETH_PTP_BASE (ETH_BASE + 0x0700) +#define ETH_DMA_BASE (ETH_BASE + 0x1000) + +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) /*!< FSMC Bank1 registers base address */ +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) /*!< FSMC Bank1E registers base address */ +#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) /*!< FSMC Bank2 registers base address */ +#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) /*!< FSMC Bank3 registers base address */ +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) /*!< FSMC Bank4 registers base address */ + +#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ + +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define BKP ((BKP_TypeDef *) BKP_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) +#define AFIO ((AFIO_TypeDef *) AFIO_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) +#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE) +#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE) +#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE) +#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE) +#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define OB ((OB_TypeDef *) OB_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) +#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* CRC calculation unit */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for CRC_DR register *********************/ +#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ + + +/******************* Bit definition for CRC_IDR register ********************/ +#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ + + +/******************** Bit definition for CRC_CR register ********************/ +#define CRC_CR_RESET ((uint8_t)0x01) /*!< RESET bit */ + +/******************************************************************************/ +/* */ +/* Power Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for PWR_CR register ********************/ +#define PWR_CR_LPDS ((uint16_t)0x0001) /*!< Low-Power Deepsleep */ +#define PWR_CR_PDDS ((uint16_t)0x0002) /*!< Power Down Deepsleep */ +#define PWR_CR_CWUF ((uint16_t)0x0004) /*!< Clear Wakeup Flag */ +#define PWR_CR_CSBF ((uint16_t)0x0008) /*!< Clear Standby Flag */ +#define PWR_CR_PVDE ((uint16_t)0x0010) /*!< Power Voltage Detector Enable */ + +#define PWR_CR_PLS ((uint16_t)0x00E0) /*!< PLS[2:0] bits (PVD Level Selection) */ +#define PWR_CR_PLS_0 ((uint16_t)0x0020) /*!< Bit 0 */ +#define PWR_CR_PLS_1 ((uint16_t)0x0040) /*!< Bit 1 */ +#define PWR_CR_PLS_2 ((uint16_t)0x0080) /*!< Bit 2 */ + +/*!< PVD level configuration */ +#define PWR_CR_PLS_2V2 ((uint16_t)0x0000) /*!< PVD level 2.2V */ +#define PWR_CR_PLS_2V3 ((uint16_t)0x0020) /*!< PVD level 2.3V */ +#define PWR_CR_PLS_2V4 ((uint16_t)0x0040) /*!< PVD level 2.4V */ +#define PWR_CR_PLS_2V5 ((uint16_t)0x0060) /*!< PVD level 2.5V */ +#define PWR_CR_PLS_2V6 ((uint16_t)0x0080) /*!< PVD level 2.6V */ +#define PWR_CR_PLS_2V7 ((uint16_t)0x00A0) /*!< PVD level 2.7V */ +#define PWR_CR_PLS_2V8 ((uint16_t)0x00C0) /*!< PVD level 2.8V */ +#define PWR_CR_PLS_2V9 ((uint16_t)0x00E0) /*!< PVD level 2.9V */ + +#define PWR_CR_DBP ((uint16_t)0x0100) /*!< Disable Backup Domain write protection */ + + +/******************* Bit definition for PWR_CSR register ********************/ +#define PWR_CSR_WUF ((uint16_t)0x0001) /*!< Wakeup Flag */ +#define PWR_CSR_SBF ((uint16_t)0x0002) /*!< Standby Flag */ +#define PWR_CSR_PVDO ((uint16_t)0x0004) /*!< PVD Output */ +#define PWR_CSR_EWUP ((uint16_t)0x0100) /*!< Enable WKUP pin */ + +/******************************************************************************/ +/* */ +/* Backup registers */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for BKP_DR1 register ********************/ +#define BKP_DR1_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR2 register ********************/ +#define BKP_DR2_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR3 register ********************/ +#define BKP_DR3_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR4 register ********************/ +#define BKP_DR4_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR5 register ********************/ +#define BKP_DR5_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR6 register ********************/ +#define BKP_DR6_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR7 register ********************/ +#define BKP_DR7_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR8 register ********************/ +#define BKP_DR8_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR9 register ********************/ +#define BKP_DR9_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR10 register *******************/ +#define BKP_DR10_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR11 register *******************/ +#define BKP_DR11_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR12 register *******************/ +#define BKP_DR12_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR13 register *******************/ +#define BKP_DR13_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR14 register *******************/ +#define BKP_DR14_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR15 register *******************/ +#define BKP_DR15_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR16 register *******************/ +#define BKP_DR16_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR17 register *******************/ +#define BKP_DR17_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_DR18 register ********************/ +#define BKP_DR18_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR19 register *******************/ +#define BKP_DR19_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR20 register *******************/ +#define BKP_DR20_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR21 register *******************/ +#define BKP_DR21_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR22 register *******************/ +#define BKP_DR22_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR23 register *******************/ +#define BKP_DR23_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR24 register *******************/ +#define BKP_DR24_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR25 register *******************/ +#define BKP_DR25_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR26 register *******************/ +#define BKP_DR26_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR27 register *******************/ +#define BKP_DR27_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR28 register *******************/ +#define BKP_DR28_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR29 register *******************/ +#define BKP_DR29_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR30 register *******************/ +#define BKP_DR30_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR31 register *******************/ +#define BKP_DR31_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR32 register *******************/ +#define BKP_DR32_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR33 register *******************/ +#define BKP_DR33_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR34 register *******************/ +#define BKP_DR34_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR35 register *******************/ +#define BKP_DR35_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR36 register *******************/ +#define BKP_DR36_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR37 register *******************/ +#define BKP_DR37_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR38 register *******************/ +#define BKP_DR38_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR39 register *******************/ +#define BKP_DR39_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR40 register *******************/ +#define BKP_DR40_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR41 register *******************/ +#define BKP_DR41_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR42 register *******************/ +#define BKP_DR42_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_RTCCR register *******************/ +#define BKP_RTCCR_CAL ((uint16_t)0x007F) /*!< Calibration value */ +#define BKP_RTCCR_CCO ((uint16_t)0x0080) /*!< Calibration Clock Output */ +#define BKP_RTCCR_ASOE ((uint16_t)0x0100) /*!< Alarm or Second Output Enable */ +#define BKP_RTCCR_ASOS ((uint16_t)0x0200) /*!< Alarm or Second Output Selection */ + +/******************** Bit definition for BKP_CR register ********************/ +#define BKP_CR_TPE ((uint8_t)0x01) /*!< TAMPER pin enable */ +#define BKP_CR_TPAL ((uint8_t)0x02) /*!< TAMPER pin active level */ + +/******************* Bit definition for BKP_CSR register ********************/ +#define BKP_CSR_CTE ((uint16_t)0x0001) /*!< Clear Tamper event */ +#define BKP_CSR_CTI ((uint16_t)0x0002) /*!< Clear Tamper Interrupt */ +#define BKP_CSR_TPIE ((uint16_t)0x0004) /*!< TAMPER Pin interrupt enable */ +#define BKP_CSR_TEF ((uint16_t)0x0100) /*!< Tamper Event Flag */ +#define BKP_CSR_TIF ((uint16_t)0x0200) /*!< Tamper Interrupt Flag */ + +/******************************************************************************/ +/* */ +/* Reset and Clock Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for RCC_CR register ********************/ +#define RCC_CR_HSION ((uint32_t)0x00000001) /*!< Internal High Speed clock enable */ +#define RCC_CR_HSIRDY ((uint32_t)0x00000002) /*!< Internal High Speed clock ready flag */ +#define RCC_CR_HSITRIM ((uint32_t)0x000000F8) /*!< Internal High Speed clock trimming */ +#define RCC_CR_HSICAL ((uint32_t)0x0000FF00) /*!< Internal High Speed clock Calibration */ +#define RCC_CR_HSEON ((uint32_t)0x00010000) /*!< External High Speed clock enable */ +#define RCC_CR_HSERDY ((uint32_t)0x00020000) /*!< External High Speed clock ready flag */ +#define RCC_CR_HSEBYP ((uint32_t)0x00040000) /*!< External High Speed clock Bypass */ +#define RCC_CR_CSSON ((uint32_t)0x00080000) /*!< Clock Security System enable */ +#define RCC_CR_PLLON ((uint32_t)0x01000000) /*!< PLL enable */ +#define RCC_CR_PLLRDY ((uint32_t)0x02000000) /*!< PLL clock ready flag */ + +#ifdef STM32F10X_CL + #define RCC_CR_PLL2ON ((uint32_t)0x04000000) /*!< PLL2 enable */ + #define RCC_CR_PLL2RDY ((uint32_t)0x08000000) /*!< PLL2 clock ready flag */ + #define RCC_CR_PLL3ON ((uint32_t)0x10000000) /*!< PLL3 enable */ + #define RCC_CR_PLL3RDY ((uint32_t)0x20000000) /*!< PLL3 clock ready flag */ +#endif /* STM32F10X_CL */ + +/******************* Bit definition for RCC_CFGR register *******************/ +/*!< SW configuration */ +#define RCC_CFGR_SW ((uint32_t)0x00000003) /*!< SW[1:0] bits (System clock Switch) */ +#define RCC_CFGR_SW_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define RCC_CFGR_SW_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define RCC_CFGR_SW_HSI ((uint32_t)0x00000000) /*!< HSI selected as system clock */ +#define RCC_CFGR_SW_HSE ((uint32_t)0x00000001) /*!< HSE selected as system clock */ +#define RCC_CFGR_SW_PLL ((uint32_t)0x00000002) /*!< PLL selected as system clock */ + +/*!< SWS configuration */ +#define RCC_CFGR_SWS ((uint32_t)0x0000000C) /*!< SWS[1:0] bits (System Clock Switch Status) */ +#define RCC_CFGR_SWS_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define RCC_CFGR_SWS_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define RCC_CFGR_SWS_HSI ((uint32_t)0x00000000) /*!< HSI oscillator used as system clock */ +#define RCC_CFGR_SWS_HSE ((uint32_t)0x00000004) /*!< HSE oscillator used as system clock */ +#define RCC_CFGR_SWS_PLL ((uint32_t)0x00000008) /*!< PLL used as system clock */ + +/*!< HPRE configuration */ +#define RCC_CFGR_HPRE ((uint32_t)0x000000F0) /*!< HPRE[3:0] bits (AHB prescaler) */ +#define RCC_CFGR_HPRE_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define RCC_CFGR_HPRE_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define RCC_CFGR_HPRE_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define RCC_CFGR_HPRE_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define RCC_CFGR_HPRE_DIV1 ((uint32_t)0x00000000) /*!< SYSCLK not divided */ +#define RCC_CFGR_HPRE_DIV2 ((uint32_t)0x00000080) /*!< SYSCLK divided by 2 */ +#define RCC_CFGR_HPRE_DIV4 ((uint32_t)0x00000090) /*!< SYSCLK divided by 4 */ +#define RCC_CFGR_HPRE_DIV8 ((uint32_t)0x000000A0) /*!< SYSCLK divided by 8 */ +#define RCC_CFGR_HPRE_DIV16 ((uint32_t)0x000000B0) /*!< SYSCLK divided by 16 */ +#define RCC_CFGR_HPRE_DIV64 ((uint32_t)0x000000C0) /*!< SYSCLK divided by 64 */ +#define RCC_CFGR_HPRE_DIV128 ((uint32_t)0x000000D0) /*!< SYSCLK divided by 128 */ +#define RCC_CFGR_HPRE_DIV256 ((uint32_t)0x000000E0) /*!< SYSCLK divided by 256 */ +#define RCC_CFGR_HPRE_DIV512 ((uint32_t)0x000000F0) /*!< SYSCLK divided by 512 */ + +/*!< PPRE1 configuration */ +#define RCC_CFGR_PPRE1 ((uint32_t)0x00000700) /*!< PRE1[2:0] bits (APB1 prescaler) */ +#define RCC_CFGR_PPRE1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_CFGR_PPRE1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define RCC_CFGR_PPRE1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE1_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE1_DIV2 ((uint32_t)0x00000400) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE1_DIV4 ((uint32_t)0x00000500) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE1_DIV8 ((uint32_t)0x00000600) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE1_DIV16 ((uint32_t)0x00000700) /*!< HCLK divided by 16 */ + +/*!< PPRE2 configuration */ +#define RCC_CFGR_PPRE2 ((uint32_t)0x00003800) /*!< PRE2[2:0] bits (APB2 prescaler) */ +#define RCC_CFGR_PPRE2_0 ((uint32_t)0x00000800) /*!< Bit 0 */ +#define RCC_CFGR_PPRE2_1 ((uint32_t)0x00001000) /*!< Bit 1 */ +#define RCC_CFGR_PPRE2_2 ((uint32_t)0x00002000) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE2_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE2_DIV2 ((uint32_t)0x00002000) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE2_DIV4 ((uint32_t)0x00002800) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE2_DIV8 ((uint32_t)0x00003000) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE2_DIV16 ((uint32_t)0x00003800) /*!< HCLK divided by 16 */ + +/*!< ADCPPRE configuration */ +#define RCC_CFGR_ADCPRE ((uint32_t)0x0000C000) /*!< ADCPRE[1:0] bits (ADC prescaler) */ +#define RCC_CFGR_ADCPRE_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define RCC_CFGR_ADCPRE_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define RCC_CFGR_ADCPRE_DIV2 ((uint32_t)0x00000000) /*!< PCLK2 divided by 2 */ +#define RCC_CFGR_ADCPRE_DIV4 ((uint32_t)0x00004000) /*!< PCLK2 divided by 4 */ +#define RCC_CFGR_ADCPRE_DIV6 ((uint32_t)0x00008000) /*!< PCLK2 divided by 6 */ +#define RCC_CFGR_ADCPRE_DIV8 ((uint32_t)0x0000C000) /*!< PCLK2 divided by 8 */ + +#define RCC_CFGR_PLLSRC ((uint32_t)0x00010000) /*!< PLL entry clock source */ + +#define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) /*!< HSE divider for PLL entry */ + +/*!< PLLMUL configuration */ +#define RCC_CFGR_PLLMULL ((uint32_t)0x003C0000) /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ +#define RCC_CFGR_PLLMULL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define RCC_CFGR_PLLMULL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define RCC_CFGR_PLLMULL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ +#define RCC_CFGR_PLLMULL_3 ((uint32_t)0x00200000) /*!< Bit 3 */ + +#ifdef STM32F10X_CL + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock * 4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock * 5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock * 6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock * 7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock * 8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock * 9 */ + #define RCC_CFGR_PLLMULL6_5 ((uint32_t)0x00340000) /*!< PLL input clock * 6.5 */ + + #define RCC_CFGR_OTGFSPRE ((uint32_t)0x00400000) /*!< USB OTG FS prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x0F000000) /*!< MCO[3:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + #define RCC_CFGR_MCO_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLLCLK_Div2 ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ + #define RCC_CFGR_MCO_PLL2CLK ((uint32_t)0x08000000) /*!< PLL2 clock selected as MCO source*/ + #define RCC_CFGR_MCO_PLL3CLK_Div2 ((uint32_t)0x09000000) /*!< PLL3 clock divided by 2 selected as MCO source*/ + #define RCC_CFGR_MCO_Ext_HSE ((uint32_t)0x0A000000) /*!< XT1 external 3-25 MHz oscillator clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL3CLK ((uint32_t)0x0B000000) /*!< PLL3 clock selected as MCO source */ +#else + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_HSE ((uint32_t)0x00010000) /*!< HSE clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_HSE ((uint32_t)0x00000000) /*!< HSE clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /*!< HSE clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ + #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ + #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ + #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ + #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ + #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ + #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ + #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ + #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ + #define RCC_CFGR_USBPRE ((uint32_t)0x00400000) /*!< USB Device prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ +#endif /* STM32F10X_CL */ + +/*!<****************** Bit definition for RCC_CIR register ********************/ +#define RCC_CIR_LSIRDYF ((uint32_t)0x00000001) /*!< LSI Ready Interrupt flag */ +#define RCC_CIR_LSERDYF ((uint32_t)0x00000002) /*!< LSE Ready Interrupt flag */ +#define RCC_CIR_HSIRDYF ((uint32_t)0x00000004) /*!< HSI Ready Interrupt flag */ +#define RCC_CIR_HSERDYF ((uint32_t)0x00000008) /*!< HSE Ready Interrupt flag */ +#define RCC_CIR_PLLRDYF ((uint32_t)0x00000010) /*!< PLL Ready Interrupt flag */ +#define RCC_CIR_CSSF ((uint32_t)0x00000080) /*!< Clock Security System Interrupt flag */ +#define RCC_CIR_LSIRDYIE ((uint32_t)0x00000100) /*!< LSI Ready Interrupt Enable */ +#define RCC_CIR_LSERDYIE ((uint32_t)0x00000200) /*!< LSE Ready Interrupt Enable */ +#define RCC_CIR_HSIRDYIE ((uint32_t)0x00000400) /*!< HSI Ready Interrupt Enable */ +#define RCC_CIR_HSERDYIE ((uint32_t)0x00000800) /*!< HSE Ready Interrupt Enable */ +#define RCC_CIR_PLLRDYIE ((uint32_t)0x00001000) /*!< PLL Ready Interrupt Enable */ +#define RCC_CIR_LSIRDYC ((uint32_t)0x00010000) /*!< LSI Ready Interrupt Clear */ +#define RCC_CIR_LSERDYC ((uint32_t)0x00020000) /*!< LSE Ready Interrupt Clear */ +#define RCC_CIR_HSIRDYC ((uint32_t)0x00040000) /*!< HSI Ready Interrupt Clear */ +#define RCC_CIR_HSERDYC ((uint32_t)0x00080000) /*!< HSE Ready Interrupt Clear */ +#define RCC_CIR_PLLRDYC ((uint32_t)0x00100000) /*!< PLL Ready Interrupt Clear */ +#define RCC_CIR_CSSC ((uint32_t)0x00800000) /*!< Clock Security System Interrupt Clear */ + +#ifdef STM32F10X_CL + #define RCC_CIR_PLL2RDYF ((uint32_t)0x00000020) /*!< PLL2 Ready Interrupt flag */ + #define RCC_CIR_PLL3RDYF ((uint32_t)0x00000040) /*!< PLL3 Ready Interrupt flag */ + #define RCC_CIR_PLL2RDYIE ((uint32_t)0x00002000) /*!< PLL2 Ready Interrupt Enable */ + #define RCC_CIR_PLL3RDYIE ((uint32_t)0x00004000) /*!< PLL3 Ready Interrupt Enable */ + #define RCC_CIR_PLL2RDYC ((uint32_t)0x00200000) /*!< PLL2 Ready Interrupt Clear */ + #define RCC_CIR_PLL3RDYC ((uint32_t)0x00400000) /*!< PLL3 Ready Interrupt Clear */ +#endif /* STM32F10X_CL */ + +/***************** Bit definition for RCC_APB2RSTR register *****************/ +#define RCC_APB2RSTR_AFIORST ((uint16_t)0x0001) /*!< Alternate Function I/O reset */ +#define RCC_APB2RSTR_IOPARST ((uint16_t)0x0004) /*!< I/O port A reset */ +#define RCC_APB2RSTR_IOPBRST ((uint16_t)0x0008) /*!< I/O port B reset */ +#define RCC_APB2RSTR_IOPCRST ((uint16_t)0x0010) /*!< I/O port C reset */ +#define RCC_APB2RSTR_IOPDRST ((uint16_t)0x0020) /*!< I/O port D reset */ +#define RCC_APB2RSTR_ADC1RST ((uint16_t)0x0200) /*!< ADC 1 interface reset */ +#define RCC_APB2RSTR_ADC2RST ((uint16_t)0x0400) /*!< ADC 2 interface reset */ +#define RCC_APB2RSTR_TIM1RST ((uint16_t)0x0800) /*!< TIM1 Timer reset */ +#define RCC_APB2RSTR_SPI1RST ((uint16_t)0x1000) /*!< SPI 1 reset */ +#define RCC_APB2RSTR_USART1RST ((uint16_t)0x4000) /*!< USART1 reset */ + +#ifndef STM32F10X_LD + #define RCC_APB2RSTR_IOPERST ((uint16_t)0x0040) /*!< I/O port E reset */ +#endif /* STM32F10X_HD */ + +#ifdef STM32F10X_HD + #define RCC_APB2RSTR_IOPFRST ((uint16_t)0x0080) /*!< I/O port F reset */ + #define RCC_APB2RSTR_IOPGRST ((uint16_t)0x0100) /*!< I/O port G reset */ + #define RCC_APB2RSTR_TIM8RST ((uint16_t)0x2000) /*!< TIM8 Timer reset */ + #define RCC_APB2RSTR_ADC3RST ((uint16_t)0x8000) /*!< ADC3 interface reset */ +#endif /* STM32F10X_HD */ + +/***************** Bit definition for RCC_APB1RSTR register *****************/ +#define RCC_APB1RSTR_TIM2RST ((uint32_t)0x00000001) /*!< Timer 2 reset */ +#define RCC_APB1RSTR_TIM3RST ((uint32_t)0x00000002) /*!< Timer 3 reset */ +#define RCC_APB1RSTR_WWDGRST ((uint32_t)0x00000800) /*!< Window Watchdog reset */ +#define RCC_APB1RSTR_USART2RST ((uint32_t)0x00020000) /*!< USART 2 reset */ +#define RCC_APB1RSTR_I2C1RST ((uint32_t)0x00200000) /*!< I2C 1 reset */ +#define RCC_APB1RSTR_CAN1RST ((uint32_t)0x02000000) /*!< CAN1 reset */ +#define RCC_APB1RSTR_BKPRST ((uint32_t)0x08000000) /*!< Backup interface reset */ +#define RCC_APB1RSTR_PWRRST ((uint32_t)0x10000000) /*!< Power interface reset */ + +#ifndef STM32F10X_LD + #define RCC_APB1RSTR_TIM4RST ((uint32_t)0x00000004) /*!< Timer 4 reset */ + #define RCC_APB1RSTR_SPI2RST ((uint32_t)0x00004000) /*!< SPI 2 reset */ + #define RCC_APB1RSTR_USART3RST ((uint32_t)0x00040000) /*!< RUSART 3 reset */ + #define RCC_APB1RSTR_I2C2RST ((uint32_t)0x00400000) /*!< I2C 2 reset */ +#endif /* STM32F10X_HD */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) + #define RCC_APB1RSTR_USBRST ((uint32_t)0x00800000) /*!< USB Device reset */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) + #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ + #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ + #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ + #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ + #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ + #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ + #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ +#endif + +#ifdef STM32F10X_CL + #define RCC_APB1RSTR_CAN2RST ((uint32_t)0x08000000) /*!< CAN2 reset */ +#endif /* STM32F10X_CL */ + +/****************** Bit definition for RCC_AHBENR register ******************/ +#define RCC_AHBENR_DMA1EN ((uint16_t)0x0001) /*!< DMA1 clock enable */ +#define RCC_AHBENR_SRAMEN ((uint16_t)0x0004) /*!< SRAM interface clock enable */ +#define RCC_AHBENR_FLITFEN ((uint16_t)0x0010) /*!< FLITF clock enable */ +#define RCC_AHBENR_CRCEN ((uint16_t)0x0040) /*!< CRC clock enable */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) + #define RCC_AHBENR_DMA2EN ((uint16_t)0x0002) /*!< DMA2 clock enable */ +#endif + +#ifdef STM32F10X_HD + #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ + #define RCC_AHBENR_SDIOEN ((uint16_t)0x0400) /*!< SDIO clock enable */ +#endif /* STM32F10X_HD */ + +#ifdef STM32F10X_CL + #define RCC_AHBENR_OTGFSEN ((uint32_t)0x00001000) /*!< USB OTG FS clock enable */ + #define RCC_AHBENR_ETHMACEN ((uint32_t)0x00004000) /*!< ETHERNET MAC clock enable */ + #define RCC_AHBENR_ETHMACTXEN ((uint32_t)0x00008000) /*!< ETHERNET MAC Tx clock enable */ + #define RCC_AHBENR_ETHMACRXEN ((uint32_t)0x00010000) /*!< ETHERNET MAC Rx clock enable */ +#endif /* STM32F10X_CL */ + +/****************** Bit definition for RCC_APB2ENR register *****************/ +#define RCC_APB2ENR_AFIOEN ((uint16_t)0x0001) /*!< Alternate Function I/O clock enable */ +#define RCC_APB2ENR_IOPAEN ((uint16_t)0x0004) /*!< I/O port A clock enable */ +#define RCC_APB2ENR_IOPBEN ((uint16_t)0x0008) /*!< I/O port B clock enable */ +#define RCC_APB2ENR_IOPCEN ((uint16_t)0x0010) /*!< I/O port C clock enable */ +#define RCC_APB2ENR_IOPDEN ((uint16_t)0x0020) /*!< I/O port D clock enable */ +#define RCC_APB2ENR_ADC1EN ((uint16_t)0x0200) /*!< ADC 1 interface clock enable */ +#define RCC_APB2ENR_ADC2EN ((uint16_t)0x0400) /*!< ADC 2 interface clock enable */ +#define RCC_APB2ENR_TIM1EN ((uint16_t)0x0800) /*!< TIM1 Timer clock enable */ +#define RCC_APB2ENR_SPI1EN ((uint16_t)0x1000) /*!< SPI 1 clock enable */ +#define RCC_APB2ENR_USART1EN ((uint16_t)0x4000) /*!< USART1 clock enable */ + +#ifndef STM32F10X_LD + #define RCC_APB2ENR_IOPEEN ((uint16_t)0x0040) /*!< I/O port E clock enable */ +#endif /* STM32F10X_HD */ + +#ifdef STM32F10X_HD + #define RCC_APB2ENR_IOPFEN ((uint16_t)0x0080) /*!< I/O port F clock enable */ + #define RCC_APB2ENR_IOPGEN ((uint16_t)0x0100) /*!< I/O port G clock enable */ + #define RCC_APB2ENR_TIM8EN ((uint16_t)0x2000) /*!< TIM8 Timer clock enable */ + #define RCC_APB2ENR_ADC3EN ((uint16_t)0x8000) /*!< DMA1 clock enable */ +#endif /* STM32F10X_HD */ + +/***************** Bit definition for RCC_APB1ENR register ******************/ +#define RCC_APB1ENR_TIM2EN ((uint32_t)0x00000001) /*!< Timer 2 clock enabled*/ +#define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002) /*!< Timer 3 clock enable */ +#define RCC_APB1ENR_WWDGEN ((uint32_t)0x00000800) /*!< Window Watchdog clock enable */ +#define RCC_APB1ENR_USART2EN ((uint32_t)0x00020000) /*!< USART 2 clock enable */ +#define RCC_APB1ENR_I2C1EN ((uint32_t)0x00200000) /*!< I2C 1 clock enable */ +#define RCC_APB1ENR_CAN1EN ((uint32_t)0x02000000) /*!< CAN1 clock enable */ +#define RCC_APB1ENR_BKPEN ((uint32_t)0x08000000) /*!< Backup interface clock enable */ +#define RCC_APB1ENR_PWREN ((uint32_t)0x10000000) /*!< Power interface clock enable */ + +#ifndef STM32F10X_LD + #define RCC_APB1ENR_TIM4EN ((uint32_t)0x00000004) /*!< Timer 4 clock enable */ + #define RCC_APB1ENR_SPI2EN ((uint32_t)0x00004000) /*!< SPI 2 clock enable */ + #define RCC_APB1ENR_USART3EN ((uint32_t)0x00040000) /*!< USART 3 clock enable */ + #define RCC_APB1ENR_I2C2EN ((uint32_t)0x00400000) /*!< I2C 2 clock enable */ +#endif /* STM32F10X_HD */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) + #define RCC_APB1ENR_USBEN ((uint32_t)0x00800000) /*!< USB Device clock enable */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) + #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ + #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ + #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ + #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ + #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ + #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ + #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ +#endif + +#ifdef STM32F10X_CL + #define RCC_APB1ENR_CAN2EN ((uint32_t)0x08000000) /*!< CAN2 clock enable */ +#endif /* STM32F10X_CL */ + +/******************* Bit definition for RCC_BDCR register *******************/ +#define RCC_BDCR_LSEON ((uint32_t)0x00000001) /*!< External Low Speed oscillator enable */ +#define RCC_BDCR_LSERDY ((uint32_t)0x00000002) /*!< External Low Speed oscillator Ready */ +#define RCC_BDCR_LSEBYP ((uint32_t)0x00000004) /*!< External Low Speed oscillator Bypass */ + +#define RCC_BDCR_RTCSEL ((uint32_t)0x00000300) /*!< RTCSEL[1:0] bits (RTC clock source selection) */ +#define RCC_BDCR_RTCSEL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_BDCR_RTCSEL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< RTC congiguration */ +#define RCC_BDCR_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ +#define RCC_BDCR_RTCSEL_LSE ((uint32_t)0x00000100) /*!< LSE oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_LSI ((uint32_t)0x00000200) /*!< LSI oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_HSE ((uint32_t)0x00000300) /*!< HSE oscillator clock divided by 128 used as RTC clock */ + +#define RCC_BDCR_RTCEN ((uint32_t)0x00008000) /*!< RTC clock enable */ +#define RCC_BDCR_BDRST ((uint32_t)0x00010000) /*!< Backup domain software reset */ + +/******************* Bit definition for RCC_CSR register ********************/ +#define RCC_CSR_LSION ((uint32_t)0x00000001) /*!< Internal Low Speed oscillator enable */ +#define RCC_CSR_LSIRDY ((uint32_t)0x00000002) /*!< Internal Low Speed oscillator Ready */ +#define RCC_CSR_RMVF ((uint32_t)0x01000000) /*!< Remove reset flag */ +#define RCC_CSR_PINRSTF ((uint32_t)0x04000000) /*!< PIN reset flag */ +#define RCC_CSR_PORRSTF ((uint32_t)0x08000000) /*!< POR/PDR reset flag */ +#define RCC_CSR_SFTRSTF ((uint32_t)0x10000000) /*!< Software Reset flag */ +#define RCC_CSR_IWDGRSTF ((uint32_t)0x20000000) /*!< Independent Watchdog reset flag */ +#define RCC_CSR_WWDGRSTF ((uint32_t)0x40000000) /*!< Window watchdog reset flag */ +#define RCC_CSR_LPWRRSTF ((uint32_t)0x80000000) /*!< Low-Power reset flag */ + +#ifdef STM32F10X_CL +/******************* Bit definition for RCC_AHBRSTR register ****************/ + #define RCC_AHBRSTR_OTGFSRST ((uint32_t)0x00001000) /*!< USB OTG FS reset */ + #define RCC_AHBRSTR_ETHMACRST ((uint32_t)0x00004000) /*!< ETHERNET MAC reset */ + +/******************* Bit definition for RCC_CFGR2 register ******************/ +/*!< PREDIV1 configuration */ + #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ + #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ + #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ + +/*!< PREDIV2 configuration */ + #define RCC_CFGR2_PREDIV2 ((uint32_t)0x000000F0) /*!< PREDIV2[3:0] bits */ + #define RCC_CFGR2_PREDIV2_0 ((uint32_t)0x00000010) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV2_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV2_2 ((uint32_t)0x00000040) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV2_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV2_DIV1 ((uint32_t)0x00000000) /*!< PREDIV2 input clock not divided */ + #define RCC_CFGR2_PREDIV2_DIV2 ((uint32_t)0x00000010) /*!< PREDIV2 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV2_DIV3 ((uint32_t)0x00000020) /*!< PREDIV2 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV2_DIV4 ((uint32_t)0x00000030) /*!< PREDIV2 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV2_DIV5 ((uint32_t)0x00000040) /*!< PREDIV2 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV2_DIV6 ((uint32_t)0x00000050) /*!< PREDIV2 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV2_DIV7 ((uint32_t)0x00000060) /*!< PREDIV2 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV2_DIV8 ((uint32_t)0x00000070) /*!< PREDIV2 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV2_DIV9 ((uint32_t)0x00000080) /*!< PREDIV2 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV2_DIV10 ((uint32_t)0x00000090) /*!< PREDIV2 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV2_DIV11 ((uint32_t)0x000000A0) /*!< PREDIV2 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV2_DIV12 ((uint32_t)0x000000B0) /*!< PREDIV2 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV2_DIV13 ((uint32_t)0x000000C0) /*!< PREDIV2 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV2_DIV14 ((uint32_t)0x000000D0) /*!< PREDIV2 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV2_DIV15 ((uint32_t)0x000000E0) /*!< PREDIV2 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV2_DIV16 ((uint32_t)0x000000F0) /*!< PREDIV2 input clock divided by 16 */ + +/*!< PLL2MUL configuration */ + #define RCC_CFGR2_PLL2MUL ((uint32_t)0x00000F00) /*!< PLL2MUL[3:0] bits */ + #define RCC_CFGR2_PLL2MUL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ + #define RCC_CFGR2_PLL2MUL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + #define RCC_CFGR2_PLL2MUL_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + #define RCC_CFGR2_PLL2MUL_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL2MUL8 ((uint32_t)0x00000600) /*!< PLL2 input clock * 8 */ + #define RCC_CFGR2_PLL2MUL9 ((uint32_t)0x00000700) /*!< PLL2 input clock * 9 */ + #define RCC_CFGR2_PLL2MUL10 ((uint32_t)0x00000800) /*!< PLL2 input clock * 10 */ + #define RCC_CFGR2_PLL2MUL11 ((uint32_t)0x00000900) /*!< PLL2 input clock * 11 */ + #define RCC_CFGR2_PLL2MUL12 ((uint32_t)0x00000A00) /*!< PLL2 input clock * 12 */ + #define RCC_CFGR2_PLL2MUL13 ((uint32_t)0x00000B00) /*!< PLL2 input clock * 13 */ + #define RCC_CFGR2_PLL2MUL14 ((uint32_t)0x00000C00) /*!< PLL2 input clock * 14 */ + #define RCC_CFGR2_PLL2MUL16 ((uint32_t)0x00000E00) /*!< PLL2 input clock * 16 */ + #define RCC_CFGR2_PLL2MUL20 ((uint32_t)0x00000F00) /*!< PLL2 input clock * 20 */ + +/*!< PLL3MUL configuration */ + #define RCC_CFGR2_PLL3MUL ((uint32_t)0x0000F000) /*!< PLL3MUL[3:0] bits */ + #define RCC_CFGR2_PLL3MUL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ + #define RCC_CFGR2_PLL3MUL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + #define RCC_CFGR2_PLL3MUL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + #define RCC_CFGR2_PLL3MUL_3 ((uint32_t)0x00008000) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL3MUL8 ((uint32_t)0x00006000) /*!< PLL3 input clock * 8 */ + #define RCC_CFGR2_PLL3MUL9 ((uint32_t)0x00007000) /*!< PLL3 input clock * 9 */ + #define RCC_CFGR2_PLL3MUL10 ((uint32_t)0x00008000) /*!< PLL3 input clock * 10 */ + #define RCC_CFGR2_PLL3MUL11 ((uint32_t)0x00009000) /*!< PLL3 input clock * 11 */ + #define RCC_CFGR2_PLL3MUL12 ((uint32_t)0x0000A000) /*!< PLL3 input clock * 12 */ + #define RCC_CFGR2_PLL3MUL13 ((uint32_t)0x0000B000) /*!< PLL3 input clock * 13 */ + #define RCC_CFGR2_PLL3MUL14 ((uint32_t)0x0000C000) /*!< PLL3 input clock * 14 */ + #define RCC_CFGR2_PLL3MUL16 ((uint32_t)0x0000E000) /*!< PLL3 input clock * 16 */ + #define RCC_CFGR2_PLL3MUL20 ((uint32_t)0x0000F000) /*!< PLL3 input clock * 20 */ + + #define RCC_CFGR2_PREDIV1SRC ((uint32_t)0x00010000) /*!< PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_PLL2 ((uint32_t)0x00010000) /*!< PLL2 selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_HSE ((uint32_t)0x00000000) /*!< HSE selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_I2S2SRC ((uint32_t)0x00020000) /*!< I2S2 entry clock source */ + #define RCC_CFGR2_I2S3SRC ((uint32_t)0x00040000) /*!< I2S3 clock source */ +#endif /* STM32F10X_CL */ + +/******************************************************************************/ +/* */ +/* General Purpose and Alternate Function I/O */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for GPIO_CRL register *******************/ +#define GPIO_CRL_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRL_MODE0 ((uint32_t)0x00000003) /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */ +#define GPIO_CRL_MODE0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRL_MODE0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRL_MODE1 ((uint32_t)0x00000030) /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */ +#define GPIO_CRL_MODE1_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRL_MODE1_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRL_MODE2 ((uint32_t)0x00000300) /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */ +#define GPIO_CRL_MODE2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRL_MODE2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRL_MODE3 ((uint32_t)0x00003000) /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */ +#define GPIO_CRL_MODE3_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRL_MODE3_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE4 ((uint32_t)0x00030000) /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */ +#define GPIO_CRL_MODE4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRL_MODE4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE5 ((uint32_t)0x00300000) /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */ +#define GPIO_CRL_MODE5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRL_MODE5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE6 ((uint32_t)0x03000000) /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */ +#define GPIO_CRL_MODE6_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE6_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE7 ((uint32_t)0x30000000) /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */ +#define GPIO_CRL_MODE7_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE7_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRL_CNF0 ((uint32_t)0x0000000C) /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */ +#define GPIO_CRL_CNF0_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRL_CNF0_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRL_CNF1 ((uint32_t)0x000000C0) /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */ +#define GPIO_CRL_CNF1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRL_CNF1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRL_CNF2 ((uint32_t)0x00000C00) /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */ +#define GPIO_CRL_CNF2_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRL_CNF2_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRL_CNF3 ((uint32_t)0x0000C000) /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */ +#define GPIO_CRL_CNF3_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRL_CNF3_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF4 ((uint32_t)0x000C0000) /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */ +#define GPIO_CRL_CNF4_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRL_CNF4_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF5 ((uint32_t)0x00C00000) /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */ +#define GPIO_CRL_CNF5_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRL_CNF5_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF6 ((uint32_t)0x0C000000) /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */ +#define GPIO_CRL_CNF6_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF6_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF7 ((uint32_t)0xC0000000) /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */ +#define GPIO_CRL_CNF7_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF7_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/******************* Bit definition for GPIO_CRH register *******************/ +#define GPIO_CRH_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRH_MODE8 ((uint32_t)0x00000003) /*!< MODE8[1:0] bits (Port x mode bits, pin 8) */ +#define GPIO_CRH_MODE8_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRH_MODE8_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRH_MODE9 ((uint32_t)0x00000030) /*!< MODE9[1:0] bits (Port x mode bits, pin 9) */ +#define GPIO_CRH_MODE9_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRH_MODE9_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRH_MODE10 ((uint32_t)0x00000300) /*!< MODE10[1:0] bits (Port x mode bits, pin 10) */ +#define GPIO_CRH_MODE10_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRH_MODE10_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRH_MODE11 ((uint32_t)0x00003000) /*!< MODE11[1:0] bits (Port x mode bits, pin 11) */ +#define GPIO_CRH_MODE11_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRH_MODE11_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE12 ((uint32_t)0x00030000) /*!< MODE12[1:0] bits (Port x mode bits, pin 12) */ +#define GPIO_CRH_MODE12_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRH_MODE12_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE13 ((uint32_t)0x00300000) /*!< MODE13[1:0] bits (Port x mode bits, pin 13) */ +#define GPIO_CRH_MODE13_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRH_MODE13_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE14 ((uint32_t)0x03000000) /*!< MODE14[1:0] bits (Port x mode bits, pin 14) */ +#define GPIO_CRH_MODE14_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE14_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE15 ((uint32_t)0x30000000) /*!< MODE15[1:0] bits (Port x mode bits, pin 15) */ +#define GPIO_CRH_MODE15_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE15_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRH_CNF8 ((uint32_t)0x0000000C) /*!< CNF8[1:0] bits (Port x configuration bits, pin 8) */ +#define GPIO_CRH_CNF8_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRH_CNF8_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRH_CNF9 ((uint32_t)0x000000C0) /*!< CNF9[1:0] bits (Port x configuration bits, pin 9) */ +#define GPIO_CRH_CNF9_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRH_CNF9_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRH_CNF10 ((uint32_t)0x00000C00) /*!< CNF10[1:0] bits (Port x configuration bits, pin 10) */ +#define GPIO_CRH_CNF10_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRH_CNF10_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRH_CNF11 ((uint32_t)0x0000C000) /*!< CNF11[1:0] bits (Port x configuration bits, pin 11) */ +#define GPIO_CRH_CNF11_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRH_CNF11_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF12 ((uint32_t)0x000C0000) /*!< CNF12[1:0] bits (Port x configuration bits, pin 12) */ +#define GPIO_CRH_CNF12_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRH_CNF12_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF13 ((uint32_t)0x00C00000) /*!< CNF13[1:0] bits (Port x configuration bits, pin 13) */ +#define GPIO_CRH_CNF13_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRH_CNF13_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF14 ((uint32_t)0x0C000000) /*!< CNF14[1:0] bits (Port x configuration bits, pin 14) */ +#define GPIO_CRH_CNF14_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF14_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF15 ((uint32_t)0xC0000000) /*!< CNF15[1:0] bits (Port x configuration bits, pin 15) */ +#define GPIO_CRH_CNF15_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF15_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/*!<****************** Bit definition for GPIO_IDR register *******************/ +#define GPIO_IDR_IDR0 ((uint16_t)0x0001) /*!< Port input data, bit 0 */ +#define GPIO_IDR_IDR1 ((uint16_t)0x0002) /*!< Port input data, bit 1 */ +#define GPIO_IDR_IDR2 ((uint16_t)0x0004) /*!< Port input data, bit 2 */ +#define GPIO_IDR_IDR3 ((uint16_t)0x0008) /*!< Port input data, bit 3 */ +#define GPIO_IDR_IDR4 ((uint16_t)0x0010) /*!< Port input data, bit 4 */ +#define GPIO_IDR_IDR5 ((uint16_t)0x0020) /*!< Port input data, bit 5 */ +#define GPIO_IDR_IDR6 ((uint16_t)0x0040) /*!< Port input data, bit 6 */ +#define GPIO_IDR_IDR7 ((uint16_t)0x0080) /*!< Port input data, bit 7 */ +#define GPIO_IDR_IDR8 ((uint16_t)0x0100) /*!< Port input data, bit 8 */ +#define GPIO_IDR_IDR9 ((uint16_t)0x0200) /*!< Port input data, bit 9 */ +#define GPIO_IDR_IDR10 ((uint16_t)0x0400) /*!< Port input data, bit 10 */ +#define GPIO_IDR_IDR11 ((uint16_t)0x0800) /*!< Port input data, bit 11 */ +#define GPIO_IDR_IDR12 ((uint16_t)0x1000) /*!< Port input data, bit 12 */ +#define GPIO_IDR_IDR13 ((uint16_t)0x2000) /*!< Port input data, bit 13 */ +#define GPIO_IDR_IDR14 ((uint16_t)0x4000) /*!< Port input data, bit 14 */ +#define GPIO_IDR_IDR15 ((uint16_t)0x8000) /*!< Port input data, bit 15 */ + +/******************* Bit definition for GPIO_ODR register *******************/ +#define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */ +#define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */ +#define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */ +#define GPIO_ODR_ODR3 ((uint16_t)0x0008) /*!< Port output data, bit 3 */ +#define GPIO_ODR_ODR4 ((uint16_t)0x0010) /*!< Port output data, bit 4 */ +#define GPIO_ODR_ODR5 ((uint16_t)0x0020) /*!< Port output data, bit 5 */ +#define GPIO_ODR_ODR6 ((uint16_t)0x0040) /*!< Port output data, bit 6 */ +#define GPIO_ODR_ODR7 ((uint16_t)0x0080) /*!< Port output data, bit 7 */ +#define GPIO_ODR_ODR8 ((uint16_t)0x0100) /*!< Port output data, bit 8 */ +#define GPIO_ODR_ODR9 ((uint16_t)0x0200) /*!< Port output data, bit 9 */ +#define GPIO_ODR_ODR10 ((uint16_t)0x0400) /*!< Port output data, bit 10 */ +#define GPIO_ODR_ODR11 ((uint16_t)0x0800) /*!< Port output data, bit 11 */ +#define GPIO_ODR_ODR12 ((uint16_t)0x1000) /*!< Port output data, bit 12 */ +#define GPIO_ODR_ODR13 ((uint16_t)0x2000) /*!< Port output data, bit 13 */ +#define GPIO_ODR_ODR14 ((uint16_t)0x4000) /*!< Port output data, bit 14 */ +#define GPIO_ODR_ODR15 ((uint16_t)0x8000) /*!< Port output data, bit 15 */ + +/****************** Bit definition for GPIO_BSRR register *******************/ +#define GPIO_BSRR_BS0 ((uint32_t)0x00000001) /*!< Port x Set bit 0 */ +#define GPIO_BSRR_BS1 ((uint32_t)0x00000002) /*!< Port x Set bit 1 */ +#define GPIO_BSRR_BS2 ((uint32_t)0x00000004) /*!< Port x Set bit 2 */ +#define GPIO_BSRR_BS3 ((uint32_t)0x00000008) /*!< Port x Set bit 3 */ +#define GPIO_BSRR_BS4 ((uint32_t)0x00000010) /*!< Port x Set bit 4 */ +#define GPIO_BSRR_BS5 ((uint32_t)0x00000020) /*!< Port x Set bit 5 */ +#define GPIO_BSRR_BS6 ((uint32_t)0x00000040) /*!< Port x Set bit 6 */ +#define GPIO_BSRR_BS7 ((uint32_t)0x00000080) /*!< Port x Set bit 7 */ +#define GPIO_BSRR_BS8 ((uint32_t)0x00000100) /*!< Port x Set bit 8 */ +#define GPIO_BSRR_BS9 ((uint32_t)0x00000200) /*!< Port x Set bit 9 */ +#define GPIO_BSRR_BS10 ((uint32_t)0x00000400) /*!< Port x Set bit 10 */ +#define GPIO_BSRR_BS11 ((uint32_t)0x00000800) /*!< Port x Set bit 11 */ +#define GPIO_BSRR_BS12 ((uint32_t)0x00001000) /*!< Port x Set bit 12 */ +#define GPIO_BSRR_BS13 ((uint32_t)0x00002000) /*!< Port x Set bit 13 */ +#define GPIO_BSRR_BS14 ((uint32_t)0x00004000) /*!< Port x Set bit 14 */ +#define GPIO_BSRR_BS15 ((uint32_t)0x00008000) /*!< Port x Set bit 15 */ + +#define GPIO_BSRR_BR0 ((uint32_t)0x00010000) /*!< Port x Reset bit 0 */ +#define GPIO_BSRR_BR1 ((uint32_t)0x00020000) /*!< Port x Reset bit 1 */ +#define GPIO_BSRR_BR2 ((uint32_t)0x00040000) /*!< Port x Reset bit 2 */ +#define GPIO_BSRR_BR3 ((uint32_t)0x00080000) /*!< Port x Reset bit 3 */ +#define GPIO_BSRR_BR4 ((uint32_t)0x00100000) /*!< Port x Reset bit 4 */ +#define GPIO_BSRR_BR5 ((uint32_t)0x00200000) /*!< Port x Reset bit 5 */ +#define GPIO_BSRR_BR6 ((uint32_t)0x00400000) /*!< Port x Reset bit 6 */ +#define GPIO_BSRR_BR7 ((uint32_t)0x00800000) /*!< Port x Reset bit 7 */ +#define GPIO_BSRR_BR8 ((uint32_t)0x01000000) /*!< Port x Reset bit 8 */ +#define GPIO_BSRR_BR9 ((uint32_t)0x02000000) /*!< Port x Reset bit 9 */ +#define GPIO_BSRR_BR10 ((uint32_t)0x04000000) /*!< Port x Reset bit 10 */ +#define GPIO_BSRR_BR11 ((uint32_t)0x08000000) /*!< Port x Reset bit 11 */ +#define GPIO_BSRR_BR12 ((uint32_t)0x10000000) /*!< Port x Reset bit 12 */ +#define GPIO_BSRR_BR13 ((uint32_t)0x20000000) /*!< Port x Reset bit 13 */ +#define GPIO_BSRR_BR14 ((uint32_t)0x40000000) /*!< Port x Reset bit 14 */ +#define GPIO_BSRR_BR15 ((uint32_t)0x80000000) /*!< Port x Reset bit 15 */ + +/******************* Bit definition for GPIO_BRR register *******************/ +#define GPIO_BRR_BR0 ((uint16_t)0x0001) /*!< Port x Reset bit 0 */ +#define GPIO_BRR_BR1 ((uint16_t)0x0002) /*!< Port x Reset bit 1 */ +#define GPIO_BRR_BR2 ((uint16_t)0x0004) /*!< Port x Reset bit 2 */ +#define GPIO_BRR_BR3 ((uint16_t)0x0008) /*!< Port x Reset bit 3 */ +#define GPIO_BRR_BR4 ((uint16_t)0x0010) /*!< Port x Reset bit 4 */ +#define GPIO_BRR_BR5 ((uint16_t)0x0020) /*!< Port x Reset bit 5 */ +#define GPIO_BRR_BR6 ((uint16_t)0x0040) /*!< Port x Reset bit 6 */ +#define GPIO_BRR_BR7 ((uint16_t)0x0080) /*!< Port x Reset bit 7 */ +#define GPIO_BRR_BR8 ((uint16_t)0x0100) /*!< Port x Reset bit 8 */ +#define GPIO_BRR_BR9 ((uint16_t)0x0200) /*!< Port x Reset bit 9 */ +#define GPIO_BRR_BR10 ((uint16_t)0x0400) /*!< Port x Reset bit 10 */ +#define GPIO_BRR_BR11 ((uint16_t)0x0800) /*!< Port x Reset bit 11 */ +#define GPIO_BRR_BR12 ((uint16_t)0x1000) /*!< Port x Reset bit 12 */ +#define GPIO_BRR_BR13 ((uint16_t)0x2000) /*!< Port x Reset bit 13 */ +#define GPIO_BRR_BR14 ((uint16_t)0x4000) /*!< Port x Reset bit 14 */ +#define GPIO_BRR_BR15 ((uint16_t)0x8000) /*!< Port x Reset bit 15 */ + +/****************** Bit definition for GPIO_LCKR register *******************/ +#define GPIO_LCKR_LCK0 ((uint32_t)0x00000001) /*!< Port x Lock bit 0 */ +#define GPIO_LCKR_LCK1 ((uint32_t)0x00000002) /*!< Port x Lock bit 1 */ +#define GPIO_LCKR_LCK2 ((uint32_t)0x00000004) /*!< Port x Lock bit 2 */ +#define GPIO_LCKR_LCK3 ((uint32_t)0x00000008) /*!< Port x Lock bit 3 */ +#define GPIO_LCKR_LCK4 ((uint32_t)0x00000010) /*!< Port x Lock bit 4 */ +#define GPIO_LCKR_LCK5 ((uint32_t)0x00000020) /*!< Port x Lock bit 5 */ +#define GPIO_LCKR_LCK6 ((uint32_t)0x00000040) /*!< Port x Lock bit 6 */ +#define GPIO_LCKR_LCK7 ((uint32_t)0x00000080) /*!< Port x Lock bit 7 */ +#define GPIO_LCKR_LCK8 ((uint32_t)0x00000100) /*!< Port x Lock bit 8 */ +#define GPIO_LCKR_LCK9 ((uint32_t)0x00000200) /*!< Port x Lock bit 9 */ +#define GPIO_LCKR_LCK10 ((uint32_t)0x00000400) /*!< Port x Lock bit 10 */ +#define GPIO_LCKR_LCK11 ((uint32_t)0x00000800) /*!< Port x Lock bit 11 */ +#define GPIO_LCKR_LCK12 ((uint32_t)0x00001000) /*!< Port x Lock bit 12 */ +#define GPIO_LCKR_LCK13 ((uint32_t)0x00002000) /*!< Port x Lock bit 13 */ +#define GPIO_LCKR_LCK14 ((uint32_t)0x00004000) /*!< Port x Lock bit 14 */ +#define GPIO_LCKR_LCK15 ((uint32_t)0x00008000) /*!< Port x Lock bit 15 */ +#define GPIO_LCKR_LCKK ((uint32_t)0x00010000) /*!< Lock key */ + +/*----------------------------------------------------------------------------*/ + +/****************** Bit definition for AFIO_EVCR register *******************/ +#define AFIO_EVCR_PIN ((uint8_t)0x0F) /*!< PIN[3:0] bits (Pin selection) */ +#define AFIO_EVCR_PIN_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define AFIO_EVCR_PIN_1 ((uint8_t)0x02) /*!< Bit 1 */ +#define AFIO_EVCR_PIN_2 ((uint8_t)0x04) /*!< Bit 2 */ +#define AFIO_EVCR_PIN_3 ((uint8_t)0x08) /*!< Bit 3 */ + +/*!< PIN configuration */ +#define AFIO_EVCR_PIN_PX0 ((uint8_t)0x00) /*!< Pin 0 selected */ +#define AFIO_EVCR_PIN_PX1 ((uint8_t)0x01) /*!< Pin 1 selected */ +#define AFIO_EVCR_PIN_PX2 ((uint8_t)0x02) /*!< Pin 2 selected */ +#define AFIO_EVCR_PIN_PX3 ((uint8_t)0x03) /*!< Pin 3 selected */ +#define AFIO_EVCR_PIN_PX4 ((uint8_t)0x04) /*!< Pin 4 selected */ +#define AFIO_EVCR_PIN_PX5 ((uint8_t)0x05) /*!< Pin 5 selected */ +#define AFIO_EVCR_PIN_PX6 ((uint8_t)0x06) /*!< Pin 6 selected */ +#define AFIO_EVCR_PIN_PX7 ((uint8_t)0x07) /*!< Pin 7 selected */ +#define AFIO_EVCR_PIN_PX8 ((uint8_t)0x08) /*!< Pin 8 selected */ +#define AFIO_EVCR_PIN_PX9 ((uint8_t)0x09) /*!< Pin 9 selected */ +#define AFIO_EVCR_PIN_PX10 ((uint8_t)0x0A) /*!< Pin 10 selected */ +#define AFIO_EVCR_PIN_PX11 ((uint8_t)0x0B) /*!< Pin 11 selected */ +#define AFIO_EVCR_PIN_PX12 ((uint8_t)0x0C) /*!< Pin 12 selected */ +#define AFIO_EVCR_PIN_PX13 ((uint8_t)0x0D) /*!< Pin 13 selected */ +#define AFIO_EVCR_PIN_PX14 ((uint8_t)0x0E) /*!< Pin 14 selected */ +#define AFIO_EVCR_PIN_PX15 ((uint8_t)0x0F) /*!< Pin 15 selected */ + +#define AFIO_EVCR_PORT ((uint8_t)0x70) /*!< PORT[2:0] bits (Port selection) */ +#define AFIO_EVCR_PORT_0 ((uint8_t)0x10) /*!< Bit 0 */ +#define AFIO_EVCR_PORT_1 ((uint8_t)0x20) /*!< Bit 1 */ +#define AFIO_EVCR_PORT_2 ((uint8_t)0x40) /*!< Bit 2 */ + +/*!< PORT configuration */ +#define AFIO_EVCR_PORT_PA ((uint8_t)0x00) /*!< Port A selected */ +#define AFIO_EVCR_PORT_PB ((uint8_t)0x10) /*!< Port B selected */ +#define AFIO_EVCR_PORT_PC ((uint8_t)0x20) /*!< Port C selected */ +#define AFIO_EVCR_PORT_PD ((uint8_t)0x30) /*!< Port D selected */ +#define AFIO_EVCR_PORT_PE ((uint8_t)0x40) /*!< Port E selected */ + +#define AFIO_EVCR_EVOE ((uint8_t)0x80) /*!< Event Output Enable */ + +/****************** Bit definition for AFIO_MAPR register *******************/ +#define AFIO_MAPR_SPI1_REMAP ((uint32_t)0x00000001) /*!< SPI1 remapping */ +#define AFIO_MAPR_I2C1_REMAP ((uint32_t)0x00000002) /*!< I2C1 remapping */ +#define AFIO_MAPR_USART1_REMAP ((uint32_t)0x00000004) /*!< USART1 remapping */ +#define AFIO_MAPR_USART2_REMAP ((uint32_t)0x00000008) /*!< USART2 remapping */ + +#define AFIO_MAPR_USART3_REMAP ((uint32_t)0x00000030) /*!< USART3_REMAP[1:0] bits (USART3 remapping) */ +#define AFIO_MAPR_USART3_REMAP_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define AFIO_MAPR_USART3_REMAP_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +/* USART3_REMAP configuration */ +#define AFIO_MAPR_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP ((uint32_t)0x00000010) /*!< Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /*!< Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ + +#define AFIO_MAPR_TIM1_REMAP ((uint32_t)0x000000C0) /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */ +#define AFIO_MAPR_TIM1_REMAP_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define AFIO_MAPR_TIM1_REMAP_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +/*!< TIM1_REMAP configuration */ +#define AFIO_MAPR_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ +#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /*!< Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ +#define AFIO_MAPR_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /*!< Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ + +#define AFIO_MAPR_TIM2_REMAP ((uint32_t)0x00000300) /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */ +#define AFIO_MAPR_TIM2_REMAP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define AFIO_MAPR_TIM2_REMAP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< TIM2_REMAP configuration */ +#define AFIO_MAPR_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /*!< Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /*!< Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ +#define AFIO_MAPR_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /*!< Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ + +#define AFIO_MAPR_TIM3_REMAP ((uint32_t)0x00000C00) /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */ +#define AFIO_MAPR_TIM3_REMAP_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define AFIO_MAPR_TIM3_REMAP_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +/*!< TIM3_REMAP configuration */ +#define AFIO_MAPR_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /*!< Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /*!< Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ + +#define AFIO_MAPR_TIM4_REMAP ((uint32_t)0x00001000) /*!< TIM4_REMAP bit (TIM4 remapping) */ + +#define AFIO_MAPR_CAN_REMAP ((uint32_t)0x00006000) /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ +#define AFIO_MAPR_CAN_REMAP_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define AFIO_MAPR_CAN_REMAP_1 ((uint32_t)0x00004000) /*!< Bit 1 */ + +/*!< CAN_REMAP configuration */ +#define AFIO_MAPR_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /*!< CANRX mapped to PA11, CANTX mapped to PA12 */ +#define AFIO_MAPR_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /*!< CANRX mapped to PB8, CANTX mapped to PB9 */ +#define AFIO_MAPR_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /*!< CANRX mapped to PD0, CANTX mapped to PD1 */ + +#define AFIO_MAPR_PD01_REMAP ((uint32_t)0x00008000) /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_MAPR_TIM5CH4_IREMAP ((uint32_t)0x00010000) /*!< TIM5 Channel4 Internal Remap */ +#define AFIO_MAPR_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /*!< ADC 1 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /*!< ADC 1 External Trigger Regular Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /*!< ADC 2 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /*!< ADC 2 External Trigger Regular Conversion remapping */ + +/*!< SWJ_CFG configuration */ +#define AFIO_MAPR_SWJ_CFG ((uint32_t)0x07000000) /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ +#define AFIO_MAPR_SWJ_CFG_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define AFIO_MAPR_SWJ_CFG_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define AFIO_MAPR_SWJ_CFG_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define AFIO_MAPR_SWJ_CFG_RESET ((uint32_t)0x00000000) /*!< Full SWJ (JTAG-DP + SW-DP) : Reset State */ +#define AFIO_MAPR_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /*!< Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ +#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /*!< JTAG-DP Disabled and SW-DP Enabled */ +#define AFIO_MAPR_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /*!< JTAG-DP Disabled and SW-DP Disabled */ + +#ifdef STM32F10X_CL +/*!< ETH_REMAP configuration */ + #define AFIO_MAPR_ETH_REMAP ((uint32_t)0x00200000) /*!< SPI3_REMAP bit (Ethernet MAC I/O remapping) */ + +/*!< CAN2_REMAP configuration */ + #define AFIO_MAPR_CAN2_REMAP ((uint32_t)0x00400000) /*!< CAN2_REMAP bit (CAN2 I/O remapping) */ + +/*!< MII_RMII_SEL configuration */ + #define AFIO_MAPR_MII_RMII_SEL ((uint32_t)0x00800000) /*!< MII_RMII_SEL bit (Ethernet MII or RMII selection) */ + +/*!< SPI3_REMAP configuration */ + #define AFIO_MAPR_SPI3_REMAP ((uint32_t)0x10000000) /*!< SPI3_REMAP bit (SPI3 remapping) */ + +/*!< TIM2ITR1_IREMAP configuration */ + #define AFIO_MAPR_TIM2ITR1_IREMAP ((uint32_t)0x20000000) /*!< TIM2ITR1_IREMAP bit (TIM2 internal trigger 1 remapping) */ + +/*!< PTP_PPS_REMAP configuration */ + #define AFIO_MAPR_PTP_PPS_REMAP ((uint32_t)0x20000000) /*!< PTP_PPS_REMAP bit (Ethernet PTP PPS remapping) */ +#endif + +/***************** Bit definition for AFIO_EXTICR1 register *****************/ +#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /*!< EXTI 0 configuration */ +#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /*!< EXTI 1 configuration */ +#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /*!< EXTI 2 configuration */ +#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /*!< EXTI 3 configuration */ + +/*!< EXTI0 configuration */ +#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /*!< PA[0] pin */ +#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /*!< PB[0] pin */ +#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /*!< PC[0] pin */ +#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /*!< PD[0] pin */ +#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /*!< PE[0] pin */ +#define AFIO_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /*!< PF[0] pin */ +#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /*!< PG[0] pin */ + +/*!< EXTI1 configuration */ +#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /*!< PA[1] pin */ +#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /*!< PB[1] pin */ +#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /*!< PC[1] pin */ +#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /*!< PD[1] pin */ +#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /*!< PE[1] pin */ +#define AFIO_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /*!< PF[1] pin */ +#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /*!< PG[1] pin */ + +/*!< EXTI2 configuration */ +#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /*!< PA[2] pin */ +#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /*!< PB[2] pin */ +#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /*!< PC[2] pin */ +#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /*!< PD[2] pin */ +#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /*!< PE[2] pin */ +#define AFIO_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /*!< PF[2] pin */ +#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /*!< PG[2] pin */ + +/*!< EXTI3 configuration */ +#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /*!< PA[3] pin */ +#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /*!< PB[3] pin */ +#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /*!< PC[3] pin */ +#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /*!< PD[3] pin */ +#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /*!< PE[3] pin */ +#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /*!< PF[3] pin */ +#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /*!< PG[3] pin */ + +/***************** Bit definition for AFIO_EXTICR2 register *****************/ +#define AFIO_EXTICR2_EXTI4 ((uint16_t)0x000F) /*!< EXTI 4 configuration */ +#define AFIO_EXTICR2_EXTI5 ((uint16_t)0x00F0) /*!< EXTI 5 configuration */ +#define AFIO_EXTICR2_EXTI6 ((uint16_t)0x0F00) /*!< EXTI 6 configuration */ +#define AFIO_EXTICR2_EXTI7 ((uint16_t)0xF000) /*!< EXTI 7 configuration */ + +/*!< EXTI4 configuration */ +#define AFIO_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /*!< PA[4] pin */ +#define AFIO_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /*!< PB[4] pin */ +#define AFIO_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /*!< PC[4] pin */ +#define AFIO_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /*!< PD[4] pin */ +#define AFIO_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /*!< PE[4] pin */ +#define AFIO_EXTICR2_EXTI4_PF ((uint16_t)0x0005) /*!< PF[4] pin */ +#define AFIO_EXTICR2_EXTI4_PG ((uint16_t)0x0006) /*!< PG[4] pin */ + +/* EXTI5 configuration */ +#define AFIO_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /*!< PA[5] pin */ +#define AFIO_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /*!< PB[5] pin */ +#define AFIO_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /*!< PC[5] pin */ +#define AFIO_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /*!< PD[5] pin */ +#define AFIO_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /*!< PE[5] pin */ +#define AFIO_EXTICR2_EXTI5_PF ((uint16_t)0x0050) /*!< PF[5] pin */ +#define AFIO_EXTICR2_EXTI5_PG ((uint16_t)0x0060) /*!< PG[5] pin */ + +/*!< EXTI6 configuration */ +#define AFIO_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /*!< PA[6] pin */ +#define AFIO_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /*!< PB[6] pin */ +#define AFIO_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /*!< PC[6] pin */ +#define AFIO_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /*!< PD[6] pin */ +#define AFIO_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /*!< PE[6] pin */ +#define AFIO_EXTICR2_EXTI6_PF ((uint16_t)0x0500) /*!< PF[6] pin */ +#define AFIO_EXTICR2_EXTI6_PG ((uint16_t)0x0600) /*!< PG[6] pin */ + +/*!< EXTI7 configuration */ +#define AFIO_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /*!< PA[7] pin */ +#define AFIO_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /*!< PB[7] pin */ +#define AFIO_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /*!< PC[7] pin */ +#define AFIO_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /*!< PD[7] pin */ +#define AFIO_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /*!< PE[7] pin */ +#define AFIO_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /*!< PF[7] pin */ +#define AFIO_EXTICR2_EXTI7_PG ((uint16_t)0x6000) /*!< PG[7] pin */ + +/***************** Bit definition for AFIO_EXTICR3 register *****************/ +#define AFIO_EXTICR3_EXTI8 ((uint16_t)0x000F) /*!< EXTI 8 configuration */ +#define AFIO_EXTICR3_EXTI9 ((uint16_t)0x00F0) /*!< EXTI 9 configuration */ +#define AFIO_EXTICR3_EXTI10 ((uint16_t)0x0F00) /*!< EXTI 10 configuration */ +#define AFIO_EXTICR3_EXTI11 ((uint16_t)0xF000) /*!< EXTI 11 configuration */ + +/*!< EXTI8 configuration */ +#define AFIO_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /*!< PA[8] pin */ +#define AFIO_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /*!< PB[8] pin */ +#define AFIO_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /*!< PC[8] pin */ +#define AFIO_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /*!< PD[8] pin */ +#define AFIO_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /*!< PE[8] pin */ +#define AFIO_EXTICR3_EXTI8_PF ((uint16_t)0x0005) /*!< PF[8] pin */ +#define AFIO_EXTICR3_EXTI8_PG ((uint16_t)0x0006) /*!< PG[8] pin */ + +/*!< EXTI9 configuration */ +#define AFIO_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /*!< PA[9] pin */ +#define AFIO_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /*!< PB[9] pin */ +#define AFIO_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /*!< PC[9] pin */ +#define AFIO_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /*!< PD[9] pin */ +#define AFIO_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /*!< PE[9] pin */ +#define AFIO_EXTICR3_EXTI9_PF ((uint16_t)0x0050) /*!< PF[9] pin */ +#define AFIO_EXTICR3_EXTI9_PG ((uint16_t)0x0060) /*!< PG[9] pin */ + +/*!< EXTI10 configuration */ +#define AFIO_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /*!< PA[10] pin */ +#define AFIO_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /*!< PB[10] pin */ +#define AFIO_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /*!< PC[10] pin */ +#define AFIO_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /*!< PD[10] pin */ +#define AFIO_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /*!< PE[10] pin */ +#define AFIO_EXTICR3_EXTI10_PF ((uint16_t)0x0500) /*!< PF[10] pin */ +#define AFIO_EXTICR3_EXTI10_PG ((uint16_t)0x0600) /*!< PG[10] pin */ + +/*!< EXTI11 configuration */ +#define AFIO_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /*!< PA[11] pin */ +#define AFIO_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /*!< PB[11] pin */ +#define AFIO_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /*!< PC[11] pin */ +#define AFIO_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /*!< PD[11] pin */ +#define AFIO_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /*!< PE[11] pin */ +#define AFIO_EXTICR3_EXTI11_PF ((uint16_t)0x5000) /*!< PF[11] pin */ +#define AFIO_EXTICR3_EXTI11_PG ((uint16_t)0x6000) /*!< PG[11] pin */ + +/***************** Bit definition for AFIO_EXTICR4 register *****************/ +#define AFIO_EXTICR4_EXTI12 ((uint16_t)0x000F) /*!< EXTI 12 configuration */ +#define AFIO_EXTICR4_EXTI13 ((uint16_t)0x00F0) /*!< EXTI 13 configuration */ +#define AFIO_EXTICR4_EXTI14 ((uint16_t)0x0F00) /*!< EXTI 14 configuration */ +#define AFIO_EXTICR4_EXTI15 ((uint16_t)0xF000) /*!< EXTI 15 configuration */ + +/* EXTI12 configuration */ +#define AFIO_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /*!< PA[12] pin */ +#define AFIO_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /*!< PB[12] pin */ +#define AFIO_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /*!< PC[12] pin */ +#define AFIO_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /*!< PD[12] pin */ +#define AFIO_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /*!< PE[12] pin */ +#define AFIO_EXTICR4_EXTI12_PF ((uint16_t)0x0005) /*!< PF[12] pin */ +#define AFIO_EXTICR4_EXTI12_PG ((uint16_t)0x0006) /*!< PG[12] pin */ + +/* EXTI13 configuration */ +#define AFIO_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /*!< PA[13] pin */ +#define AFIO_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /*!< PB[13] pin */ +#define AFIO_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /*!< PC[13] pin */ +#define AFIO_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /*!< PD[13] pin */ +#define AFIO_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /*!< PE[13] pin */ +#define AFIO_EXTICR4_EXTI13_PF ((uint16_t)0x0050) /*!< PF[13] pin */ +#define AFIO_EXTICR4_EXTI13_PG ((uint16_t)0x0060) /*!< PG[13] pin */ + +/*!< EXTI14 configuration */ +#define AFIO_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /*!< PA[14] pin */ +#define AFIO_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /*!< PB[14] pin */ +#define AFIO_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /*!< PC[14] pin */ +#define AFIO_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /*!< PD[14] pin */ +#define AFIO_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /*!< PE[14] pin */ +#define AFIO_EXTICR4_EXTI14_PF ((uint16_t)0x0500) /*!< PF[14] pin */ +#define AFIO_EXTICR4_EXTI14_PG ((uint16_t)0x0600) /*!< PG[14] pin */ + +/*!< EXTI15 configuration */ +#define AFIO_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /*!< PA[15] pin */ +#define AFIO_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /*!< PB[15] pin */ +#define AFIO_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /*!< PC[15] pin */ +#define AFIO_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /*!< PD[15] pin */ +#define AFIO_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /*!< PE[15] pin */ +#define AFIO_EXTICR4_EXTI15_PF ((uint16_t)0x5000) /*!< PF[15] pin */ +#define AFIO_EXTICR4_EXTI15_PG ((uint16_t)0x6000) /*!< PG[15] pin */ + +/******************************************************************************/ +/* */ +/* SystemTick */ +/* */ +/******************************************************************************/ + +/***************** Bit definition for SysTick_CTRL register *****************/ +#define SysTick_CTRL_ENABLE ((uint32_t)0x00000001) /*!< Counter enable */ +#define SysTick_CTRL_TICKINT ((uint32_t)0x00000002) /*!< Counting down to 0 pends the SysTick handler */ +#define SysTick_CTRL_CLKSOURCE ((uint32_t)0x00000004) /*!< Clock source */ +#define SysTick_CTRL_COUNTFLAG ((uint32_t)0x00010000) /*!< Count Flag */ + +/***************** Bit definition for SysTick_LOAD register *****************/ +#define SysTick_LOAD_RELOAD ((uint32_t)0x00FFFFFF) /*!< Value to load into the SysTick Current Value Register when the counter reaches 0 */ + +/***************** Bit definition for SysTick_VAL register ******************/ +#define SysTick_VAL_CURRENT ((uint32_t)0x00FFFFFF) /*!< Current value at the time the register is accessed */ + +/***************** Bit definition for SysTick_CALIB register ****************/ +#define SysTick_CALIB_TENMS ((uint32_t)0x00FFFFFF) /*!< Reload value to use for 10ms timing */ +#define SysTick_CALIB_SKEW ((uint32_t)0x40000000) /*!< Calibration value is not exactly 10 ms */ +#define SysTick_CALIB_NOREF ((uint32_t)0x80000000) /*!< The reference clock is not provided */ + +/******************************************************************************/ +/* */ +/* Nested Vectored Interrupt Controller */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for NVIC_ISER register *******************/ +#define NVIC_ISER_SETENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt set enable bits */ +#define NVIC_ISER_SETENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISER_SETENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISER_SETENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISER_SETENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISER_SETENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISER_SETENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISER_SETENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISER_SETENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISER_SETENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISER_SETENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISER_SETENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISER_SETENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISER_SETENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISER_SETENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISER_SETENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISER_SETENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISER_SETENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISER_SETENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISER_SETENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISER_SETENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISER_SETENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISER_SETENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISER_SETENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISER_SETENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISER_SETENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISER_SETENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISER_SETENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISER_SETENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISER_SETENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISER_SETENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISER_SETENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISER_SETENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICER register *******************/ +#define NVIC_ICER_CLRENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-enable bits */ +#define NVIC_ICER_CLRENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICER_CLRENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICER_CLRENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICER_CLRENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICER_CLRENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICER_CLRENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICER_CLRENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICER_CLRENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICER_CLRENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICER_CLRENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICER_CLRENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICER_CLRENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICER_CLRENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICER_CLRENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICER_CLRENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICER_CLRENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICER_CLRENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICER_CLRENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICER_CLRENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICER_CLRENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICER_CLRENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICER_CLRENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICER_CLRENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICER_CLRENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICER_CLRENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICER_CLRENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICER_CLRENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICER_CLRENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICER_CLRENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICER_CLRENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICER_CLRENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICER_CLRENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ISPR register *******************/ +#define NVIC_ISPR_SETPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt set-pending bits */ +#define NVIC_ISPR_SETPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISPR_SETPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISPR_SETPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISPR_SETPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISPR_SETPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISPR_SETPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISPR_SETPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISPR_SETPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISPR_SETPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISPR_SETPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISPR_SETPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISPR_SETPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISPR_SETPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISPR_SETPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISPR_SETPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISPR_SETPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISPR_SETPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISPR_SETPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISPR_SETPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISPR_SETPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISPR_SETPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISPR_SETPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISPR_SETPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISPR_SETPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISPR_SETPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISPR_SETPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISPR_SETPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISPR_SETPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISPR_SETPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISPR_SETPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISPR_SETPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISPR_SETPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICPR register *******************/ +#define NVIC_ICPR_CLRPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-pending bits */ +#define NVIC_ICPR_CLRPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICPR_CLRPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICPR_CLRPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICPR_CLRPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICPR_CLRPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICPR_CLRPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICPR_CLRPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICPR_CLRPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICPR_CLRPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICPR_CLRPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICPR_CLRPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICPR_CLRPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICPR_CLRPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICPR_CLRPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICPR_CLRPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICPR_CLRPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICPR_CLRPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICPR_CLRPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICPR_CLRPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICPR_CLRPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICPR_CLRPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICPR_CLRPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICPR_CLRPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICPR_CLRPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICPR_CLRPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICPR_CLRPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICPR_CLRPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICPR_CLRPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICPR_CLRPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICPR_CLRPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICPR_CLRPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICPR_CLRPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_IABR register *******************/ +#define NVIC_IABR_ACTIVE ((uint32_t)0xFFFFFFFF) /*!< Interrupt active flags */ +#define NVIC_IABR_ACTIVE_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_IABR_ACTIVE_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_IABR_ACTIVE_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_IABR_ACTIVE_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_IABR_ACTIVE_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_IABR_ACTIVE_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_IABR_ACTIVE_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_IABR_ACTIVE_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_IABR_ACTIVE_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_IABR_ACTIVE_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_IABR_ACTIVE_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_IABR_ACTIVE_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_IABR_ACTIVE_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_IABR_ACTIVE_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_IABR_ACTIVE_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_IABR_ACTIVE_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_IABR_ACTIVE_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_IABR_ACTIVE_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_IABR_ACTIVE_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_IABR_ACTIVE_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_IABR_ACTIVE_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_IABR_ACTIVE_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_IABR_ACTIVE_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_IABR_ACTIVE_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_IABR_ACTIVE_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_IABR_ACTIVE_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_IABR_ACTIVE_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_IABR_ACTIVE_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_IABR_ACTIVE_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_IABR_ACTIVE_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_IABR_ACTIVE_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_IABR_ACTIVE_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_PRI0 register *******************/ +#define NVIC_IPR0_PRI_0 ((uint32_t)0x000000FF) /*!< Priority of interrupt 0 */ +#define NVIC_IPR0_PRI_1 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 1 */ +#define NVIC_IPR0_PRI_2 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 2 */ +#define NVIC_IPR0_PRI_3 ((uint32_t)0xFF000000) /*!< Priority of interrupt 3 */ + +/****************** Bit definition for NVIC_PRI1 register *******************/ +#define NVIC_IPR1_PRI_4 ((uint32_t)0x000000FF) /*!< Priority of interrupt 4 */ +#define NVIC_IPR1_PRI_5 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 5 */ +#define NVIC_IPR1_PRI_6 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 6 */ +#define NVIC_IPR1_PRI_7 ((uint32_t)0xFF000000) /*!< Priority of interrupt 7 */ + +/****************** Bit definition for NVIC_PRI2 register *******************/ +#define NVIC_IPR2_PRI_8 ((uint32_t)0x000000FF) /*!< Priority of interrupt 8 */ +#define NVIC_IPR2_PRI_9 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 9 */ +#define NVIC_IPR2_PRI_10 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 10 */ +#define NVIC_IPR2_PRI_11 ((uint32_t)0xFF000000) /*!< Priority of interrupt 11 */ + +/****************** Bit definition for NVIC_PRI3 register *******************/ +#define NVIC_IPR3_PRI_12 ((uint32_t)0x000000FF) /*!< Priority of interrupt 12 */ +#define NVIC_IPR3_PRI_13 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 13 */ +#define NVIC_IPR3_PRI_14 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 14 */ +#define NVIC_IPR3_PRI_15 ((uint32_t)0xFF000000) /*!< Priority of interrupt 15 */ + +/****************** Bit definition for NVIC_PRI4 register *******************/ +#define NVIC_IPR4_PRI_16 ((uint32_t)0x000000FF) /*!< Priority of interrupt 16 */ +#define NVIC_IPR4_PRI_17 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 17 */ +#define NVIC_IPR4_PRI_18 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 18 */ +#define NVIC_IPR4_PRI_19 ((uint32_t)0xFF000000) /*!< Priority of interrupt 19 */ + +/****************** Bit definition for NVIC_PRI5 register *******************/ +#define NVIC_IPR5_PRI_20 ((uint32_t)0x000000FF) /*!< Priority of interrupt 20 */ +#define NVIC_IPR5_PRI_21 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 21 */ +#define NVIC_IPR5_PRI_22 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 22 */ +#define NVIC_IPR5_PRI_23 ((uint32_t)0xFF000000) /*!< Priority of interrupt 23 */ + +/****************** Bit definition for NVIC_PRI6 register *******************/ +#define NVIC_IPR6_PRI_24 ((uint32_t)0x000000FF) /*!< Priority of interrupt 24 */ +#define NVIC_IPR6_PRI_25 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 25 */ +#define NVIC_IPR6_PRI_26 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 26 */ +#define NVIC_IPR6_PRI_27 ((uint32_t)0xFF000000) /*!< Priority of interrupt 27 */ + +/****************** Bit definition for NVIC_PRI7 register *******************/ +#define NVIC_IPR7_PRI_28 ((uint32_t)0x000000FF) /*!< Priority of interrupt 28 */ +#define NVIC_IPR7_PRI_29 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 29 */ +#define NVIC_IPR7_PRI_30 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 30 */ +#define NVIC_IPR7_PRI_31 ((uint32_t)0xFF000000) /*!< Priority of interrupt 31 */ + +/****************** Bit definition for SCB_CPUID register *******************/ +#define SCB_CPUID_REVISION ((uint32_t)0x0000000F) /*!< Implementation defined revision number */ +#define SCB_CPUID_PARTNO ((uint32_t)0x0000FFF0) /*!< Number of processor within family */ +#define SCB_CPUID_Constant ((uint32_t)0x000F0000) /*!< Reads as 0x0F */ +#define SCB_CPUID_VARIANT ((uint32_t)0x00F00000) /*!< Implementation defined variant number */ +#define SCB_CPUID_IMPLEMENTER ((uint32_t)0xFF000000) /*!< Implementer code. ARM is 0x41 */ + +/******************* Bit definition for SCB_ICSR register *******************/ +#define SCB_ICSR_VECTACTIVE ((uint32_t)0x000001FF) /*!< Active ISR number field */ +#define SCB_ICSR_RETTOBASE ((uint32_t)0x00000800) /*!< All active exceptions minus the IPSR_current_exception yields the empty set */ +#define SCB_ICSR_VECTPENDING ((uint32_t)0x003FF000) /*!< Pending ISR number field */ +#define SCB_ICSR_ISRPENDING ((uint32_t)0x00400000) /*!< Interrupt pending flag */ +#define SCB_ICSR_ISRPREEMPT ((uint32_t)0x00800000) /*!< It indicates that a pending interrupt becomes active in the next running cycle */ +#define SCB_ICSR_PENDSTCLR ((uint32_t)0x02000000) /*!< Clear pending SysTick bit */ +#define SCB_ICSR_PENDSTSET ((uint32_t)0x04000000) /*!< Set pending SysTick bit */ +#define SCB_ICSR_PENDSVCLR ((uint32_t)0x08000000) /*!< Clear pending pendSV bit */ +#define SCB_ICSR_PENDSVSET ((uint32_t)0x10000000) /*!< Set pending pendSV bit */ +#define SCB_ICSR_NMIPENDSET ((uint32_t)0x80000000) /*!< Set pending NMI bit */ + +/******************* Bit definition for SCB_VTOR register *******************/ +#define SCB_VTOR_TBLOFF ((uint32_t)0x1FFFFF80) /*!< Vector table base offset field */ +#define SCB_VTOR_TBLBASE ((uint32_t)0x20000000) /*!< Table base in code(0) or RAM(1) */ + +/*!<***************** Bit definition for SCB_AIRCR register *******************/ +#define SCB_AIRCR_VECTRESET ((uint32_t)0x00000001) /*!< System Reset bit */ +#define SCB_AIRCR_VECTCLRACTIVE ((uint32_t)0x00000002) /*!< Clear active vector bit */ +#define SCB_AIRCR_SYSRESETREQ ((uint32_t)0x00000004) /*!< Requests chip control logic to generate a reset */ + +#define SCB_AIRCR_PRIGROUP ((uint32_t)0x00000700) /*!< PRIGROUP[2:0] bits (Priority group) */ +#define SCB_AIRCR_PRIGROUP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define SCB_AIRCR_PRIGROUP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define SCB_AIRCR_PRIGROUP_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +/* prority group configuration */ +#define SCB_AIRCR_PRIGROUP0 ((uint32_t)0x00000000) /*!< Priority group=0 (7 bits of pre-emption priority, 1 bit of subpriority) */ +#define SCB_AIRCR_PRIGROUP1 ((uint32_t)0x00000100) /*!< Priority group=1 (6 bits of pre-emption priority, 2 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP2 ((uint32_t)0x00000200) /*!< Priority group=2 (5 bits of pre-emption priority, 3 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP3 ((uint32_t)0x00000300) /*!< Priority group=3 (4 bits of pre-emption priority, 4 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP4 ((uint32_t)0x00000400) /*!< Priority group=4 (3 bits of pre-emption priority, 5 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP5 ((uint32_t)0x00000500) /*!< Priority group=5 (2 bits of pre-emption priority, 6 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP6 ((uint32_t)0x00000600) /*!< Priority group=6 (1 bit of pre-emption priority, 7 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP7 ((uint32_t)0x00000700) /*!< Priority group=7 (no pre-emption priority, 8 bits of subpriority) */ + +#define SCB_AIRCR_ENDIANESS ((uint32_t)0x00008000) /*!< Data endianness bit */ +#define SCB_AIRCR_VECTKEY ((uint32_t)0xFFFF0000) /*!< Register key (VECTKEY) - Reads as 0xFA05 (VECTKEYSTAT) */ + +/******************* Bit definition for SCB_SCR register ********************/ +#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< Sleep on exit bit */ +#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< Sleep deep bit */ +#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< Wake up from WFE */ + +/******************** Bit definition for SCB_CCR register *******************/ +#define SCB_CCR_NONBASETHRDENA ((uint16_t)0x0001) /*!< Thread mode can be entered from any level in Handler mode by controlled return value */ +#define SCB_CCR_USERSETMPEND ((uint16_t)0x0002) /*!< Enables user code to write the Software Trigger Interrupt register to trigger (pend) a Main exception */ +#define SCB_CCR_UNALIGN_TRP ((uint16_t)0x0008) /*!< Trap for unaligned access */ +#define SCB_CCR_DIV_0_TRP ((uint16_t)0x0010) /*!< Trap on Divide by 0 */ +#define SCB_CCR_BFHFNMIGN ((uint16_t)0x0100) /*!< Handlers running at priority -1 and -2 */ +#define SCB_CCR_STKALIGN ((uint16_t)0x0200) /*!< On exception entry, the SP used prior to the exception is adjusted to be 8-byte aligned */ + +/******************* Bit definition for SCB_SHPR register ********************/ +#define SCB_SHPR_PRI_N ((uint32_t)0x000000FF) /*!< Priority of system handler 4,8, and 12. Mem Manage, reserved and Debug Monitor */ +#define SCB_SHPR_PRI_N1 ((uint32_t)0x0000FF00) /*!< Priority of system handler 5,9, and 13. Bus Fault, reserved and reserved */ +#define SCB_SHPR_PRI_N2 ((uint32_t)0x00FF0000) /*!< Priority of system handler 6,10, and 14. Usage Fault, reserved and PendSV */ +#define SCB_SHPR_PRI_N3 ((uint32_t)0xFF000000) /*!< Priority of system handler 7,11, and 15. Reserved, SVCall and SysTick */ + +/****************** Bit definition for SCB_SHCSR register *******************/ +#define SCB_SHCSR_MEMFAULTACT ((uint32_t)0x00000001) /*!< MemManage is active */ +#define SCB_SHCSR_BUSFAULTACT ((uint32_t)0x00000002) /*!< BusFault is active */ +#define SCB_SHCSR_USGFAULTACT ((uint32_t)0x00000008) /*!< UsageFault is active */ +#define SCB_SHCSR_SVCALLACT ((uint32_t)0x00000080) /*!< SVCall is active */ +#define SCB_SHCSR_MONITORACT ((uint32_t)0x00000100) /*!< Monitor is active */ +#define SCB_SHCSR_PENDSVACT ((uint32_t)0x00000400) /*!< PendSV is active */ +#define SCB_SHCSR_SYSTICKACT ((uint32_t)0x00000800) /*!< SysTick is active */ +#define SCB_SHCSR_USGFAULTPENDED ((uint32_t)0x00001000) /*!< Usage Fault is pended */ +#define SCB_SHCSR_MEMFAULTPENDED ((uint32_t)0x00002000) /*!< MemManage is pended */ +#define SCB_SHCSR_BUSFAULTPENDED ((uint32_t)0x00004000) /*!< Bus Fault is pended */ +#define SCB_SHCSR_SVCALLPENDED ((uint32_t)0x00008000) /*!< SVCall is pended */ +#define SCB_SHCSR_MEMFAULTENA ((uint32_t)0x00010000) /*!< MemManage enable */ +#define SCB_SHCSR_BUSFAULTENA ((uint32_t)0x00020000) /*!< Bus Fault enable */ +#define SCB_SHCSR_USGFAULTENA ((uint32_t)0x00040000) /*!< UsageFault enable */ + +/******************* Bit definition for SCB_CFSR register *******************/ +/*!< MFSR */ +#define SCB_CFSR_IACCVIOL ((uint32_t)0x00000001) /*!< Instruction access violation */ +#define SCB_CFSR_DACCVIOL ((uint32_t)0x00000002) /*!< Data access violation */ +#define SCB_CFSR_MUNSTKERR ((uint32_t)0x00000008) /*!< Unstacking error */ +#define SCB_CFSR_MSTKERR ((uint32_t)0x00000010) /*!< Stacking error */ +#define SCB_CFSR_MMARVALID ((uint32_t)0x00000080) /*!< Memory Manage Address Register address valid flag */ +/*!< BFSR */ +#define SCB_CFSR_IBUSERR ((uint32_t)0x00000100) /*!< Instruction bus error flag */ +#define SCB_CFSR_PRECISERR ((uint32_t)0x00000200) /*!< Precise data bus error */ +#define SCB_CFSR_IMPRECISERR ((uint32_t)0x00000400) /*!< Imprecise data bus error */ +#define SCB_CFSR_UNSTKERR ((uint32_t)0x00000800) /*!< Unstacking error */ +#define SCB_CFSR_STKERR ((uint32_t)0x00001000) /*!< Stacking error */ +#define SCB_CFSR_BFARVALID ((uint32_t)0x00008000) /*!< Bus Fault Address Register address valid flag */ +/*!< UFSR */ +#define SCB_CFSR_UNDEFINSTR ((uint32_t)0x00010000) /*!< The processor attempt to excecute an undefined instruction */ +#define SCB_CFSR_INVSTATE ((uint32_t)0x00020000) /*!< Invalid combination of EPSR and instruction */ +#define SCB_CFSR_INVPC ((uint32_t)0x00040000) /*!< Attempt to load EXC_RETURN into pc illegally */ +#define SCB_CFSR_NOCP ((uint32_t)0x00080000) /*!< Attempt to use a coprocessor instruction */ +#define SCB_CFSR_UNALIGNED ((uint32_t)0x01000000) /*!< Fault occurs when there is an attempt to make an unaligned memory access */ +#define SCB_CFSR_DIVBYZERO ((uint32_t)0x02000000) /*!< Fault occurs when SDIV or DIV instruction is used with a divisor of 0 */ + +/******************* Bit definition for SCB_HFSR register *******************/ +#define SCB_HFSR_VECTTBL ((uint32_t)0x00000002) /*!< Fault occures because of vector table read on exception processing */ +#define SCB_HFSR_FORCED ((uint32_t)0x40000000) /*!< Hard Fault activated when a configurable Fault was received and cannot activate */ +#define SCB_HFSR_DEBUGEVT ((uint32_t)0x80000000) /*!< Fault related to debug */ + +/******************* Bit definition for SCB_DFSR register *******************/ +#define SCB_DFSR_HALTED ((uint8_t)0x01) /*!< Halt request flag */ +#define SCB_DFSR_BKPT ((uint8_t)0x02) /*!< BKPT flag */ +#define SCB_DFSR_DWTTRAP ((uint8_t)0x04) /*!< Data Watchpoint and Trace (DWT) flag */ +#define SCB_DFSR_VCATCH ((uint8_t)0x08) /*!< Vector catch flag */ +#define SCB_DFSR_EXTERNAL ((uint8_t)0x10) /*!< External debug request flag */ + +/******************* Bit definition for SCB_MMFAR register ******************/ +#define SCB_MMFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Mem Manage fault address field */ + +/******************* Bit definition for SCB_BFAR register *******************/ +#define SCB_BFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Bus fault address field */ + +/******************* Bit definition for SCB_afsr register *******************/ +#define SCB_AFSR_IMPDEF ((uint32_t)0xFFFFFFFF) /*!< Implementation defined */ + +/******************************************************************************/ +/* */ +/* External Interrupt/Event Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for EXTI_IMR register *******************/ +#define EXTI_IMR_MR0 ((uint32_t)0x00000001) /*!< Interrupt Mask on line 0 */ +#define EXTI_IMR_MR1 ((uint32_t)0x00000002) /*!< Interrupt Mask on line 1 */ +#define EXTI_IMR_MR2 ((uint32_t)0x00000004) /*!< Interrupt Mask on line 2 */ +#define EXTI_IMR_MR3 ((uint32_t)0x00000008) /*!< Interrupt Mask on line 3 */ +#define EXTI_IMR_MR4 ((uint32_t)0x00000010) /*!< Interrupt Mask on line 4 */ +#define EXTI_IMR_MR5 ((uint32_t)0x00000020) /*!< Interrupt Mask on line 5 */ +#define EXTI_IMR_MR6 ((uint32_t)0x00000040) /*!< Interrupt Mask on line 6 */ +#define EXTI_IMR_MR7 ((uint32_t)0x00000080) /*!< Interrupt Mask on line 7 */ +#define EXTI_IMR_MR8 ((uint32_t)0x00000100) /*!< Interrupt Mask on line 8 */ +#define EXTI_IMR_MR9 ((uint32_t)0x00000200) /*!< Interrupt Mask on line 9 */ +#define EXTI_IMR_MR10 ((uint32_t)0x00000400) /*!< Interrupt Mask on line 10 */ +#define EXTI_IMR_MR11 ((uint32_t)0x00000800) /*!< Interrupt Mask on line 11 */ +#define EXTI_IMR_MR12 ((uint32_t)0x00001000) /*!< Interrupt Mask on line 12 */ +#define EXTI_IMR_MR13 ((uint32_t)0x00002000) /*!< Interrupt Mask on line 13 */ +#define EXTI_IMR_MR14 ((uint32_t)0x00004000) /*!< Interrupt Mask on line 14 */ +#define EXTI_IMR_MR15 ((uint32_t)0x00008000) /*!< Interrupt Mask on line 15 */ +#define EXTI_IMR_MR16 ((uint32_t)0x00010000) /*!< Interrupt Mask on line 16 */ +#define EXTI_IMR_MR17 ((uint32_t)0x00020000) /*!< Interrupt Mask on line 17 */ +#define EXTI_IMR_MR18 ((uint32_t)0x00040000) /*!< Interrupt Mask on line 18 */ +#define EXTI_IMR_MR19 ((uint32_t)0x00080000) /*!< Interrupt Mask on line 19 */ + +/******************* Bit definition for EXTI_EMR register *******************/ +#define EXTI_EMR_MR0 ((uint32_t)0x00000001) /*!< Event Mask on line 0 */ +#define EXTI_EMR_MR1 ((uint32_t)0x00000002) /*!< Event Mask on line 1 */ +#define EXTI_EMR_MR2 ((uint32_t)0x00000004) /*!< Event Mask on line 2 */ +#define EXTI_EMR_MR3 ((uint32_t)0x00000008) /*!< Event Mask on line 3 */ +#define EXTI_EMR_MR4 ((uint32_t)0x00000010) /*!< Event Mask on line 4 */ +#define EXTI_EMR_MR5 ((uint32_t)0x00000020) /*!< Event Mask on line 5 */ +#define EXTI_EMR_MR6 ((uint32_t)0x00000040) /*!< Event Mask on line 6 */ +#define EXTI_EMR_MR7 ((uint32_t)0x00000080) /*!< Event Mask on line 7 */ +#define EXTI_EMR_MR8 ((uint32_t)0x00000100) /*!< Event Mask on line 8 */ +#define EXTI_EMR_MR9 ((uint32_t)0x00000200) /*!< Event Mask on line 9 */ +#define EXTI_EMR_MR10 ((uint32_t)0x00000400) /*!< Event Mask on line 10 */ +#define EXTI_EMR_MR11 ((uint32_t)0x00000800) /*!< Event Mask on line 11 */ +#define EXTI_EMR_MR12 ((uint32_t)0x00001000) /*!< Event Mask on line 12 */ +#define EXTI_EMR_MR13 ((uint32_t)0x00002000) /*!< Event Mask on line 13 */ +#define EXTI_EMR_MR14 ((uint32_t)0x00004000) /*!< Event Mask on line 14 */ +#define EXTI_EMR_MR15 ((uint32_t)0x00008000) /*!< Event Mask on line 15 */ +#define EXTI_EMR_MR16 ((uint32_t)0x00010000) /*!< Event Mask on line 16 */ +#define EXTI_EMR_MR17 ((uint32_t)0x00020000) /*!< Event Mask on line 17 */ +#define EXTI_EMR_MR18 ((uint32_t)0x00040000) /*!< Event Mask on line 18 */ +#define EXTI_EMR_MR19 ((uint32_t)0x00080000) /*!< Event Mask on line 19 */ + +/****************** Bit definition for EXTI_RTSR register *******************/ +#define EXTI_RTSR_TR0 ((uint32_t)0x00000001) /*!< Rising trigger event configuration bit of line 0 */ +#define EXTI_RTSR_TR1 ((uint32_t)0x00000002) /*!< Rising trigger event configuration bit of line 1 */ +#define EXTI_RTSR_TR2 ((uint32_t)0x00000004) /*!< Rising trigger event configuration bit of line 2 */ +#define EXTI_RTSR_TR3 ((uint32_t)0x00000008) /*!< Rising trigger event configuration bit of line 3 */ +#define EXTI_RTSR_TR4 ((uint32_t)0x00000010) /*!< Rising trigger event configuration bit of line 4 */ +#define EXTI_RTSR_TR5 ((uint32_t)0x00000020) /*!< Rising trigger event configuration bit of line 5 */ +#define EXTI_RTSR_TR6 ((uint32_t)0x00000040) /*!< Rising trigger event configuration bit of line 6 */ +#define EXTI_RTSR_TR7 ((uint32_t)0x00000080) /*!< Rising trigger event configuration bit of line 7 */ +#define EXTI_RTSR_TR8 ((uint32_t)0x00000100) /*!< Rising trigger event configuration bit of line 8 */ +#define EXTI_RTSR_TR9 ((uint32_t)0x00000200) /*!< Rising trigger event configuration bit of line 9 */ +#define EXTI_RTSR_TR10 ((uint32_t)0x00000400) /*!< Rising trigger event configuration bit of line 10 */ +#define EXTI_RTSR_TR11 ((uint32_t)0x00000800) /*!< Rising trigger event configuration bit of line 11 */ +#define EXTI_RTSR_TR12 ((uint32_t)0x00001000) /*!< Rising trigger event configuration bit of line 12 */ +#define EXTI_RTSR_TR13 ((uint32_t)0x00002000) /*!< Rising trigger event configuration bit of line 13 */ +#define EXTI_RTSR_TR14 ((uint32_t)0x00004000) /*!< Rising trigger event configuration bit of line 14 */ +#define EXTI_RTSR_TR15 ((uint32_t)0x00008000) /*!< Rising trigger event configuration bit of line 15 */ +#define EXTI_RTSR_TR16 ((uint32_t)0x00010000) /*!< Rising trigger event configuration bit of line 16 */ +#define EXTI_RTSR_TR17 ((uint32_t)0x00020000) /*!< Rising trigger event configuration bit of line 17 */ +#define EXTI_RTSR_TR18 ((uint32_t)0x00040000) /*!< Rising trigger event configuration bit of line 18 */ +#define EXTI_RTSR_TR19 ((uint32_t)0x00080000) /*!< Rising trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_FTSR register *******************/ +#define EXTI_FTSR_TR0 ((uint32_t)0x00000001) /*!< Falling trigger event configuration bit of line 0 */ +#define EXTI_FTSR_TR1 ((uint32_t)0x00000002) /*!< Falling trigger event configuration bit of line 1 */ +#define EXTI_FTSR_TR2 ((uint32_t)0x00000004) /*!< Falling trigger event configuration bit of line 2 */ +#define EXTI_FTSR_TR3 ((uint32_t)0x00000008) /*!< Falling trigger event configuration bit of line 3 */ +#define EXTI_FTSR_TR4 ((uint32_t)0x00000010) /*!< Falling trigger event configuration bit of line 4 */ +#define EXTI_FTSR_TR5 ((uint32_t)0x00000020) /*!< Falling trigger event configuration bit of line 5 */ +#define EXTI_FTSR_TR6 ((uint32_t)0x00000040) /*!< Falling trigger event configuration bit of line 6 */ +#define EXTI_FTSR_TR7 ((uint32_t)0x00000080) /*!< Falling trigger event configuration bit of line 7 */ +#define EXTI_FTSR_TR8 ((uint32_t)0x00000100) /*!< Falling trigger event configuration bit of line 8 */ +#define EXTI_FTSR_TR9 ((uint32_t)0x00000200) /*!< Falling trigger event configuration bit of line 9 */ +#define EXTI_FTSR_TR10 ((uint32_t)0x00000400) /*!< Falling trigger event configuration bit of line 10 */ +#define EXTI_FTSR_TR11 ((uint32_t)0x00000800) /*!< Falling trigger event configuration bit of line 11 */ +#define EXTI_FTSR_TR12 ((uint32_t)0x00001000) /*!< Falling trigger event configuration bit of line 12 */ +#define EXTI_FTSR_TR13 ((uint32_t)0x00002000) /*!< Falling trigger event configuration bit of line 13 */ +#define EXTI_FTSR_TR14 ((uint32_t)0x00004000) /*!< Falling trigger event configuration bit of line 14 */ +#define EXTI_FTSR_TR15 ((uint32_t)0x00008000) /*!< Falling trigger event configuration bit of line 15 */ +#define EXTI_FTSR_TR16 ((uint32_t)0x00010000) /*!< Falling trigger event configuration bit of line 16 */ +#define EXTI_FTSR_TR17 ((uint32_t)0x00020000) /*!< Falling trigger event configuration bit of line 17 */ +#define EXTI_FTSR_TR18 ((uint32_t)0x00040000) /*!< Falling trigger event configuration bit of line 18 */ +#define EXTI_FTSR_TR19 ((uint32_t)0x00080000) /*!< Falling trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_SWIER register ******************/ +#define EXTI_SWIER_SWIER0 ((uint32_t)0x00000001) /*!< Software Interrupt on line 0 */ +#define EXTI_SWIER_SWIER1 ((uint32_t)0x00000002) /*!< Software Interrupt on line 1 */ +#define EXTI_SWIER_SWIER2 ((uint32_t)0x00000004) /*!< Software Interrupt on line 2 */ +#define EXTI_SWIER_SWIER3 ((uint32_t)0x00000008) /*!< Software Interrupt on line 3 */ +#define EXTI_SWIER_SWIER4 ((uint32_t)0x00000010) /*!< Software Interrupt on line 4 */ +#define EXTI_SWIER_SWIER5 ((uint32_t)0x00000020) /*!< Software Interrupt on line 5 */ +#define EXTI_SWIER_SWIER6 ((uint32_t)0x00000040) /*!< Software Interrupt on line 6 */ +#define EXTI_SWIER_SWIER7 ((uint32_t)0x00000080) /*!< Software Interrupt on line 7 */ +#define EXTI_SWIER_SWIER8 ((uint32_t)0x00000100) /*!< Software Interrupt on line 8 */ +#define EXTI_SWIER_SWIER9 ((uint32_t)0x00000200) /*!< Software Interrupt on line 9 */ +#define EXTI_SWIER_SWIER10 ((uint32_t)0x00000400) /*!< Software Interrupt on line 10 */ +#define EXTI_SWIER_SWIER11 ((uint32_t)0x00000800) /*!< Software Interrupt on line 11 */ +#define EXTI_SWIER_SWIER12 ((uint32_t)0x00001000) /*!< Software Interrupt on line 12 */ +#define EXTI_SWIER_SWIER13 ((uint32_t)0x00002000) /*!< Software Interrupt on line 13 */ +#define EXTI_SWIER_SWIER14 ((uint32_t)0x00004000) /*!< Software Interrupt on line 14 */ +#define EXTI_SWIER_SWIER15 ((uint32_t)0x00008000) /*!< Software Interrupt on line 15 */ +#define EXTI_SWIER_SWIER16 ((uint32_t)0x00010000) /*!< Software Interrupt on line 16 */ +#define EXTI_SWIER_SWIER17 ((uint32_t)0x00020000) /*!< Software Interrupt on line 17 */ +#define EXTI_SWIER_SWIER18 ((uint32_t)0x00040000) /*!< Software Interrupt on line 18 */ +#define EXTI_SWIER_SWIER19 ((uint32_t)0x00080000) /*!< Software Interrupt on line 19 */ + +/******************* Bit definition for EXTI_PR register ********************/ +#define EXTI_PR_PR0 ((uint32_t)0x00000001) /*!< Pending bit for line 0 */ +#define EXTI_PR_PR1 ((uint32_t)0x00000002) /*!< Pending bit for line 1 */ +#define EXTI_PR_PR2 ((uint32_t)0x00000004) /*!< Pending bit for line 2 */ +#define EXTI_PR_PR3 ((uint32_t)0x00000008) /*!< Pending bit for line 3 */ +#define EXTI_PR_PR4 ((uint32_t)0x00000010) /*!< Pending bit for line 4 */ +#define EXTI_PR_PR5 ((uint32_t)0x00000020) /*!< Pending bit for line 5 */ +#define EXTI_PR_PR6 ((uint32_t)0x00000040) /*!< Pending bit for line 6 */ +#define EXTI_PR_PR7 ((uint32_t)0x00000080) /*!< Pending bit for line 7 */ +#define EXTI_PR_PR8 ((uint32_t)0x00000100) /*!< Pending bit for line 8 */ +#define EXTI_PR_PR9 ((uint32_t)0x00000200) /*!< Pending bit for line 9 */ +#define EXTI_PR_PR10 ((uint32_t)0x00000400) /*!< Pending bit for line 10 */ +#define EXTI_PR_PR11 ((uint32_t)0x00000800) /*!< Pending bit for line 11 */ +#define EXTI_PR_PR12 ((uint32_t)0x00001000) /*!< Pending bit for line 12 */ +#define EXTI_PR_PR13 ((uint32_t)0x00002000) /*!< Pending bit for line 13 */ +#define EXTI_PR_PR14 ((uint32_t)0x00004000) /*!< Pending bit for line 14 */ +#define EXTI_PR_PR15 ((uint32_t)0x00008000) /*!< Pending bit for line 15 */ +#define EXTI_PR_PR16 ((uint32_t)0x00010000) /*!< Pending bit for line 16 */ +#define EXTI_PR_PR17 ((uint32_t)0x00020000) /*!< Pending bit for line 17 */ +#define EXTI_PR_PR18 ((uint32_t)0x00040000) /*!< Pending bit for line 18 */ +#define EXTI_PR_PR19 ((uint32_t)0x00080000) /*!< Pending bit for line 19 */ + +/******************************************************************************/ +/* */ +/* DMA Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for DMA_ISR register ********************/ +#define DMA_ISR_GIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt flag */ +#define DMA_ISR_TCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete flag */ +#define DMA_ISR_HTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer flag */ +#define DMA_ISR_TEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error flag */ +#define DMA_ISR_GIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt flag */ +#define DMA_ISR_TCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete flag */ +#define DMA_ISR_HTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer flag */ +#define DMA_ISR_TEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error flag */ +#define DMA_ISR_GIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt flag */ +#define DMA_ISR_TCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete flag */ +#define DMA_ISR_HTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer flag */ +#define DMA_ISR_TEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error flag */ +#define DMA_ISR_GIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt flag */ +#define DMA_ISR_TCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete flag */ +#define DMA_ISR_HTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer flag */ +#define DMA_ISR_TEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error flag */ +#define DMA_ISR_GIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt flag */ +#define DMA_ISR_TCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete flag */ +#define DMA_ISR_HTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer flag */ +#define DMA_ISR_TEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error flag */ +#define DMA_ISR_GIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt flag */ +#define DMA_ISR_TCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete flag */ +#define DMA_ISR_HTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer flag */ +#define DMA_ISR_TEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error flag */ +#define DMA_ISR_GIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt flag */ +#define DMA_ISR_TCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete flag */ +#define DMA_ISR_HTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer flag */ +#define DMA_ISR_TEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error flag */ + +/******************* Bit definition for DMA_IFCR register *******************/ +#define DMA_IFCR_CGIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt clearr */ +#define DMA_IFCR_CTCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete clear */ +#define DMA_IFCR_CHTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer clear */ +#define DMA_IFCR_CTEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error clear */ +#define DMA_IFCR_CGIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt clear */ +#define DMA_IFCR_CTCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete clear */ +#define DMA_IFCR_CHTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer clear */ +#define DMA_IFCR_CTEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error clear */ +#define DMA_IFCR_CGIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt clear */ +#define DMA_IFCR_CTCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete clear */ +#define DMA_IFCR_CHTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer clear */ +#define DMA_IFCR_CTEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error clear */ +#define DMA_IFCR_CGIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt clear */ +#define DMA_IFCR_CTCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete clear */ +#define DMA_IFCR_CHTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer clear */ +#define DMA_IFCR_CTEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error clear */ +#define DMA_IFCR_CGIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt clear */ +#define DMA_IFCR_CTCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete clear */ +#define DMA_IFCR_CHTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer clear */ +#define DMA_IFCR_CTEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error clear */ +#define DMA_IFCR_CGIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt clear */ +#define DMA_IFCR_CTCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete clear */ +#define DMA_IFCR_CHTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer clear */ +#define DMA_IFCR_CTEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error clear */ +#define DMA_IFCR_CGIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt clear */ +#define DMA_IFCR_CTCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete clear */ +#define DMA_IFCR_CHTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer clear */ +#define DMA_IFCR_CTEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error clear */ + +/******************* Bit definition for DMA_CCR1 register *******************/ +#define DMA_CCR1_EN ((uint16_t)0x0001) /*!< Channel enable*/ +#define DMA_CCR1_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR1_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR1_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR1_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR1_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR1_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR1_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR1_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR1_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR1_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR1_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR1_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR1_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR1_PL ((uint16_t)0x3000) /*!< PL[1:0] bits(Channel Priority level) */ +#define DMA_CCR1_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR1_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR1_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR2 register *******************/ +#define DMA_CCR2_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR2_TCIE ((uint16_t)0x0002) /*!< ransfer complete interrupt enable */ +#define DMA_CCR2_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR2_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR2_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR2_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR2_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR2_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR2_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR2_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR2_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR2_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR2_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR2_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR2_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR2_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR2_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR2_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR3 register *******************/ +#define DMA_CCR3_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR3_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR3_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR3_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR3_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR3_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR3_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR3_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR3_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR3_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR3_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR3_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR3_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR3_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR3_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR3_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR3_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR3_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/*!<****************** Bit definition for DMA_CCR4 register *******************/ +#define DMA_CCR4_EN ((uint16_t)0x0001) /*!
© COPYRIGHT 2009 STMicroelectronics
+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f10x_system + * @{ + */ + +/** @addtogroup STM32F10x_System_Private_Includes + * @{ + */ + +#include "stm32f10x.h" + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Defines + * @{ + */ + +/*!< Uncomment the line corresponding to the desired System clock (SYSCLK) + frequency (after reset the HSI is used as SYSCLK source) + + IMPORTANT NOTE: + ============== + 1. After each device reset the HSI is used as System clock source. + + 2. Please make sure that the selected System clock doesn't exceed your device's + maximum frequency. + + 3. If none of the define below is enabled, the HSI is used as System clock + source. + + 4. The System clock configuration functions provided within this file assume that: + - For Low, Medium and High density devices an external 8MHz crystal is + used to drive the System clock. + - For Connectivity line devices an external 25MHz crystal is used to drive + the System clock. + If you are using different crystal you have to adapt those functions accordingly. + */ + +/* #define SYSCLK_FREQ_HSE HSE_Value */ +/* #define SYSCLK_FREQ_24MHz 24000000 */ +/* #define SYSCLK_FREQ_36MHz 36000000 */ +/* #define SYSCLK_FREQ_48MHz 48000000 */ +/* #define SYSCLK_FREQ_56MHz 56000000 */ +#define SYSCLK_FREQ_72MHz 72000000 + +/*!< Uncomment the following line if you need to use external SRAM mounted + on STM3210E-EVAL board (STM32 High density devices) as data memory */ +#ifdef STM32F10X_HD +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F10X_HD */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Variables + * @{ + */ + +/******************************************************************************* +* Clock Definitions +*******************************************************************************/ +#ifdef SYSCLK_FREQ_HSE + const uint32_t SystemFrequency = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */ + const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_HSE; /*!< System clock */ + const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_HSE; /*!< AHB System bus speed */ + const uint32_t SystemFrequency_APB1Clk = SYSCLK_FREQ_HSE; /*!< APB Peripheral bus 1 (low) speed */ + const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_HSE; /*!< APB Peripheral bus 2 (high) speed */ +#elif defined SYSCLK_FREQ_24MHz + const uint32_t SystemFrequency = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */ + const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_24MHz; /*!< System clock */ + const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_24MHz; /*!< AHB System bus speed */ + const uint32_t SystemFrequency_APB1Clk = SYSCLK_FREQ_24MHz; /*!< APB Peripheral bus 1 (low) speed */ + const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_24MHz; /*!< APB Peripheral bus 2 (high) speed */ +#elif defined SYSCLK_FREQ_36MHz + const uint32_t SystemFrequency = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */ + const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_36MHz; /*!< System clock */ + const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_36MHz; /*!< AHB System bus speed */ + const uint32_t SystemFrequency_APB1Clk = SYSCLK_FREQ_36MHz; /*!< APB Peripheral bus 1 (low) speed */ + const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_36MHz; /*!< APB Peripheral bus 2 (high) speed */ +#elif defined SYSCLK_FREQ_48MHz + const uint32_t SystemFrequency = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */ + const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_48MHz; /*!< System clock */ + const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_48MHz; /*!< AHB System bus speed */ + const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_48MHz/2); /*!< APB Peripheral bus 1 (low) speed */ + const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_48MHz; /*!< APB Peripheral bus 2 (high) speed */ +#elif defined SYSCLK_FREQ_56MHz + const uint32_t SystemFrequency = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */ + const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_56MHz; /*!< System clock */ + const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_56MHz; /*!< AHB System bus speed */ + const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_56MHz/2); /*!< APB Peripheral bus 1 (low) speed */ + const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_56MHz; /*!< APB Peripheral bus 2 (high) speed */ +#elif defined SYSCLK_FREQ_72MHz + const uint32_t SystemFrequency = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */ + const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_72MHz; /*!< System clock */ + const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_72MHz; /*!< AHB System bus speed */ + const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_72MHz/2); /*!< APB Peripheral bus 1 (low) speed */ + const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_72MHz; /*!< APB Peripheral bus 2 (high) speed */ +#else /*!< HSI Selected as System Clock source */ + const uint32_t SystemFrequency = HSI_Value; /*!< System Clock Frequency (Core Clock) */ + const uint32_t SystemFrequency_SysClk = HSI_Value; /*!< System clock */ + const uint32_t SystemFrequency_AHBClk = HSI_Value; /*!< AHB System bus speed */ + const uint32_t SystemFrequency_APB1Clk = HSI_Value; /*!< APB Peripheral bus 1 (low) speed */ + const uint32_t SystemFrequency_APB2Clk = HSI_Value; /*!< APB Peripheral bus 2 (high) speed */ +#endif + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_FunctionPrototypes + * @{ + */ + +static void SetSysClock(void); + +#ifdef SYSCLK_FREQ_HSE + static void SetSysClockToHSE(void); +#elif defined SYSCLK_FREQ_24MHz + static void SetSysClockTo24(void); +#elif defined SYSCLK_FREQ_36MHz + static void SetSysClockTo36(void); +#elif defined SYSCLK_FREQ_48MHz + static void SetSysClockTo48(void); +#elif defined SYSCLK_FREQ_56MHz + static void SetSysClockTo56(void); +#elif defined SYSCLK_FREQ_72MHz + static void SetSysClockTo72(void); +#endif + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the SystemFrequency variable. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +void SystemInit (void) +{ + /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ +#ifndef STM32F10X_CL + RCC->CFGR &= (uint32_t)0xF8FF0000; +#else + RCC->CFGR &= (uint32_t)0xF0FF0000; +#endif /* STM32F10X_CL */ + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC->CFGR &= (uint32_t)0xFF80FFFF; + +#ifndef STM32F10X_CL + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; +#else + /* Reset PLL2ON and PLL3ON bits */ + RCC->CR &= (uint32_t)0xEBFFFFFF; + + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x00FF0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#endif /* STM32F10X_CL */ + + /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */ + /* Configure the Flash Latency cycles and enable prefetch buffer */ + SetSysClock(); + +} + +/** + * @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers. + * @param None + * @retval None + */ +static void SetSysClock(void) +{ +#ifdef SYSCLK_FREQ_HSE + SetSysClockToHSE(); +#elif defined SYSCLK_FREQ_24MHz + SetSysClockTo24(); +#elif defined SYSCLK_FREQ_36MHz + SetSysClockTo36(); +#elif defined SYSCLK_FREQ_48MHz + SetSysClockTo48(); +#elif defined SYSCLK_FREQ_56MHz + SetSysClockTo56(); +#elif defined SYSCLK_FREQ_72MHz + SetSysClockTo72(); +#endif + + /* If none of the define above is enabled, the HSI is used as System clock + source (default after reset) */ +} + +/** + * @brief Setup the external memory controller. Called in startup_stm32f10x.s + * before jump to __main + * @param None + * @retval None + */ +#ifdef DATA_IN_ExtSRAM +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f10x_xx.s/.c before jump to main. + * This function configures the external SRAM mounted on STM3210E-EVAL + * board (STM32 High density devices). This SRAM will be used as program + * data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ +/*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is + required, then adjust the Register Addresses */ + + /* Enable FSMC clock */ + RCC->AHBENR = 0x00000114; + + /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ + RCC->APB2ENR = 0x000001E0; + +/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/ +/*---------------- SRAM Address lines configuration -------------------------*/ +/*---------------- NOE and NWE configuration --------------------------------*/ +/*---------------- NE3 configuration ----------------------------------------*/ +/*---------------- NBL0, NBL1 configuration ---------------------------------*/ + + GPIOD->CRL = 0x44BB44BB; + GPIOD->CRH = 0xBBBBBBBB; + + GPIOE->CRL = 0xB44444BB; + GPIOE->CRH = 0xBBBBBBBB; + + GPIOF->CRL = 0x44BBBBBB; + GPIOF->CRH = 0xBBBB4444; + + GPIOG->CRL = 0x44BBBBBB; + GPIOG->CRH = 0x44444B44; + +/*---------------- FSMC Configuration ---------------------------------------*/ +/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/ + + FSMC_Bank1->BTCR[4] = 0x00001011; + FSMC_Bank1->BTCR[5] = 0x00000200; +} +#endif /* DATA_IN_ExtSRAM */ + +#ifdef SYSCLK_FREQ_HSE +/** + * @brief Selects HSE as System clock source and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockToHSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 0 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + +#ifndef STM32F10X_CL + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; +#else + if (HSE_Value <= 24000000) + { + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; + } + else + { + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; + } +#endif /* STM32F10X_CL */ + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + + /* Select HSE as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE; + + /* Wait till HSE is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + + /* Go to infinite loop */ + while (1) + { + } + } +} +#elif defined SYSCLK_FREQ_24MHz +/** + * @brief Sets System clock frequency to 24MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo24(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 0 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + /* PLL configuration: PLLCLK = PREDIV1 * 6 = 24 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL6); + + /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */ + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } +#else + /* PLL configuration: = (HSE / 2) * 6 = 24 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL6); +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + + /* Go to infinite loop */ + while (1) + { + } + } +} +#elif defined SYSCLK_FREQ_36MHz +/** + * @brief Sets System clock frequency to 36MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo36(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 1 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + + /* PLL configuration: PLLCLK = PREDIV1 * 9 = 36 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL9); + + /*!< PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */ + + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } + +#else + /* PLL configuration: PLLCLK = (HSE / 2) * 9 = 36 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9); +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + + /* Go to infinite loop */ + while (1) + { + } + } +} +#elif defined SYSCLK_FREQ_48MHz +/** + * @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo48(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 1 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK/2 */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ + + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } + + + /* PLL configuration: PLLCLK = PREDIV1 * 6 = 48 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL6); +#else + /* PLL configuration: PLLCLK = HSE * 6 = 48 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + + /* Go to infinite loop */ + while (1) + { + } + } +} + +#elif defined SYSCLK_FREQ_56MHz +/** + * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo56(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 2 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK/2 */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ + + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } + + + /* PLL configuration: PLLCLK = PREDIV1 * 7 = 56 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL7); +#else + /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL7); + +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + + /* Go to infinite loop */ + while (1) + { + } + } +} + +#elif defined SYSCLK_FREQ_72MHz +/** + * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo72(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 2 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; + + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK/2 */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; + +#ifdef STM32F10X_CL + /* Configure PLLs ------------------------------------------------------*/ + /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ + /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ + + RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | + RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); + RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | + RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); + + /* Enable PLL2 */ + RCC->CR |= RCC_CR_PLL2ON; + /* Wait till PLL2 is ready */ + while((RCC->CR & RCC_CR_PLL2RDY) == 0) + { + } + + + /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ + RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | + RCC_CFGR_PLLMULL9); +#else + /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | + RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); +#endif /* STM32F10X_CL */ + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + + /* Go to infinite loop */ + while (1) + { + } + } +} +#endif + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/system_stm32f10x.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/system_stm32f10x.h new file mode 100644 index 0000000..67b98d6 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/CM3/system_stm32f10x.h @@ -0,0 +1,100 @@ +/** + ****************************************************************************** + * @file system_stm32f10x.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Header File. + ****************************************************************************** + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f10x_system + * @{ + */ + +/** + * @brief Define to prevent recursive inclusion + */ +#ifndef __SYSTEM_STM32F10X_H +#define __SYSTEM_STM32F10X_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup STM32F10x_System_Includes + * @{ + */ + +/** + * @} + */ + + +/** @addtogroup STM32F10x_System_Exported_types + * @{ + */ + +extern const uint32_t SystemFrequency; /*!< System Clock Frequency (Core Clock) */ +extern const uint32_t SystemFrequency_SysClk; /*!< System clock */ +extern const uint32_t SystemFrequency_AHBClk; /*!< AHB System bus speed */ +extern const uint32_t SystemFrequency_APB1Clk; /*!< APB Peripheral Bus 1 (low) speed */ +extern const uint32_t SystemFrequency_APB2Clk; /*!< APB Peripheral Bus 2 (high) speed */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Exported_Functions + * @{ + */ + +extern void SystemInit(void); +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__SYSTEM_STM32F10X_H */ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/Documentation/CMSIS_Core.htm b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/Documentation/CMSIS_Core.htm new file mode 100644 index 0000000..60b79b8 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/Core/Documentation/CMSIS_Core.htm @@ -0,0 +1,1231 @@ + + + + CMSIS: Cortex Microcontroller Software Interface Standard + + + +

Cortex Microcontroller Software Interface Standard

+ +

This file describes the Cortex Microcontroller Software Interface Standard (CMSIS).

+

Version: 1.20 - 22. May 2009

+ +

Information in this file, the accompany manuals, and software is
+ Copyright © ARM Ltd.
All rights reserved. +

+ +
+ +

Revision History

+
    +
  • Version 1.00: initial release.
  • +
  • Version 1.01: added __LDREXx, __STREXx, and __CLREX.
  • +
  • Version 1.02: added Cortex-M0.
  • +
  • Version 1.10: second review.
  • +
  • Version 1.20: third review.
  • +
+ +
+ +

Contents

+ +
    +
  1. About
  2. +
  3. Coding Rules and Conventions
  4. +
  5. CMSIS Files
  6. +
  7. Core Peripheral Access Layer
  8. +
  9. CMSIS Example
  10. +
+ +

About

+ +

+ The Cortex Microcontroller Software Interface Standard (CMSIS) answers the challenges + that are faced when software components are deployed to physical microcontroller devices based on a + Cortex-M0 / Cortex-M1 or Cortex-M3 processor. The CMSIS will be also expanded to future Cortex-M + processor cores (the term Cortex-Mx is used to indicate that). The CMSIS is defined in close co-operation + with various silicon and software vendors and provides a common approach to interface to peripherals, + real-time operating systems, and middleware components. +

+ +

ARM provides as part of the CMSIS the following software layers that are +available for various compiler implementations:

+
    +
  • Core Peripheral Access Layer: contains name definitions, + address definitions and helper functions to + access core registers and peripherals. It defines also an device + independent interface for RTOS Kernels that includes debug channel + definitions.
  • +
  • Middleware Access Layer: provides common methods to + access peripherals for the software industry. The Middleware Access Layer + is adapted by the Silicon Vendor for the device specific peripherals used + by middleware components. The middleware access layer is currently in + development and not yet part of this documentation
  • +
+ +

These software layers are expanded by Silicon partners with:

+
    +
  • Device Peripheral Access Layer: provides definitions + for all device peripherals
  • +
  • Access Functions for Peripherals (optional): provides + additional helper functions for peripherals
  • +
+ +

CMSIS defines for a Cortex-Mx Microcontroller System:

+
    +
  • A common way to access peripheral registers + and a common way to define exception vectors.
  • +
  • The register names of the Core + Peripherals and the names of the Core + Exception Vectors.
  • +
  • An device independent interface for RTOS Kernels including a debug + channel.
  • +
  • Interfaces for middleware components (TCP/IP + Stack, Flash File System).
  • +
+ +

+ By using CMSIS compliant software components, the user can easier re-use template code. + CMSIS is intended to enable the combination of software components from multiple middleware vendors. +

+ +

Coding Rules and Conventions

+ +

+ The following section describes the coding rules and conventions used in the CMSIS + implementation. It contains also information about data types and version number information. +

+ +

Essentials

+
    +
  • The CMSIS C code conforms to MISRA 2004 rules. In case of MISRA violations, + there are disable and enable sequences for PC-LINT inserted.
  • +
  • ANSI standard data types defined in the ANSI C header file + <stdint.h> are used.
  • +
  • #define constants that include expressions must be enclosed by + parenthesis.
  • +
  • Variables and parameters have a complete data type.
  • +
  • All functions in the Core Peripheral Access Layer are + re-entrant.
  • +
  • The Core Peripheral Access Layer has no blocking code + (which means that wait/query loops are done at other software layers such as + the Middleware Access Layer).
  • +
  • For each exception/interrupt there is definition for: +
      +
    • an exception/interrupt handler with the postfix _Handler + (for exceptions) or _IRQHandler (for interrupts).
    • +
    • a default exception/interrupt handler (weak definition) that contains an endless loop.
    • +
    • a #define of the interrupt number with the postfix _IRQn.
    • +
  • +
+ +

Recommendations

+ +

The CMSIS recommends the following conventions for identifiers.

+
    +
  • CAPITAL names to identify Core Registers, Peripheral Registers, and CPU Instructions.
  • +
  • CamelCase names to identify peripherals access functions and interrupts.
  • +
  • PERIPHERAL_ prefix to identify functions that belong to specify peripherals.
  • +
  • Doxygen comments for all functions are included as described under Function Comments below.
  • +
+ +Comments + +
    +
  • Comments use the ANSI C90 style (/* comment */) or C++ style + (// comment). It is assumed that the programming tools support today + consistently the C++ comment style.
  • +
  • Function Comments provide for each function the following information: +
      +
    • one-line brief function overview.
    • +
    • detailed parameter explanation.
    • +
    • detailed information about return values.
    • +
    • detailed description of the actual function.
    • +
    +

    Doxygen Example:

    +
    +/** 
    + * @brief  Enable Interrupt in NVIC Interrupt Controller
    + * @param  IRQn  interrupt number that specifies the interrupt
    + * @return none.
    + * Enable the specified interrupt in the NVIC Interrupt Controller.
    + * Other settings of the interrupt such as priority are not affected.
    + */
    +
  • +
+ +

Data Types and IO Type Qualifiers

+ +

+ The Cortex-Mx HAL uses the standard types from the standard ANSI C header file + <stdint.h>. IO Type Qualifiers are used to specify the access + to peripheral variables. IO Type Qualifiers are indented to be used for automatic generation of + debug information of peripheral registers. +

+ + + + + + + + + + + + + + + + + + + + + + + + +
IO Type Qualifier#defineDescription
__Ivolatile constRead access only
__OvolatileWrite access only
__IOvolatileRead and write access
+ +

CMSIS Version Number

+

+ File core_cm3.h contains the version number of the CMSIS with the following define: +

+ +
+#define __CM3_CMSIS_VERSION_MAIN  (0x00)      /* [31:16] main version       */
+#define __CM3_CMSIS_VERSION_SUB   (0x03)      /* [15:0]  sub version        */
+#define __CM3_CMSIS_VERSION       ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB)
+ +

+ File core_cm0.h contains the version number of the CMSIS with the following define: +

+ +
+#define __CM0_CMSIS_VERSION_MAIN  (0x00)      /* [31:16] main version       */
+#define __CM0_CMSIS_VERSION_SUB   (0x00)      /* [15:0]  sub version        */
+#define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16) | __CM0_CMSIS_VERSION_SUB)
+ + +

CMSIS Cortex Core

+

+ File core_cm3.h contains the type of the CMSIS Cortex-Mx with the following define: +

+ +
+#define __CORTEX_M                (0x03)
+ +

+ File core_cm0.h contains the type of the CMSIS Cortex-Mx with the following define: +

+ +
+#define __CORTEX_M                (0x00)
+ + +

CMSIS Files

+

+ This section describes the Files provided in context with the CMSIS to access the Cortex-Mx + hardware and peripherals. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileProviderDescription
device.hDevice specific (provided by silicon partner)Defines the peripherals for the actual device. The file may use + several other include files to define the peripherals of the actual device.
core_cm0.hARM (for RealView ARMCC, IAR, and GNU GCC)Defines the core peripherals for the Cortex-M0 CPU and core peripherals.
core_cm3.hARM (for RealView ARMCC, IAR, and GNU GCC)Defines the core peripherals for the Cortex-M3 CPU and core peripherals.
core_cm0.cARM (for RealView ARMCC, IAR, and GNU GCC)Provides helper functions that access core registers.
core_cm0.cARM (for RealView ARMCC, IAR, and GNU GCC)Provides helper functions that access core registers.
startup_deviceARM (adapted by compiler partner / silicon partner)Provides the Cortex-Mx startup code and the complete (device specific) Interrupt Vector Table
system_deviceARM (adapted by silicon partner)Provides a device specific configuration file for the device. It configures the device initializes + typically the oscillator (PLL) that is part of the microcontroller device
+ +

device.h

+ +

+ The file device.h is provided by the silicon vendor and is the + central include file that the application programmer is using in + the C source code. This file contains: +

+
    +
  • +

    Interrupt Number Definition: provides interrupt numbers + (IRQn) for all core and device specific exceptions and interrupts.

    +
  • +
  • +

    Configuration for core_cm0.h / core_cm3.h: reflects the + actual configuration of the Cortex-Mx processor that is part of the actual + device. As such the file core_cm0.h / core_cm3.h is included that + implements access to processor registers and core peripherals.

    +
  • +
  • +

    Device Peripheral Access Layer: provides definitions + for all device peripherals. It contains all data structures and the address + mapping for the device specific peripherals.

    +
  • +
  • Access Functions for Peripherals (optional): provides + additional helper functions for peripherals that are useful for programming + of these peripherals. Access Functions may be provided as inline functions + or can be extern references to a device specific library provided by the + silicon vendor.
  • +
+ + +

Interrupt Number Definition

+ +

To access the device specific interrupts the device.h file defines IRQn +numbers for the complete device using a enum typedef as shown below:

+
+typedef enum IRQn
+{
+/******  Cortex-M3 Processor Exceptions/Interrupt Numbers ************************************************/
+  NonMaskableInt_IRQn             = -14,      /*!< 2 Non Maskable Interrupt                              */
+  HardFault_IRQn                  = -13,      /*!< 3 Cortex-M3 Hard Fault Interrupt                      */
+  MemoryManagement_IRQn           = -12,      /*!< 4 Cortex-M3 Memory Management Interrupt               */
+  BusFault_IRQn                   = -11,      /*!< 5 Cortex-M3 Bus Fault Interrupt                       */
+  UsageFault_IRQn                 = -10,      /*!< 6 Cortex-M3 Usage Fault Interrupt                     */
+  SVCall_IRQn                     = -5,       /*!< 11 Cortex-M3 SV Call Interrupt                        */
+  DebugMonitor_IRQn               = -4,       /*!< 12 Cortex-M3 Debug Monitor Interrupt                  */
+  PendSV_IRQn                     = -2,       /*!< 14 Cortex-M3 Pend SV Interrupt                        */
+  SysTick_IRQn                    = -1,       /*!< 15 Cortex-M3 System Tick Interrupt                    */
+/******  STM32 specific Interrupt Numbers ****************************************************************/
+  WWDG_STM_IRQn                   = 0,        /*!< Window WatchDog Interrupt                             */
+  PVD_STM_IRQn                    = 1,        /*!< PVD through EXTI Line detection Interrupt             */
+  :
+  :
+  } IRQn_Type;
+ + +

Configuration for core_cm0.h / core_cm3.h

+

+ The Cortex-Mx core configuration options which are defined for each device implementation. Some + configuration options are reflected in the CMSIS layer using the #define settings described below. +

+

+ To access core peripherals file device.h includes file core_cm0.h / core_cm3.h. + Several features in core_cm0.h / core_cm3.h are configured by the following defines that must be + defined before #include <core_cm0.h> / #include <core_cm3.h> + preprocessor command. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#defineFileValueDescription
__NVIC_PRIO_BITScore_cm0.h(2)Number of priority bits implemented in the NVIC (device specific)
__NVIC_PRIO_BITScore_cm3.h(2 ... 8)Number of priority bits implemented in the NVIC (device specific)
__MPU_PRESENTcore_cm0.h, core_cm3.h(0, 1)Defines if an MPU is present or not
__Vendor_SysTickConfigcore_cm0.h, core_cm3.h(1)When this define is setup to 1, the SysTickConfig function + in core_cm3.h is excluded. In this case the device.h + file must contain a vendor specific implementation of this function.
+ + +

Device Peripheral Access Layer

+

+ Each peripheral uses a PERIPHERAL_ prefix to identify peripheral registers + and functions that access this specific peripheral. If more than one peripheral of the same + type exists, identifiers have a postfix (digit or letter). For example: +

+
    +
  • UART_Type: defines the generic register layout for all UART channels in a device.
  • +
  • UART1: is a pointer to a register structure that refers to a specific UART. + For example UART1->DR is the data register of UART1.
  • +
  • UART_SendChar(UART1, c): is a generic function that works with all UART's in the device. + To communicate the UART that it accesses the first parameter is a pointer to the actual + UART register structure.
  • +
  • UART1_SendChar(c): is an UART1 specific implementation (in this case the send function).
  • +
+ +
Minimal Requiements
+

+ To access the peripheral registers and related function in a device the files device.h + and core_cm0.h / core_cm3.h defines as a minimum: +

+
    +
  • The Register Layout Typedef for each peripheral that defines all register names. + Names that start with RESERVE are used to introduce space into the structure to adjust the addresses of + the peripheral registers. For example: +
    +typedef struct {
    +  __IO uint32_t CTRL;      /* SysTick Control and Status Register */
    +  __IO uint32_t LOAD;      /* SysTick Reload Value Register       */
    +  __IO uint32_t VAL;       /* SysTick Current Value Register      */
    +  __I  uint32_t CALIB;     /* SysTick Calibration Register        */
    +  } SysTick_Type;
    +
  • + +
  • Base Address for each peripheral (in case of multiple peripherals + that use the same register layout typedef multiple base addresses are defined). For example: +
    +#define SysTick_BASE (SCS_BASE + 0x0010)            /* SysTick Base Address */
    +
  • + +
  • Access Definition for each peripheral (in case of multiple peripherals that use + the same register layout typedef multiple access definitions exist, i.e. UART0, + UART1). For Example: +
    +#define SysTick ((SysTick_Type *) SysTick_BASE)     /* SysTick access definition */
    +
  • +
+ +

+ These definitions allow to access the peripheral registers from user code with simple assignments like: +

+
SysTick->CTRL = 0;
+ +
Optional Features
+

In addition the device.h file may define:

+
    +
  • #define constants that simplify access to the peripheral registers. + These constant define bit-positions or other specific patterns are that + required for the programming of the peripheral registers. The identifiers + used start with the name of the PERIPERHAL_. It is + recommended to use CAPITAL letters for such #define constants.
  • +
  • Functions that perform more complex functions with the peripheral (i.e. + status query before a sending register is accessed). Again these function + start with the name of the PERIPHERAL_.
  • +
+ +

core_cm0.h and core_cm0.c

+

+ File core_cm0.h describes the data structures for the Cortex-M0 core peripherals and does + the address mapping of this structures. It also provides basic access to the Cortex-M0 core registers + and core peripherals with efficient functions (defined as static inline). +

+

+ File core_cm0.c defines several helper functions that access processor registers. +

+

Together these files implement the Core Peripheral Access Layer for a Cortex-M0.

+ +

core_cm3.h and core_cm3.c

+

+ File core_cm3.h describes the data structures for the Cortex-M3 core peripherals and does + the address mapping of this structures. It also provides basic access to the Cortex-M3 core registers + and core peripherals with efficient functions (defined as static inline). +

+

+ File core_cm3.c defines several helper functions that access processor registers. +

+

Together these files implement the Core Peripheral Access Layer for a Cortex-M3.

+ +

startup_device

+

+ A template file for startup_device is provided by ARM for each supported + compiler. It is adapted by the silicon vendor to include interrupt vectors for all device specific + interrupt handlers. Each interrupt handler is defined as weak function + to an dummy handler. Therefore the interrupt handler can be directly used in application software + without any requirements to adapt the startup_device file. +

+

+ The following exception names are fixed and define the start of the vector table for a Cortex-M0: +

+
+__Vectors       DCD     __initial_sp              ; Top of Stack
+                DCD     Reset_Handler             ; Reset Handler
+                DCD     NMI_Handler               ; NMI Handler
+                DCD     HardFault_Handler         ; Hard Fault Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     SVC_Handler               ; SVCall Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     PendSV_Handler            ; PendSV Handler
+                DCD     SysTick_Handler           ; SysTick Handler
+ +

+ The following exception names are fixed and define the start of the vector table for a Cortex-M3: +

+
+__Vectors       DCD     __initial_sp              ; Top of Stack
+                DCD     Reset_Handler             ; Reset Handler
+                DCD     NMI_Handler               ; NMI Handler
+                DCD     HardFault_Handler         ; Hard Fault Handler
+                DCD     MemManage_Handler         ; MPU Fault Handler
+                DCD     BusFault_Handler          ; Bus Fault Handler
+                DCD     UsageFault_Handler        ; Usage Fault Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     SVC_Handler               ; SVCall Handler
+                DCD     DebugMon_Handler          ; Debug Monitor Handler
+                DCD     0                         ; Reserved
+                DCD     PendSV_Handler            ; PendSV Handler
+                DCD     SysTick_Handler           ; SysTick Handler
+ +

+ In the following examples for device specific interrupts are shown: +

+
+; External Interrupts
+                DCD     WWDG_IRQHandler           ; Window Watchdog
+                DCD     PVD_IRQHandler            ; PVD through EXTI Line detect
+                DCD     TAMPER_IRQHandler         ; Tamper
+ +

+ Device specific interrupts must have a dummy function that can be overwritten in user code. + Below is an example for this dummy function. +

+
+Default_Handler PROC
+                EXPORT WWDG_IRQHandler   [WEAK]
+                EXPORT PVD_IRQHandler    [WEAK]
+                EXPORT TAMPER_IRQHandler [WEAK]
+                :
+                :
+                WWDG_IRQHandler
+                PVD_IRQHandler
+                TAMPER_IRQHandler
+                :
+                :
+                B .
+                ENDP
+ +

+ The user application may simply define an interrupt handler function by using the handler name + as shown below. +

+
+void WWDG_IRQHandler(void)
+{
+  :
+  :
+}
+ + +

system_device.c

+

+ A template file for system_device.c is provided by ARM but adapted by + the silicon vendor to match their actual device. As a minimum requirement + this file must provide a device specific system configuration function and a global variable + that contains the system frequency. It configures the device and initializes typically the + oscillator (PLL) that is part of the microcontroller device. +

+

+ The file system_device.c must provide + as a minimum requirement the SystemInit function as shown below. +

+ + + + + + + + + + + + +
Function DefinitionDescription
void SystemInit (void)Setup the microcontroller system. Typically this function configures the + oscillator (PLL) that is part of the microcontroller device. For systems + with variable clock speed it also updates the variable SystemFrequency.
+ +

+ Also part of the file system_device.c + is the variable SystemFrequency which contains the current CPU clock speed shown below. +

+ + + + + + + + + + + + +
Variable DefinitionDescription
uint32_t SystemFrequencyContains the system frequency (which is the system clock frequency supplied + to the SysTick timer and the processor core clock). This variable can be + used by the user application after the call to the function SystemInit() + to setup the SysTick timer or configure other parameters. It may also be + used by debugger to query the frequency of the debug timer or configure + the trace clock speed.

+ This variable may also be defined in the const space. + The compiler must be configured to avoid the removal of this variable in + case that the application program is not using it. It is important for + debug systems that the variable is physically present in memory so that + it can be examined to configure the debugger.
+ +

Note

+
    +
  • The above definitions are the minimum requirements for the file + system_device.c. This + file may export more functions or variables that provide a more flexible + configuration of the microcontroller system.

    +
  • +
+ + +

Core Peripheral Access Layer

+ +

Cortex-Mx Core Register Access

+

+ The following functions are defined in core_cm0.h / core_cm3.h + and provide access to Cortex-Mx core registers. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function DefinitionCoreCore RegisterDescription
void __enable_irq (void)M0, M3PRIMASK = 0Global Interrupt enable (using the instruction CPSIE + i)
void __disable_irq (void)M0, M3PRIMASK = 1Global Interrupt disable (using the instruction + CPSID i)
void __set_PRIMASK (uint32_t value)M0, M3PRIMASK = valueAssign value to Priority Mask Register (using the instruction + MSR)
uint32_t __get_PRIMASK (void)M0, M3return PRIMASKReturn Priority Mask Register (using the instruction + MRS)
void __enable_fault_irq (void)M3FAULTMASK = 0Global Fault exception and Interrupt enable (using the + instruction CPSIE + f)
void __disable_fault_irq (void)M3FAULTMASK = 1Global Fault exception and Interrupt disable (using the + instruction CPSID f)
void __set_FAULTMASK (uint32_t value)M3FAULTMASK = valueAssign value to Fault Mask Register (using the instruction + MSR)
uint32_t __get_FAULTMASK (void)M3return FAULTMASKReturn Fault Mask Register (using the instruction MRS)
void __set_BASEPRI (uint32_t value)M3BASEPRI = valueSet Base Priority (using the instruction MSR)
uiuint32_t __get_BASEPRI (void)M3return BASEPRIReturn Base Priority (using the instruction MRS)
void __set_CONTROL (uint32_t value)M0, M3CONTROL = valueSet CONTROL register value (using the instruction MSR)
uint32_t __get_CONTROL (void)M0, M3return CONTROLReturn Control Register Value (using the instruction + MRS)
void __set_PSP (uint32_t TopOfProcStack)M0, M3PSP = TopOfProcStackSet Process Stack Pointer value (using the instruction + MSR)
uint32_t __get_PSP (void)M0, M3return PSPReturn Process Stack Pointer (using the instruction MRS)
void __set_MSP (uint32_t TopOfMainStack)M0, M3MSP = TopOfMainStackSet Main Stack Pointer (using the instruction MSR)
uint32_t __get_MSP (void)M0, M3return MSPReturn Main Stack Pointer (using the instruction MRS)
+ +

Cortex-Mx Instruction Access

+

+ The following functions are defined in core_cm0.h / core_cm3.hand + generate specific Cortex-Mx instructions. The functions are implemented in the file + core_cm0.c / core_cm3.c. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCoreGenerated CPU InstructionDescription
void __WFI (void)M0, M3WFIWait for Interrupt
void __WFE (void)M0, M3WFEWait for Event
void __SEV (void)M0, M3SEVSet Event
void __ISB (void)M0, M3ISBInstruction Synchronization Barrier
void __DSB (void)M0, M3DSBData Synchronization Barrier
void __DMB (void)M0, M3DMBData Memory Barrier
uint32_t __REV (uint32_t value)M0, M3REVReverse byte order in integer value.
uint32_t __REV16 (uint16_t value)M0, M3REV16Reverse byte order in unsigned short value.
sint32_t __REVSH (sint16_t value)M0, M3REVSHReverse byte order in signed short value with sign extension to integer.
uint32_t __RBIT (uint32_t value)M3RBITReverse bit order of value
uint8_t __LDREXB (uint8_t *addr)M3LDREXBLoad exclusive byte
uint16_t __LDREXH (uint16_t *addr)M3LDREXHLoad exclusive half-word
uint32_t __LDREXW (uint32_t *addr)M3LDREXWLoad exclusive word
uint32_t __STREXB (uint8_t value, uint8_t *addr)M3STREXBStore exclusive byte
uint32_t __STREXB (uint16_t value, uint16_t *addr)M3STREXHStore exclusive half-word
uint32_t __STREXB (uint32_t value, uint32_t *addr)M3STREXWStore exclusive word
void __CLREX (void)M3CLREXRemove the exclusive lock created by __LDREXB, __LDREXH, or __LDREXW
+ + +

NVIC Access Functions

+

+ The CMSIS provides access to the NVIC via the register interface structure and several helper + functions that simplify the setup of the NVIC. The CMSIS HAL uses IRQ numbers (IRQn) to + identify the interrupts. The first device interrupt has the IRQn value 0. Therefore negative + IRQn values are used for processor core exceptions. +

+

+ For the IRQn values of core exceptions the file device.h provides + the following enum names. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Core Exception enum ValueCoreIRQnDescription
NonMaskableInt_IRQnM0, M3-14Cortex-Mx Non Maskable Interrupt
HardFault_IRQnM0, M3-13Cortex-Mx Hard Fault Interrupt
MemoryManagement_IRQnM3-12Cortex-Mx Memory Management Interrupt
BusFault_IRQnM3-11Cortex-Mx Bus Fault Interrupt
UsageFault_IRQnM3-10Cortex-Mx Usage Fault Interrupt
SVCall_IRQnM0, M3-5Cortex-Mx SV Call Interrupt
DebugMonitor_IRQnM3-4Cortex-Mx Debug Monitor Interrupt
PendSV_IRQnM0, M3-2Cortex-Mx Pend SV Interrupt
SysTick_IRQnM0, M3-1Cortex-Mx System Tick Interrupt
+ +

The following functions simplify the setup of the NVIC. +The functions are defined as static inline.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCoreParameterDescription
void NVIC_SetPriorityGrouping (uint32_t PriorityGroup)M3Priority Grouping ValueSet the Priority Grouping (Groups . Subgroups)
void NVIC_EnableIRQ (IRQn_Type IRQn)M0, M3IRQ NumberEnable IRQn
void NVIC_DisableIRQ (IRQn_Type IRQn)M0, M3IRQ NumberDisable IRQn
uint32_t NVIC_GetPendingIRQ (IRQn_Type IRQn)M0, M3IRQ NumberReturn 1 if IRQn is pending else 0
void NVIC_SetPendingIRQ (IRQn_Type IRQn)M0, M3IRQ NumberSet IRQn Pending
void NVIC_ClearPendingIRQ (IRQn_Type IRQn)M0, M3IRQ NumberClear IRQn Pending Status
uint32_t NVIC_GetActive (IRQn_Type IRQn)M3IRQ NumberReturn 1 if IRQn is active else 0
void NVIC_SetPriority (IRQn_Type IRQn, uint32_t priority)M0, M3IRQ Number, PrioritySet Priority for IRQn
+ (not threadsafe for Cortex-M0)
uint32_t NVIC_GetPriority (IRQn_Type IRQn)M0, M3IRQ NumberGet Priority for IRQn
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)M3IRQ Number, Priority Group, Preemtive Priority, Sub PriorityEncode priority for given group, preemtive and sub priority
NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority)M3IRQ Number, Priority, pointer to Priority Group, pointer to Preemtive Priority, pointer to Sub PriorityDeccode given priority to group, preemtive and sub priority
void NVIC_SystemReset (void)M0, M3(void)Resets the System
+

Note

+
    +
  • The processor exceptions have negative enum values. Device specific interrupts + have positive enum values and start with 0. The values are defined in + device.h file. +

    +
  • +
  • The values for PreemptPriority and SubPriority + used in functions NVIC_EncodePriority and NVIC_DecodePriority + depend on the available __NVIC_PRIO_BITS implemented in the NVIC. +

    +
  • +
+ + +

SysTick Configuration Function

+ +

The following function is used to configure the SysTick timer and start the +SysTick interrupt.

+ + + + + + + + + + + + + + +
NameParameterDescription
uint32_t SysTickConfig + (uint32_t ticks)ticks is SysTick counter reload valueSetup the SysTick timer and enable the SysTick interrupt. After this + call the SysTick timer creates interrupts with the specified time + interval.
+
+ Return: 0 when successful, 1 on failure.
+
+ + +

Cortex-M3 ITM Debug Access

+ +

The Cortex-M3 incorporates the Instrumented Trace Macrocell (ITM) that +provides together with the Serial Viewer Output trace capabilities for the +microcontroller system. The ITM has 32 communication channels; two ITM +communication channels are used by CMSIS to output the following information:

+
    +
  • ITM Channel 0: implements the ITM_putchar function + which can be used for printf-style output via the debug interface.
  • +
  • ITM Channel 31: is reserved for the RTOS kernel and can be used for + kernel awareness debugging.
  • +
+

Note

+
    +
  • The ITM channel 31 is selected for the RTOS kernel since some kernels + may use the Privileged level for program execution. ITM + channels have 4 groups with 8 channels each, whereby each group can be + configured for access rights in the Unprivileged level. The ITM channel 0 + may be therefore enabled for the user task whereas ITM channel 31 may be + accessible only in Privileged level from the RTOS kernel itself.

    +
  • +
+ +

The prototype of the ITM_putchar routine is shown in the +table below.

+ + + + + + + + + + + + + + +
NameParameterDescription
void uint32_t ITM_putchar(uint32_t chr)character to outputThe function outputs a character via the ITM channel 0. The + function returns when no debugger is connected that has booked the + output. It is blocking when a debugger is connected, but the + previous character send is not transmitted.

+ Return: the input character 'chr'.
+ + +

+ Example for the usage of the ITM Channel 31 for RTOS Kernels: +

+
+  // check if debugger connected and ITM channel enabled for tracing
+  if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA) &&
+  (ITM->TCR & ITM_TCR_ITMENA) &&
+  (ITM->TER & (1UL << 31))) {
+    // transmit trace data
+    while (ITM->PORT31_U32 == 0);
+    ITM->PORT[31].u8 = task_id;      // id of next task
+    while (ITM->PORT[31].u32 == 0);
+    ITM->PORT[31].u32 = task_status; // status information
+  }
+ + +

CMSIS Example

+

+ The following section shows a typical example for using the CMSIS layer in user applications. +

+
+#include <device.h>                              // file name depends on the device used.
+
+void SysTick_Handler (void)  {                   // SysTick Interrupt Handler
+  ;
+}
+
+void TIM1_UP_IRQHandler (void)  {                // Timer Interrupt Handler
+  ;
+}
+
+void timer1_init(int frequency) {
+                                                 // set up Timer (device specific)
+  NVIC_SetPriority (TIM1_UP_IRQn, 1);            // Set Timer priority
+  NVIC_EnableIRQ (TIM1_UP_IRQn);                 // Enable Timer Interrupt
+}
+
+void main (void) {
+  SystemInit ();
+
+  if (SysTick_Config (SystemFrequency / 1000)) { // Setup SysTick Timer for 1 msec interrupts
+    :                                            // Handle Error
+    :
+    while (1);
+  }
+
+  timer1_init ();                                // device specific timer
+
+  while (1);
+}
+ + + \ No newline at end of file diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/License.doc b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/License.doc new file mode 100644 index 0000000..b6b8ace Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/CMSIS/License.doc differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h new file mode 100644 index 0000000..7f61f83 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h @@ -0,0 +1,219 @@ +/** + ****************************************************************************** + * @file misc.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the miscellaneous + * firmware library functions (add-on to CMSIS functions). + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MISC_H +#define __MISC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup MISC + * @{ + */ + +/** @defgroup MISC_Exported_Types + * @{ + */ + +/** + * @brief NVIC Init Structure definition + */ + +typedef struct +{ + uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled. + This parameter can be a value of @ref IRQn_Type + (For the complete STM32 Devices IRQ Channels list, please + refer to stm32f10x.h file) */ + + uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the IRQ channel + specified in NVIC_IRQChannel. This parameter can be a value + between 0 and 15 as described in the table @ref NVIC_Priority_Table */ + + uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel specified + in NVIC_IRQChannel. This parameter can be a value + between 0 and 15 as described in the table @ref NVIC_Priority_Table */ + + FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel + will be enabled or disabled. + This parameter can be set either to ENABLE or DISABLE */ +} NVIC_InitTypeDef; + +/** + * @} + */ + +/** @defgroup NVIC_Priority_Table + * @{ + */ + +/** +@code + The table below gives the allowed values of the pre-emption priority and subpriority according + to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function + ============================================================================================================================ + NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description + ============================================================================================================================ + NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority + | | | 4 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority + | | | 3 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority + | | | 2 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority + | | | 1 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority + | | | 0 bits for subpriority + ============================================================================================================================ +@endcode +*/ + +/** + * @} + */ + +/** @defgroup MISC_Exported_Constants + * @{ + */ + +/** @defgroup Vector_Table_Base + * @{ + */ + +#define NVIC_VectTab_RAM ((uint32_t)0x20000000) +#define NVIC_VectTab_FLASH ((uint32_t)0x08000000) +#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \ + ((VECTTAB) == NVIC_VectTab_FLASH)) +/** + * @} + */ + +/** @defgroup System_Low_Power + * @{ + */ + +#define NVIC_LP_SEVONPEND ((uint8_t)0x10) +#define NVIC_LP_SLEEPDEEP ((uint8_t)0x04) +#define NVIC_LP_SLEEPONEXIT ((uint8_t)0x02) +#define IS_NVIC_LP(LP) (((LP) == NVIC_LP_SEVONPEND) || \ + ((LP) == NVIC_LP_SLEEPDEEP) || \ + ((LP) == NVIC_LP_SLEEPONEXIT)) +/** + * @} + */ + +/** @defgroup Preemption_Priority_Group + * @{ + */ + +#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority + 4 bits for subpriority */ +#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority + 3 bits for subpriority */ +#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority + 2 bits for subpriority */ +#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority + 1 bits for subpriority */ +#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority + 0 bits for subpriority */ + +#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \ + ((GROUP) == NVIC_PriorityGroup_1) || \ + ((GROUP) == NVIC_PriorityGroup_2) || \ + ((GROUP) == NVIC_PriorityGroup_3) || \ + ((GROUP) == NVIC_PriorityGroup_4)) + +#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) + +#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) + +#define IS_NVIC_OFFSET(OFFSET) ((OFFSET) < 0x0007FFFF) + +/** + * @} + */ + +/** @defgroup SysTick_clock_source + * @{ + */ + +#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) +#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) +#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \ + ((SOURCE) == SysTick_CLKSource_HCLK_Div8)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup MISC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Exported_Functions + * @{ + */ + +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); +void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); +void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); +void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource); + +#ifdef __cplusplus +} +#endif + +#endif /* __MISC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h new file mode 100644 index 0000000..c8a07be --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h @@ -0,0 +1,479 @@ +/** + ****************************************************************************** + * @file stm32f10x_adc.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the ADC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_ADC_H +#define __STM32F10x_ADC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup ADC + * @{ + */ + +/** @defgroup ADC_Exported_Types + * @{ + */ + +/** + * @brief ADC Init structure definition + */ + +typedef struct +{ + uint32_t ADC_Mode; /*!< Configures the ADC to operate in independent or + dual mode. + This parameter can be a value of @ref ADC_mode */ + + FunctionalState ADC_ScanConvMode; /*!< Specifies whether the conversion is performed in + Scan (multichannels) or Single (one channel) mode. + This parameter can be set to ENABLE or DISABLE */ + + FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed in + Continuous or Single mode. + This parameter can be set to ENABLE or DISABLE. */ + + uint32_t ADC_ExternalTrigConv; /*!< Defines the external trigger used to start the analog + to digital conversion of regular channels. This parameter + can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */ + + uint32_t ADC_DataAlign; /*!< Specifies whether the ADC data alignment is left or right. + This parameter can be a value of @ref ADC_data_align */ + + uint8_t ADC_NbrOfChannel; /*!< Specifies the number of ADC channels that will be converted + using the sequencer for regular channel group. + This parameter must range from 1 to 16. */ +}ADC_InitTypeDef; +/** + * @} + */ + +/** @defgroup ADC_Exported_Constants + * @{ + */ + +#define IS_ADC_ALL_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ + ((PERIPH) == ADC2) || \ + ((PERIPH) == ADC3)) + +#define IS_ADC_DMA_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ + ((PERIPH) == ADC3)) + +/** @defgroup ADC_mode + * @{ + */ + +#define ADC_Mode_Independent ((uint32_t)0x00000000) +#define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) +#define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) +#define ADC_Mode_InjecSimult_FastInterl ((uint32_t)0x00030000) +#define ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000) +#define ADC_Mode_InjecSimult ((uint32_t)0x00050000) +#define ADC_Mode_RegSimult ((uint32_t)0x00060000) +#define ADC_Mode_FastInterl ((uint32_t)0x00070000) +#define ADC_Mode_SlowInterl ((uint32_t)0x00080000) +#define ADC_Mode_AlterTrig ((uint32_t)0x00090000) + +#define IS_ADC_MODE(MODE) (((MODE) == ADC_Mode_Independent) || \ + ((MODE) == ADC_Mode_RegInjecSimult) || \ + ((MODE) == ADC_Mode_RegSimult_AlterTrig) || \ + ((MODE) == ADC_Mode_InjecSimult_FastInterl) || \ + ((MODE) == ADC_Mode_InjecSimult_SlowInterl) || \ + ((MODE) == ADC_Mode_InjecSimult) || \ + ((MODE) == ADC_Mode_RegSimult) || \ + ((MODE) == ADC_Mode_FastInterl) || \ + ((MODE) == ADC_Mode_SlowInterl) || \ + ((MODE) == ADC_Mode_AlterTrig)) +/** + * @} + */ + +/** @defgroup ADC_external_trigger_sources_for_regular_channels_conversion + * @{ + */ + +#define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x00020000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x00060000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x00080000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x000A0000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO ((uint32_t)0x000C0000) /*!< For ADC1 and ADC2 */ + +#define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000) /*!< For ADC1, ADC2 and ADC3 */ +#define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000) /*!< For ADC1, ADC2 and ADC3 */ + +#define ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x00000000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x00020000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T8_CC1 ((uint32_t)0x00060000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T8_TRGO ((uint32_t)0x00080000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T5_CC1 ((uint32_t)0x000A0000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T5_CC3 ((uint32_t)0x000C0000) /*!< For ADC3 only */ + +#define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T1_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T1_CC2) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T1_CC3) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \ + ((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_None) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T8_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T8_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T5_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T5_CC3)) +/** + * @} + */ + +/** @defgroup ADC_data_align + * @{ + */ + +#define ADC_DataAlign_Right ((uint32_t)0x00000000) +#define ADC_DataAlign_Left ((uint32_t)0x00000800) +#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \ + ((ALIGN) == ADC_DataAlign_Left)) +/** + * @} + */ + +/** @defgroup ADC_channels + * @{ + */ + +#define ADC_Channel_0 ((uint8_t)0x00) +#define ADC_Channel_1 ((uint8_t)0x01) +#define ADC_Channel_2 ((uint8_t)0x02) +#define ADC_Channel_3 ((uint8_t)0x03) +#define ADC_Channel_4 ((uint8_t)0x04) +#define ADC_Channel_5 ((uint8_t)0x05) +#define ADC_Channel_6 ((uint8_t)0x06) +#define ADC_Channel_7 ((uint8_t)0x07) +#define ADC_Channel_8 ((uint8_t)0x08) +#define ADC_Channel_9 ((uint8_t)0x09) +#define ADC_Channel_10 ((uint8_t)0x0A) +#define ADC_Channel_11 ((uint8_t)0x0B) +#define ADC_Channel_12 ((uint8_t)0x0C) +#define ADC_Channel_13 ((uint8_t)0x0D) +#define ADC_Channel_14 ((uint8_t)0x0E) +#define ADC_Channel_15 ((uint8_t)0x0F) +#define ADC_Channel_16 ((uint8_t)0x10) +#define ADC_Channel_17 ((uint8_t)0x11) + +#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_Channel_0) || ((CHANNEL) == ADC_Channel_1) || \ + ((CHANNEL) == ADC_Channel_2) || ((CHANNEL) == ADC_Channel_3) || \ + ((CHANNEL) == ADC_Channel_4) || ((CHANNEL) == ADC_Channel_5) || \ + ((CHANNEL) == ADC_Channel_6) || ((CHANNEL) == ADC_Channel_7) || \ + ((CHANNEL) == ADC_Channel_8) || ((CHANNEL) == ADC_Channel_9) || \ + ((CHANNEL) == ADC_Channel_10) || ((CHANNEL) == ADC_Channel_11) || \ + ((CHANNEL) == ADC_Channel_12) || ((CHANNEL) == ADC_Channel_13) || \ + ((CHANNEL) == ADC_Channel_14) || ((CHANNEL) == ADC_Channel_15) || \ + ((CHANNEL) == ADC_Channel_16) || ((CHANNEL) == ADC_Channel_17)) +/** + * @} + */ + +/** @defgroup ADC_sampling_time + * @{ + */ + +#define ADC_SampleTime_1Cycles5 ((uint8_t)0x00) +#define ADC_SampleTime_7Cycles5 ((uint8_t)0x01) +#define ADC_SampleTime_13Cycles5 ((uint8_t)0x02) +#define ADC_SampleTime_28Cycles5 ((uint8_t)0x03) +#define ADC_SampleTime_41Cycles5 ((uint8_t)0x04) +#define ADC_SampleTime_55Cycles5 ((uint8_t)0x05) +#define ADC_SampleTime_71Cycles5 ((uint8_t)0x06) +#define ADC_SampleTime_239Cycles5 ((uint8_t)0x07) +#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_1Cycles5) || \ + ((TIME) == ADC_SampleTime_7Cycles5) || \ + ((TIME) == ADC_SampleTime_13Cycles5) || \ + ((TIME) == ADC_SampleTime_28Cycles5) || \ + ((TIME) == ADC_SampleTime_41Cycles5) || \ + ((TIME) == ADC_SampleTime_55Cycles5) || \ + ((TIME) == ADC_SampleTime_71Cycles5) || \ + ((TIME) == ADC_SampleTime_239Cycles5)) +/** + * @} + */ + +/** @defgroup ADC_external_trigger_sources_for_injected_channels_conversion + * @{ + */ + +#define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00002000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00003000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00004000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00005000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 ((uint32_t)0x00006000) /*!< For ADC1 and ADC2 */ + +#define ADC_ExternalTrigInjecConv_T1_TRGO ((uint32_t)0x00000000) /*!< For ADC1, ADC2 and ADC3 */ +#define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00001000) /*!< For ADC1, ADC2 and ADC3 */ +#define ADC_ExternalTrigInjecConv_None ((uint32_t)0x00007000) /*!< For ADC1, ADC2 and ADC3 */ + +#define ADC_ExternalTrigInjecConv_T4_CC3 ((uint32_t)0x00002000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T8_CC2 ((uint32_t)0x00003000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T8_CC4 ((uint32_t)0x00004000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T5_TRGO ((uint32_t)0x00005000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T5_CC4 ((uint32_t)0x00006000) /*!< For ADC3 only */ + +#define IS_ADC_EXT_INJEC_TRIG(INJTRIG) (((INJTRIG) == ADC_ExternalTrigInjecConv_T1_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T1_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_CC1) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T3_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_None) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC3) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC2) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_CC4)) +/** + * @} + */ + +/** @defgroup ADC_injected_channel_selection + * @{ + */ + +#define ADC_InjectedChannel_1 ((uint8_t)0x14) +#define ADC_InjectedChannel_2 ((uint8_t)0x18) +#define ADC_InjectedChannel_3 ((uint8_t)0x1C) +#define ADC_InjectedChannel_4 ((uint8_t)0x20) +#define IS_ADC_INJECTED_CHANNEL(CHANNEL) (((CHANNEL) == ADC_InjectedChannel_1) || \ + ((CHANNEL) == ADC_InjectedChannel_2) || \ + ((CHANNEL) == ADC_InjectedChannel_3) || \ + ((CHANNEL) == ADC_InjectedChannel_4)) +/** + * @} + */ + +/** @defgroup ADC_analog_watchdog_selection + * @{ + */ + +#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200) +#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200) +#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200) +#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000) +#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000) +#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000) +#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000) + +#define IS_ADC_ANALOG_WATCHDOG(WATCHDOG) (((WATCHDOG) == ADC_AnalogWatchdog_SingleRegEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_SingleInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_SingleRegOrInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllRegEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllRegAllInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_None)) +/** + * @} + */ + +/** @defgroup ADC_interrupts_definition + * @{ + */ + +#define ADC_IT_EOC ((uint16_t)0x0220) +#define ADC_IT_AWD ((uint16_t)0x0140) +#define ADC_IT_JEOC ((uint16_t)0x0480) + +#define IS_ADC_IT(IT) ((((IT) & (uint16_t)0xF81F) == 0x00) && ((IT) != 0x00)) + +#define IS_ADC_GET_IT(IT) (((IT) == ADC_IT_EOC) || ((IT) == ADC_IT_AWD) || \ + ((IT) == ADC_IT_JEOC)) +/** + * @} + */ + +/** @defgroup ADC_flags_definition + * @{ + */ + +#define ADC_FLAG_AWD ((uint8_t)0x01) +#define ADC_FLAG_EOC ((uint8_t)0x02) +#define ADC_FLAG_JEOC ((uint8_t)0x04) +#define ADC_FLAG_JSTRT ((uint8_t)0x08) +#define ADC_FLAG_STRT ((uint8_t)0x10) +#define IS_ADC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint8_t)0xE0) == 0x00) && ((FLAG) != 0x00)) +#define IS_ADC_GET_FLAG(FLAG) (((FLAG) == ADC_FLAG_AWD) || ((FLAG) == ADC_FLAG_EOC) || \ + ((FLAG) == ADC_FLAG_JEOC) || ((FLAG)== ADC_FLAG_JSTRT) || \ + ((FLAG) == ADC_FLAG_STRT)) +/** + * @} + */ + +/** @defgroup ADC_thresholds + * @{ + */ + +#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF) + +/** + * @} + */ + +/** @defgroup ADC_injected_offset + * @{ + */ + +#define IS_ADC_OFFSET(OFFSET) ((OFFSET) <= 0xFFF) + +/** + * @} + */ + +/** @defgroup ADC_injected_length + * @{ + */ + +#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x4)) + +/** + * @} + */ + +/** @defgroup ADC_injected_rank + * @{ + */ + +#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x4)) + +/** + * @} + */ + + +/** @defgroup ADC_regular_length + * @{ + */ + +#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x10)) +/** + * @} + */ + +/** @defgroup ADC_regular_rank + * @{ + */ + +#define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x10)) + +/** + * @} + */ + +/** @defgroup ADC_regular_discontinuous_mode_number + * @{ + */ + +#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= 0x1) && ((NUMBER) <= 0x8)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup ADC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Exported_Functions + * @{ + */ + +void ADC_DeInit(ADC_TypeDef* ADCx); +void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); +void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); +void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); +void ADC_ResetCalibration(ADC_TypeDef* ADCx); +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx); +void ADC_StartCalibration(ADC_TypeDef* ADCx); +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); +void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); +void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); +void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); +uint32_t ADC_GetDualModeConversionValue(void); +void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv); +void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx); +void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); +void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); +void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold); +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); +void ADC_TempSensorVrefintCmd(FunctionalState NewState); +FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); +void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); +ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); +void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_ADC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h new file mode 100644 index 0000000..1c16cda --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h @@ -0,0 +1,194 @@ +/** + ****************************************************************************** + * @file stm32f10x_bkp.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the BKP firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_BKP_H +#define __STM32F10x_BKP_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup BKP + * @{ + */ + +/** @defgroup BKP_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Exported_Constants + * @{ + */ + +/** @defgroup Tamper_Pin_active_level + * @{ + */ + +#define BKP_TamperPinLevel_High ((uint16_t)0x0000) +#define BKP_TamperPinLevel_Low ((uint16_t)0x0001) +#define IS_BKP_TAMPER_PIN_LEVEL(LEVEL) (((LEVEL) == BKP_TamperPinLevel_High) || \ + ((LEVEL) == BKP_TamperPinLevel_Low)) +/** + * @} + */ + +/** @defgroup RTC_output_source_to_output_on_the_Tamper_pin + * @{ + */ + +#define BKP_RTCOutputSource_None ((uint16_t)0x0000) +#define BKP_RTCOutputSource_CalibClock ((uint16_t)0x0080) +#define BKP_RTCOutputSource_Alarm ((uint16_t)0x0100) +#define BKP_RTCOutputSource_Second ((uint16_t)0x0300) +#define IS_BKP_RTC_OUTPUT_SOURCE(SOURCE) (((SOURCE) == BKP_RTCOutputSource_None) || \ + ((SOURCE) == BKP_RTCOutputSource_CalibClock) || \ + ((SOURCE) == BKP_RTCOutputSource_Alarm) || \ + ((SOURCE) == BKP_RTCOutputSource_Second)) +/** + * @} + */ + +/** @defgroup Data_Backup_Register + * @{ + */ + +#define BKP_DR1 ((uint16_t)0x0004) +#define BKP_DR2 ((uint16_t)0x0008) +#define BKP_DR3 ((uint16_t)0x000C) +#define BKP_DR4 ((uint16_t)0x0010) +#define BKP_DR5 ((uint16_t)0x0014) +#define BKP_DR6 ((uint16_t)0x0018) +#define BKP_DR7 ((uint16_t)0x001C) +#define BKP_DR8 ((uint16_t)0x0020) +#define BKP_DR9 ((uint16_t)0x0024) +#define BKP_DR10 ((uint16_t)0x0028) +#define BKP_DR11 ((uint16_t)0x0040) +#define BKP_DR12 ((uint16_t)0x0044) +#define BKP_DR13 ((uint16_t)0x0048) +#define BKP_DR14 ((uint16_t)0x004C) +#define BKP_DR15 ((uint16_t)0x0050) +#define BKP_DR16 ((uint16_t)0x0054) +#define BKP_DR17 ((uint16_t)0x0058) +#define BKP_DR18 ((uint16_t)0x005C) +#define BKP_DR19 ((uint16_t)0x0060) +#define BKP_DR20 ((uint16_t)0x0064) +#define BKP_DR21 ((uint16_t)0x0068) +#define BKP_DR22 ((uint16_t)0x006C) +#define BKP_DR23 ((uint16_t)0x0070) +#define BKP_DR24 ((uint16_t)0x0074) +#define BKP_DR25 ((uint16_t)0x0078) +#define BKP_DR26 ((uint16_t)0x007C) +#define BKP_DR27 ((uint16_t)0x0080) +#define BKP_DR28 ((uint16_t)0x0084) +#define BKP_DR29 ((uint16_t)0x0088) +#define BKP_DR30 ((uint16_t)0x008C) +#define BKP_DR31 ((uint16_t)0x0090) +#define BKP_DR32 ((uint16_t)0x0094) +#define BKP_DR33 ((uint16_t)0x0098) +#define BKP_DR34 ((uint16_t)0x009C) +#define BKP_DR35 ((uint16_t)0x00A0) +#define BKP_DR36 ((uint16_t)0x00A4) +#define BKP_DR37 ((uint16_t)0x00A8) +#define BKP_DR38 ((uint16_t)0x00AC) +#define BKP_DR39 ((uint16_t)0x00B0) +#define BKP_DR40 ((uint16_t)0x00B4) +#define BKP_DR41 ((uint16_t)0x00B8) +#define BKP_DR42 ((uint16_t)0x00BC) + +#define IS_BKP_DR(DR) (((DR) == BKP_DR1) || ((DR) == BKP_DR2) || ((DR) == BKP_DR3) || \ + ((DR) == BKP_DR4) || ((DR) == BKP_DR5) || ((DR) == BKP_DR6) || \ + ((DR) == BKP_DR7) || ((DR) == BKP_DR8) || ((DR) == BKP_DR9) || \ + ((DR) == BKP_DR10) || ((DR) == BKP_DR11) || ((DR) == BKP_DR12) || \ + ((DR) == BKP_DR13) || ((DR) == BKP_DR14) || ((DR) == BKP_DR15) || \ + ((DR) == BKP_DR16) || ((DR) == BKP_DR17) || ((DR) == BKP_DR18) || \ + ((DR) == BKP_DR19) || ((DR) == BKP_DR20) || ((DR) == BKP_DR21) || \ + ((DR) == BKP_DR22) || ((DR) == BKP_DR23) || ((DR) == BKP_DR24) || \ + ((DR) == BKP_DR25) || ((DR) == BKP_DR26) || ((DR) == BKP_DR27) || \ + ((DR) == BKP_DR28) || ((DR) == BKP_DR29) || ((DR) == BKP_DR30) || \ + ((DR) == BKP_DR31) || ((DR) == BKP_DR32) || ((DR) == BKP_DR33) || \ + ((DR) == BKP_DR34) || ((DR) == BKP_DR35) || ((DR) == BKP_DR36) || \ + ((DR) == BKP_DR37) || ((DR) == BKP_DR38) || ((DR) == BKP_DR39) || \ + ((DR) == BKP_DR40) || ((DR) == BKP_DR41) || ((DR) == BKP_DR42)) + +#define IS_BKP_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x7F) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup BKP_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Exported_Functions + * @{ + */ + +void BKP_DeInit(void); +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel); +void BKP_TamperPinCmd(FunctionalState NewState); +void BKP_ITConfig(FunctionalState NewState); +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource); +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue); +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data); +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR); +FlagStatus BKP_GetFlagStatus(void); +void BKP_ClearFlag(void); +ITStatus BKP_GetITStatus(void); +void BKP_ClearITPendingBit(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_BKP_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h new file mode 100644 index 0000000..e8b430f --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h @@ -0,0 +1,535 @@ +/** + ****************************************************************************** + * @file stm32f10x_can.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the CAN firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CAN_H +#define __STM32F10x_CAN_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup CAN + * @{ + */ + +/** @defgroup CAN_Exported_Types + * @{ + */ + +#define IS_CAN_ALL_PERIPH(PERIPH) (((PERIPH) == CAN1) || \ + ((PERIPH) == CAN2)) + +/** + * @brief CAN init structure definition + */ + +typedef struct +{ + uint16_t CAN_Prescaler; /*!< Specifies the length of a time quantum. It ranges from 1 to 1024. */ + + uint8_t CAN_Mode; /*!< Specifies the CAN operating mode. + This parameter can be a value of @ref CAN_operating_mode */ + + uint8_t CAN_SJW; /*!< Specifies the maximum number of time quanta the CAN hardware + is allowed to lengthen or shorten a bit to perform resynchronization. + This parameter can be a value of @ref CAN_synchronisation_jump_width */ + + uint8_t CAN_BS1; /*!< Specifies the number of time quanta in Bit Segment 1. + This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 */ + + uint8_t CAN_BS2; /*!< Specifies the number of time quanta in Bit Segment 2. + This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */ + + FunctionalState CAN_TTCM; /*!< Enable or disable the time triggered communication mode. + This parameter can be set either to ENABLE or DISABLE. */ + + FunctionalState CAN_ABOM; /*!< Enable or disable the automatic bus-off management. + This parameter can be set either to ENABLE or DISABLE. */ + + FunctionalState CAN_AWUM; /*!< Enable or disable the automatic wake-up mode. + This parameter can be set either to ENABLE or DISABLE. */ + + FunctionalState CAN_NART; /*!< Enable or disable the no-automatic retransmission mode. + This parameter can be set either to ENABLE or DISABLE. */ + + FunctionalState CAN_RFLM; /*!< Enable or disable the Receive FIFO Locked mode. + This parameter can be set either to ENABLE or DISABLE. */ + + FunctionalState CAN_TXFP; /*!< Enable or disable the transmit FIFO priority. + This parameter can be set either to ENABLE or DISABLE. */ +} CAN_InitTypeDef; + +/** + * @brief CAN filter init structure definition + */ + +typedef struct +{ + uint16_t CAN_FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bit + configuration, first one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bit + configuration, second one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number, + according to the mode (MSBs for a 32-bit configuration, + first one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterMaskIdLow; /*!< Specifies the filter mask number or identification number, + according to the mode (LSBs for a 32-bit configuration, + second one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter. + This parameter can be a value of @ref CAN_filter_FIFO */ + + uint8_t CAN_FilterNumber; /*!< Specifies the filter which will be initialized. It ranges from 0 to 13. */ + + uint8_t CAN_FilterMode; /*!< Specifies the filter mode to be initialized. + This parameter can be a value of @ref CAN_filter_mode */ + + uint8_t CAN_FilterScale; /*!< Specifies the filter scale. + This parameter can be a value of @ref CAN_filter_scale */ + + FunctionalState CAN_FilterActivation; /*!< Enable or disable the filter. + This parameter can be set either to ENABLE or DISABLE. */ +} CAN_FilterInitTypeDef; + +/** + * @brief CAN Tx message structure definition + */ + +typedef struct +{ + uint32_t StdId; /*!< Specifies the standard identifier. + This parameter can be a value between 0 to 0x7FF. */ + + uint32_t ExtId; /*!< Specifies the extended identifier. + This parameter can be a value between 0 to 0x1FFFFFFF. */ + + uint8_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted. + This parameter can be a value of @ref CAN_identifier_type */ + + uint8_t RTR; /*!< Specifies the type of frame for the message that will be transmitted. + This parameter can be a value of @ref CAN_remote_transmission_request */ + + uint8_t DLC; /*!< Specifies the length of the frame that will be transmitted. + This parameter can be a value between 0 to 8 */ + + uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 to 0xFF. */ +} CanTxMsg; + +/** + * @brief CAN Rx message structure definition + */ + +typedef struct +{ + uint32_t StdId; /*!< Specifies the standard identifier. + This parameter can be a value between 0 to 0x7FF. */ + + uint32_t ExtId; /*!< Specifies the extended identifier. + This parameter can be a value between 0 to 0x1FFFFFFF. */ + + uint8_t IDE; /*!< Specifies the type of identifier for the message that will be received. + This parameter can be a value of @ref CAN_identifier_type */ + + uint8_t RTR; /*!< Specifies the type of frame for the received message. + This parameter can be a value of @ref CAN_remote_transmission_request */ + + uint8_t DLC; /*!< Specifies the length of the frame that will be received. + This parameter can be a value between 0 to 8 */ + + uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to 0xFF. */ + + uint8_t FMI; /*!< Specifies the index of the filter the message stored in the mailbox passes through. + This parameter can be a value between 0 to 0xFF */ +} CanRxMsg; + +/** + * @} + */ + +/** @defgroup CAN_Exported_Constants + * @{ + */ + +/** @defgroup CAN_sleep_constants + * @{ + */ + +#define CANINITFAILED ((uint8_t)0x00) /*!< CAN initialization failed */ +#define CANINITOK ((uint8_t)0x01) /*!< CAN initialization failed */ + +/** + * @} + */ + +/** @defgroup CAN_operating_mode + * @{ + */ + +#define CAN_Mode_Normal ((uint8_t)0x00) /*!< normal mode */ +#define CAN_Mode_LoopBack ((uint8_t)0x01) /*!< loopback mode */ +#define CAN_Mode_Silent ((uint8_t)0x02) /*!< silent mode */ +#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /*!< loopback combined with silent mode */ + +#define IS_CAN_MODE(MODE) (((MODE) == CAN_Mode_Normal) || ((MODE) == CAN_Mode_LoopBack)|| \ + ((MODE) == CAN_Mode_Silent) || ((MODE) == CAN_Mode_Silent_LoopBack)) +/** + * @} + */ + +/** @defgroup CAN_synchronisation_jump_width + * @{ + */ + +#define CAN_SJW_1tq ((uint8_t)0x00) /*!< 1 time quantum */ +#define CAN_SJW_2tq ((uint8_t)0x01) /*!< 2 time quantum */ +#define CAN_SJW_3tq ((uint8_t)0x02) /*!< 3 time quantum */ +#define CAN_SJW_4tq ((uint8_t)0x03) /*!< 4 time quantum */ + +#define IS_CAN_SJW(SJW) (((SJW) == CAN_SJW_1tq) || ((SJW) == CAN_SJW_2tq)|| \ + ((SJW) == CAN_SJW_3tq) || ((SJW) == CAN_SJW_4tq)) +/** + * @} + */ + +/** @defgroup CAN_time_quantum_in_bit_segment_1 + * @{ + */ + +#define CAN_BS1_1tq ((uint8_t)0x00) /*!< 1 time quantum */ +#define CAN_BS1_2tq ((uint8_t)0x01) /*!< 2 time quantum */ +#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ +#define CAN_BS1_4tq ((uint8_t)0x03) /*!< 4 time quantum */ +#define CAN_BS1_5tq ((uint8_t)0x04) /*!< 5 time quantum */ +#define CAN_BS1_6tq ((uint8_t)0x05) /*!< 6 time quantum */ +#define CAN_BS1_7tq ((uint8_t)0x06) /*!< 7 time quantum */ +#define CAN_BS1_8tq ((uint8_t)0x07) /*!< 8 time quantum */ +#define CAN_BS1_9tq ((uint8_t)0x08) /*!< 9 time quantum */ +#define CAN_BS1_10tq ((uint8_t)0x09) /*!< 10 time quantum */ +#define CAN_BS1_11tq ((uint8_t)0x0A) /*!< 11 time quantum */ +#define CAN_BS1_12tq ((uint8_t)0x0B) /*!< 12 time quantum */ +#define CAN_BS1_13tq ((uint8_t)0x0C) /*!< 13 time quantum */ +#define CAN_BS1_14tq ((uint8_t)0x0D) /*!< 14 time quantum */ +#define CAN_BS1_15tq ((uint8_t)0x0E) /*!< 15 time quantum */ +#define CAN_BS1_16tq ((uint8_t)0x0F) /*!< 16 time quantum */ + +#define IS_CAN_BS1(BS1) ((BS1) <= CAN_BS1_16tq) +/** + * @} + */ + +/** @defgroup CAN_time_quantum_in_bit_segment_2 + * @{ + */ + +#define CAN_BS2_1tq ((uint8_t)0x00) /*!< 1 time quantum */ +#define CAN_BS2_2tq ((uint8_t)0x01) /*!< 2 time quantum */ +#define CAN_BS2_3tq ((uint8_t)0x02) /*!< 3 time quantum */ +#define CAN_BS2_4tq ((uint8_t)0x03) /*!< 4 time quantum */ +#define CAN_BS2_5tq ((uint8_t)0x04) /*!< 5 time quantum */ +#define CAN_BS2_6tq ((uint8_t)0x05) /*!< 6 time quantum */ +#define CAN_BS2_7tq ((uint8_t)0x06) /*!< 7 time quantum */ +#define CAN_BS2_8tq ((uint8_t)0x07) /*!< 8 time quantum */ + +#define IS_CAN_BS2(BS2) ((BS2) <= CAN_BS2_8tq) + +/** + * @} + */ + +/** @defgroup CAN_clock_prescaler + * @{ + */ + +#define IS_CAN_PRESCALER(PRESCALER) (((PRESCALER) >= 1) && ((PRESCALER) <= 1024)) + +/** + * @} + */ + +/** @defgroup CAN_filter_number + * @{ + */ +#ifndef STM32F10X_CL + #define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 13) +#else + #define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 27) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +/** @defgroup CAN_filter_mode + * @{ + */ + +#define CAN_FilterMode_IdMask ((uint8_t)0x00) /*!< id/mask mode */ +#define CAN_FilterMode_IdList ((uint8_t)0x01) /*!< identifier list mode */ + +#define IS_CAN_FILTER_MODE(MODE) (((MODE) == CAN_FilterMode_IdMask) || \ + ((MODE) == CAN_FilterMode_IdList)) +/** + * @} + */ + +/** @defgroup CAN_filter_scale + * @{ + */ + +#define CAN_FilterScale_16bit ((uint8_t)0x00) /*!< Two 16-bit filters */ +#define CAN_FilterScale_32bit ((uint8_t)0x01) /*!< One 32-bit filter */ + +#define IS_CAN_FILTER_SCALE(SCALE) (((SCALE) == CAN_FilterScale_16bit) || \ + ((SCALE) == CAN_FilterScale_32bit)) + +/** + * @} + */ + +/** @defgroup CAN_filter_FIFO + * @{ + */ + +#define CAN_FilterFIFO0 ((uint8_t)0x00) /*!< Filter FIFO 0 assignment for filter x */ +#define CAN_FilterFIFO1 ((uint8_t)0x01) /*!< Filter FIFO 1 assignment for filter x */ +#define IS_CAN_FILTER_FIFO(FIFO) (((FIFO) == CAN_FilterFIFO0) || \ + ((FIFO) == CAN_FilterFIFO1)) + +/** + * @} + */ + +/** @defgroup Start_bank_filter_for_slave_CAN + * @{ + */ +#define IS_CAN_BANKNUMBER(BANKNUMBER) (((BANKNUMBER) >= 1) && ((BANKNUMBER) <= 27)) +/** + * @} + */ + +/** @defgroup CAN_Tx + * @{ + */ + +#define IS_CAN_TRANSMITMAILBOX(TRANSMITMAILBOX) ((TRANSMITMAILBOX) <= ((uint8_t)0x02)) +#define IS_CAN_STDID(STDID) ((STDID) <= ((uint32_t)0x7FF)) +#define IS_CAN_EXTID(EXTID) ((EXTID) <= ((uint32_t)0x1FFFFFFF)) +#define IS_CAN_DLC(DLC) ((DLC) <= ((uint8_t)0x08)) + +/** + * @} + */ + +/** @defgroup CAN_identifier_type + * @{ + */ + +#define CAN_ID_STD ((uint32_t)0x00000000) /*!< Standard Id */ +#define CAN_ID_EXT ((uint32_t)0x00000004) /*!< Extended Id */ +#define IS_CAN_IDTYPE(IDTYPE) (((IDTYPE) == CAN_ID_STD) || ((IDTYPE) == CAN_ID_EXT)) + +/** + * @} + */ + +/** @defgroup CAN_remote_transmission_request + * @{ + */ + +#define CAN_RTR_DATA ((uint32_t)0x00000000) /*!< Data frame */ +#define CAN_RTR_REMOTE ((uint32_t)0x00000002) /*!< Remote frame */ +#define IS_CAN_RTR(RTR) (((RTR) == CAN_RTR_DATA) || ((RTR) == CAN_RTR_REMOTE)) + +/** + * @} + */ + +/** @defgroup CAN_transmit_constants + * @{ + */ + +#define CANTXFAILED ((uint8_t)0x00) /*!< CAN transmission failed */ +#define CANTXOK ((uint8_t)0x01) /*!< CAN transmission succeeded */ +#define CANTXPENDING ((uint8_t)0x02) /*!< CAN transmission pending */ +#define CAN_NO_MB ((uint8_t)0x04) /*!< CAN cell did not provide an empty mailbox */ + +/** + * @} + */ + +/** @defgroup CAN_receive_FIFO_number_constants + * @{ + */ + +#define CAN_FIFO0 ((uint8_t)0x00) /*!< CAN FIFO0 used to receive */ +#define CAN_FIFO1 ((uint8_t)0x01) /*!< CAN FIFO1 used to receive */ + +#define IS_CAN_FIFO(FIFO) (((FIFO) == CAN_FIFO0) || ((FIFO) == CAN_FIFO1)) + +/** + * @} + */ + +/** @defgroup CAN_sleep_constants + * @{ + */ + +#define CANSLEEPFAILED ((uint8_t)0x00) /*!< CAN did not enter the sleep mode */ +#define CANSLEEPOK ((uint8_t)0x01) /*!< CAN entered the sleep mode */ + +/** + * @} + */ + +/** @defgroup CAN_wake_up_constants + * @{ + */ + +#define CANWAKEUPFAILED ((uint8_t)0x00) /*!< CAN did not leave the sleep mode */ +#define CANWAKEUPOK ((uint8_t)0x01) /*!< CAN leaved the sleep mode */ + +/** + * @} + */ + +/** @defgroup CAN_flags + * @{ + */ + +#define CAN_FLAG_EWG ((uint32_t)0x00000001) /*!< Error Warning Flag */ +#define CAN_FLAG_EPV ((uint32_t)0x00000002) /*!< Error Passive Flag */ +#define CAN_FLAG_BOF ((uint32_t)0x00000004) /*!< Bus-Off Flag */ + +#define IS_CAN_FLAG(FLAG) (((FLAG) == CAN_FLAG_EWG) || ((FLAG) == CAN_FLAG_EPV) ||\ + ((FLAG) == CAN_FLAG_BOF)) + +/** + * @} + */ + +/** @defgroup CAN_interrupts + * @{ + */ + +#define CAN_IT_RQCP0 ((uint32_t)0x00000005) /*!< Request completed mailbox 0 */ +#define CAN_IT_RQCP1 ((uint32_t)0x00000006) /*!< Request completed mailbox 1 */ +#define CAN_IT_RQCP2 ((uint32_t)0x00000007) /*!< Request completed mailbox 2 */ +#define CAN_IT_TME ((uint32_t)0x00000001) /*!< Transmit mailbox empty */ +#define CAN_IT_FMP0 ((uint32_t)0x00000002) /*!< FIFO 0 message pending */ +#define CAN_IT_FF0 ((uint32_t)0x00000004) /*!< FIFO 0 full */ +#define CAN_IT_FOV0 ((uint32_t)0x00000008) /*!< FIFO 0 overrun */ +#define CAN_IT_FMP1 ((uint32_t)0x00000010) /*!< FIFO 1 message pending */ +#define CAN_IT_FF1 ((uint32_t)0x00000020) /*!< FIFO 1 full */ +#define CAN_IT_FOV1 ((uint32_t)0x00000040) /*!< FIFO 1 overrun */ +#define CAN_IT_EWG ((uint32_t)0x00000100) /*!< Error warning */ +#define CAN_IT_EPV ((uint32_t)0x00000200) /*!< Error passive */ +#define CAN_IT_BOF ((uint32_t)0x00000400) /*!< Bus-off */ +#define CAN_IT_LEC ((uint32_t)0x00000800) /*!< Last error code */ +#define CAN_IT_ERR ((uint32_t)0x00008000) /*!< Error */ +#define CAN_IT_WKU ((uint32_t)0x00010000) /*!< Wake-up */ +#define CAN_IT_SLK ((uint32_t)0x00020000) /*!< Sleep */ + +#define IS_CAN_ITConfig(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FMP0) ||\ + ((IT) == CAN_IT_FF0) || ((IT) == CAN_IT_FOV0) ||\ + ((IT) == CAN_IT_FMP1) || ((IT) == CAN_IT_FF1) ||\ + ((IT) == CAN_IT_FOV1) || ((IT) == CAN_IT_EWG) ||\ + ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ + ((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||\ + ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) + +#define IS_CAN_ITStatus(IT) (((IT) == CAN_IT_RQCP0) || ((IT) == CAN_IT_RQCP1) ||\ + ((IT) == CAN_IT_RQCP2) || ((IT) == CAN_IT_FF0) ||\ + ((IT) == CAN_IT_FOV0) || ((IT) == CAN_IT_FF1) ||\ + ((IT) == CAN_IT_FOV1) || ((IT) == CAN_IT_EWG) ||\ + ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ + ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup CAN_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions + * @{ + */ + +void CAN_DeInit(CAN_TypeDef* CANx); +uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct); +void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct); +void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct); +void CAN_SlaveStartBank(uint8_t CAN_BankNumber); +void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState); +uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage); +uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox); +void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox); +void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber); +uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber); +void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage); +void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState); +uint8_t CAN_Sleep(CAN_TypeDef* CANx); +uint8_t CAN_WakeUp(CAN_TypeDef* CANx); +FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG); +void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG); +ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT); +void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_CAN_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h new file mode 100644 index 0000000..7dec6d0 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h @@ -0,0 +1,93 @@ +/** + ****************************************************************************** + * @file stm32f10x_crc.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the CRC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CRC_H +#define __STM32F10x_CRC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup CRC + * @{ + */ + +/** @defgroup CRC_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Exported_Functions + * @{ + */ + +void CRC_ResetDR(void); +uint32_t CRC_CalcCRC(uint32_t Data); +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); +uint32_t CRC_GetCRC(void); +void CRC_SetIDRegister(uint8_t IDValue); +uint8_t CRC_GetIDRegister(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_CRC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h new file mode 100644 index 0000000..11ecaca --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h @@ -0,0 +1,282 @@ +/** + ****************************************************************************** + * @file stm32f10x_dac.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the DAC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_DAC_H +#define __STM32F10x_DAC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DAC + * @{ + */ + +/** @defgroup DAC_Exported_Types + * @{ + */ + +/** + * @brief DAC Init structure definition + */ + +typedef struct +{ + uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel. + This parameter can be a value of @ref DAC_trigger_selection */ + + uint32_t DAC_WaveGeneration; /*!< Specifies whether DAC channel noise waves or triangle waves + are generated, or whether no wave is generated. + This parameter can be a value of @ref DAC_wave_generation */ + + uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< Specifies the LFSR mask for noise wave generation or + the maximum amplitude triangle generation for the DAC channel. + This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */ + + uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled. + This parameter can be a value of @ref DAC_output_buffer */ +}DAC_InitTypeDef; + +/** + * @} + */ + +/** @defgroup DAC_Exported_Constants + * @{ + */ + +/** @defgroup DAC_trigger_selection + * @{ + */ + +#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register + has been loaded, and not by external trigger */ +#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T8_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel + only in High-density devices*/ +#define DAC_Trigger_T3_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel + only in Connectivity line devices */ +#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T5_TRGO ((uint32_t)0x0000001C) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */ + +#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_Trigger_None) || \ + ((TRIGGER) == DAC_Trigger_T6_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T8_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T7_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T5_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T2_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T4_TRGO) || \ + ((TRIGGER) == DAC_Trigger_Ext_IT9) || \ + ((TRIGGER) == DAC_Trigger_Software)) + +/** + * @} + */ + +/** @defgroup DAC_wave_generation + * @{ + */ + +#define DAC_WaveGeneration_None ((uint32_t)0x00000000) +#define DAC_WaveGeneration_Noise ((uint32_t)0x00000040) +#define DAC_WaveGeneration_Triangle ((uint32_t)0x00000080) +#define IS_DAC_GENERATE_WAVE(WAVE) (((WAVE) == DAC_WaveGeneration_None) || \ + ((WAVE) == DAC_WaveGeneration_Noise) || \ + ((WAVE) == DAC_WaveGeneration_Triangle)) +/** + * @} + */ + +/** @defgroup DAC_lfsrunmask_triangleamplitude + * @{ + */ + +#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ +#define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000100) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000200) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000300) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000400) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000500) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000600) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000700) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000800) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000900) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x00000A00) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x00000B00) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ +#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000) /*!< Select max triangle amplitude of 1 */ +#define DAC_TriangleAmplitude_3 ((uint32_t)0x00000100) /*!< Select max triangle amplitude of 3 */ +#define DAC_TriangleAmplitude_7 ((uint32_t)0x00000200) /*!< Select max triangle amplitude of 7 */ +#define DAC_TriangleAmplitude_15 ((uint32_t)0x00000300) /*!< Select max triangle amplitude of 15 */ +#define DAC_TriangleAmplitude_31 ((uint32_t)0x00000400) /*!< Select max triangle amplitude of 31 */ +#define DAC_TriangleAmplitude_63 ((uint32_t)0x00000500) /*!< Select max triangle amplitude of 63 */ +#define DAC_TriangleAmplitude_127 ((uint32_t)0x00000600) /*!< Select max triangle amplitude of 127 */ +#define DAC_TriangleAmplitude_255 ((uint32_t)0x00000700) /*!< Select max triangle amplitude of 255 */ +#define DAC_TriangleAmplitude_511 ((uint32_t)0x00000800) /*!< Select max triangle amplitude of 511 */ +#define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000900) /*!< Select max triangle amplitude of 1023 */ +#define DAC_TriangleAmplitude_2047 ((uint32_t)0x00000A00) /*!< Select max triangle amplitude of 2047 */ +#define DAC_TriangleAmplitude_4095 ((uint32_t)0x00000B00) /*!< Select max triangle amplitude of 4095 */ + +#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUnmask_Bit0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits1_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits2_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits3_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits4_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits5_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits6_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits7_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits8_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits9_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits10_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits11_0) || \ + ((VALUE) == DAC_TriangleAmplitude_1) || \ + ((VALUE) == DAC_TriangleAmplitude_3) || \ + ((VALUE) == DAC_TriangleAmplitude_7) || \ + ((VALUE) == DAC_TriangleAmplitude_15) || \ + ((VALUE) == DAC_TriangleAmplitude_31) || \ + ((VALUE) == DAC_TriangleAmplitude_63) || \ + ((VALUE) == DAC_TriangleAmplitude_127) || \ + ((VALUE) == DAC_TriangleAmplitude_255) || \ + ((VALUE) == DAC_TriangleAmplitude_511) || \ + ((VALUE) == DAC_TriangleAmplitude_1023) || \ + ((VALUE) == DAC_TriangleAmplitude_2047) || \ + ((VALUE) == DAC_TriangleAmplitude_4095)) +/** + * @} + */ + +/** @defgroup DAC_output_buffer + * @{ + */ + +#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) +#define DAC_OutputBuffer_Disable ((uint32_t)0x00000002) +#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OutputBuffer_Enable) || \ + ((STATE) == DAC_OutputBuffer_Disable)) +/** + * @} + */ + +/** @defgroup DAC_Channel_selection + * @{ + */ + +#define DAC_Channel_1 ((uint32_t)0x00000000) +#define DAC_Channel_2 ((uint32_t)0x00000010) +#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_Channel_1) || \ + ((CHANNEL) == DAC_Channel_2)) +/** + * @} + */ + +/** @defgroup DAC_data_alignement + * @{ + */ + +#define DAC_Align_12b_R ((uint32_t)0x00000000) +#define DAC_Align_12b_L ((uint32_t)0x00000004) +#define DAC_Align_8b_R ((uint32_t)0x00000008) +#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_Align_12b_R) || \ + ((ALIGN) == DAC_Align_12b_L) || \ + ((ALIGN) == DAC_Align_8b_R)) +/** + * @} + */ + +/** @defgroup DAC_wave_generation + * @{ + */ + +#define DAC_Wave_Noise ((uint32_t)0x00000040) +#define DAC_Wave_Triangle ((uint32_t)0x00000080) +#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_Wave_Noise) || \ + ((WAVE) == DAC_Wave_Triangle)) +/** + * @} + */ + +/** @defgroup DAC_data + * @{ + */ + +#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup DAC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Exported_Functions + * @{ + */ + +void DAC_DeInit(void); +void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct); +void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct); +void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_DualSoftwareTriggerCmd(FunctionalState NewState); +void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState); +void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); +uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_DAC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h new file mode 100644 index 0000000..be48ed9 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h @@ -0,0 +1,109 @@ +/** + ****************************************************************************** + * @file stm32f10x_dbgmcu.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the DBGMCU + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_DBGMCU_H +#define __STM32F10x_DBGMCU_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DBGMCU + * @{ + */ + +/** @defgroup DBGMCU_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Exported_Constants + * @{ + */ + +#define DBGMCU_SLEEP ((uint32_t)0x00000001) +#define DBGMCU_STOP ((uint32_t)0x00000002) +#define DBGMCU_STANDBY ((uint32_t)0x00000004) +#define DBGMCU_IWDG_STOP ((uint32_t)0x00000100) +#define DBGMCU_WWDG_STOP ((uint32_t)0x00000200) +#define DBGMCU_TIM1_STOP ((uint32_t)0x00000400) +#define DBGMCU_TIM2_STOP ((uint32_t)0x00000800) +#define DBGMCU_TIM3_STOP ((uint32_t)0x00001000) +#define DBGMCU_TIM4_STOP ((uint32_t)0x00002000) +#define DBGMCU_CAN1_STOP ((uint32_t)0x00004000) +#define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00008000) +#define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00010000) +#define DBGMCU_TIM8_STOP ((uint32_t)0x00020000) +#define DBGMCU_TIM5_STOP ((uint32_t)0x00040000) +#define DBGMCU_TIM6_STOP ((uint32_t)0x00080000) +#define DBGMCU_TIM7_STOP ((uint32_t)0x00100000) +#define DBGMCU_CAN2_STOP ((uint32_t)0x00200000) + +#define IS_DBGMCU_PERIPH(PERIPH) ((((PERIPH) & 0xFFC000F8) == 0x00) && ((PERIPH) != 0x00)) +/** + * @} + */ + +/** @defgroup DBGMCU_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Exported_Functions + * @{ + */ + +uint32_t DBGMCU_GetREVID(void); +uint32_t DBGMCU_GetDEVID(void); +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_DBGMCU_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h new file mode 100644 index 0000000..376f8a3 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h @@ -0,0 +1,437 @@ +/** + ****************************************************************************** + * @file stm32f10x_dma.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the DMA firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_DMA_H +#define __STM32F10x_DMA_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DMA + * @{ + */ + +/** @defgroup DMA_Exported_Types + * @{ + */ + +/** + * @brief DMA Init structure definition + */ + +typedef struct +{ + uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */ + + uint32_t DMA_MemoryBaseAddr; /*!< Specifies the memory base address for DMAy Channelx. */ + + uint32_t DMA_DIR; /*!< Specifies if the peripheral is the source or destination. + This parameter can be a value of @ref DMA_data_transfer_direction */ + + uint32_t DMA_BufferSize; /*!< Specifies the buffer size, in data unit, of the specified Channel. + The data unit is equal to the configuration set in DMA_PeripheralDataSize + or DMA_MemoryDataSize members depending in the transfer direction. */ + + uint32_t DMA_PeripheralInc; /*!< Specifies whether the Peripheral address register is incremented or not. + This parameter can be a value of @ref DMA_peripheral_incremented_mode */ + + uint32_t DMA_MemoryInc; /*!< Specifies whether the memory address register is incremented or not. + This parameter can be a value of @ref DMA_memory_incremented_mode */ + + uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width. + This parameter can be a value of @ref DMA_peripheral_data_size */ + + uint32_t DMA_MemoryDataSize; /*!< Specifies the Memory data width. + This parameter can be a value of @ref DMA_memory_data_size */ + + uint32_t DMA_Mode; /*!< Specifies the operation mode of the DMAy Channelx. + This parameter can be a value of @ref DMA_circular_normal_mode. + @note: The circular buffer mode cannot be used if the memory-to-memory + data transfer is configured on the selected Channel */ + + uint32_t DMA_Priority; /*!< Specifies the software priority for the DMAy Channelx. + This parameter can be a value of @ref DMA_priority_level */ + + uint32_t DMA_M2M; /*!< Specifies if the DMAy Channelx will be used in memory-to-memory transfer. + This parameter can be a value of @ref DMA_memory_to_memory */ +}DMA_InitTypeDef; + +/** + * @} + */ + +/** @defgroup DMA_Exported_Constants + * @{ + */ + +#define IS_DMA_ALL_PERIPH(PERIPH) (((PERIPH) == DMA1_Channel1) || \ + ((PERIPH) == DMA1_Channel2) || \ + ((PERIPH) == DMA1_Channel3) || \ + ((PERIPH) == DMA1_Channel4) || \ + ((PERIPH) == DMA1_Channel5) || \ + ((PERIPH) == DMA1_Channel6) || \ + ((PERIPH) == DMA1_Channel7) || \ + ((PERIPH) == DMA2_Channel1) || \ + ((PERIPH) == DMA2_Channel2) || \ + ((PERIPH) == DMA2_Channel3) || \ + ((PERIPH) == DMA2_Channel4) || \ + ((PERIPH) == DMA2_Channel5)) + +/** @defgroup DMA_data_transfer_direction + * @{ + */ + +#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) +#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) +#define IS_DMA_DIR(DIR) (((DIR) == DMA_DIR_PeripheralDST) || \ + ((DIR) == DMA_DIR_PeripheralSRC)) +/** + * @} + */ + +/** @defgroup DMA_peripheral_incremented_mode + * @{ + */ + +#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040) +#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) +#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PeripheralInc_Enable) || \ + ((STATE) == DMA_PeripheralInc_Disable)) +/** + * @} + */ + +/** @defgroup DMA_memory_incremented_mode + * @{ + */ + +#define DMA_MemoryInc_Enable ((uint32_t)0x00000080) +#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) +#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MemoryInc_Enable) || \ + ((STATE) == DMA_MemoryInc_Disable)) +/** + * @} + */ + +/** @defgroup DMA_peripheral_data_size + * @{ + */ + +#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) +#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) +#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200) +#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PeripheralDataSize_Byte) || \ + ((SIZE) == DMA_PeripheralDataSize_HalfWord) || \ + ((SIZE) == DMA_PeripheralDataSize_Word)) +/** + * @} + */ + +/** @defgroup DMA_memory_data_size + * @{ + */ + +#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) +#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400) +#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800) +#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MemoryDataSize_Byte) || \ + ((SIZE) == DMA_MemoryDataSize_HalfWord) || \ + ((SIZE) == DMA_MemoryDataSize_Word)) +/** + * @} + */ + +/** @defgroup DMA_circular_normal_mode + * @{ + */ + +#define DMA_Mode_Circular ((uint32_t)0x00000020) +#define DMA_Mode_Normal ((uint32_t)0x00000000) +#define IS_DMA_MODE(MODE) (((MODE) == DMA_Mode_Circular) || ((MODE) == DMA_Mode_Normal)) +/** + * @} + */ + +/** @defgroup DMA_priority_level + * @{ + */ + +#define DMA_Priority_VeryHigh ((uint32_t)0x00003000) +#define DMA_Priority_High ((uint32_t)0x00002000) +#define DMA_Priority_Medium ((uint32_t)0x00001000) +#define DMA_Priority_Low ((uint32_t)0x00000000) +#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_Priority_VeryHigh) || \ + ((PRIORITY) == DMA_Priority_High) || \ + ((PRIORITY) == DMA_Priority_Medium) || \ + ((PRIORITY) == DMA_Priority_Low)) +/** + * @} + */ + +/** @defgroup DMA_memory_to_memory + * @{ + */ + +#define DMA_M2M_Enable ((uint32_t)0x00004000) +#define DMA_M2M_Disable ((uint32_t)0x00000000) +#define IS_DMA_M2M_STATE(STATE) (((STATE) == DMA_M2M_Enable) || ((STATE) == DMA_M2M_Disable)) + +/** + * @} + */ + +/** @defgroup DMA_interrupts_definition + * @{ + */ + +#define DMA_IT_TC ((uint32_t)0x00000002) +#define DMA_IT_HT ((uint32_t)0x00000004) +#define DMA_IT_TE ((uint32_t)0x00000008) +#define IS_DMA_CONFIG_IT(IT) ((((IT) & 0xFFFFFFF1) == 0x00) && ((IT) != 0x00)) + +#define DMA1_IT_GL1 ((uint32_t)0x00000001) +#define DMA1_IT_TC1 ((uint32_t)0x00000002) +#define DMA1_IT_HT1 ((uint32_t)0x00000004) +#define DMA1_IT_TE1 ((uint32_t)0x00000008) +#define DMA1_IT_GL2 ((uint32_t)0x00000010) +#define DMA1_IT_TC2 ((uint32_t)0x00000020) +#define DMA1_IT_HT2 ((uint32_t)0x00000040) +#define DMA1_IT_TE2 ((uint32_t)0x00000080) +#define DMA1_IT_GL3 ((uint32_t)0x00000100) +#define DMA1_IT_TC3 ((uint32_t)0x00000200) +#define DMA1_IT_HT3 ((uint32_t)0x00000400) +#define DMA1_IT_TE3 ((uint32_t)0x00000800) +#define DMA1_IT_GL4 ((uint32_t)0x00001000) +#define DMA1_IT_TC4 ((uint32_t)0x00002000) +#define DMA1_IT_HT4 ((uint32_t)0x00004000) +#define DMA1_IT_TE4 ((uint32_t)0x00008000) +#define DMA1_IT_GL5 ((uint32_t)0x00010000) +#define DMA1_IT_TC5 ((uint32_t)0x00020000) +#define DMA1_IT_HT5 ((uint32_t)0x00040000) +#define DMA1_IT_TE5 ((uint32_t)0x00080000) +#define DMA1_IT_GL6 ((uint32_t)0x00100000) +#define DMA1_IT_TC6 ((uint32_t)0x00200000) +#define DMA1_IT_HT6 ((uint32_t)0x00400000) +#define DMA1_IT_TE6 ((uint32_t)0x00800000) +#define DMA1_IT_GL7 ((uint32_t)0x01000000) +#define DMA1_IT_TC7 ((uint32_t)0x02000000) +#define DMA1_IT_HT7 ((uint32_t)0x04000000) +#define DMA1_IT_TE7 ((uint32_t)0x08000000) + +#define DMA2_IT_GL1 ((uint32_t)0x10000001) +#define DMA2_IT_TC1 ((uint32_t)0x10000002) +#define DMA2_IT_HT1 ((uint32_t)0x10000004) +#define DMA2_IT_TE1 ((uint32_t)0x10000008) +#define DMA2_IT_GL2 ((uint32_t)0x10000010) +#define DMA2_IT_TC2 ((uint32_t)0x10000020) +#define DMA2_IT_HT2 ((uint32_t)0x10000040) +#define DMA2_IT_TE2 ((uint32_t)0x10000080) +#define DMA2_IT_GL3 ((uint32_t)0x10000100) +#define DMA2_IT_TC3 ((uint32_t)0x10000200) +#define DMA2_IT_HT3 ((uint32_t)0x10000400) +#define DMA2_IT_TE3 ((uint32_t)0x10000800) +#define DMA2_IT_GL4 ((uint32_t)0x10001000) +#define DMA2_IT_TC4 ((uint32_t)0x10002000) +#define DMA2_IT_HT4 ((uint32_t)0x10004000) +#define DMA2_IT_TE4 ((uint32_t)0x10008000) +#define DMA2_IT_GL5 ((uint32_t)0x10010000) +#define DMA2_IT_TC5 ((uint32_t)0x10020000) +#define DMA2_IT_HT5 ((uint32_t)0x10040000) +#define DMA2_IT_TE5 ((uint32_t)0x10080000) + +#define IS_DMA_CLEAR_IT(IT) (((((IT) & 0xF0000000) == 0x00) || (((IT) & 0xEFF00000) == 0x00)) && ((IT) != 0x00)) + +#define IS_DMA_GET_IT(IT) (((IT) == DMA1_IT_GL1) || ((IT) == DMA1_IT_TC1) || \ + ((IT) == DMA1_IT_HT1) || ((IT) == DMA1_IT_TE1) || \ + ((IT) == DMA1_IT_GL2) || ((IT) == DMA1_IT_TC2) || \ + ((IT) == DMA1_IT_HT2) || ((IT) == DMA1_IT_TE2) || \ + ((IT) == DMA1_IT_GL3) || ((IT) == DMA1_IT_TC3) || \ + ((IT) == DMA1_IT_HT3) || ((IT) == DMA1_IT_TE3) || \ + ((IT) == DMA1_IT_GL4) || ((IT) == DMA1_IT_TC4) || \ + ((IT) == DMA1_IT_HT4) || ((IT) == DMA1_IT_TE4) || \ + ((IT) == DMA1_IT_GL5) || ((IT) == DMA1_IT_TC5) || \ + ((IT) == DMA1_IT_HT5) || ((IT) == DMA1_IT_TE5) || \ + ((IT) == DMA1_IT_GL6) || ((IT) == DMA1_IT_TC6) || \ + ((IT) == DMA1_IT_HT6) || ((IT) == DMA1_IT_TE6) || \ + ((IT) == DMA1_IT_GL7) || ((IT) == DMA1_IT_TC7) || \ + ((IT) == DMA1_IT_HT7) || ((IT) == DMA1_IT_TE7) || \ + ((IT) == DMA2_IT_GL1) || ((IT) == DMA2_IT_TC1) || \ + ((IT) == DMA2_IT_HT1) || ((IT) == DMA2_IT_TE1) || \ + ((IT) == DMA2_IT_GL2) || ((IT) == DMA2_IT_TC2) || \ + ((IT) == DMA2_IT_HT2) || ((IT) == DMA2_IT_TE2) || \ + ((IT) == DMA2_IT_GL3) || ((IT) == DMA2_IT_TC3) || \ + ((IT) == DMA2_IT_HT3) || ((IT) == DMA2_IT_TE3) || \ + ((IT) == DMA2_IT_GL4) || ((IT) == DMA2_IT_TC4) || \ + ((IT) == DMA2_IT_HT4) || ((IT) == DMA2_IT_TE4) || \ + ((IT) == DMA2_IT_GL5) || ((IT) == DMA2_IT_TC5) || \ + ((IT) == DMA2_IT_HT5) || ((IT) == DMA2_IT_TE5)) + +/** + * @} + */ + +/** @defgroup DMA_flags_definition + * @{ + */ +#define DMA1_FLAG_GL1 ((uint32_t)0x00000001) +#define DMA1_FLAG_TC1 ((uint32_t)0x00000002) +#define DMA1_FLAG_HT1 ((uint32_t)0x00000004) +#define DMA1_FLAG_TE1 ((uint32_t)0x00000008) +#define DMA1_FLAG_GL2 ((uint32_t)0x00000010) +#define DMA1_FLAG_TC2 ((uint32_t)0x00000020) +#define DMA1_FLAG_HT2 ((uint32_t)0x00000040) +#define DMA1_FLAG_TE2 ((uint32_t)0x00000080) +#define DMA1_FLAG_GL3 ((uint32_t)0x00000100) +#define DMA1_FLAG_TC3 ((uint32_t)0x00000200) +#define DMA1_FLAG_HT3 ((uint32_t)0x00000400) +#define DMA1_FLAG_TE3 ((uint32_t)0x00000800) +#define DMA1_FLAG_GL4 ((uint32_t)0x00001000) +#define DMA1_FLAG_TC4 ((uint32_t)0x00002000) +#define DMA1_FLAG_HT4 ((uint32_t)0x00004000) +#define DMA1_FLAG_TE4 ((uint32_t)0x00008000) +#define DMA1_FLAG_GL5 ((uint32_t)0x00010000) +#define DMA1_FLAG_TC5 ((uint32_t)0x00020000) +#define DMA1_FLAG_HT5 ((uint32_t)0x00040000) +#define DMA1_FLAG_TE5 ((uint32_t)0x00080000) +#define DMA1_FLAG_GL6 ((uint32_t)0x00100000) +#define DMA1_FLAG_TC6 ((uint32_t)0x00200000) +#define DMA1_FLAG_HT6 ((uint32_t)0x00400000) +#define DMA1_FLAG_TE6 ((uint32_t)0x00800000) +#define DMA1_FLAG_GL7 ((uint32_t)0x01000000) +#define DMA1_FLAG_TC7 ((uint32_t)0x02000000) +#define DMA1_FLAG_HT7 ((uint32_t)0x04000000) +#define DMA1_FLAG_TE7 ((uint32_t)0x08000000) + +#define DMA2_FLAG_GL1 ((uint32_t)0x10000001) +#define DMA2_FLAG_TC1 ((uint32_t)0x10000002) +#define DMA2_FLAG_HT1 ((uint32_t)0x10000004) +#define DMA2_FLAG_TE1 ((uint32_t)0x10000008) +#define DMA2_FLAG_GL2 ((uint32_t)0x10000010) +#define DMA2_FLAG_TC2 ((uint32_t)0x10000020) +#define DMA2_FLAG_HT2 ((uint32_t)0x10000040) +#define DMA2_FLAG_TE2 ((uint32_t)0x10000080) +#define DMA2_FLAG_GL3 ((uint32_t)0x10000100) +#define DMA2_FLAG_TC3 ((uint32_t)0x10000200) +#define DMA2_FLAG_HT3 ((uint32_t)0x10000400) +#define DMA2_FLAG_TE3 ((uint32_t)0x10000800) +#define DMA2_FLAG_GL4 ((uint32_t)0x10001000) +#define DMA2_FLAG_TC4 ((uint32_t)0x10002000) +#define DMA2_FLAG_HT4 ((uint32_t)0x10004000) +#define DMA2_FLAG_TE4 ((uint32_t)0x10008000) +#define DMA2_FLAG_GL5 ((uint32_t)0x10010000) +#define DMA2_FLAG_TC5 ((uint32_t)0x10020000) +#define DMA2_FLAG_HT5 ((uint32_t)0x10040000) +#define DMA2_FLAG_TE5 ((uint32_t)0x10080000) + +#define IS_DMA_CLEAR_FLAG(FLAG) (((((FLAG) & 0xF0000000) == 0x00) || (((FLAG) & 0xEFF00000) == 0x00)) && ((FLAG) != 0x00)) + +#define IS_DMA_GET_FLAG(FLAG) (((FLAG) == DMA1_FLAG_GL1) || ((FLAG) == DMA1_FLAG_TC1) || \ + ((FLAG) == DMA1_FLAG_HT1) || ((FLAG) == DMA1_FLAG_TE1) || \ + ((FLAG) == DMA1_FLAG_GL2) || ((FLAG) == DMA1_FLAG_TC2) || \ + ((FLAG) == DMA1_FLAG_HT2) || ((FLAG) == DMA1_FLAG_TE2) || \ + ((FLAG) == DMA1_FLAG_GL3) || ((FLAG) == DMA1_FLAG_TC3) || \ + ((FLAG) == DMA1_FLAG_HT3) || ((FLAG) == DMA1_FLAG_TE3) || \ + ((FLAG) == DMA1_FLAG_GL4) || ((FLAG) == DMA1_FLAG_TC4) || \ + ((FLAG) == DMA1_FLAG_HT4) || ((FLAG) == DMA1_FLAG_TE4) || \ + ((FLAG) == DMA1_FLAG_GL5) || ((FLAG) == DMA1_FLAG_TC5) || \ + ((FLAG) == DMA1_FLAG_HT5) || ((FLAG) == DMA1_FLAG_TE5) || \ + ((FLAG) == DMA1_FLAG_GL6) || ((FLAG) == DMA1_FLAG_TC6) || \ + ((FLAG) == DMA1_FLAG_HT6) || ((FLAG) == DMA1_FLAG_TE6) || \ + ((FLAG) == DMA1_FLAG_GL7) || ((FLAG) == DMA1_FLAG_TC7) || \ + ((FLAG) == DMA1_FLAG_HT7) || ((FLAG) == DMA1_FLAG_TE7) || \ + ((FLAG) == DMA2_FLAG_GL1) || ((FLAG) == DMA2_FLAG_TC1) || \ + ((FLAG) == DMA2_FLAG_HT1) || ((FLAG) == DMA2_FLAG_TE1) || \ + ((FLAG) == DMA2_FLAG_GL2) || ((FLAG) == DMA2_FLAG_TC2) || \ + ((FLAG) == DMA2_FLAG_HT2) || ((FLAG) == DMA2_FLAG_TE2) || \ + ((FLAG) == DMA2_FLAG_GL3) || ((FLAG) == DMA2_FLAG_TC3) || \ + ((FLAG) == DMA2_FLAG_HT3) || ((FLAG) == DMA2_FLAG_TE3) || \ + ((FLAG) == DMA2_FLAG_GL4) || ((FLAG) == DMA2_FLAG_TC4) || \ + ((FLAG) == DMA2_FLAG_HT4) || ((FLAG) == DMA2_FLAG_TE4) || \ + ((FLAG) == DMA2_FLAG_GL5) || ((FLAG) == DMA2_FLAG_TC5) || \ + ((FLAG) == DMA2_FLAG_HT5) || ((FLAG) == DMA2_FLAG_TE5)) +/** + * @} + */ + +/** @defgroup DMA_Buffer_Size + * @{ + */ + +#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x1) && ((SIZE) < 0x10000)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup DMA_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions + * @{ + */ + +void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); +void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); +void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); +void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); +void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); +FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG); +void DMA_ClearFlag(uint32_t DMA_FLAG); +ITStatus DMA_GetITStatus(uint32_t DMA_IT); +void DMA_ClearITPendingBit(uint32_t DMA_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_DMA_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h new file mode 100644 index 0000000..442a19e --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h @@ -0,0 +1,183 @@ +/** + ****************************************************************************** + * @file stm32f10x_exti.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the EXTI firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_EXTI_H +#define __STM32F10x_EXTI_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup EXTI + * @{ + */ + +/** @defgroup EXTI_Exported_Types + * @{ + */ + +/** + * @brief EXTI mode enumeration + */ + +typedef enum +{ + EXTI_Mode_Interrupt = 0x00, + EXTI_Mode_Event = 0x04 +}EXTIMode_TypeDef; + +#define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event)) + +/** + * @brief EXTI Trigger enumeration + */ + +typedef enum +{ + EXTI_Trigger_Rising = 0x08, + EXTI_Trigger_Falling = 0x0C, + EXTI_Trigger_Rising_Falling = 0x10 +}EXTITrigger_TypeDef; + +#define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \ + ((TRIGGER) == EXTI_Trigger_Falling) || \ + ((TRIGGER) == EXTI_Trigger_Rising_Falling)) +/** + * @brief EXTI Init Structure definition + */ + +typedef struct +{ + uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. + This parameter can be any combination of @ref EXTI_Lines */ + + EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines. + This parameter can be a value of @ref EXTIMode_TypeDef */ + + EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. + This parameter can be a value of @ref EXTIMode_TypeDef */ + + FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. + This parameter can be set either to ENABLE or DISABLE */ +}EXTI_InitTypeDef; + +/** + * @} + */ + +/** @defgroup EXTI_Exported_Constants + * @{ + */ + +/** @defgroup EXTI_Lines + * @{ + */ + +#define EXTI_Line0 ((uint32_t)0x00001) /*!< External interrupt line 0 */ +#define EXTI_Line1 ((uint32_t)0x00002) /*!< External interrupt line 1 */ +#define EXTI_Line2 ((uint32_t)0x00004) /*!< External interrupt line 2 */ +#define EXTI_Line3 ((uint32_t)0x00008) /*!< External interrupt line 3 */ +#define EXTI_Line4 ((uint32_t)0x00010) /*!< External interrupt line 4 */ +#define EXTI_Line5 ((uint32_t)0x00020) /*!< External interrupt line 5 */ +#define EXTI_Line6 ((uint32_t)0x00040) /*!< External interrupt line 6 */ +#define EXTI_Line7 ((uint32_t)0x00080) /*!< External interrupt line 7 */ +#define EXTI_Line8 ((uint32_t)0x00100) /*!< External interrupt line 8 */ +#define EXTI_Line9 ((uint32_t)0x00200) /*!< External interrupt line 9 */ +#define EXTI_Line10 ((uint32_t)0x00400) /*!< External interrupt line 10 */ +#define EXTI_Line11 ((uint32_t)0x00800) /*!< External interrupt line 11 */ +#define EXTI_Line12 ((uint32_t)0x01000) /*!< External interrupt line 12 */ +#define EXTI_Line13 ((uint32_t)0x02000) /*!< External interrupt line 13 */ +#define EXTI_Line14 ((uint32_t)0x04000) /*!< External interrupt line 14 */ +#define EXTI_Line15 ((uint32_t)0x08000) /*!< External interrupt line 15 */ +#define EXTI_Line16 ((uint32_t)0x10000) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_Line17 ((uint32_t)0x20000) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_Line18 ((uint32_t)0x40000) /*!< External interrupt line 18 Connected to the USB Device/USB OTG FS + Wakeup from suspend event */ +#define EXTI_Line19 ((uint32_t)0x80000) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ + +#define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0xFFF00000) == 0x00) && ((LINE) != (uint16_t)0x00)) + +#define IS_GET_EXTI_LINE(LINE) (((LINE) == EXTI_Line0) || ((LINE) == EXTI_Line1) || \ + ((LINE) == EXTI_Line2) || ((LINE) == EXTI_Line3) || \ + ((LINE) == EXTI_Line4) || ((LINE) == EXTI_Line5) || \ + ((LINE) == EXTI_Line6) || ((LINE) == EXTI_Line7) || \ + ((LINE) == EXTI_Line8) || ((LINE) == EXTI_Line9) || \ + ((LINE) == EXTI_Line10) || ((LINE) == EXTI_Line11) || \ + ((LINE) == EXTI_Line12) || ((LINE) == EXTI_Line13) || \ + ((LINE) == EXTI_Line14) || ((LINE) == EXTI_Line15) || \ + ((LINE) == EXTI_Line16) || ((LINE) == EXTI_Line17) || \ + ((LINE) == EXTI_Line18) || ((LINE) == EXTI_Line19)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup EXTI_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Exported_Functions + * @{ + */ + +void EXTI_DeInit(void); +void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); +void EXTI_ClearFlag(uint32_t EXTI_Line); +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); +void EXTI_ClearITPendingBit(uint32_t EXTI_Line); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_EXTI_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h new file mode 100644 index 0000000..e2be146 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h @@ -0,0 +1,346 @@ +/** + ****************************************************************************** + * @file stm32f10x_flash.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the FLASH + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_FLASH_H +#define __STM32F10x_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup FLASH + * @{ + */ + +/** @defgroup FLASH_Exported_Types + * @{ + */ + +/** + * @brief FLASH Status + */ + +typedef enum +{ + FLASH_BUSY = 1, + FLASH_ERROR_PG, + FLASH_ERROR_WRP, + FLASH_COMPLETE, + FLASH_TIMEOUT +}FLASH_Status; + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Constants + * @{ + */ + +/** @defgroup Flash_Latency + * @{ + */ + +#define FLASH_Latency_0 ((uint32_t)0x00000000) /*!< FLASH Zero Latency cycle */ +#define FLASH_Latency_1 ((uint32_t)0x00000001) /*!< FLASH One Latency cycle */ +#define FLASH_Latency_2 ((uint32_t)0x00000002) /*!< FLASH Two Latency cycles */ +#define IS_FLASH_LATENCY(LATENCY) (((LATENCY) == FLASH_Latency_0) || \ + ((LATENCY) == FLASH_Latency_1) || \ + ((LATENCY) == FLASH_Latency_2)) +/** + * @} + */ + +/** @defgroup Half_Cycle_Enable_Disable + * @{ + */ + +#define FLASH_HalfCycleAccess_Enable ((uint32_t)0x00000008) /*!< FLASH Half Cycle Enable */ +#define FLASH_HalfCycleAccess_Disable ((uint32_t)0x00000000) /*!< FLASH Half Cycle Disable */ +#define IS_FLASH_HALFCYCLEACCESS_STATE(STATE) (((STATE) == FLASH_HalfCycleAccess_Enable) || \ + ((STATE) == FLASH_HalfCycleAccess_Disable)) +/** + * @} + */ + +/** @defgroup Prefetch_Buffer_Enable_Disable + * @{ + */ + +#define FLASH_PrefetchBuffer_Enable ((uint32_t)0x00000010) /*!< FLASH Prefetch Buffer Enable */ +#define FLASH_PrefetchBuffer_Disable ((uint32_t)0x00000000) /*!< FLASH Prefetch Buffer Disable */ +#define IS_FLASH_PREFETCHBUFFER_STATE(STATE) (((STATE) == FLASH_PrefetchBuffer_Enable) || \ + ((STATE) == FLASH_PrefetchBuffer_Disable)) +/** + * @} + */ + +/** @defgroup Option_Bytes_Write_Protection + * @{ + */ + +/* Values to be used with STM32 Low and Medium density devices */ +#define FLASH_WRProt_Pages0to3 ((uint32_t)0x00000001) /*!< STM32 Low and Medium density devices: Write protection of page 0 to 3 */ +#define FLASH_WRProt_Pages4to7 ((uint32_t)0x00000002) /*!< STM32 Low and Medium density devices: Write protection of page 4 to 7 */ +#define FLASH_WRProt_Pages8to11 ((uint32_t)0x00000004) /*!< STM32 Low and Medium density devices: Write protection of page 8 to 11 */ +#define FLASH_WRProt_Pages12to15 ((uint32_t)0x00000008) /*!< STM32 Low and Medium density devices: Write protection of page 12 to 15 */ +#define FLASH_WRProt_Pages16to19 ((uint32_t)0x00000010) /*!< STM32 Low and Medium density devices: Write protection of page 16 to 19 */ +#define FLASH_WRProt_Pages20to23 ((uint32_t)0x00000020) /*!< STM32 Low and Medium density devices: Write protection of page 20 to 23 */ +#define FLASH_WRProt_Pages24to27 ((uint32_t)0x00000040) /*!< STM32 Low and Medium density devices: Write protection of page 24 to 27 */ +#define FLASH_WRProt_Pages28to31 ((uint32_t)0x00000080) /*!< STM32 Low and Medium density devices: Write protection of page 28 to 31 */ + +/* Values to be used with STM32 Medium-density devices */ +#define FLASH_WRProt_Pages32to35 ((uint32_t)0x00000100) /*!< STM32 Medium-density devices: Write protection of page 32 to 35 */ +#define FLASH_WRProt_Pages36to39 ((uint32_t)0x00000200) /*!< STM32 Medium-density devices: Write protection of page 36 to 39 */ +#define FLASH_WRProt_Pages40to43 ((uint32_t)0x00000400) /*!< STM32 Medium-density devices: Write protection of page 40 to 43 */ +#define FLASH_WRProt_Pages44to47 ((uint32_t)0x00000800) /*!< STM32 Medium-density devices: Write protection of page 44 to 47 */ +#define FLASH_WRProt_Pages48to51 ((uint32_t)0x00001000) /*!< STM32 Medium-density devices: Write protection of page 48 to 51 */ +#define FLASH_WRProt_Pages52to55 ((uint32_t)0x00002000) /*!< STM32 Medium-density devices: Write protection of page 52 to 55 */ +#define FLASH_WRProt_Pages56to59 ((uint32_t)0x00004000) /*!< STM32 Medium-density devices: Write protection of page 56 to 59 */ +#define FLASH_WRProt_Pages60to63 ((uint32_t)0x00008000) /*!< STM32 Medium-density devices: Write protection of page 60 to 63 */ +#define FLASH_WRProt_Pages64to67 ((uint32_t)0x00010000) /*!< STM32 Medium-density devices: Write protection of page 64 to 67 */ +#define FLASH_WRProt_Pages68to71 ((uint32_t)0x00020000) /*!< STM32 Medium-density devices: Write protection of page 68 to 71 */ +#define FLASH_WRProt_Pages72to75 ((uint32_t)0x00040000) /*!< STM32 Medium-density devices: Write protection of page 72 to 75 */ +#define FLASH_WRProt_Pages76to79 ((uint32_t)0x00080000) /*!< STM32 Medium-density devices: Write protection of page 76 to 79 */ +#define FLASH_WRProt_Pages80to83 ((uint32_t)0x00100000) /*!< STM32 Medium-density devices: Write protection of page 80 to 83 */ +#define FLASH_WRProt_Pages84to87 ((uint32_t)0x00200000) /*!< STM32 Medium-density devices: Write protection of page 84 to 87 */ +#define FLASH_WRProt_Pages88to91 ((uint32_t)0x00400000) /*!< STM32 Medium-density devices: Write protection of page 88 to 91 */ +#define FLASH_WRProt_Pages92to95 ((uint32_t)0x00800000) /*!< STM32 Medium-density devices: Write protection of page 92 to 95 */ +#define FLASH_WRProt_Pages96to99 ((uint32_t)0x01000000) /*!< STM32 Medium-density devices: Write protection of page 96 to 99 */ +#define FLASH_WRProt_Pages100to103 ((uint32_t)0x02000000) /*!< STM32 Medium-density devices: Write protection of page 100 to 103 */ +#define FLASH_WRProt_Pages104to107 ((uint32_t)0x04000000) /*!< STM32 Medium-density devices: Write protection of page 104 to 107 */ +#define FLASH_WRProt_Pages108to111 ((uint32_t)0x08000000) /*!< STM32 Medium-density devices: Write protection of page 108 to 111 */ +#define FLASH_WRProt_Pages112to115 ((uint32_t)0x10000000) /*!< STM32 Medium-density devices: Write protection of page 112 to 115 */ +#define FLASH_WRProt_Pages116to119 ((uint32_t)0x20000000) /*!< STM32 Medium-density devices: Write protection of page 115 to 119 */ +#define FLASH_WRProt_Pages120to123 ((uint32_t)0x40000000) /*!< STM32 Medium-density devices: Write protection of page 120 to 123 */ +#define FLASH_WRProt_Pages124to127 ((uint32_t)0x80000000) /*!< STM32 Medium-density devices: Write protection of page 124 to 127 */ + +/* Values to be used with STM32 High-density and STM32F10X Connectivity line devices */ +#define FLASH_WRProt_Pages0to1 ((uint32_t)0x00000001) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 0 to 1 */ +#define FLASH_WRProt_Pages2to3 ((uint32_t)0x00000002) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 2 to 3 */ +#define FLASH_WRProt_Pages4to5 ((uint32_t)0x00000004) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 4 to 5 */ +#define FLASH_WRProt_Pages6to7 ((uint32_t)0x00000008) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 6 to 7 */ +#define FLASH_WRProt_Pages8to9 ((uint32_t)0x00000010) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 8 to 9 */ +#define FLASH_WRProt_Pages10to11 ((uint32_t)0x00000020) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 10 to 11 */ +#define FLASH_WRProt_Pages12to13 ((uint32_t)0x00000040) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 12 to 13 */ +#define FLASH_WRProt_Pages14to15 ((uint32_t)0x00000080) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 14 to 15 */ +#define FLASH_WRProt_Pages16to17 ((uint32_t)0x00000100) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 16 to 17 */ +#define FLASH_WRProt_Pages18to19 ((uint32_t)0x00000200) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 18 to 19 */ +#define FLASH_WRProt_Pages20to21 ((uint32_t)0x00000400) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 20 to 21 */ +#define FLASH_WRProt_Pages22to23 ((uint32_t)0x00000800) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 22 to 23 */ +#define FLASH_WRProt_Pages24to25 ((uint32_t)0x00001000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 24 to 25 */ +#define FLASH_WRProt_Pages26to27 ((uint32_t)0x00002000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 26 to 27 */ +#define FLASH_WRProt_Pages28to29 ((uint32_t)0x00004000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 28 to 29 */ +#define FLASH_WRProt_Pages30to31 ((uint32_t)0x00008000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 30 to 31 */ +#define FLASH_WRProt_Pages32to33 ((uint32_t)0x00010000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 32 to 33 */ +#define FLASH_WRProt_Pages34to35 ((uint32_t)0x00020000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 34 to 35 */ +#define FLASH_WRProt_Pages36to37 ((uint32_t)0x00040000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 36 to 37 */ +#define FLASH_WRProt_Pages38to39 ((uint32_t)0x00080000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 38 to 39 */ +#define FLASH_WRProt_Pages40to41 ((uint32_t)0x00100000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 40 to 41 */ +#define FLASH_WRProt_Pages42to43 ((uint32_t)0x00200000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 42 to 43 */ +#define FLASH_WRProt_Pages44to45 ((uint32_t)0x00400000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 44 to 45 */ +#define FLASH_WRProt_Pages46to47 ((uint32_t)0x00800000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 46 to 47 */ +#define FLASH_WRProt_Pages48to49 ((uint32_t)0x01000000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 48 to 49 */ +#define FLASH_WRProt_Pages50to51 ((uint32_t)0x02000000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 50 to 51 */ +#define FLASH_WRProt_Pages52to53 ((uint32_t)0x04000000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 52 to 53 */ +#define FLASH_WRProt_Pages54to55 ((uint32_t)0x08000000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 54 to 55 */ +#define FLASH_WRProt_Pages56to57 ((uint32_t)0x10000000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 56 to 57 */ +#define FLASH_WRProt_Pages58to59 ((uint32_t)0x20000000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 58 to 59 */ +#define FLASH_WRProt_Pages60to61 ((uint32_t)0x40000000) /*!< STM32 Medium-density and Connectivity line devices: + Write protection of page 60 to 61 */ +#define FLASH_WRProt_Pages62to127 ((uint32_t)0x80000000) /*!< STM32 Connectivity line devices: Write protection of page 62 to 127 */ +#define FLASH_WRProt_Pages62to255 ((uint32_t)0x80000000) /*!< STM32 Medium-density devices: Write protection of page 62 to 255 */ + +#define FLASH_WRProt_AllPages ((uint32_t)0xFFFFFFFF) /*!< Write protection of all Pages */ + +#define IS_FLASH_WRPROT_PAGE(PAGE) (((PAGE) != 0x00000000)) + +#define IS_FLASH_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08000000) && ((ADDRESS) < 0x0807FFFF)) + +#define IS_OB_DATA_ADDRESS(ADDRESS) (((ADDRESS) == 0x1FFFF804) || ((ADDRESS) == 0x1FFFF806)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_IWatchdog + * @{ + */ + +#define OB_IWDG_SW ((uint16_t)0x0001) /*!< Software IWDG selected */ +#define OB_IWDG_HW ((uint16_t)0x0000) /*!< Hardware IWDG selected */ +#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_nRST_STOP + * @{ + */ + +#define OB_STOP_NoRST ((uint16_t)0x0002) /*!< No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint16_t)0x0000) /*!< Reset generated when entering in STOP */ +#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NoRST) || ((SOURCE) == OB_STOP_RST)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_nRST_STDBY + * @{ + */ + +#define OB_STDBY_NoRST ((uint16_t)0x0004) /*!< No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint16_t)0x0000) /*!< Reset generated when entering in STANDBY */ +#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NoRST) || ((SOURCE) == OB_STDBY_RST)) + +/** + * @} + */ + +/** @defgroup FLASH_Interrupts + * @{ + */ + +#define FLASH_IT_ERROR ((uint32_t)0x00000400) /*!< FPEC error interrupt source */ +#define FLASH_IT_EOP ((uint32_t)0x00001000) /*!< End of FLASH Operation Interrupt source */ +#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0xFFFFEBFF) == 0x00000000) && (((IT) != 0x00000000))) + +/** + * @} + */ + +/** @defgroup FLASH_Flags + * @{ + */ + +#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /*!< FLASH Busy flag */ +#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /*!< FLASH End of Operation flag */ +#define FLASH_FLAG_PGERR ((uint32_t)0x00000004) /*!< FLASH Program error flag */ +#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /*!< FLASH Write protected error flag */ +#define FLASH_FLAG_OPTERR ((uint32_t)0x00000001) /*!< FLASH Option Byte error flag */ + +#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFCA) == 0x00000000) && ((FLAG) != 0x00000000)) +#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_BSY) || ((FLAG) == FLASH_FLAG_EOP) || \ + ((FLAG) == FLASH_FLAG_PGERR) || ((FLAG) == FLASH_FLAG_WRPRTERR) || \ + ((FLAG) == FLASH_FLAG_OPTERR)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions + * @{ + */ + +void FLASH_SetLatency(uint32_t FLASH_Latency); +void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess); +void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer); +void FLASH_Unlock(void); +void FLASH_Lock(void); +FLASH_Status FLASH_ErasePage(uint32_t Page_Address); +FLASH_Status FLASH_EraseAllPages(void); +FLASH_Status FLASH_EraseOptionBytes(void); +FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); +FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages); +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState); +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY); +uint32_t FLASH_GetUserOptionByte(void); +uint32_t FLASH_GetWriteProtectionOptionByte(void); +FlagStatus FLASH_GetReadOutProtectionStatus(void); +FlagStatus FLASH_GetPrefetchBufferStatus(void); +void FLASH_ITConfig(uint16_t FLASH_IT, FunctionalState NewState); +FlagStatus FLASH_GetFlagStatus(uint16_t FLASH_FLAG); +void FLASH_ClearFlag(uint16_t FLASH_FLAG); +FLASH_Status FLASH_GetStatus(void); +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_FLASH_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h new file mode 100644 index 0000000..ce22848 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h @@ -0,0 +1,716 @@ +/** + ****************************************************************************** + * @file stm32f10x_fsmc.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the FSMC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_FSMC_H +#define __STM32F10x_FSMC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup FSMC + * @{ + */ + +/** @defgroup FSMC_Exported_Types + * @{ + */ + +/** + * @brief Timing parameters For NOR/SRAM Banks + */ + +typedef struct +{ + uint32_t FSMC_AddressSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address setup time. + This parameter can be a value between 0 and 0xF. + @note: It is not used with synchronous NOR Flash memories. */ + + uint32_t FSMC_AddressHoldTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address hold time. + This parameter can be a value between 0 and 0xF. + @note: It is not used with synchronous NOR Flash memories.*/ + + uint32_t FSMC_DataSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the data setup time. + This parameter can be a value between 0 and 0xFF. + @note: It is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */ + + uint32_t FSMC_BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure + the duration of the bus turnaround. + This parameter can be a value between 0 and 0xF. + @note: It is only used for multiplexed NOR Flash memories. */ + + uint32_t FSMC_CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles. + This parameter can be a value between 1 and 0xF. + @note: This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */ + + uint32_t FSMC_DataLatency; /*!< Defines the number of memory clock cycles to issue + to the memory before getting the first data. + The value of this parameter depends on the memory type as shown below: + - It must be set to 0 in case of a CRAM + - It is don’t care in asynchronous NOR, SRAM or ROM accesses + - It may assume a value between 0 and 0xF in NOR Flash memories + with synchronous burst mode enable */ + + uint32_t FSMC_AccessMode; /*!< Specifies the asynchronous access mode. + This parameter can be a value of @ref FSMC_Access_Mode */ +}FSMC_NORSRAMTimingInitTypeDef; + +/** + * @brief FSMC NOR/SRAM Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Bank; /*!< Specifies the NOR/SRAM memory bank that will be used. + This parameter can be a value of @ref FSMC_NORSRAM_Bank */ + + uint32_t FSMC_DataAddressMux; /*!< Specifies whether the address and data values are + multiplexed on the databus or not. + This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */ + + uint32_t FSMC_MemoryType; /*!< Specifies the type of external memory attached to + the corresponding memory bank. + This parameter can be a value of @ref FSMC_Memory_Type */ + + uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. + This parameter can be a value of @ref FSMC_Data_Width */ + + uint32_t FSMC_BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory, + valid only with synchronous burst Flash memories. + This parameter can be a value of @ref FSMC_Burst_Access_Mode */ + + uint32_t FSMC_WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing + the Flash memory in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */ + + uint32_t FSMC_WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash + memory, valid only when accessing Flash memories in burst mode. + This parameter can be a value of @ref FSMC_Wrap_Mode */ + + uint32_t FSMC_WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one + clock cycle before the wait state or during the wait state, + valid only when accessing memories in burst mode. + This parameter can be a value of @ref FSMC_Wait_Timing */ + + uint32_t FSMC_WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FSMC. + This parameter can be a value of @ref FSMC_Write_Operation */ + + uint32_t FSMC_WaitSignal; /*!< Enables or disables the wait-state insertion via wait + signal, valid for Flash memory access in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal */ + + uint32_t FSMC_ExtendedMode; /*!< Enables or disables the extended mode. + This parameter can be a value of @ref FSMC_Extended_Mode */ + + uint32_t FSMC_WriteBurst; /*!< Enables or disables the write burst operation. + This parameter can be a value of @ref FSMC_Write_Burst */ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the ExtendedMode is not used*/ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /*!< Timing Parameters for write access if the ExtendedMode is used*/ +}FSMC_NORSRAMInitTypeDef; + +/** + * @brief Timing parameters For FSMC NAND and PCCARD Banks + */ + +typedef struct +{ + uint32_t FSMC_SetupTime; /*!< Defines the number of HCLK cycles to setup address before + the command assertion for NAND-Flash read or write access + to common/Attribute or I/O memory space (depending on + the memory space timing to be configured). + This parameter can be a value between 0 and 0xFF.*/ + + uint32_t FSMC_WaitSetupTime; /*!< Defines the minimum number of HCLK cycles to assert the + command for NAND-Flash read or write access to + common/Attribute or I/O memory space (depending on the + memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HoldSetupTime; /*!< Defines the number of HCLK clock cycles to hold address + (and data for write access) after the command deassertion + for NAND-Flash read or write access to common/Attribute + or I/O memory space (depending on the memory space timing + to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HiZSetupTime; /*!< Defines the number of HCLK clock cycles during which the + databus is kept in HiZ after the start of a NAND-Flash + write access to common/Attribute or I/O memory space (depending + on the memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ +}FSMC_NAND_PCCARDTimingInitTypeDef; + +/** + * @brief FSMC NAND Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Bank; /*!< Specifies the NAND memory bank that will be used. + This parameter can be a value of @ref FSMC_NAND_Bank */ + + uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the NAND Memory Bank. + This parameter can be any value of @ref FSMC_Wait_feature */ + + uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. + This parameter can be any value of @ref FSMC_Data_Width */ + + uint32_t FSMC_ECC; /*!< Enables or disables the ECC computation. + This parameter can be any value of @ref FSMC_ECC */ + + uint32_t FSMC_ECCPageSize; /*!< Defines the page size for the extended ECC. + This parameter can be any value of @ref FSMC_ECC_Page_Size */ + + uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between CLE low and RE low. + This parameter can be a value between 0 and 0xFF. */ + + uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between ALE low and RE low. + This parameter can be a number between 0x0 and 0xFF */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ +}FSMC_NANDInitTypeDef; + +/** + * @brief FSMC PCCARD Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the Memory Bank. + This parameter can be any value of @ref FSMC_Wait_feature */ + + uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between CLE low and RE low. + This parameter can be a value between 0 and 0xFF. */ + + uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between ALE low and RE low. + This parameter can be a number between 0x0 and 0xFF */ + + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_IOSpaceTimingStruct; /*!< FSMC IO Space Timing */ +}FSMC_PCCARDInitTypeDef; + +/** + * @} + */ + +/** @defgroup FSMC_Exported_Constants + * @{ + */ + +/** @defgroup FSMC_NORSRAM_Bank + * @{ + */ +#define FSMC_Bank1_NORSRAM1 ((uint32_t)0x00000000) +#define FSMC_Bank1_NORSRAM2 ((uint32_t)0x00000002) +#define FSMC_Bank1_NORSRAM3 ((uint32_t)0x00000004) +#define FSMC_Bank1_NORSRAM4 ((uint32_t)0x00000006) +/** + * @} + */ + +/** @defgroup FSMC_NAND_Bank + * @{ + */ +#define FSMC_Bank2_NAND ((uint32_t)0x00000010) +#define FSMC_Bank3_NAND ((uint32_t)0x00000100) +/** + * @} + */ + +/** @defgroup FSMC_PCCARD_Bank + * @{ + */ +#define FSMC_Bank4_PCCARD ((uint32_t)0x00001000) +/** + * @} + */ + +#define IS_FSMC_NORSRAM_BANK(BANK) (((BANK) == FSMC_Bank1_NORSRAM1) || \ + ((BANK) == FSMC_Bank1_NORSRAM2) || \ + ((BANK) == FSMC_Bank1_NORSRAM3) || \ + ((BANK) == FSMC_Bank1_NORSRAM4)) + +#define IS_FSMC_NAND_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND)) + +#define IS_FSMC_GETFLAG_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND) || \ + ((BANK) == FSMC_Bank4_PCCARD)) + +#define IS_FSMC_IT_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND) || \ + ((BANK) == FSMC_Bank4_PCCARD)) + +/** @defgroup NOR_SRAM_Controller + * @{ + */ + +/** @defgroup FSMC_Data_Address_Bus_Multiplexing + * @{ + */ + +#define FSMC_DataAddressMux_Disable ((uint32_t)0x00000000) +#define FSMC_DataAddressMux_Enable ((uint32_t)0x00000002) +#define IS_FSMC_MUX(MUX) (((MUX) == FSMC_DataAddressMux_Disable) || \ + ((MUX) == FSMC_DataAddressMux_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Memory_Type + * @{ + */ + +#define FSMC_MemoryType_SRAM ((uint32_t)0x00000000) +#define FSMC_MemoryType_PSRAM ((uint32_t)0x00000004) +#define FSMC_MemoryType_NOR ((uint32_t)0x00000008) +#define IS_FSMC_MEMORY(MEMORY) (((MEMORY) == FSMC_MemoryType_SRAM) || \ + ((MEMORY) == FSMC_MemoryType_PSRAM)|| \ + ((MEMORY) == FSMC_MemoryType_NOR)) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Width + * @{ + */ + +#define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000) +#define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010) +#define IS_FSMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FSMC_MemoryDataWidth_8b) || \ + ((WIDTH) == FSMC_MemoryDataWidth_16b)) + +/** + * @} + */ + +/** @defgroup FSMC_Burst_Access_Mode + * @{ + */ + +#define FSMC_BurstAccessMode_Disable ((uint32_t)0x00000000) +#define FSMC_BurstAccessMode_Enable ((uint32_t)0x00000100) +#define IS_FSMC_BURSTMODE(STATE) (((STATE) == FSMC_BurstAccessMode_Disable) || \ + ((STATE) == FSMC_BurstAccessMode_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal_Polarity + * @{ + */ + +#define FSMC_WaitSignalPolarity_Low ((uint32_t)0x00000000) +#define FSMC_WaitSignalPolarity_High ((uint32_t)0x00000200) +#define IS_FSMC_WAIT_POLARITY(POLARITY) (((POLARITY) == FSMC_WaitSignalPolarity_Low) || \ + ((POLARITY) == FSMC_WaitSignalPolarity_High)) + +/** + * @} + */ + +/** @defgroup FSMC_Wrap_Mode + * @{ + */ + +#define FSMC_WrapMode_Disable ((uint32_t)0x00000000) +#define FSMC_WrapMode_Enable ((uint32_t)0x00000400) +#define IS_FSMC_WRAP_MODE(MODE) (((MODE) == FSMC_WrapMode_Disable) || \ + ((MODE) == FSMC_WrapMode_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Timing + * @{ + */ + +#define FSMC_WaitSignalActive_BeforeWaitState ((uint32_t)0x00000000) +#define FSMC_WaitSignalActive_DuringWaitState ((uint32_t)0x00000800) +#define IS_FSMC_WAIT_SIGNAL_ACTIVE(ACTIVE) (((ACTIVE) == FSMC_WaitSignalActive_BeforeWaitState) || \ + ((ACTIVE) == FSMC_WaitSignalActive_DuringWaitState)) + +/** + * @} + */ + +/** @defgroup FSMC_Write_Operation + * @{ + */ + +#define FSMC_WriteOperation_Disable ((uint32_t)0x00000000) +#define FSMC_WriteOperation_Enable ((uint32_t)0x00001000) +#define IS_FSMC_WRITE_OPERATION(OPERATION) (((OPERATION) == FSMC_WriteOperation_Disable) || \ + ((OPERATION) == FSMC_WriteOperation_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal + * @{ + */ + +#define FSMC_WaitSignal_Disable ((uint32_t)0x00000000) +#define FSMC_WaitSignal_Enable ((uint32_t)0x00002000) +#define IS_FSMC_WAITE_SIGNAL(SIGNAL) (((SIGNAL) == FSMC_WaitSignal_Disable) || \ + ((SIGNAL) == FSMC_WaitSignal_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Extended_Mode + * @{ + */ + +#define FSMC_ExtendedMode_Disable ((uint32_t)0x00000000) +#define FSMC_ExtendedMode_Enable ((uint32_t)0x00004000) + +#define IS_FSMC_EXTENDED_MODE(MODE) (((MODE) == FSMC_ExtendedMode_Disable) || \ + ((MODE) == FSMC_ExtendedMode_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Write_Burst + * @{ + */ + +#define FSMC_WriteBurst_Disable ((uint32_t)0x00000000) +#define FSMC_WriteBurst_Enable ((uint32_t)0x00080000) +#define IS_FSMC_WRITE_BURST(BURST) (((BURST) == FSMC_WriteBurst_Disable) || \ + ((BURST) == FSMC_WriteBurst_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Address_Setup_Time + * @{ + */ + +#define IS_FSMC_ADDRESS_SETUP_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Address_Hold_Time + * @{ + */ + +#define IS_FSMC_ADDRESS_HOLD_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Setup_Time + * @{ + */ + +#define IS_FSMC_DATASETUP_TIME(TIME) (((TIME) > 0) && ((TIME) <= 0xFF)) + +/** + * @} + */ + +/** @defgroup FSMC_Bus_Turn_around_Duration + * @{ + */ + +#define IS_FSMC_TURNAROUND_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_CLK_Division + * @{ + */ + +#define IS_FSMC_CLK_DIV(DIV) ((DIV) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Latency + * @{ + */ + +#define IS_FSMC_DATA_LATENCY(LATENCY) ((LATENCY) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Access_Mode + * @{ + */ + +#define FSMC_AccessMode_A ((uint32_t)0x00000000) +#define FSMC_AccessMode_B ((uint32_t)0x10000000) +#define FSMC_AccessMode_C ((uint32_t)0x20000000) +#define FSMC_AccessMode_D ((uint32_t)0x30000000) +#define IS_FSMC_ACCESS_MODE(MODE) (((MODE) == FSMC_AccessMode_A) || \ + ((MODE) == FSMC_AccessMode_B) || \ + ((MODE) == FSMC_AccessMode_C) || \ + ((MODE) == FSMC_AccessMode_D)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup NAND_PCCARD_Controller + * @{ + */ + +/** @defgroup FSMC_Wait_feature + * @{ + */ + +#define FSMC_Waitfeature_Disable ((uint32_t)0x00000000) +#define FSMC_Waitfeature_Enable ((uint32_t)0x00000002) +#define IS_FSMC_WAIT_FEATURE(FEATURE) (((FEATURE) == FSMC_Waitfeature_Disable) || \ + ((FEATURE) == FSMC_Waitfeature_Enable)) + +/** + * @} + */ + + +/** @defgroup FSMC_ECC + * @{ + */ + +#define FSMC_ECC_Disable ((uint32_t)0x00000000) +#define FSMC_ECC_Enable ((uint32_t)0x00000040) +#define IS_FSMC_ECC_STATE(STATE) (((STATE) == FSMC_ECC_Disable) || \ + ((STATE) == FSMC_ECC_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_ECC_Page_Size + * @{ + */ + +#define FSMC_ECCPageSize_256Bytes ((uint32_t)0x00000000) +#define FSMC_ECCPageSize_512Bytes ((uint32_t)0x00020000) +#define FSMC_ECCPageSize_1024Bytes ((uint32_t)0x00040000) +#define FSMC_ECCPageSize_2048Bytes ((uint32_t)0x00060000) +#define FSMC_ECCPageSize_4096Bytes ((uint32_t)0x00080000) +#define FSMC_ECCPageSize_8192Bytes ((uint32_t)0x000A0000) +#define IS_FSMC_ECCPAGE_SIZE(SIZE) (((SIZE) == FSMC_ECCPageSize_256Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_512Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_1024Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_2048Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_4096Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_8192Bytes)) + +/** + * @} + */ + +/** @defgroup FSMC_TCLR_Setup_Time + * @{ + */ + +#define IS_FSMC_TCLR_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_TAR_Setup_Time + * @{ + */ + +#define IS_FSMC_TAR_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Setup_Time + * @{ + */ + +#define IS_FSMC_SETUP_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Setup_Time + * @{ + */ + +#define IS_FSMC_WAIT_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Hold_Setup_Time + * @{ + */ + +#define IS_FSMC_HOLD_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_HiZ_Setup_Time + * @{ + */ + +#define IS_FSMC_HIZ_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Interrupt_sources + * @{ + */ + +#define FSMC_IT_RisingEdge ((uint32_t)0x00000008) +#define FSMC_IT_Level ((uint32_t)0x00000010) +#define FSMC_IT_FallingEdge ((uint32_t)0x00000020) +#define IS_FSMC_IT(IT) ((((IT) & (uint32_t)0xFFFFFFC7) == 0x00000000) && ((IT) != 0x00000000)) +#define IS_FSMC_GET_IT(IT) (((IT) == FSMC_IT_RisingEdge) || \ + ((IT) == FSMC_IT_Level) || \ + ((IT) == FSMC_IT_FallingEdge)) +/** + * @} + */ + +/** @defgroup FSMC_Flags + * @{ + */ + +#define FSMC_FLAG_RisingEdge ((uint32_t)0x00000001) +#define FSMC_FLAG_Level ((uint32_t)0x00000002) +#define FSMC_FLAG_FallingEdge ((uint32_t)0x00000004) +#define FSMC_FLAG_FEMPT ((uint32_t)0x00000040) +#define IS_FSMC_GET_FLAG(FLAG) (((FLAG) == FSMC_FLAG_RisingEdge) || \ + ((FLAG) == FSMC_FLAG_Level) || \ + ((FLAG) == FSMC_FLAG_FallingEdge) || \ + ((FLAG) == FSMC_FLAG_FEMPT)) + +#define IS_FSMC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFF8) == 0x00000000) && ((FLAG) != 0x00000000)) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup FSMC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Exported_Functions + * @{ + */ + +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank); +void FSMC_NANDDeInit(uint32_t FSMC_Bank); +void FSMC_PCCARDDeInit(void); +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState); +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState); +void FSMC_PCCARDCmd(FunctionalState NewState); +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState); +uint32_t FSMC_GetECC(uint32_t FSMC_Bank); +void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState); +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); +void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); +ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT); +void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_FSMC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h new file mode 100644 index 0000000..127d075 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h @@ -0,0 +1,359 @@ +/** + ****************************************************************************** + * @file stm32f10x_gpio.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the GPIO + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_GPIO_H +#define __STM32F10x_GPIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup GPIO + * @{ + */ + +/** @defgroup GPIO_Exported_Types + * @{ + */ + +#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ + ((PERIPH) == GPIOB) || \ + ((PERIPH) == GPIOC) || \ + ((PERIPH) == GPIOD) || \ + ((PERIPH) == GPIOE) || \ + ((PERIPH) == GPIOF) || \ + ((PERIPH) == GPIOG)) + +/** + * @brief Output Maximum frequency selection + */ + +typedef enum +{ + GPIO_Speed_10MHz = 1, + GPIO_Speed_2MHz, + GPIO_Speed_50MHz +}GPIOSpeed_TypeDef; +#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \ + ((SPEED) == GPIO_Speed_50MHz)) + +/** + * @brief Configuration Mode enumeration + */ + +typedef enum +{ GPIO_Mode_AIN = 0x0, + GPIO_Mode_IN_FLOATING = 0x04, + GPIO_Mode_IPD = 0x28, + GPIO_Mode_IPU = 0x48, + GPIO_Mode_Out_OD = 0x14, + GPIO_Mode_Out_PP = 0x10, + GPIO_Mode_AF_OD = 0x1C, + GPIO_Mode_AF_PP = 0x18 +}GPIOMode_TypeDef; + +#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \ + ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \ + ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \ + ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP)) + +/** + * @brief GPIO Init structure definition + */ + +typedef struct +{ + uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIOSpeed_TypeDef */ + + GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIOMode_TypeDef */ +}GPIO_InitTypeDef; + + +/** + * @brief Bit_SET and Bit_RESET enumeration + */ + +typedef enum +{ Bit_RESET = 0, + Bit_SET +}BitAction; + +#define IS_GPIO_BIT_ACTION(ACTION) (((ACTION) == Bit_RESET) || ((ACTION) == Bit_SET)) + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Constants + * @{ + */ + +/** @defgroup GPIO_pins_define + * @{ + */ + +#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ +#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ +#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ +#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ +#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ +#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ +#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ +#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ +#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ +#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ +#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ +#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ +#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ +#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ +#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ +#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */ +#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */ + +#define IS_GPIO_PIN(PIN) ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) != (uint16_t)0x00)) + +#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \ + ((PIN) == GPIO_Pin_1) || \ + ((PIN) == GPIO_Pin_2) || \ + ((PIN) == GPIO_Pin_3) || \ + ((PIN) == GPIO_Pin_4) || \ + ((PIN) == GPIO_Pin_5) || \ + ((PIN) == GPIO_Pin_6) || \ + ((PIN) == GPIO_Pin_7) || \ + ((PIN) == GPIO_Pin_8) || \ + ((PIN) == GPIO_Pin_9) || \ + ((PIN) == GPIO_Pin_10) || \ + ((PIN) == GPIO_Pin_11) || \ + ((PIN) == GPIO_Pin_12) || \ + ((PIN) == GPIO_Pin_13) || \ + ((PIN) == GPIO_Pin_14) || \ + ((PIN) == GPIO_Pin_15)) + +/** + * @} + */ + +/** @defgroup GPIO_Remap_define + * @{ + */ + +#define GPIO_Remap_SPI1 ((uint32_t)0x00000001) /*!< SPI1 Alternate Function mapping */ +#define GPIO_Remap_I2C1 ((uint32_t)0x00000002) /*!< I2C1 Alternate Function mapping */ +#define GPIO_Remap_USART1 ((uint32_t)0x00000004) /*!< USART1 Alternate Function mapping */ +#define GPIO_Remap_USART2 ((uint32_t)0x00000008) /*!< USART2 Alternate Function mapping */ +#define GPIO_PartialRemap_USART3 ((uint32_t)0x00140010) /*!< USART3 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART3 ((uint32_t)0x00140030) /*!< USART3 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM1 ((uint32_t)0x00160040) /*!< TIM1 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM1 ((uint32_t)0x001600C0) /*!< TIM1 Full Alternate Function mapping */ +#define GPIO_PartialRemap1_TIM2 ((uint32_t)0x00180100) /*!< TIM2 Partial1 Alternate Function mapping */ +#define GPIO_PartialRemap2_TIM2 ((uint32_t)0x00180200) /*!< TIM2 Partial2 Alternate Function mapping */ +#define GPIO_FullRemap_TIM2 ((uint32_t)0x00180300) /*!< TIM2 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM3 ((uint32_t)0x001A0800) /*!< TIM3 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM3 ((uint32_t)0x001A0C00) /*!< TIM3 Full Alternate Function mapping */ +#define GPIO_Remap_TIM4 ((uint32_t)0x00001000) /*!< TIM4 Alternate Function mapping */ +#define GPIO_Remap1_CAN1 ((uint32_t)0x001D4000) /*!< CAN1 Alternate Function mapping */ +#define GPIO_Remap2_CAN1 ((uint32_t)0x001D6000) /*!< CAN1 Alternate Function mapping */ +#define GPIO_Remap_PD01 ((uint32_t)0x00008000) /*!< PD01 Alternate Function mapping */ +#define GPIO_Remap_TIM5CH4_LSI ((uint32_t)0x00200001) /*!< LSI connected to TIM5 Channel4 input capture for calibration */ +#define GPIO_Remap_ADC1_ETRGINJ ((uint32_t)0x00200002) /*!< ADC1 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC1_ETRGREG ((uint32_t)0x00200004) /*!< ADC1 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGINJ ((uint32_t)0x00200008) /*!< ADC2 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGREG ((uint32_t)0x00200010) /*!< ADC2 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ETH ((uint32_t)0x00200020) /*!< Ethernet remapping (only for Connectivity line devices) */ +#define GPIO_Remap_CAN2 ((uint32_t)0x00200040) /*!< CAN2 remapping (only for Connectivity line devices) */ +#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100) /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */ +#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*!< JTAG-DP Disabled and SW-DP Enabled */ +#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /*!< Full SWJ Disabled (JTAG-DP + SW-DP) */ +#define GPIO_Remap_SPI3 ((uint32_t)0x00201000) /*!< SPI3 Alternate Function mapping (only for Connectivity line devices) */ +#define GPIO_Remap_TIM2ITR1_PTP_SOF ((uint32_t)0x00202000) /*!< Ethernet PTP output or USB OTG SOF (Start of Frame) connected + to TIM2 Internal Trigger 1 for calibration + (only for Connectivity line devices) */ +#define GPIO_Remap_PTP_PPS ((uint32_t)0x00204000) /*!< Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) */ + +#define IS_GPIO_REMAP(REMAP) (((REMAP) == GPIO_Remap_SPI1) || ((REMAP) == GPIO_Remap_I2C1) || \ + ((REMAP) == GPIO_Remap_USART1) || ((REMAP) == GPIO_Remap_USART2) || \ + ((REMAP) == GPIO_PartialRemap_USART3) || ((REMAP) == GPIO_FullRemap_USART3) || \ + ((REMAP) == GPIO_PartialRemap_TIM1) || ((REMAP) == GPIO_FullRemap_TIM1) || \ + ((REMAP) == GPIO_PartialRemap1_TIM2) || ((REMAP) == GPIO_PartialRemap2_TIM2) || \ + ((REMAP) == GPIO_FullRemap_TIM2) || ((REMAP) == GPIO_PartialRemap_TIM3) || \ + ((REMAP) == GPIO_FullRemap_TIM3) || ((REMAP) == GPIO_Remap_TIM4) || \ + ((REMAP) == GPIO_Remap1_CAN1) || ((REMAP) == GPIO_Remap2_CAN1) || \ + ((REMAP) == GPIO_Remap_PD01) || ((REMAP) == GPIO_Remap_TIM5CH4_LSI) || \ + ((REMAP) == GPIO_Remap_ADC1_ETRGINJ) ||((REMAP) == GPIO_Remap_ADC1_ETRGREG) || \ + ((REMAP) == GPIO_Remap_ADC2_ETRGINJ) ||((REMAP) == GPIO_Remap_ADC2_ETRGREG) || \ + ((REMAP) == GPIO_Remap_ETH) ||((REMAP) == GPIO_Remap_CAN2) || \ + ((REMAP) == GPIO_Remap_SWJ_NoJTRST) || ((REMAP) == GPIO_Remap_SWJ_JTAGDisable) || \ + ((REMAP) == GPIO_Remap_SWJ_Disable)|| ((REMAP) == GPIO_Remap_SPI3) || \ + ((REMAP) == GPIO_Remap_TIM2ITR1_PTP_SOF) || ((REMAP) == GPIO_Remap_PTP_PPS)) + +/** + * @} + */ + +/** @defgroup GPIO_Port_Sources + * @{ + */ + +#define GPIO_PortSourceGPIOA ((uint8_t)0x00) +#define GPIO_PortSourceGPIOB ((uint8_t)0x01) +#define GPIO_PortSourceGPIOC ((uint8_t)0x02) +#define GPIO_PortSourceGPIOD ((uint8_t)0x03) +#define GPIO_PortSourceGPIOE ((uint8_t)0x04) +#define GPIO_PortSourceGPIOF ((uint8_t)0x05) +#define GPIO_PortSourceGPIOG ((uint8_t)0x06) +#define IS_GPIO_EVENTOUT_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == GPIO_PortSourceGPIOA) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOB) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOC) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOD) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOE)) + +#define IS_GPIO_EXTI_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == GPIO_PortSourceGPIOA) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOB) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOC) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOD) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOE) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOF) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOG)) + +/** + * @} + */ + +/** @defgroup GPIO_Pin_sources + * @{ + */ + +#define GPIO_PinSource0 ((uint8_t)0x00) +#define GPIO_PinSource1 ((uint8_t)0x01) +#define GPIO_PinSource2 ((uint8_t)0x02) +#define GPIO_PinSource3 ((uint8_t)0x03) +#define GPIO_PinSource4 ((uint8_t)0x04) +#define GPIO_PinSource5 ((uint8_t)0x05) +#define GPIO_PinSource6 ((uint8_t)0x06) +#define GPIO_PinSource7 ((uint8_t)0x07) +#define GPIO_PinSource8 ((uint8_t)0x08) +#define GPIO_PinSource9 ((uint8_t)0x09) +#define GPIO_PinSource10 ((uint8_t)0x0A) +#define GPIO_PinSource11 ((uint8_t)0x0B) +#define GPIO_PinSource12 ((uint8_t)0x0C) +#define GPIO_PinSource13 ((uint8_t)0x0D) +#define GPIO_PinSource14 ((uint8_t)0x0E) +#define GPIO_PinSource15 ((uint8_t)0x0F) + +#define IS_GPIO_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == GPIO_PinSource0) || \ + ((PINSOURCE) == GPIO_PinSource1) || \ + ((PINSOURCE) == GPIO_PinSource2) || \ + ((PINSOURCE) == GPIO_PinSource3) || \ + ((PINSOURCE) == GPIO_PinSource4) || \ + ((PINSOURCE) == GPIO_PinSource5) || \ + ((PINSOURCE) == GPIO_PinSource6) || \ + ((PINSOURCE) == GPIO_PinSource7) || \ + ((PINSOURCE) == GPIO_PinSource8) || \ + ((PINSOURCE) == GPIO_PinSource9) || \ + ((PINSOURCE) == GPIO_PinSource10) || \ + ((PINSOURCE) == GPIO_PinSource11) || \ + ((PINSOURCE) == GPIO_PinSource12) || \ + ((PINSOURCE) == GPIO_PinSource13) || \ + ((PINSOURCE) == GPIO_PinSource14) || \ + ((PINSOURCE) == GPIO_PinSource15)) + +/** + * @} + */ + +/** @defgroup Ethernet_Media_Interface + * @{ + */ +#define GPIO_ETH_MediaInterface_MII ((uint32_t)0x00000000) +#define GPIO_ETH_MediaInterface_RMII ((uint32_t)0x00000001) + +#define IS_GPIO_ETH_MEDIA_INTERFACE(INTERFACE) (((INTERFACE) == GPIO_ETH_MediaInterface_MII) || \ + ((INTERFACE) == GPIO_ETH_MediaInterface_RMII)) + +/** + * @} + */ +/** + * @} + */ + +/** @defgroup GPIO_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Functions + * @{ + */ + +void GPIO_DeInit(GPIO_TypeDef* GPIOx); +void GPIO_AFIODeInit(void); +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); +void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); +void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); +void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); +void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_EventOutputCmd(FunctionalState NewState); +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState); +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_GPIO_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h new file mode 100644 index 0000000..7461770 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h @@ -0,0 +1,472 @@ +/** + ****************************************************************************** + * @file stm32f10x_i2c.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the I2C firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_I2C_H +#define __STM32F10x_I2C_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup I2C + * @{ + */ + +/** @defgroup I2C_Exported_Types + * @{ + */ + +/** + * @brief I2C Init structure definition + */ + +typedef struct +{ + uint32_t I2C_ClockSpeed; /*!< Specifies the clock frequency. + This parameter must be set to a value lower than 400kHz */ + + uint16_t I2C_Mode; /*!< Specifies the I2C mode. + This parameter can be a value of @ref I2C_mode */ + + uint16_t I2C_DutyCycle; /*!< Specifies the I2C fast mode duty cycle. + This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ + + uint16_t I2C_OwnAddress1; /*!< Specifies the first device own address. + This parameter can be a 7-bit or 10-bit address. */ + + uint16_t I2C_Ack; /*!< Enables or disables the acknowledgement. + This parameter can be a value of @ref I2C_acknowledgement */ + + uint16_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged. + This parameter can be a value of @ref I2C_acknowledged_address */ +}I2C_InitTypeDef; + +/** + * @} + */ + + +/** @defgroup I2C_Exported_Constants + * @{ + */ + +#define IS_I2C_ALL_PERIPH(PERIPH) (((PERIPH) == I2C1) || \ + ((PERIPH) == I2C2)) +/** @defgroup I2C_mode + * @{ + */ + +#define I2C_Mode_I2C ((uint16_t)0x0000) +#define I2C_Mode_SMBusDevice ((uint16_t)0x0002) +#define I2C_Mode_SMBusHost ((uint16_t)0x000A) +#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \ + ((MODE) == I2C_Mode_SMBusDevice) || \ + ((MODE) == I2C_Mode_SMBusHost)) +/** + * @} + */ + +/** @defgroup I2C_duty_cycle_in_fast_mode + * @{ + */ + +#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /*!< I2C fast mode Tlow/Thigh = 16/9 */ +#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /*!< I2C fast mode Tlow/Thigh = 2 */ +#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \ + ((CYCLE) == I2C_DutyCycle_2)) +/** + * @} + */ + +/** @defgroup I2C_acknowledgement + * @{ + */ + +#define I2C_Ack_Enable ((uint16_t)0x0400) +#define I2C_Ack_Disable ((uint16_t)0x0000) +#define IS_I2C_ACK_STATE(STATE) (((STATE) == I2C_Ack_Enable) || \ + ((STATE) == I2C_Ack_Disable)) +/** + * @} + */ + +/** @defgroup I2C_transfer_direction + * @{ + */ + +#define I2C_Direction_Transmitter ((uint8_t)0x00) +#define I2C_Direction_Receiver ((uint8_t)0x01) +#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \ + ((DIRECTION) == I2C_Direction_Receiver)) +/** + * @} + */ + +/** @defgroup I2C_acknowledged_address + * @{ + */ + +#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000) +#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000) +#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \ + ((ADDRESS) == I2C_AcknowledgedAddress_10bit)) +/** + * @} + */ + +/** @defgroup I2C_registers + * @{ + */ + +#define I2C_Register_CR1 ((uint8_t)0x00) +#define I2C_Register_CR2 ((uint8_t)0x04) +#define I2C_Register_OAR1 ((uint8_t)0x08) +#define I2C_Register_OAR2 ((uint8_t)0x0C) +#define I2C_Register_DR ((uint8_t)0x10) +#define I2C_Register_SR1 ((uint8_t)0x14) +#define I2C_Register_SR2 ((uint8_t)0x18) +#define I2C_Register_CCR ((uint8_t)0x1C) +#define I2C_Register_TRISE ((uint8_t)0x20) +#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \ + ((REGISTER) == I2C_Register_CR2) || \ + ((REGISTER) == I2C_Register_OAR1) || \ + ((REGISTER) == I2C_Register_OAR2) || \ + ((REGISTER) == I2C_Register_DR) || \ + ((REGISTER) == I2C_Register_SR1) || \ + ((REGISTER) == I2C_Register_SR2) || \ + ((REGISTER) == I2C_Register_CCR) || \ + ((REGISTER) == I2C_Register_TRISE)) +/** + * @} + */ + +/** @defgroup I2C_SMBus_alert_pin_level + * @{ + */ + +#define I2C_SMBusAlert_Low ((uint16_t)0x2000) +#define I2C_SMBusAlert_High ((uint16_t)0xDFFF) +#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \ + ((ALERT) == I2C_SMBusAlert_High)) +/** + * @} + */ + +/** @defgroup I2C_PEC_position + * @{ + */ + +#define I2C_PECPosition_Next ((uint16_t)0x0800) +#define I2C_PECPosition_Current ((uint16_t)0xF7FF) +#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \ + ((POSITION) == I2C_PECPosition_Current)) +/** + * @} + */ + +/** @defgroup I2C_interrupts_definition + * @{ + */ + +#define I2C_IT_BUF ((uint16_t)0x0400) +#define I2C_IT_EVT ((uint16_t)0x0200) +#define I2C_IT_ERR ((uint16_t)0x0100) +#define IS_I2C_CONFIG_IT(IT) ((((IT) & (uint16_t)0xF8FF) == 0x00) && ((IT) != 0x00)) +/** + * @} + */ + +/** @defgroup I2C_interrupts_definition + * @{ + */ + +#define I2C_IT_SMBALERT ((uint32_t)0x01008000) +#define I2C_IT_TIMEOUT ((uint32_t)0x01004000) +#define I2C_IT_PECERR ((uint32_t)0x01001000) +#define I2C_IT_OVR ((uint32_t)0x01000800) +#define I2C_IT_AF ((uint32_t)0x01000400) +#define I2C_IT_ARLO ((uint32_t)0x01000200) +#define I2C_IT_BERR ((uint32_t)0x01000100) +#define I2C_IT_TXE ((uint32_t)0x06000080) +#define I2C_IT_RXNE ((uint32_t)0x06000040) +#define I2C_IT_STOPF ((uint32_t)0x02000010) +#define I2C_IT_ADD10 ((uint32_t)0x02000008) +#define I2C_IT_BTF ((uint32_t)0x02000004) +#define I2C_IT_ADDR ((uint32_t)0x02000002) +#define I2C_IT_SB ((uint32_t)0x02000001) + +#define IS_I2C_CLEAR_IT(IT) ((((IT) & (uint16_t)0x20FF) == 0x00) && ((IT) != (uint16_t)0x00)) + +#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \ + ((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \ + ((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \ + ((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \ + ((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \ + ((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \ + ((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB)) +/** + * @} + */ + +/** @defgroup I2C_flags_definition + * @{ + */ + +/** + * @brief SR2 register flags + */ + +#define I2C_FLAG_DUALF ((uint32_t)0x00800000) +#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000) +#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000) +#define I2C_FLAG_GENCALL ((uint32_t)0x00100000) +#define I2C_FLAG_TRA ((uint32_t)0x00040000) +#define I2C_FLAG_BUSY ((uint32_t)0x00020000) +#define I2C_FLAG_MSL ((uint32_t)0x00010000) + +/** + * @brief SR1 register flags + */ + +#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000) +#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000) +#define I2C_FLAG_PECERR ((uint32_t)0x10001000) +#define I2C_FLAG_OVR ((uint32_t)0x10000800) +#define I2C_FLAG_AF ((uint32_t)0x10000400) +#define I2C_FLAG_ARLO ((uint32_t)0x10000200) +#define I2C_FLAG_BERR ((uint32_t)0x10000100) +#define I2C_FLAG_TXE ((uint32_t)0x10000080) +#define I2C_FLAG_RXNE ((uint32_t)0x10000040) +#define I2C_FLAG_STOPF ((uint32_t)0x10000010) +#define I2C_FLAG_ADD10 ((uint32_t)0x10000008) +#define I2C_FLAG_BTF ((uint32_t)0x10000004) +#define I2C_FLAG_ADDR ((uint32_t)0x10000002) +#define I2C_FLAG_SB ((uint32_t)0x10000001) + +#define IS_I2C_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0x20FF) == 0x00) && ((FLAG) != (uint16_t)0x00)) + +#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \ + ((FLAG) == I2C_FLAG_SMBDEFAULT) || ((FLAG) == I2C_FLAG_GENCALL) || \ + ((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \ + ((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \ + ((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \ + ((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \ + ((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \ + ((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \ + ((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \ + ((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \ + ((FLAG) == I2C_FLAG_SB)) +/** + * @} + */ + +/** @defgroup I2C_Events + * @{ + */ + +/** + * @brief EV1 + */ + +#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */ +#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */ +#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */ +#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */ + +/** + * @brief EV2 + */ + +#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */ + +/** + * @brief EV3 + */ + +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */ + +/** + * @brief EV4 + */ + +#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */ + +/** + * @brief EV5 + */ + +#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ + +/** + * @brief EV6 + */ + +#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */ +#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ + +/** + * @brief EV7 + */ + +#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */ + +/** + * @brief EV8 + */ + +#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */ + +/** + * @brief EV8_2 + */ + +#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */ + +/** + * @brief EV9 + */ + +#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */ + +/** + * @brief EV3_2 + */ + +#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */ + +#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_STOP_DETECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \ + ((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTING) || \ + ((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \ + ((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE)) +/** + * @} + */ + +/** @defgroup I2C_own_address1 + * @{ + */ + +#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF) +/** + * @} + */ + +/** @defgroup I2C_clock_speed + * @{ + */ + +#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup I2C_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Exported_Functions + * @{ + */ + +void I2C_DeInit(I2C_TypeDef* I2Cx); +void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); +void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct); +void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); +void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState); +void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); +uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx); +void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); +uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register); +void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert); +void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition); +void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx); +void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle); +uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx); +ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT); +FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); +void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); +ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT); +void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_I2C_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h new file mode 100644 index 0000000..a46546a --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h @@ -0,0 +1,139 @@ +/** + ****************************************************************************** + * @file stm32f10x_iwdg.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the IWDG + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_IWDG_H +#define __STM32F10x_IWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup IWDG + * @{ + */ + +/** @defgroup IWDG_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Exported_Constants + * @{ + */ + +/** @defgroup IWDG_WriteAccess + * @{ + */ + +#define IWDG_WriteAccess_Enable ((uint16_t)0x5555) +#define IWDG_WriteAccess_Disable ((uint16_t)0x0000) +#define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) || \ + ((ACCESS) == IWDG_WriteAccess_Disable)) +/** + * @} + */ + +/** @defgroup IWDG_prescaler + * @{ + */ + +#define IWDG_Prescaler_4 ((uint8_t)0x00) +#define IWDG_Prescaler_8 ((uint8_t)0x01) +#define IWDG_Prescaler_16 ((uint8_t)0x02) +#define IWDG_Prescaler_32 ((uint8_t)0x03) +#define IWDG_Prescaler_64 ((uint8_t)0x04) +#define IWDG_Prescaler_128 ((uint8_t)0x05) +#define IWDG_Prescaler_256 ((uint8_t)0x06) +#define IS_IWDG_PRESCALER(PRESCALER) (((PRESCALER) == IWDG_Prescaler_4) || \ + ((PRESCALER) == IWDG_Prescaler_8) || \ + ((PRESCALER) == IWDG_Prescaler_16) || \ + ((PRESCALER) == IWDG_Prescaler_32) || \ + ((PRESCALER) == IWDG_Prescaler_64) || \ + ((PRESCALER) == IWDG_Prescaler_128)|| \ + ((PRESCALER) == IWDG_Prescaler_256)) +/** + * @} + */ + +/** @defgroup IWDG_Flag + * @{ + */ + +#define IWDG_FLAG_PVU ((uint16_t)0x0001) +#define IWDG_FLAG_RVU ((uint16_t)0x0002) +#define IS_IWDG_FLAG(FLAG) (((FLAG) == IWDG_FLAG_PVU) || ((FLAG) == IWDG_FLAG_RVU)) +#define IS_IWDG_RELOAD(RELOAD) ((RELOAD) <= 0xFFF) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup IWDG_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Exported_Functions + * @{ + */ + +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); +void IWDG_SetReload(uint16_t Reload); +void IWDG_ReloadCounter(void); +void IWDG_Enable(void); +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_IWDG_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h new file mode 100644 index 0000000..f8d59df --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h @@ -0,0 +1,155 @@ +/** + ****************************************************************************** + * @file stm32f10x_pwr.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the PWR firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_PWR_H +#define __STM32F10x_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup PWR + * @{ + */ + +/** @defgroup PWR_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Exported_Constants + * @{ + */ + +/** @defgroup PVD_detection_level + * @{ + */ + +#define PWR_PVDLevel_2V2 ((uint32_t)0x00000000) +#define PWR_PVDLevel_2V3 ((uint32_t)0x00000020) +#define PWR_PVDLevel_2V4 ((uint32_t)0x00000040) +#define PWR_PVDLevel_2V5 ((uint32_t)0x00000060) +#define PWR_PVDLevel_2V6 ((uint32_t)0x00000080) +#define PWR_PVDLevel_2V7 ((uint32_t)0x000000A0) +#define PWR_PVDLevel_2V8 ((uint32_t)0x000000C0) +#define PWR_PVDLevel_2V9 ((uint32_t)0x000000E0) +#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLevel_2V2) || ((LEVEL) == PWR_PVDLevel_2V3)|| \ + ((LEVEL) == PWR_PVDLevel_2V4) || ((LEVEL) == PWR_PVDLevel_2V5)|| \ + ((LEVEL) == PWR_PVDLevel_2V6) || ((LEVEL) == PWR_PVDLevel_2V7)|| \ + ((LEVEL) == PWR_PVDLevel_2V8) || ((LEVEL) == PWR_PVDLevel_2V9)) +/** + * @} + */ + +/** @defgroup Regulator_state_is_STOP_mode + * @{ + */ + +#define PWR_Regulator_ON ((uint32_t)0x00000000) +#define PWR_Regulator_LowPower ((uint32_t)0x00000001) +#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_Regulator_ON) || \ + ((REGULATOR) == PWR_Regulator_LowPower)) +/** + * @} + */ + +/** @defgroup STOP_mode_entry + * @{ + */ + +#define PWR_STOPEntry_WFI ((uint8_t)0x01) +#define PWR_STOPEntry_WFE ((uint8_t)0x02) +#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPEntry_WFI) || ((ENTRY) == PWR_STOPEntry_WFE)) + +/** + * @} + */ + +/** @defgroup PWR_Flag + * @{ + */ + +#define PWR_FLAG_WU ((uint32_t)0x00000001) +#define PWR_FLAG_SB ((uint32_t)0x00000002) +#define PWR_FLAG_PVDO ((uint32_t)0x00000004) +#define IS_PWR_GET_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB) || \ + ((FLAG) == PWR_FLAG_PVDO)) + +#define IS_PWR_CLEAR_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup PWR_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Exported_Functions + * @{ + */ + +void PWR_DeInit(void); +void PWR_BackupAccessCmd(FunctionalState NewState); +void PWR_PVDCmd(FunctionalState NewState); +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); +void PWR_WakeUpPinCmd(FunctionalState NewState); +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); +void PWR_EnterSTANDBYMode(void); +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); +void PWR_ClearFlag(uint32_t PWR_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_PWR_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h new file mode 100644 index 0000000..2d18376 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h @@ -0,0 +1,700 @@ +/** + ****************************************************************************** + * @file stm32f10x_rcc.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the RCC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_RCC_H +#define __STM32F10x_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/** @defgroup RCC_Exported_Types + * @{ + */ + +typedef struct +{ + uint32_t SYSCLK_Frequency; /*!< returns SYSCLK clock frequency expressed in Hz */ + uint32_t HCLK_Frequency; /*!< returns HCLK clock frequency expressed in Hz */ + uint32_t PCLK1_Frequency; /*!< returns PCLK1 clock frequency expressed in Hz */ + uint32_t PCLK2_Frequency; /*!< returns PCLK2 clock frequency expressed in Hz */ + uint32_t ADCCLK_Frequency; /*!< returns ADCCLK clock frequency expressed in Hz */ +}RCC_ClocksTypeDef; + +/** + * @} + */ + +/** @defgroup RCC_Exported_Constants + * @{ + */ + +/** @defgroup HSE_configuration + * @{ + */ + +#define RCC_HSE_OFF ((uint32_t)0x00000000) +#define RCC_HSE_ON ((uint32_t)0x00010000) +#define RCC_HSE_Bypass ((uint32_t)0x00040000) +#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ + ((HSE) == RCC_HSE_Bypass)) + +/** + * @} + */ + +/** @defgroup PLL_entry_clock_source + * @{ + */ + +#define RCC_PLLSource_HSI_Div2 ((uint32_t)0x00000000) + +#ifndef STM32F10X_CL + #define RCC_PLLSource_HSE_Div1 ((uint32_t)0x00010000) + #define RCC_PLLSource_HSE_Div2 ((uint32_t)0x00030000) + #define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \ + ((SOURCE) == RCC_PLLSource_HSE_Div1) || \ + ((SOURCE) == RCC_PLLSource_HSE_Div2)) +#else + #define RCC_PLLSource_PREDIV1 ((uint32_t)0x00010000) +#define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \ + ((SOURCE) == RCC_PLLSource_PREDIV1)) +#endif /* STM32F10X_CL */ + +/** + * @} + */ + +/** @defgroup PLL_multiplication_factor + * @{ + */ +#ifndef STM32F10X_CL + #define RCC_PLLMul_2 ((uint32_t)0x00000000) + #define RCC_PLLMul_3 ((uint32_t)0x00040000) + #define RCC_PLLMul_4 ((uint32_t)0x00080000) + #define RCC_PLLMul_5 ((uint32_t)0x000C0000) + #define RCC_PLLMul_6 ((uint32_t)0x00100000) + #define RCC_PLLMul_7 ((uint32_t)0x00140000) + #define RCC_PLLMul_8 ((uint32_t)0x00180000) + #define RCC_PLLMul_9 ((uint32_t)0x001C0000) + #define RCC_PLLMul_10 ((uint32_t)0x00200000) + #define RCC_PLLMul_11 ((uint32_t)0x00240000) + #define RCC_PLLMul_12 ((uint32_t)0x00280000) + #define RCC_PLLMul_13 ((uint32_t)0x002C0000) + #define RCC_PLLMul_14 ((uint32_t)0x00300000) + #define RCC_PLLMul_15 ((uint32_t)0x00340000) + #define RCC_PLLMul_16 ((uint32_t)0x00380000) + #define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_2) || ((MUL) == RCC_PLLMul_3) || \ + ((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5) || \ + ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7) || \ + ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9) || \ + ((MUL) == RCC_PLLMul_10) || ((MUL) == RCC_PLLMul_11) || \ + ((MUL) == RCC_PLLMul_12) || ((MUL) == RCC_PLLMul_13) || \ + ((MUL) == RCC_PLLMul_14) || ((MUL) == RCC_PLLMul_15) || \ + ((MUL) == RCC_PLLMul_16)) + +#else + #define RCC_PLLMul_4 ((uint32_t)0x00080000) + #define RCC_PLLMul_5 ((uint32_t)0x000C0000) + #define RCC_PLLMul_6 ((uint32_t)0x00100000) + #define RCC_PLLMul_7 ((uint32_t)0x00140000) + #define RCC_PLLMul_8 ((uint32_t)0x00180000) + #define RCC_PLLMul_9 ((uint32_t)0x001C0000) + #define RCC_PLLMul_6_5 ((uint32_t)0x00340000) + + #define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5) || \ + ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7) || \ + ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9) || \ + ((MUL) == RCC_PLLMul_6_5)) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +#ifdef STM32F10X_CL +/** @defgroup PREDIV1_division_factor + * @{ + */ + #define RCC_PREDIV1_Div1 ((uint32_t)0x00000000) + #define RCC_PREDIV1_Div2 ((uint32_t)0x00000001) + #define RCC_PREDIV1_Div3 ((uint32_t)0x00000002) + #define RCC_PREDIV1_Div4 ((uint32_t)0x00000003) + #define RCC_PREDIV1_Div5 ((uint32_t)0x00000004) + #define RCC_PREDIV1_Div6 ((uint32_t)0x00000005) + #define RCC_PREDIV1_Div7 ((uint32_t)0x00000006) + #define RCC_PREDIV1_Div8 ((uint32_t)0x00000007) + #define RCC_PREDIV1_Div9 ((uint32_t)0x00000008) + #define RCC_PREDIV1_Div10 ((uint32_t)0x00000009) + #define RCC_PREDIV1_Div11 ((uint32_t)0x0000000A) + #define RCC_PREDIV1_Div12 ((uint32_t)0x0000000B) + #define RCC_PREDIV1_Div13 ((uint32_t)0x0000000C) + #define RCC_PREDIV1_Div14 ((uint32_t)0x0000000D) + #define RCC_PREDIV1_Div15 ((uint32_t)0x0000000E) + #define RCC_PREDIV1_Div16 ((uint32_t)0x0000000F) + + #define IS_RCC_PREDIV1(PREDIV1) (((PREDIV1) == RCC_PREDIV1_Div1) || ((PREDIV1) == RCC_PREDIV1_Div2) || \ + ((PREDIV1) == RCC_PREDIV1_Div3) || ((PREDIV1) == RCC_PREDIV1_Div4) || \ + ((PREDIV1) == RCC_PREDIV1_Div5) || ((PREDIV1) == RCC_PREDIV1_Div6) || \ + ((PREDIV1) == RCC_PREDIV1_Div7) || ((PREDIV1) == RCC_PREDIV1_Div8) || \ + ((PREDIV1) == RCC_PREDIV1_Div9) || ((PREDIV1) == RCC_PREDIV1_Div10) || \ + ((PREDIV1) == RCC_PREDIV1_Div11) || ((PREDIV1) == RCC_PREDIV1_Div12) || \ + ((PREDIV1) == RCC_PREDIV1_Div13) || ((PREDIV1) == RCC_PREDIV1_Div14) || \ + ((PREDIV1) == RCC_PREDIV1_Div15) || ((PREDIV1) == RCC_PREDIV1_Div16)) +/** + * @} + */ + + +/** @defgroup PREDIV1_clock_source + * @{ + */ +/* PREDIV1 clock source (only for STM32 connectivity line devices) */ + #define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) + #define RCC_PREDIV1_Source_PLL2 ((uint32_t)0x00010000) + + #define IS_RCC_PREDIV1_SOURCE(SOURCE) (((SOURCE) == RCC_PREDIV1_Source_HSE) || \ + ((SOURCE) == RCC_PREDIV1_Source_PLL2)) +/** + * @} + */ + + +/** @defgroup PREDIV2_division_factor + * @{ + */ + + #define RCC_PREDIV2_Div1 ((uint32_t)0x00000000) + #define RCC_PREDIV2_Div2 ((uint32_t)0x00000010) + #define RCC_PREDIV2_Div3 ((uint32_t)0x00000020) + #define RCC_PREDIV2_Div4 ((uint32_t)0x00000030) + #define RCC_PREDIV2_Div5 ((uint32_t)0x00000040) + #define RCC_PREDIV2_Div6 ((uint32_t)0x00000050) + #define RCC_PREDIV2_Div7 ((uint32_t)0x00000060) + #define RCC_PREDIV2_Div8 ((uint32_t)0x00000070) + #define RCC_PREDIV2_Div9 ((uint32_t)0x00000080) + #define RCC_PREDIV2_Div10 ((uint32_t)0x00000090) + #define RCC_PREDIV2_Div11 ((uint32_t)0x000000A0) + #define RCC_PREDIV2_Div12 ((uint32_t)0x000000B0) + #define RCC_PREDIV2_Div13 ((uint32_t)0x000000C0) + #define RCC_PREDIV2_Div14 ((uint32_t)0x000000D0) + #define RCC_PREDIV2_Div15 ((uint32_t)0x000000E0) + #define RCC_PREDIV2_Div16 ((uint32_t)0x000000F0) + + #define IS_RCC_PREDIV2(PREDIV2) (((PREDIV2) == RCC_PREDIV2_Div1) || ((PREDIV2) == RCC_PREDIV2_Div2) || \ + ((PREDIV2) == RCC_PREDIV2_Div3) || ((PREDIV2) == RCC_PREDIV2_Div4) || \ + ((PREDIV2) == RCC_PREDIV2_Div5) || ((PREDIV2) == RCC_PREDIV2_Div6) || \ + ((PREDIV2) == RCC_PREDIV2_Div7) || ((PREDIV2) == RCC_PREDIV2_Div8) || \ + ((PREDIV2) == RCC_PREDIV2_Div9) || ((PREDIV2) == RCC_PREDIV2_Div10) || \ + ((PREDIV2) == RCC_PREDIV2_Div11) || ((PREDIV2) == RCC_PREDIV2_Div12) || \ + ((PREDIV2) == RCC_PREDIV2_Div13) || ((PREDIV2) == RCC_PREDIV2_Div14) || \ + ((PREDIV2) == RCC_PREDIV2_Div15) || ((PREDIV2) == RCC_PREDIV2_Div16)) +/** + * @} + */ + + +/** @defgroup PLL2_multiplication_factor + * @{ + */ + + #define RCC_PLL2Mul_8 ((uint32_t)0x00000600) + #define RCC_PLL2Mul_9 ((uint32_t)0x00000700) + #define RCC_PLL2Mul_10 ((uint32_t)0x00000800) + #define RCC_PLL2Mul_11 ((uint32_t)0x00000900) + #define RCC_PLL2Mul_12 ((uint32_t)0x00000A00) + #define RCC_PLL2Mul_13 ((uint32_t)0x00000B00) + #define RCC_PLL2Mul_14 ((uint32_t)0x00000C00) + #define RCC_PLL2Mul_16 ((uint32_t)0x00000E00) + #define RCC_PLL2Mul_20 ((uint32_t)0x00000F00) + + #define IS_RCC_PLL2_MUL(MUL) (((MUL) == RCC_PLL2Mul_8) || ((MUL) == RCC_PLL2Mul_9) || \ + ((MUL) == RCC_PLL2Mul_10) || ((MUL) == RCC_PLL2Mul_11) || \ + ((MUL) == RCC_PLL2Mul_12) || ((MUL) == RCC_PLL2Mul_13) || \ + ((MUL) == RCC_PLL2Mul_14) || ((MUL) == RCC_PLL2Mul_16) || \ + ((MUL) == RCC_PLL2Mul_20)) +/** + * @} + */ + + +/** @defgroup PLL3_multiplication_factor + * @{ + */ + + #define RCC_PLL3Mul_8 ((uint32_t)0x00006000) + #define RCC_PLL3Mul_9 ((uint32_t)0x00007000) + #define RCC_PLL3Mul_10 ((uint32_t)0x00008000) + #define RCC_PLL3Mul_11 ((uint32_t)0x00009000) + #define RCC_PLL3Mul_12 ((uint32_t)0x0000A000) + #define RCC_PLL3Mul_13 ((uint32_t)0x0000B000) + #define RCC_PLL3Mul_14 ((uint32_t)0x0000C000) + #define RCC_PLL3Mul_16 ((uint32_t)0x0000E000) + #define RCC_PLL3Mul_20 ((uint32_t)0x0000F000) + + #define IS_RCC_PLL3_MUL(MUL) (((MUL) == RCC_PLL3Mul_8) || ((MUL) == RCC_PLL3Mul_9) || \ + ((MUL) == RCC_PLL3Mul_10) || ((MUL) == RCC_PLL3Mul_11) || \ + ((MUL) == RCC_PLL3Mul_12) || ((MUL) == RCC_PLL3Mul_13) || \ + ((MUL) == RCC_PLL3Mul_14) || ((MUL) == RCC_PLL3Mul_16) || \ + ((MUL) == RCC_PLL3Mul_20)) +/** + * @} + */ + +#endif /* STM32F10X_CL */ + + +/** @defgroup System_clock_source + * @{ + */ + +#define RCC_SYSCLKSource_HSI ((uint32_t)0x00000000) +#define RCC_SYSCLKSource_HSE ((uint32_t)0x00000001) +#define RCC_SYSCLKSource_PLLCLK ((uint32_t)0x00000002) +#define IS_RCC_SYSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSource_HSI) || \ + ((SOURCE) == RCC_SYSCLKSource_HSE) || \ + ((SOURCE) == RCC_SYSCLKSource_PLLCLK)) +/** + * @} + */ + +/** @defgroup AHB_clock_source + * @{ + */ + +#define RCC_SYSCLK_Div1 ((uint32_t)0x00000000) +#define RCC_SYSCLK_Div2 ((uint32_t)0x00000080) +#define RCC_SYSCLK_Div4 ((uint32_t)0x00000090) +#define RCC_SYSCLK_Div8 ((uint32_t)0x000000A0) +#define RCC_SYSCLK_Div16 ((uint32_t)0x000000B0) +#define RCC_SYSCLK_Div64 ((uint32_t)0x000000C0) +#define RCC_SYSCLK_Div128 ((uint32_t)0x000000D0) +#define RCC_SYSCLK_Div256 ((uint32_t)0x000000E0) +#define RCC_SYSCLK_Div512 ((uint32_t)0x000000F0) +#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_Div1) || ((HCLK) == RCC_SYSCLK_Div2) || \ + ((HCLK) == RCC_SYSCLK_Div4) || ((HCLK) == RCC_SYSCLK_Div8) || \ + ((HCLK) == RCC_SYSCLK_Div16) || ((HCLK) == RCC_SYSCLK_Div64) || \ + ((HCLK) == RCC_SYSCLK_Div128) || ((HCLK) == RCC_SYSCLK_Div256) || \ + ((HCLK) == RCC_SYSCLK_Div512)) +/** + * @} + */ + +/** @defgroup APB1_APB2_clock_source + * @{ + */ + +#define RCC_HCLK_Div1 ((uint32_t)0x00000000) +#define RCC_HCLK_Div2 ((uint32_t)0x00000400) +#define RCC_HCLK_Div4 ((uint32_t)0x00000500) +#define RCC_HCLK_Div8 ((uint32_t)0x00000600) +#define RCC_HCLK_Div16 ((uint32_t)0x00000700) +#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_Div1) || ((PCLK) == RCC_HCLK_Div2) || \ + ((PCLK) == RCC_HCLK_Div4) || ((PCLK) == RCC_HCLK_Div8) || \ + ((PCLK) == RCC_HCLK_Div16)) +/** + * @} + */ + +/** @defgroup RCC_Interrupt_source + * @{ + */ + +#define RCC_IT_LSIRDY ((uint8_t)0x01) +#define RCC_IT_LSERDY ((uint8_t)0x02) +#define RCC_IT_HSIRDY ((uint8_t)0x04) +#define RCC_IT_HSERDY ((uint8_t)0x08) +#define RCC_IT_PLLRDY ((uint8_t)0x10) +#define RCC_IT_CSS ((uint8_t)0x80) + +#ifndef STM32F10X_CL + #define IS_RCC_IT(IT) ((((IT) & (uint8_t)0xE0) == 0x00) && ((IT) != 0x00)) + #define IS_RCC_GET_IT(IT) (((IT) == RCC_IT_LSIRDY) || ((IT) == RCC_IT_LSERDY) || \ + ((IT) == RCC_IT_HSIRDY) || ((IT) == RCC_IT_HSERDY) || \ + ((IT) == RCC_IT_PLLRDY) || ((IT) == RCC_IT_CSS)) + #define IS_RCC_CLEAR_IT(IT) ((((IT) & (uint8_t)0x60) == 0x00) && ((IT) != 0x00)) +#else + #define RCC_IT_PLL2RDY ((uint8_t)0x20) + #define RCC_IT_PLL3RDY ((uint8_t)0x40) + #define IS_RCC_IT(IT) ((((IT) & (uint8_t)0x80) == 0x00) && ((IT) != 0x00)) + #define IS_RCC_GET_IT(IT) (((IT) == RCC_IT_LSIRDY) || ((IT) == RCC_IT_LSERDY) || \ + ((IT) == RCC_IT_HSIRDY) || ((IT) == RCC_IT_HSERDY) || \ + ((IT) == RCC_IT_PLLRDY) || ((IT) == RCC_IT_CSS) || \ + ((IT) == RCC_IT_PLL2RDY) || ((IT) == RCC_IT_PLL3RDY)) + #define IS_RCC_CLEAR_IT(IT) ((IT) != 0x00) +#endif /* STM32F10X_CL */ + + +/** + * @} + */ + +#ifndef STM32F10X_CL +/** @defgroup USB_Device_clock_source + * @{ + */ + + #define RCC_USBCLKSource_PLLCLK_1Div5 ((uint8_t)0x00) + #define RCC_USBCLKSource_PLLCLK_Div1 ((uint8_t)0x01) + + #define IS_RCC_USBCLK_SOURCE(SOURCE) (((SOURCE) == RCC_USBCLKSource_PLLCLK_1Div5) || \ + ((SOURCE) == RCC_USBCLKSource_PLLCLK_Div1)) +#else +/** @defgroup USB_OTG_FS_clock_source + * @{ + */ + #define RCC_OTGFSCLKSource_PLLVCO_Div3 ((uint8_t)0x00) + #define RCC_OTGFSCLKSource_PLLVCO_Div2 ((uint8_t)0x01) + + #define IS_RCC_OTGFSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_OTGFSCLKSource_PLLVCO_Div3) || \ + ((SOURCE) == RCC_OTGFSCLKSource_PLLVCO_Div2)) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +#ifdef STM32F10X_CL +/** @defgroup I2S2_clock_source + * @{ + */ + #define RCC_I2S2CLKSource_SYSCLK ((uint8_t)0x00) + #define RCC_I2S2CLKSource_PLL3_VCO ((uint8_t)0x01) + + #define IS_RCC_I2S2CLK_SOURCE(SOURCE) (((SOURCE) == RCC_I2S2CLKSource_SYSCLK) || \ + ((SOURCE) == RCC_I2S2CLKSource_PLL3_VCO)) +/** + * @} + */ + +/** @defgroup I2S3_clock_source + * @{ + */ + #define RCC_I2S3CLKSource_SYSCLK ((uint8_t)0x00) + #define RCC_I2S3CLKSource_PLL3_VCO ((uint8_t)0x01) + + #define IS_RCC_I2S3CLK_SOURCE(SOURCE) (((SOURCE) == RCC_I2S3CLKSource_SYSCLK) || \ + ((SOURCE) == RCC_I2S3CLKSource_PLL3_VCO)) +/** + * @} + */ +#endif /* STM32F10X_CL */ + + +/** @defgroup ADC_clock_source + * @{ + */ + +#define RCC_PCLK2_Div2 ((uint32_t)0x00000000) +#define RCC_PCLK2_Div4 ((uint32_t)0x00004000) +#define RCC_PCLK2_Div6 ((uint32_t)0x00008000) +#define RCC_PCLK2_Div8 ((uint32_t)0x0000C000) +#define IS_RCC_ADCCLK(ADCCLK) (((ADCCLK) == RCC_PCLK2_Div2) || ((ADCCLK) == RCC_PCLK2_Div4) || \ + ((ADCCLK) == RCC_PCLK2_Div6) || ((ADCCLK) == RCC_PCLK2_Div8)) +/** + * @} + */ + +/** @defgroup LSE_configuration + * @{ + */ + +#define RCC_LSE_OFF ((uint8_t)0x00) +#define RCC_LSE_ON ((uint8_t)0x01) +#define RCC_LSE_Bypass ((uint8_t)0x04) +#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ + ((LSE) == RCC_LSE_Bypass)) +/** + * @} + */ + +/** @defgroup RTC_clock_source + * @{ + */ + +#define RCC_RTCCLKSource_LSE ((uint32_t)0x00000100) +#define RCC_RTCCLKSource_LSI ((uint32_t)0x00000200) +#define RCC_RTCCLKSource_HSE_Div128 ((uint32_t)0x00000300) +#define IS_RCC_RTCCLK_SOURCE(SOURCE) (((SOURCE) == RCC_RTCCLKSource_LSE) || \ + ((SOURCE) == RCC_RTCCLKSource_LSI) || \ + ((SOURCE) == RCC_RTCCLKSource_HSE_Div128)) +/** + * @} + */ + +/** @defgroup AHB_peripheral + * @{ + */ + +#define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) +#define RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) +#define RCC_AHBPeriph_SRAM ((uint32_t)0x00000004) +#define RCC_AHBPeriph_FLITF ((uint32_t)0x00000010) +#define RCC_AHBPeriph_CRC ((uint32_t)0x00000040) + +#ifndef STM32F10X_CL + #define RCC_AHBPeriph_FSMC ((uint32_t)0x00000100) + #define RCC_AHBPeriph_SDIO ((uint32_t)0x00000400) + #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFAA8) == 0x00) && ((PERIPH) != 0x00)) +#else + #define RCC_AHBPeriph_OTG_FS ((uint32_t)0x00001000) + #define RCC_AHBPeriph_ETH_MAC ((uint32_t)0x00004000) + #define RCC_AHBPeriph_ETH_MAC_Tx ((uint32_t)0x00008000) + #define RCC_AHBPeriph_ETH_MAC_Rx ((uint32_t)0x00010000) + + #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFE2FA8) == 0x00) && ((PERIPH) != 0x00)) + #define IS_RCC_AHB_PERIPH_RESET(PERIPH) ((((PERIPH) & 0xFFFFAFFF) == 0x00) && ((PERIPH) != 0x00)) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +/** @defgroup APB2_peripheral + * @{ + */ + +#define RCC_APB2Periph_AFIO ((uint32_t)0x00000001) +#define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) +#define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008) +#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) +#define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) +#define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040) +#define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080) +#define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100) +#define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200) +#define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400) +#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800) +#define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) +#define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000) +#define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) +#define RCC_APB2Periph_ADC3 ((uint32_t)0x00008000) + +#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFFF0002) == 0x00) && ((PERIPH) != 0x00)) +/** + * @} + */ + +/** @defgroup APB1_peripheral + * @{ + */ + +#define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) +#define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) +#define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) +#define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) +#define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) +#define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) +#define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) +#define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000) +#define RCC_APB1Periph_SPI3 ((uint32_t)0x00008000) +#define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) +#define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) +#define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) +#define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) +#define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) +#define RCC_APB1Periph_I2C2 ((uint32_t)0x00400000) +#define RCC_APB1Periph_USB ((uint32_t)0x00800000) +#define RCC_APB1Periph_CAN1 ((uint32_t)0x02000000) +#define RCC_APB1Periph_BKP ((uint32_t)0x08000000) +#define RCC_APB1Periph_PWR ((uint32_t)0x10000000) +#define RCC_APB1Periph_DAC ((uint32_t)0x20000000) +#define RCC_APB1Periph_CAN2 ((uint32_t)0x04000000) +#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0xC10137C0) == 0x00) && ((PERIPH) != 0x00)) + +/** + * @} + */ + +/** @defgroup Clock_source_to_output_on_MCO_pin + * @{ + */ + +#define RCC_MCO_NoClock ((uint8_t)0x00) +#define RCC_MCO_SYSCLK ((uint8_t)0x04) +#define RCC_MCO_HSI ((uint8_t)0x05) +#define RCC_MCO_HSE ((uint8_t)0x06) +#define RCC_MCO_PLLCLK_Div2 ((uint8_t)0x07) + +#ifndef STM32F10X_CL + #define IS_RCC_MCO(MCO) (((MCO) == RCC_MCO_NoClock) || ((MCO) == RCC_MCO_HSI) || \ + ((MCO) == RCC_MCO_SYSCLK) || ((MCO) == RCC_MCO_HSE) || \ + ((MCO) == RCC_MCO_PLLCLK_Div2)) +#else + #define RCC_MCO_PLL2CLK ((uint8_t)0x08) + #define RCC_MCO_PLL3CLK_Div2 ((uint8_t)0x09) + #define RCC_MCO_XT1 ((uint8_t)0x0A) + #define RCC_MCO_PLL3CLK ((uint8_t)0x0B) + + #define IS_RCC_MCO(MCO) (((MCO) == RCC_MCO_NoClock) || ((MCO) == RCC_MCO_HSI) || \ + ((MCO) == RCC_MCO_SYSCLK) || ((MCO) == RCC_MCO_HSE) || \ + ((MCO) == RCC_MCO_PLLCLK_Div2) || ((MCO) == RCC_MCO_PLL2CLK) || \ + ((MCO) == RCC_MCO_PLL3CLK_Div2) || ((MCO) == RCC_MCO_XT1) || \ + ((MCO) == RCC_MCO_PLL3CLK)) +#endif /* STM32F10X_CL */ + +/** + * @} + */ + +/** @defgroup RCC_Flag + * @{ + */ + +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_LSERDY ((uint8_t)0x41) +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) + +#ifndef STM32F10X_CL + #define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ + ((FLAG) == RCC_FLAG_PLLRDY) || ((FLAG) == RCC_FLAG_LSERDY) || \ + ((FLAG) == RCC_FLAG_LSIRDY) || ((FLAG) == RCC_FLAG_PINRST) || \ + ((FLAG) == RCC_FLAG_PORRST) || ((FLAG) == RCC_FLAG_SFTRST) || \ + ((FLAG) == RCC_FLAG_IWDGRST)|| ((FLAG) == RCC_FLAG_WWDGRST)|| \ + ((FLAG) == RCC_FLAG_LPWRRST)) +#else + #define RCC_FLAG_PLL2RDY ((uint8_t)0x3B) + #define RCC_FLAG_PLL3RDY ((uint8_t)0x3D) + #define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ + ((FLAG) == RCC_FLAG_PLLRDY) || ((FLAG) == RCC_FLAG_LSERDY) || \ + ((FLAG) == RCC_FLAG_PLL2RDY) || ((FLAG) == RCC_FLAG_PLL3RDY) || \ + ((FLAG) == RCC_FLAG_LSIRDY) || ((FLAG) == RCC_FLAG_PINRST) || \ + ((FLAG) == RCC_FLAG_PORRST) || ((FLAG) == RCC_FLAG_SFTRST) || \ + ((FLAG) == RCC_FLAG_IWDGRST)|| ((FLAG) == RCC_FLAG_WWDGRST)|| \ + ((FLAG) == RCC_FLAG_LPWRRST)) +#endif /* STM32F10X_CL */ + +#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1F) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup RCC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Exported_Functions + * @{ + */ + +void RCC_DeInit(void); +void RCC_HSEConfig(uint32_t RCC_HSE); +ErrorStatus RCC_WaitForHSEStartUp(void); +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); +void RCC_HSICmd(FunctionalState NewState); +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul); +void RCC_PLLCmd(FunctionalState NewState); + +#ifdef STM32F10X_CL + void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div); + void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div); + void RCC_PLL2Config(uint32_t RCC_PLL2Mul); + void RCC_PLL2Cmd(FunctionalState NewState); + void RCC_PLL3Config(uint32_t RCC_PLL3Mul); + void RCC_PLL3Cmd(FunctionalState NewState); +#endif /* STM32F10X_CL */ + +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); +uint8_t RCC_GetSYSCLKSource(void); +void RCC_HCLKConfig(uint32_t RCC_SYSCLK); +void RCC_PCLK1Config(uint32_t RCC_HCLK); +void RCC_PCLK2Config(uint32_t RCC_HCLK); +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); + +#ifndef STM32F10X_CL + void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource); +#else + void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource); +#endif /* STM32F10X_CL */ + +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); + +#ifdef STM32F10X_CL + void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource); + void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource); +#endif /* STM32F10X_CL */ + +void RCC_LSEConfig(uint8_t RCC_LSE); +void RCC_LSICmd(FunctionalState NewState); +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); +void RCC_RTCCLKCmd(FunctionalState NewState); +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks); +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); + +#ifdef STM32F10X_CL +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +#endif /* STM32F10X_CL */ + +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); +void RCC_BackupResetCmd(FunctionalState NewState); +void RCC_ClockSecuritySystemCmd(FunctionalState NewState); +void RCC_MCOConfig(uint8_t RCC_MCO); +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); +void RCC_ClearFlag(void); +ITStatus RCC_GetITStatus(uint8_t RCC_IT); +void RCC_ClearITPendingBit(uint8_t RCC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_RCC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h new file mode 100644 index 0000000..1c76d58 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h @@ -0,0 +1,134 @@ +/** + ****************************************************************************** + * @file stm32f10x_rtc.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the RTC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_RTC_H +#define __STM32F10x_RTC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup RTC + * @{ + */ + +/** @defgroup RTC_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Exported_Constants + * @{ + */ + +/** @defgroup RTC_interrupts_define + * @{ + */ + +#define RTC_IT_OW ((uint16_t)0x0004) /*!< Overflow interrupt */ +#define RTC_IT_ALR ((uint16_t)0x0002) /*!< Alarm interrupt */ +#define RTC_IT_SEC ((uint16_t)0x0001) /*!< Second interrupt */ +#define IS_RTC_IT(IT) ((((IT) & (uint16_t)0xFFF8) == 0x00) && ((IT) != 0x00)) +#define IS_RTC_GET_IT(IT) (((IT) == RTC_IT_OW) || ((IT) == RTC_IT_ALR) || \ + ((IT) == RTC_IT_SEC)) +/** + * @} + */ + +/** @defgroup RTC_interrupts_flags + * @{ + */ + +#define RTC_FLAG_RTOFF ((uint16_t)0x0020) /*!< RTC Operation OFF flag */ +#define RTC_FLAG_RSF ((uint16_t)0x0008) /*!< Registers Synchronized flag */ +#define RTC_FLAG_OW ((uint16_t)0x0004) /*!< Overflow flag */ +#define RTC_FLAG_ALR ((uint16_t)0x0002) /*!< Alarm flag */ +#define RTC_FLAG_SEC ((uint16_t)0x0001) /*!< Second flag */ +#define IS_RTC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFFF0) == 0x00) && ((FLAG) != 0x00)) +#define IS_RTC_GET_FLAG(FLAG) (((FLAG) == RTC_FLAG_RTOFF) || ((FLAG) == RTC_FLAG_RSF) || \ + ((FLAG) == RTC_FLAG_OW) || ((FLAG) == RTC_FLAG_ALR) || \ + ((FLAG) == RTC_FLAG_SEC)) +#define IS_RTC_PRESCALER(PRESCALER) ((PRESCALER) <= 0xFFFFF) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup RTC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Exported_Functions + * @{ + */ + +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState); +void RTC_EnterConfigMode(void); +void RTC_ExitConfigMode(void); +uint32_t RTC_GetCounter(void); +void RTC_SetCounter(uint32_t CounterValue); +void RTC_SetPrescaler(uint32_t PrescalerValue); +void RTC_SetAlarm(uint32_t AlarmValue); +uint32_t RTC_GetDivider(void); +void RTC_WaitForLastTask(void); +void RTC_WaitForSynchro(void); +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG); +void RTC_ClearFlag(uint16_t RTC_FLAG); +ITStatus RTC_GetITStatus(uint16_t RTC_IT); +void RTC_ClearITPendingBit(uint16_t RTC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_RTC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h new file mode 100644 index 0000000..76736ba --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h @@ -0,0 +1,530 @@ +/** + ****************************************************************************** + * @file stm32f10x_sdio.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the SDIO firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_SDIO_H +#define __STM32F10x_SDIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SDIO + * @{ + */ + +/** @defgroup SDIO_Exported_Types + * @{ + */ + +typedef struct +{ + uint32_t SDIO_ClockEdge; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref SDIO_Clock_Edge */ + + uint32_t SDIO_ClockBypass; /*!< Specifies whether the SDIO Clock divider bypass is + enabled or disabled. + This parameter can be a value of @ref SDIO_Clock_Bypass */ + + uint32_t SDIO_ClockPowerSave; /*!< Specifies whether SDIO Clock output is enabled or + disabled when the bus is idle. + This parameter can be a value of @ref SDIO_Clock_Power_Save */ + + uint32_t SDIO_BusWide; /*!< Specifies the SDIO bus width. + This parameter can be a value of @ref SDIO_Bus_Wide */ + + uint32_t SDIO_HardwareFlowControl; /*!< Specifies whether the SDIO hardware flow control is enabled or disabled. + This parameter can be a value of @ref SDIO_Hardware_Flow_Control */ + + uint8_t SDIO_ClockDiv; /*!< Specifies the clock frequency of the SDIO controller. + This parameter can be a value between 0x00 and 0xFF. */ + +} SDIO_InitTypeDef; + +typedef struct +{ + uint32_t SDIO_Argument; /*!< Specifies the SDIO command argument which is sent + to a card as part of a command message. If a command + contains an argument, it must be loaded into this register + before writing the command to the command register */ + + uint32_t SDIO_CmdIndex; /*!< Specifies the SDIO command index. It must be lower than 0x40. */ + + uint32_t SDIO_Response; /*!< Specifies the SDIO response type. + This parameter can be a value of @ref SDIO_Response_Type */ + + uint32_t SDIO_Wait; /*!< Specifies whether SDIO wait-for-interrupt request is enabled or disabled. + This parameter can be a value of @ref SDIO_Wait_Interrupt_State */ + + uint32_t SDIO_CPSM; /*!< Specifies whether SDIO Command path state machine (CPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_CPSM_State */ +} SDIO_CmdInitTypeDef; + +typedef struct +{ + uint32_t SDIO_DataTimeOut; /*!< Specifies the data timeout period in card bus clock periods. */ + + uint32_t SDIO_DataLength; /*!< Specifies the number of data bytes to be transferred. */ + + uint32_t SDIO_DataBlockSize; /*!< Specifies the data block size for block transfer. + This parameter can be a value of @ref SDIO_Data_Block_Size */ + + uint32_t SDIO_TransferDir; /*!< Specifies the data transfer direction, whether the transfer + is a read or write. + This parameter can be a value of @ref SDIO_Transfer_Direction */ + + uint32_t SDIO_TransferMode; /*!< Specifies whether data transfer is in stream or block mode. + This parameter can be a value of @ref SDIO_Transfer_Type */ + + uint32_t SDIO_DPSM; /*!< Specifies whether SDIO Data path state machine (DPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_DPSM_State */ +} SDIO_DataInitTypeDef; + +/** + * @} + */ + +/** @defgroup SDIO_Exported_Constants + * @{ + */ + +/** @defgroup SDIO_Clock_Edge + * @{ + */ + +#define SDIO_ClockEdge_Rising ((uint32_t)0x00000000) +#define SDIO_ClockEdge_Falling ((uint32_t)0x00002000) +#define IS_SDIO_CLOCK_EDGE(EDGE) (((EDGE) == SDIO_ClockEdge_Rising) || \ + ((EDGE) == SDIO_ClockEdge_Falling)) +/** + * @} + */ + +/** @defgroup SDIO_Clock_Bypass + * @{ + */ + +#define SDIO_ClockBypass_Disable ((uint32_t)0x00000000) +#define SDIO_ClockBypass_Enable ((uint32_t)0x00000400) +#define IS_SDIO_CLOCK_BYPASS(BYPASS) (((BYPASS) == SDIO_ClockBypass_Disable) || \ + ((BYPASS) == SDIO_ClockBypass_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Clock_Power_Save + * @{ + */ + +#define SDIO_ClockPowerSave_Disable ((uint32_t)0x00000000) +#define SDIO_ClockPowerSave_Enable ((uint32_t)0x00000200) +#define IS_SDIO_CLOCK_POWER_SAVE(SAVE) (((SAVE) == SDIO_ClockPowerSave_Disable) || \ + ((SAVE) == SDIO_ClockPowerSave_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Bus_Wide + * @{ + */ + +#define SDIO_BusWide_1b ((uint32_t)0x00000000) +#define SDIO_BusWide_4b ((uint32_t)0x00000800) +#define SDIO_BusWide_8b ((uint32_t)0x00001000) +#define IS_SDIO_BUS_WIDE(WIDE) (((WIDE) == SDIO_BusWide_1b) || ((WIDE) == SDIO_BusWide_4b) || \ + ((WIDE) == SDIO_BusWide_8b)) + +/** + * @} + */ + +/** @defgroup SDIO_Hardware_Flow_Control + * @{ + */ + +#define SDIO_HardwareFlowControl_Disable ((uint32_t)0x00000000) +#define SDIO_HardwareFlowControl_Enable ((uint32_t)0x00004000) +#define IS_SDIO_HARDWARE_FLOW_CONTROL(CONTROL) (((CONTROL) == SDIO_HardwareFlowControl_Disable) || \ + ((CONTROL) == SDIO_HardwareFlowControl_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Power_State + * @{ + */ + +#define SDIO_PowerState_OFF ((uint32_t)0x00000000) +#define SDIO_PowerState_ON ((uint32_t)0x00000003) +#define IS_SDIO_POWER_STATE(STATE) (((STATE) == SDIO_PowerState_OFF) || ((STATE) == SDIO_PowerState_ON)) +/** + * @} + */ + + +/** @defgroup SDIO_Interrupt_soucres + * @{ + */ + +#define SDIO_IT_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_IT_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_IT_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_IT_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_IT_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_IT_RXOVERR ((uint32_t)0x00000020) +#define SDIO_IT_CMDREND ((uint32_t)0x00000040) +#define SDIO_IT_CMDSENT ((uint32_t)0x00000080) +#define SDIO_IT_DATAEND ((uint32_t)0x00000100) +#define SDIO_IT_STBITERR ((uint32_t)0x00000200) +#define SDIO_IT_DBCKEND ((uint32_t)0x00000400) +#define SDIO_IT_CMDACT ((uint32_t)0x00000800) +#define SDIO_IT_TXACT ((uint32_t)0x00001000) +#define SDIO_IT_RXACT ((uint32_t)0x00002000) +#define SDIO_IT_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_IT_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_IT_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_IT_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_IT_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_IT_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_IT_TXDAVL ((uint32_t)0x00100000) +#define SDIO_IT_RXDAVL ((uint32_t)0x00200000) +#define SDIO_IT_SDIOIT ((uint32_t)0x00400000) +#define SDIO_IT_CEATAEND ((uint32_t)0x00800000) +#define IS_SDIO_IT(IT) ((((IT) & (uint32_t)0xFF000000) == 0x00) && ((IT) != (uint32_t)0x00)) +/** + * @} + */ + +/** @defgroup SDIO_Command_Index + * @{ + */ + +#define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40) +/** + * @} + */ + +/** @defgroup SDIO_Response_Type + * @{ + */ + +#define SDIO_Response_No ((uint32_t)0x00000000) +#define SDIO_Response_Short ((uint32_t)0x00000040) +#define SDIO_Response_Long ((uint32_t)0x000000C0) +#define IS_SDIO_RESPONSE(RESPONSE) (((RESPONSE) == SDIO_Response_No) || \ + ((RESPONSE) == SDIO_Response_Short) || \ + ((RESPONSE) == SDIO_Response_Long)) +/** + * @} + */ + +/** @defgroup SDIO_Wait_Interrupt_State + * @{ + */ + +#define SDIO_Wait_No ((uint32_t)0x00000000) /*!< SDIO No Wait, TimeOut is enabled */ +#define SDIO_Wait_IT ((uint32_t)0x00000100) /*!< SDIO Wait Interrupt Request */ +#define SDIO_Wait_Pend ((uint32_t)0x00000200) /*!< SDIO Wait End of transfer */ +#define IS_SDIO_WAIT(WAIT) (((WAIT) == SDIO_Wait_No) || ((WAIT) == SDIO_Wait_IT) || \ + ((WAIT) == SDIO_Wait_Pend)) +/** + * @} + */ + +/** @defgroup SDIO_CPSM_State + * @{ + */ + +#define SDIO_CPSM_Disable ((uint32_t)0x00000000) +#define SDIO_CPSM_Enable ((uint32_t)0x00000400) +#define IS_SDIO_CPSM(CPSM) (((CPSM) == SDIO_CPSM_Enable) || ((CPSM) == SDIO_CPSM_Disable)) +/** + * @} + */ + +/** @defgroup SDIO_Response_Registers + * @{ + */ + +#define SDIO_RESP1 ((uint32_t)0x00000000) +#define SDIO_RESP2 ((uint32_t)0x00000004) +#define SDIO_RESP3 ((uint32_t)0x00000008) +#define SDIO_RESP4 ((uint32_t)0x0000000C) +#define IS_SDIO_RESP(RESP) (((RESP) == SDIO_RESP1) || ((RESP) == SDIO_RESP2) || \ + ((RESP) == SDIO_RESP3) || ((RESP) == SDIO_RESP4)) +/** + * @} + */ + +/** @defgroup SDIO_Data_Length + * @{ + */ + +#define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <= 0x01FFFFFF) +/** + * @} + */ + +/** @defgroup SDIO_Data_Block_Size + * @{ + */ + +#define SDIO_DataBlockSize_1b ((uint32_t)0x00000000) +#define SDIO_DataBlockSize_2b ((uint32_t)0x00000010) +#define SDIO_DataBlockSize_4b ((uint32_t)0x00000020) +#define SDIO_DataBlockSize_8b ((uint32_t)0x00000030) +#define SDIO_DataBlockSize_16b ((uint32_t)0x00000040) +#define SDIO_DataBlockSize_32b ((uint32_t)0x00000050) +#define SDIO_DataBlockSize_64b ((uint32_t)0x00000060) +#define SDIO_DataBlockSize_128b ((uint32_t)0x00000070) +#define SDIO_DataBlockSize_256b ((uint32_t)0x00000080) +#define SDIO_DataBlockSize_512b ((uint32_t)0x00000090) +#define SDIO_DataBlockSize_1024b ((uint32_t)0x000000A0) +#define SDIO_DataBlockSize_2048b ((uint32_t)0x000000B0) +#define SDIO_DataBlockSize_4096b ((uint32_t)0x000000C0) +#define SDIO_DataBlockSize_8192b ((uint32_t)0x000000D0) +#define SDIO_DataBlockSize_16384b ((uint32_t)0x000000E0) +#define IS_SDIO_BLOCK_SIZE(SIZE) (((SIZE) == SDIO_DataBlockSize_1b) || \ + ((SIZE) == SDIO_DataBlockSize_2b) || \ + ((SIZE) == SDIO_DataBlockSize_4b) || \ + ((SIZE) == SDIO_DataBlockSize_8b) || \ + ((SIZE) == SDIO_DataBlockSize_16b) || \ + ((SIZE) == SDIO_DataBlockSize_32b) || \ + ((SIZE) == SDIO_DataBlockSize_64b) || \ + ((SIZE) == SDIO_DataBlockSize_128b) || \ + ((SIZE) == SDIO_DataBlockSize_256b) || \ + ((SIZE) == SDIO_DataBlockSize_512b) || \ + ((SIZE) == SDIO_DataBlockSize_1024b) || \ + ((SIZE) == SDIO_DataBlockSize_2048b) || \ + ((SIZE) == SDIO_DataBlockSize_4096b) || \ + ((SIZE) == SDIO_DataBlockSize_8192b) || \ + ((SIZE) == SDIO_DataBlockSize_16384b)) +/** + * @} + */ + +/** @defgroup SDIO_Transfer_Direction + * @{ + */ + +#define SDIO_TransferDir_ToCard ((uint32_t)0x00000000) +#define SDIO_TransferDir_ToSDIO ((uint32_t)0x00000002) +#define IS_SDIO_TRANSFER_DIR(DIR) (((DIR) == SDIO_TransferDir_ToCard) || \ + ((DIR) == SDIO_TransferDir_ToSDIO)) +/** + * @} + */ + +/** @defgroup SDIO_Transfer_Type + * @{ + */ + +#define SDIO_TransferMode_Block ((uint32_t)0x00000000) +#define SDIO_TransferMode_Stream ((uint32_t)0x00000004) +#define IS_SDIO_TRANSFER_MODE(MODE) (((MODE) == SDIO_TransferMode_Stream) || \ + ((MODE) == SDIO_TransferMode_Block)) +/** + * @} + */ + +/** @defgroup SDIO_DPSM_State + * @{ + */ + +#define SDIO_DPSM_Disable ((uint32_t)0x00000000) +#define SDIO_DPSM_Enable ((uint32_t)0x00000001) +#define IS_SDIO_DPSM(DPSM) (((DPSM) == SDIO_DPSM_Enable) || ((DPSM) == SDIO_DPSM_Disable)) +/** + * @} + */ + +/** @defgroup SDIO_Flags + * @{ + */ + +#define SDIO_FLAG_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_FLAG_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_FLAG_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_FLAG_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_FLAG_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_FLAG_RXOVERR ((uint32_t)0x00000020) +#define SDIO_FLAG_CMDREND ((uint32_t)0x00000040) +#define SDIO_FLAG_CMDSENT ((uint32_t)0x00000080) +#define SDIO_FLAG_DATAEND ((uint32_t)0x00000100) +#define SDIO_FLAG_STBITERR ((uint32_t)0x00000200) +#define SDIO_FLAG_DBCKEND ((uint32_t)0x00000400) +#define SDIO_FLAG_CMDACT ((uint32_t)0x00000800) +#define SDIO_FLAG_TXACT ((uint32_t)0x00001000) +#define SDIO_FLAG_RXACT ((uint32_t)0x00002000) +#define SDIO_FLAG_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_FLAG_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_FLAG_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_FLAG_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_FLAG_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_FLAG_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_FLAG_TXDAVL ((uint32_t)0x00100000) +#define SDIO_FLAG_RXDAVL ((uint32_t)0x00200000) +#define SDIO_FLAG_SDIOIT ((uint32_t)0x00400000) +#define SDIO_FLAG_CEATAEND ((uint32_t)0x00800000) +#define IS_SDIO_FLAG(FLAG) (((FLAG) == SDIO_FLAG_CCRCFAIL) || \ + ((FLAG) == SDIO_FLAG_DCRCFAIL) || \ + ((FLAG) == SDIO_FLAG_CTIMEOUT) || \ + ((FLAG) == SDIO_FLAG_DTIMEOUT) || \ + ((FLAG) == SDIO_FLAG_TXUNDERR) || \ + ((FLAG) == SDIO_FLAG_RXOVERR) || \ + ((FLAG) == SDIO_FLAG_CMDREND) || \ + ((FLAG) == SDIO_FLAG_CMDSENT) || \ + ((FLAG) == SDIO_FLAG_DATAEND) || \ + ((FLAG) == SDIO_FLAG_STBITERR) || \ + ((FLAG) == SDIO_FLAG_DBCKEND) || \ + ((FLAG) == SDIO_FLAG_CMDACT) || \ + ((FLAG) == SDIO_FLAG_TXACT) || \ + ((FLAG) == SDIO_FLAG_RXACT) || \ + ((FLAG) == SDIO_FLAG_TXFIFOHE) || \ + ((FLAG) == SDIO_FLAG_RXFIFOHF) || \ + ((FLAG) == SDIO_FLAG_TXFIFOF) || \ + ((FLAG) == SDIO_FLAG_RXFIFOF) || \ + ((FLAG) == SDIO_FLAG_TXFIFOE) || \ + ((FLAG) == SDIO_FLAG_RXFIFOE) || \ + ((FLAG) == SDIO_FLAG_TXDAVL) || \ + ((FLAG) == SDIO_FLAG_RXDAVL) || \ + ((FLAG) == SDIO_FLAG_SDIOIT) || \ + ((FLAG) == SDIO_FLAG_CEATAEND)) + +#define IS_SDIO_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFF3FF800) == 0x00) && ((FLAG) != (uint32_t)0x00)) + +#define IS_SDIO_GET_IT(IT) (((IT) == SDIO_IT_CCRCFAIL) || \ + ((IT) == SDIO_IT_DCRCFAIL) || \ + ((IT) == SDIO_IT_CTIMEOUT) || \ + ((IT) == SDIO_IT_DTIMEOUT) || \ + ((IT) == SDIO_IT_TXUNDERR) || \ + ((IT) == SDIO_IT_RXOVERR) || \ + ((IT) == SDIO_IT_CMDREND) || \ + ((IT) == SDIO_IT_CMDSENT) || \ + ((IT) == SDIO_IT_DATAEND) || \ + ((IT) == SDIO_IT_STBITERR) || \ + ((IT) == SDIO_IT_DBCKEND) || \ + ((IT) == SDIO_IT_CMDACT) || \ + ((IT) == SDIO_IT_TXACT) || \ + ((IT) == SDIO_IT_RXACT) || \ + ((IT) == SDIO_IT_TXFIFOHE) || \ + ((IT) == SDIO_IT_RXFIFOHF) || \ + ((IT) == SDIO_IT_TXFIFOF) || \ + ((IT) == SDIO_IT_RXFIFOF) || \ + ((IT) == SDIO_IT_TXFIFOE) || \ + ((IT) == SDIO_IT_RXFIFOE) || \ + ((IT) == SDIO_IT_TXDAVL) || \ + ((IT) == SDIO_IT_RXDAVL) || \ + ((IT) == SDIO_IT_SDIOIT) || \ + ((IT) == SDIO_IT_CEATAEND)) + +#define IS_SDIO_CLEAR_IT(IT) ((((IT) & (uint32_t)0xFF3FF800) == 0x00) && ((IT) != (uint32_t)0x00)) + +/** + * @} + */ + +/** @defgroup SDIO_Read_Wait_Mode + * @{ + */ + +#define SDIO_ReadWaitMode_CLK ((uint32_t)0x00000000) +#define SDIO_ReadWaitMode_DATA2 ((uint32_t)0x00000001) +#define IS_SDIO_READWAIT_MODE(MODE) (((MODE) == SDIO_ReadWaitMode_CLK) || \ + ((MODE) == SDIO_ReadWaitMode_DATA2)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup SDIO_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Exported_Functions + * @{ + */ + +void SDIO_DeInit(void); +void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_ClockCmd(FunctionalState NewState); +void SDIO_SetPowerState(uint32_t SDIO_PowerState); +uint32_t SDIO_GetPowerState(void); +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState); +void SDIO_DMACmd(FunctionalState NewState); +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct); +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct); +uint8_t SDIO_GetCommandResponse(void); +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP); +void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +uint32_t SDIO_GetDataCounter(void); +uint32_t SDIO_ReadData(void); +void SDIO_WriteData(uint32_t Data); +uint32_t SDIO_GetFIFOCount(void); +void SDIO_StartSDIOReadWait(FunctionalState NewState); +void SDIO_StopSDIOReadWait(FunctionalState NewState); +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); +void SDIO_SetSDIOOperation(FunctionalState NewState); +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState); +void SDIO_CommandCompletionCmd(FunctionalState NewState); +void SDIO_CEATAITCmd(FunctionalState NewState); +void SDIO_SendCEATACmd(FunctionalState NewState); +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG); +void SDIO_ClearFlag(uint32_t SDIO_FLAG); +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT); +void SDIO_ClearITPendingBit(uint32_t SDIO_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_SDIO_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h new file mode 100644 index 0000000..36fd845 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h @@ -0,0 +1,490 @@ +/** + ****************************************************************************** + * @file stm32f10x_spi.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the SPI firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_SPI_H +#define __STM32F10x_SPI_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SPI + * @{ + */ + +/** @defgroup SPI_Exported_Types + * @{ + */ + +/** + * @brief SPI Init structure definition + */ + +typedef struct +{ + uint16_t SPI_Direction; /*!< Specifies the SPI unidirectional or bidirectional data mode. + This parameter can be any combination of @ref SPI_data_direction */ + + uint16_t SPI_Mode; /*!< Specifies the SPI operating mode. + This parameter can be any combination of @ref SPI_mode */ + + uint16_t SPI_DataSize; /*!< Specifies the SPI data size. + This parameter can be any combination of @ref SPI_data_size */ + + uint16_t SPI_CPOL; /*!< Specifies the serial clock steady state. + This parameter can be any combination of @ref SPI_Clock_Polarity */ + + uint16_t SPI_CPHA; /*!< Specifies the clock active edge for the bit capture. + This parameter can be any combination of @ref SPI_Clock_Phase */ + + uint16_t SPI_NSS; /*!< Specifies whether the NSS signal is managed by + hardware (NSS pin) or by software using the SSI bit. + This parameter can be any combination of @ref SPI_Slave_Select_management */ + + uint16_t SPI_BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be + used to configure the transmit and receive SCK clock. + This parameter can be any combination of @ref SPI_BaudRate_Prescaler. + @note The communication clock is derived from the master + clock. The slave clock does not need to be set. */ + + uint16_t SPI_FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. + This parameter can be any combination of @ref SPI_MSB_LSB_transmission */ + + uint16_t SPI_CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. */ +}SPI_InitTypeDef; + +/** + * @brief I2S Init structure definition + */ + +typedef struct +{ + + uint16_t I2S_Mode; /*!< Specifies the I2S operating mode. + This parameter can be any combination of @ref I2S_Mode */ + + uint16_t I2S_Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be any combination of @ref I2S_Standard */ + + uint16_t I2S_DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be any combination of @ref I2S_Data_Format */ + + uint16_t I2S_MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. + This parameter can be any combination of @ref I2S_MCLK_Output */ + + uint32_t I2S_AudioFreq; /*!< Specifies the frequency selected for the I2S communication. + This parameter can be any combination of @ref I2S_Audio_Frequency */ + + uint16_t I2S_CPOL; /*!< Specifies the idle state of the I2S clock. + This parameter can be any combination of @ref I2S_Clock_Polarity */ +}I2S_InitTypeDef; + +/** + * @} + */ + +/** @defgroup SPI_Exported_Constants + * @{ + */ + +#define IS_SPI_ALL_PERIPH(PERIPH) (((PERIPH) == SPI1) || \ + ((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3)) + +#define IS_SPI_23_PERIPH(PERIPH) (((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3)) + +/** @defgroup SPI_data_direction + * @{ + */ + +#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000) +#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400) +#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) +#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) +#define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_Direction_2Lines_FullDuplex) || \ + ((MODE) == SPI_Direction_2Lines_RxOnly) || \ + ((MODE) == SPI_Direction_1Line_Rx) || \ + ((MODE) == SPI_Direction_1Line_Tx)) +/** + * @} + */ + +/** @defgroup SPI_mode + * @{ + */ + +#define SPI_Mode_Master ((uint16_t)0x0104) +#define SPI_Mode_Slave ((uint16_t)0x0000) +#define IS_SPI_MODE(MODE) (((MODE) == SPI_Mode_Master) || \ + ((MODE) == SPI_Mode_Slave)) +/** + * @} + */ + +/** @defgroup SPI_data_size + * @{ + */ + +#define SPI_DataSize_16b ((uint16_t)0x0800) +#define SPI_DataSize_8b ((uint16_t)0x0000) +#define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_DataSize_16b) || \ + ((DATASIZE) == SPI_DataSize_8b)) +/** + * @} + */ + +/** @defgroup SPI_Clock_Polarity + * @{ + */ + +#define SPI_CPOL_Low ((uint16_t)0x0000) +#define SPI_CPOL_High ((uint16_t)0x0002) +#define IS_SPI_CPOL(CPOL) (((CPOL) == SPI_CPOL_Low) || \ + ((CPOL) == SPI_CPOL_High)) +/** + * @} + */ + +/** @defgroup SPI_Clock_Phase + * @{ + */ + +#define SPI_CPHA_1Edge ((uint16_t)0x0000) +#define SPI_CPHA_2Edge ((uint16_t)0x0001) +#define IS_SPI_CPHA(CPHA) (((CPHA) == SPI_CPHA_1Edge) || \ + ((CPHA) == SPI_CPHA_2Edge)) +/** + * @} + */ + +/** @defgroup SPI_Slave_Select_management + * @{ + */ + +#define SPI_NSS_Soft ((uint16_t)0x0200) +#define SPI_NSS_Hard ((uint16_t)0x0000) +#define IS_SPI_NSS(NSS) (((NSS) == SPI_NSS_Soft) || \ + ((NSS) == SPI_NSS_Hard)) +/** + * @} + */ + +/** @defgroup SPI_BaudRate_Prescaler + * @{ + */ + +#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) +#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) +#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) +#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) +#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) +#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) +#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) +#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) +#define IS_SPI_BAUDRATE_PRESCALER(PRESCALER) (((PRESCALER) == SPI_BaudRatePrescaler_2) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_4) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_8) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_16) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_32) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_64) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_128) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_256)) +/** + * @} + */ + +/** @defgroup SPI_MSB_LSB_transmission + * @{ + */ + +#define SPI_FirstBit_MSB ((uint16_t)0x0000) +#define SPI_FirstBit_LSB ((uint16_t)0x0080) +#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FirstBit_MSB) || \ + ((BIT) == SPI_FirstBit_LSB)) +/** + * @} + */ + +/** @defgroup I2S_Mode + * @{ + */ + +#define I2S_Mode_SlaveTx ((uint16_t)0x0000) +#define I2S_Mode_SlaveRx ((uint16_t)0x0100) +#define I2S_Mode_MasterTx ((uint16_t)0x0200) +#define I2S_Mode_MasterRx ((uint16_t)0x0300) +#define IS_I2S_MODE(MODE) (((MODE) == I2S_Mode_SlaveTx) || \ + ((MODE) == I2S_Mode_SlaveRx) || \ + ((MODE) == I2S_Mode_MasterTx) || \ + ((MODE) == I2S_Mode_MasterRx) ) +/** + * @} + */ + +/** @defgroup I2S_Standard + * @{ + */ + +#define I2S_Standard_Phillips ((uint16_t)0x0000) +#define I2S_Standard_MSB ((uint16_t)0x0010) +#define I2S_Standard_LSB ((uint16_t)0x0020) +#define I2S_Standard_PCMShort ((uint16_t)0x0030) +#define I2S_Standard_PCMLong ((uint16_t)0x00B0) +#define IS_I2S_STANDARD(STANDARD) (((STANDARD) == I2S_Standard_Phillips) || \ + ((STANDARD) == I2S_Standard_MSB) || \ + ((STANDARD) == I2S_Standard_LSB) || \ + ((STANDARD) == I2S_Standard_PCMShort) || \ + ((STANDARD) == I2S_Standard_PCMLong)) +/** + * @} + */ + +/** @defgroup I2S_Data_Format + * @{ + */ + +#define I2S_DataFormat_16b ((uint16_t)0x0000) +#define I2S_DataFormat_16bextended ((uint16_t)0x0001) +#define I2S_DataFormat_24b ((uint16_t)0x0003) +#define I2S_DataFormat_32b ((uint16_t)0x0005) +#define IS_I2S_DATA_FORMAT(FORMAT) (((FORMAT) == I2S_DataFormat_16b) || \ + ((FORMAT) == I2S_DataFormat_16bextended) || \ + ((FORMAT) == I2S_DataFormat_24b) || \ + ((FORMAT) == I2S_DataFormat_32b)) +/** + * @} + */ + +/** @defgroup I2S_MCLK_Output + * @{ + */ + +#define I2S_MCLKOutput_Enable ((uint16_t)0x0200) +#define I2S_MCLKOutput_Disable ((uint16_t)0x0000) +#define IS_I2S_MCLK_OUTPUT(OUTPUT) (((OUTPUT) == I2S_MCLKOutput_Enable) || \ + ((OUTPUT) == I2S_MCLKOutput_Disable)) +/** + * @} + */ + +/** @defgroup I2S_Audio_Frequency + * @{ + */ + +#define I2S_AudioFreq_96k ((uint32_t)96000) +#define I2S_AudioFreq_48k ((uint32_t)48000) +#define I2S_AudioFreq_44k ((uint32_t)44100) +#define I2S_AudioFreq_32k ((uint32_t)32000) +#define I2S_AudioFreq_22k ((uint32_t)22050) +#define I2S_AudioFreq_16k ((uint32_t)16000) +#define I2S_AudioFreq_11k ((uint32_t)11025) +#define I2S_AudioFreq_8k ((uint32_t)8000) +#define I2S_AudioFreq_Default ((uint32_t)2) +#define IS_I2S_AUDIO_FREQ(FREQ) (((FREQ) == I2S_AudioFreq_96k) || \ + ((FREQ) == I2S_AudioFreq_48k) || \ + ((FREQ) == I2S_AudioFreq_44k) || \ + ((FREQ) == I2S_AudioFreq_32k) || \ + ((FREQ) == I2S_AudioFreq_22k) || \ + ((FREQ) == I2S_AudioFreq_16k) || \ + ((FREQ) == I2S_AudioFreq_11k) || \ + ((FREQ) == I2S_AudioFreq_8k) || \ + ((FREQ) == I2S_AudioFreq_Default)) +/** + * @} + */ + +/** @defgroup I2S_Clock_Polarity + * @{ + */ + +#define I2S_CPOL_Low ((uint16_t)0x0000) +#define I2S_CPOL_High ((uint16_t)0x0008) +#define IS_I2S_CPOL(CPOL) (((CPOL) == I2S_CPOL_Low) || \ + ((CPOL) == I2S_CPOL_High)) +/** + * @} + */ + +/** @defgroup SPI_I2S_DMA_transfer_requests + * @{ + */ + +#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002) +#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001) +#define IS_SPI_I2S_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFFFC) == 0x00) && ((DMAREQ) != 0x00)) +/** + * @} + */ + +/** @defgroup SPI_NSS_internal_software_mangement + * @{ + */ + +#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100) +#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF) +#define IS_SPI_NSS_INTERNAL(INTERNAL) (((INTERNAL) == SPI_NSSInternalSoft_Set) || \ + ((INTERNAL) == SPI_NSSInternalSoft_Reset)) +/** + * @} + */ + +/** @defgroup SPI_CRC_Transmit_Receive + * @{ + */ + +#define SPI_CRC_Tx ((uint8_t)0x00) +#define SPI_CRC_Rx ((uint8_t)0x01) +#define IS_SPI_CRC(CRC) (((CRC) == SPI_CRC_Tx) || ((CRC) == SPI_CRC_Rx)) +/** + * @} + */ + +/** @defgroup SPI_direction_transmit_receive + * @{ + */ + +#define SPI_Direction_Rx ((uint16_t)0xBFFF) +#define SPI_Direction_Tx ((uint16_t)0x4000) +#define IS_SPI_DIRECTION(DIRECTION) (((DIRECTION) == SPI_Direction_Rx) || \ + ((DIRECTION) == SPI_Direction_Tx)) +/** + * @} + */ + +/** @defgroup SPI_I2S_interrupts_definition + * @{ + */ + +#define SPI_I2S_IT_TXE ((uint8_t)0x71) +#define SPI_I2S_IT_RXNE ((uint8_t)0x60) +#define SPI_I2S_IT_ERR ((uint8_t)0x50) +#define IS_SPI_I2S_CONFIG_IT(IT) (((IT) == SPI_I2S_IT_TXE) || \ + ((IT) == SPI_I2S_IT_RXNE) || \ + ((IT) == SPI_I2S_IT_ERR)) +#define SPI_I2S_IT_OVR ((uint8_t)0x56) +#define SPI_IT_MODF ((uint8_t)0x55) +#define SPI_IT_CRCERR ((uint8_t)0x54) +#define I2S_IT_UDR ((uint8_t)0x53) +#define IS_SPI_I2S_CLEAR_IT(IT) (((IT) == SPI_IT_CRCERR)) +#define IS_SPI_I2S_GET_IT(IT) (((IT) == SPI_I2S_IT_RXNE) || ((IT) == SPI_I2S_IT_TXE) || \ + ((IT) == I2S_IT_UDR) || ((IT) == SPI_IT_CRCERR) || \ + ((IT) == SPI_IT_MODF) || ((IT) == SPI_I2S_IT_OVR)) +/** + * @} + */ + +/** @defgroup SPI_I2S_flags_definition + * @{ + */ + +#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001) +#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002) +#define I2S_FLAG_CHSIDE ((uint16_t)0x0004) +#define I2S_FLAG_UDR ((uint16_t)0x0008) +#define SPI_FLAG_CRCERR ((uint16_t)0x0010) +#define SPI_FLAG_MODF ((uint16_t)0x0020) +#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040) +#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080) +#define IS_SPI_I2S_CLEAR_FLAG(FLAG) (((FLAG) == SPI_FLAG_CRCERR)) +#define IS_SPI_I2S_GET_FLAG(FLAG) (((FLAG) == SPI_I2S_FLAG_BSY) || ((FLAG) == SPI_I2S_FLAG_OVR) || \ + ((FLAG) == SPI_FLAG_MODF) || ((FLAG) == SPI_FLAG_CRCERR) || \ + ((FLAG) == I2S_FLAG_UDR) || ((FLAG) == I2S_FLAG_CHSIDE) || \ + ((FLAG) == SPI_I2S_FLAG_TXE) || ((FLAG) == SPI_I2S_FLAG_RXNE)) +/** + * @} + */ + +/** @defgroup SPI_CRC_polynomial + * @{ + */ + +#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL) ((POLYNOMIAL) >= 0x1) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup SPI_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Exported_Functions + * @{ + */ + +void SPI_I2S_DeInit(SPI_TypeDef* SPIx); +void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); +void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); +void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct); +void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct); +void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); +void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); +void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft); +void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); +void SPI_TransmitCRC(SPI_TypeDef* SPIx); +void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState); +uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC); +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx); +void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction); +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); +void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); +void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_SPI_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h new file mode 100644 index 0000000..6fa30b0 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h @@ -0,0 +1,1040 @@ +/** + ****************************************************************************** + * @file stm32f10x_tim.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the TIM firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_TIM_H +#define __STM32F10x_TIM_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup TIM + * @{ + */ + +/** @defgroup TIM_Exported_Types + * @{ + */ + +/** + * @brief TIM Time Base Init structure definition + * @note This sturcture is used with all TIMx except for TIM6 and TIM7. + */ + +typedef struct +{ + uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_CounterMode; /*!< Specifies the counter mode. + This parameter can be a value of @ref TIM_Counter_Mode */ + + uint16_t TIM_Period; /*!< Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter must be a number between 0x0000 and 0xFFFF. */ + + uint16_t TIM_ClockDivision; /*!< Specifies the clock division. + This parameter can be a value of @ref TIM_Clock_Division_CKD */ + + uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + This parameter must be a number between 0x00 and 0xFF. + @note This parameter is valid only for TIM1 and TIM8. */ +} TIM_TimeBaseInitTypeDef; + +/** + * @brief TIM Output Compare Init structure definition + */ + +typedef struct +{ + uint16_t TIM_OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint16_t TIM_OutputState; /*!< Specifies the TIM Output Compare state. + This parameter can be a value of @ref TIM_Output_Compare_state */ + + uint16_t TIM_OutputNState; /*!< Specifies the TIM complementary Output Compare state. + This parameter can be a value of @ref TIM_Output_Compare_N_state + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint16_t TIM_OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for TIM1 and TIM8. */ +} TIM_OCInitTypeDef; + +/** + * @brief TIM Input Capture Init structure definition + */ + +typedef struct +{ + + uint16_t TIM_Channel; /*!< Specifies the TIM channel. + This parameter can be a value of @ref TIM_Channel */ + + uint16_t TIM_ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint16_t TIM_ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint16_t TIM_ICPrescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint16_t TIM_ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between 0x0 and 0xF */ +} TIM_ICInitTypeDef; + +/** + * @brief BDTR structure definition + * @note This sturcture is used only with TIM1 and TIM8. + */ + +typedef struct +{ + + uint16_t TIM_OSSRState; /*!< Specifies the Off-State selection used in Run mode. + This parameter can be a value of @ref OSSR_Off_State_Selection_for_Run_mode_state */ + + uint16_t TIM_OSSIState; /*!< Specifies the Off-State used in Idle state. + This parameter can be a value of @ref OSSI_Off_State_Selection_for_Idle_mode_state */ + + uint16_t TIM_LOCKLevel; /*!< Specifies the LOCK level parameters. + This parameter can be a value of @ref Lock_level */ + + uint16_t TIM_DeadTime; /*!< Specifies the delay time between the switching-off and the + switching-on of the outputs. + This parameter can be a number between 0x00 and 0xFF */ + + uint16_t TIM_Break; /*!< Specifies whether the TIM Break input is enabled or not. + This parameter can be a value of @ref Break_Input_enable_disable */ + + uint16_t TIM_BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. + This parameter can be a value of @ref Break_Polarity */ + + uint16_t TIM_AutomaticOutput; /*!< Specifies whether the TIM Automatic Output feature is enabled or not. + This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ +} TIM_BDTRInitTypeDef; + +/** @defgroup TIM_Exported_constants + * @{ + */ + +#define IS_TIM_ALL_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7) || \ + ((PERIPH) == TIM8)) + +#define IS_TIM_18_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM8)) + +#define IS_TIM_123458_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_and_PWM_modes + * @{ + */ + +#define TIM_OCMode_Timing ((uint16_t)0x0000) +#define TIM_OCMode_Active ((uint16_t)0x0010) +#define TIM_OCMode_Inactive ((uint16_t)0x0020) +#define TIM_OCMode_Toggle ((uint16_t)0x0030) +#define TIM_OCMode_PWM1 ((uint16_t)0x0060) +#define TIM_OCMode_PWM2 ((uint16_t)0x0070) +#define IS_TIM_OC_MODE(MODE) (((MODE) == TIM_OCMode_Timing) || \ + ((MODE) == TIM_OCMode_Active) || \ + ((MODE) == TIM_OCMode_Inactive) || \ + ((MODE) == TIM_OCMode_Toggle)|| \ + ((MODE) == TIM_OCMode_PWM1) || \ + ((MODE) == TIM_OCMode_PWM2)) +#define IS_TIM_OCM(MODE) (((MODE) == TIM_OCMode_Timing) || \ + ((MODE) == TIM_OCMode_Active) || \ + ((MODE) == TIM_OCMode_Inactive) || \ + ((MODE) == TIM_OCMode_Toggle)|| \ + ((MODE) == TIM_OCMode_PWM1) || \ + ((MODE) == TIM_OCMode_PWM2) || \ + ((MODE) == TIM_ForcedAction_Active) || \ + ((MODE) == TIM_ForcedAction_InActive)) +/** + * @} + */ + +/** @defgroup TIM_One_Pulse_Mode + * @{ + */ + +#define TIM_OPMode_Single ((uint16_t)0x0008) +#define TIM_OPMode_Repetitive ((uint16_t)0x0000) +#define IS_TIM_OPM_MODE(MODE) (((MODE) == TIM_OPMode_Single) || \ + ((MODE) == TIM_OPMode_Repetitive)) +/** + * @} + */ + +/** @defgroup TIM_Channel + * @{ + */ + +#define TIM_Channel_1 ((uint16_t)0x0000) +#define TIM_Channel_2 ((uint16_t)0x0004) +#define TIM_Channel_3 ((uint16_t)0x0008) +#define TIM_Channel_4 ((uint16_t)0x000C) +#define IS_TIM_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2) || \ + ((CHANNEL) == TIM_Channel_3) || \ + ((CHANNEL) == TIM_Channel_4)) +#define IS_TIM_PWMI_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2)) +#define IS_TIM_COMPLEMENTARY_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2) || \ + ((CHANNEL) == TIM_Channel_3)) +/** + * @} + */ + +/** @defgroup TIM_Clock_Division_CKD + * @{ + */ + +#define TIM_CKD_DIV1 ((uint16_t)0x0000) +#define TIM_CKD_DIV2 ((uint16_t)0x0100) +#define TIM_CKD_DIV4 ((uint16_t)0x0200) +#define IS_TIM_CKD_DIV(DIV) (((DIV) == TIM_CKD_DIV1) || \ + ((DIV) == TIM_CKD_DIV2) || \ + ((DIV) == TIM_CKD_DIV4)) +/** + * @} + */ + +/** @defgroup TIM_Counter_Mode + * @{ + */ + +#define TIM_CounterMode_Up ((uint16_t)0x0000) +#define TIM_CounterMode_Down ((uint16_t)0x0010) +#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) +#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) +#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) +#define IS_TIM_COUNTER_MODE(MODE) (((MODE) == TIM_CounterMode_Up) || \ + ((MODE) == TIM_CounterMode_Down) || \ + ((MODE) == TIM_CounterMode_CenterAligned1) || \ + ((MODE) == TIM_CounterMode_CenterAligned2) || \ + ((MODE) == TIM_CounterMode_CenterAligned3)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Polarity + * @{ + */ + +#define TIM_OCPolarity_High ((uint16_t)0x0000) +#define TIM_OCPolarity_Low ((uint16_t)0x0002) +#define IS_TIM_OC_POLARITY(POLARITY) (((POLARITY) == TIM_OCPolarity_High) || \ + ((POLARITY) == TIM_OCPolarity_Low)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Polarity + * @{ + */ + +#define TIM_OCNPolarity_High ((uint16_t)0x0000) +#define TIM_OCNPolarity_Low ((uint16_t)0x0008) +#define IS_TIM_OCN_POLARITY(POLARITY) (((POLARITY) == TIM_OCNPolarity_High) || \ + ((POLARITY) == TIM_OCNPolarity_Low)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_state + * @{ + */ + +#define TIM_OutputState_Disable ((uint16_t)0x0000) +#define TIM_OutputState_Enable ((uint16_t)0x0001) +#define IS_TIM_OUTPUT_STATE(STATE) (((STATE) == TIM_OutputState_Disable) || \ + ((STATE) == TIM_OutputState_Enable)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_state + * @{ + */ + +#define TIM_OutputNState_Disable ((uint16_t)0x0000) +#define TIM_OutputNState_Enable ((uint16_t)0x0004) +#define IS_TIM_OUTPUTN_STATE(STATE) (((STATE) == TIM_OutputNState_Disable) || \ + ((STATE) == TIM_OutputNState_Enable)) +/** + * @} + */ + +/** @defgroup TIM_Capture_Compare_state + * @{ + */ + +#define TIM_CCx_Enable ((uint16_t)0x0001) +#define TIM_CCx_Disable ((uint16_t)0x0000) +#define IS_TIM_CCX(CCX) (((CCX) == TIM_CCx_Enable) || \ + ((CCX) == TIM_CCx_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Capture_Compare_N_state + * @{ + */ + +#define TIM_CCxN_Enable ((uint16_t)0x0004) +#define TIM_CCxN_Disable ((uint16_t)0x0000) +#define IS_TIM_CCXN(CCXN) (((CCXN) == TIM_CCxN_Enable) || \ + ((CCXN) == TIM_CCxN_Disable)) +/** + * @} + */ + +/** @defgroup Break_Input_enable_disable + * @{ + */ + +#define TIM_Break_Enable ((uint16_t)0x1000) +#define TIM_Break_Disable ((uint16_t)0x0000) +#define IS_TIM_BREAK_STATE(STATE) (((STATE) == TIM_Break_Enable) || \ + ((STATE) == TIM_Break_Disable)) +/** + * @} + */ + +/** @defgroup Break_Polarity + * @{ + */ + +#define TIM_BreakPolarity_Low ((uint16_t)0x0000) +#define TIM_BreakPolarity_High ((uint16_t)0x2000) +#define IS_TIM_BREAK_POLARITY(POLARITY) (((POLARITY) == TIM_BreakPolarity_Low) || \ + ((POLARITY) == TIM_BreakPolarity_High)) +/** + * @} + */ + +/** @defgroup TIM_AOE_Bit_Set_Reset + * @{ + */ + +#define TIM_AutomaticOutput_Enable ((uint16_t)0x4000) +#define TIM_AutomaticOutput_Disable ((uint16_t)0x0000) +#define IS_TIM_AUTOMATIC_OUTPUT_STATE(STATE) (((STATE) == TIM_AutomaticOutput_Enable) || \ + ((STATE) == TIM_AutomaticOutput_Disable)) +/** + * @} + */ + +/** @defgroup Lock_level + * @{ + */ + +#define TIM_LOCKLevel_OFF ((uint16_t)0x0000) +#define TIM_LOCKLevel_1 ((uint16_t)0x0100) +#define TIM_LOCKLevel_2 ((uint16_t)0x0200) +#define TIM_LOCKLevel_3 ((uint16_t)0x0300) +#define IS_TIM_LOCK_LEVEL(LEVEL) (((LEVEL) == TIM_LOCKLevel_OFF) || \ + ((LEVEL) == TIM_LOCKLevel_1) || \ + ((LEVEL) == TIM_LOCKLevel_2) || \ + ((LEVEL) == TIM_LOCKLevel_3)) +/** + * @} + */ + +/** @defgroup OSSI_Off_State_Selection_for_Idle_mode_state + * @{ + */ + +#define TIM_OSSIState_Enable ((uint16_t)0x0400) +#define TIM_OSSIState_Disable ((uint16_t)0x0000) +#define IS_TIM_OSSI_STATE(STATE) (((STATE) == TIM_OSSIState_Enable) || \ + ((STATE) == TIM_OSSIState_Disable)) +/** + * @} + */ + +/** @defgroup OSSR_Off_State_Selection_for_Run_mode_state + * @{ + */ + +#define TIM_OSSRState_Enable ((uint16_t)0x0800) +#define TIM_OSSRState_Disable ((uint16_t)0x0000) +#define IS_TIM_OSSR_STATE(STATE) (((STATE) == TIM_OSSRState_Enable) || \ + ((STATE) == TIM_OSSRState_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Idle_State + * @{ + */ + +#define TIM_OCIdleState_Set ((uint16_t)0x0100) +#define TIM_OCIdleState_Reset ((uint16_t)0x0000) +#define IS_TIM_OCIDLE_STATE(STATE) (((STATE) == TIM_OCIdleState_Set) || \ + ((STATE) == TIM_OCIdleState_Reset)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Idle_State + * @{ + */ + +#define TIM_OCNIdleState_Set ((uint16_t)0x0200) +#define TIM_OCNIdleState_Reset ((uint16_t)0x0000) +#define IS_TIM_OCNIDLE_STATE(STATE) (((STATE) == TIM_OCNIdleState_Set) || \ + ((STATE) == TIM_OCNIdleState_Reset)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Polarity + * @{ + */ + +#define TIM_ICPolarity_Rising ((uint16_t)0x0000) +#define TIM_ICPolarity_Falling ((uint16_t)0x0002) +#define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \ + ((POLARITY) == TIM_ICPolarity_Falling)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Selection + * @{ + */ + +#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC2, IC1, IC4 or IC3, respectively. */ +#define TIM_ICSelection_TRC ((uint16_t)0x0003) /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ +#define IS_TIM_IC_SELECTION(SELECTION) (((SELECTION) == TIM_ICSelection_DirectTI) || \ + ((SELECTION) == TIM_ICSelection_IndirectTI) || \ + ((SELECTION) == TIM_ICSelection_TRC)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Prescaler + * @{ + */ + +#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /*!< Capture performed each time an edge is detected on the capture input. */ +#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /*!< Capture performed once every 2 events. */ +#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /*!< Capture performed once every 4 events. */ +#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /*!< Capture performed once every 8 events. */ +#define IS_TIM_IC_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ICPSC_DIV1) || \ + ((PRESCALER) == TIM_ICPSC_DIV2) || \ + ((PRESCALER) == TIM_ICPSC_DIV4) || \ + ((PRESCALER) == TIM_ICPSC_DIV8)) +/** + * @} + */ + +/** @defgroup TIM_interrupt_sources + * @{ + */ + +#define TIM_IT_Update ((uint16_t)0x0001) +#define TIM_IT_CC1 ((uint16_t)0x0002) +#define TIM_IT_CC2 ((uint16_t)0x0004) +#define TIM_IT_CC3 ((uint16_t)0x0008) +#define TIM_IT_CC4 ((uint16_t)0x0010) +#define TIM_IT_COM ((uint16_t)0x0020) +#define TIM_IT_Trigger ((uint16_t)0x0040) +#define TIM_IT_Break ((uint16_t)0x0080) +#define IS_TIM_IT(IT) ((((IT) & (uint16_t)0xFF00) == 0x0000) && ((IT) != 0x0000)) + +#define IS_TIM_GET_IT(IT) (((IT) == TIM_IT_Update) || \ + ((IT) == TIM_IT_CC1) || \ + ((IT) == TIM_IT_CC2) || \ + ((IT) == TIM_IT_CC3) || \ + ((IT) == TIM_IT_CC4) || \ + ((IT) == TIM_IT_COM) || \ + ((IT) == TIM_IT_Trigger) || \ + ((IT) == TIM_IT_Break)) +/** + * @} + */ + +/** @defgroup TIM_DMA_Base_address + * @{ + */ + +#define TIM_DMABase_CR1 ((uint16_t)0x0000) +#define TIM_DMABase_CR2 ((uint16_t)0x0001) +#define TIM_DMABase_SMCR ((uint16_t)0x0002) +#define TIM_DMABase_DIER ((uint16_t)0x0003) +#define TIM_DMABase_SR ((uint16_t)0x0004) +#define TIM_DMABase_EGR ((uint16_t)0x0005) +#define TIM_DMABase_CCMR1 ((uint16_t)0x0006) +#define TIM_DMABase_CCMR2 ((uint16_t)0x0007) +#define TIM_DMABase_CCER ((uint16_t)0x0008) +#define TIM_DMABase_CNT ((uint16_t)0x0009) +#define TIM_DMABase_PSC ((uint16_t)0x000A) +#define TIM_DMABase_ARR ((uint16_t)0x000B) +#define TIM_DMABase_RCR ((uint16_t)0x000C) +#define TIM_DMABase_CCR1 ((uint16_t)0x000D) +#define TIM_DMABase_CCR2 ((uint16_t)0x000E) +#define TIM_DMABase_CCR3 ((uint16_t)0x000F) +#define TIM_DMABase_CCR4 ((uint16_t)0x0010) +#define TIM_DMABase_BDTR ((uint16_t)0x0011) +#define TIM_DMABase_DCR ((uint16_t)0x0012) +#define IS_TIM_DMA_BASE(BASE) (((BASE) == TIM_DMABase_CR1) || \ + ((BASE) == TIM_DMABase_CR2) || \ + ((BASE) == TIM_DMABase_SMCR) || \ + ((BASE) == TIM_DMABase_DIER) || \ + ((BASE) == TIM_DMABase_SR) || \ + ((BASE) == TIM_DMABase_EGR) || \ + ((BASE) == TIM_DMABase_CCMR1) || \ + ((BASE) == TIM_DMABase_CCMR2) || \ + ((BASE) == TIM_DMABase_CCER) || \ + ((BASE) == TIM_DMABase_CNT) || \ + ((BASE) == TIM_DMABase_PSC) || \ + ((BASE) == TIM_DMABase_ARR) || \ + ((BASE) == TIM_DMABase_RCR) || \ + ((BASE) == TIM_DMABase_CCR1) || \ + ((BASE) == TIM_DMABase_CCR2) || \ + ((BASE) == TIM_DMABase_CCR3) || \ + ((BASE) == TIM_DMABase_CCR4) || \ + ((BASE) == TIM_DMABase_BDTR) || \ + ((BASE) == TIM_DMABase_DCR)) +/** + * @} + */ + +/** @defgroup TIM_DMA_Burst_Length + * @{ + */ + +#define TIM_DMABurstLength_1Byte ((uint16_t)0x0000) +#define TIM_DMABurstLength_2Bytes ((uint16_t)0x0100) +#define TIM_DMABurstLength_3Bytes ((uint16_t)0x0200) +#define TIM_DMABurstLength_4Bytes ((uint16_t)0x0300) +#define TIM_DMABurstLength_5Bytes ((uint16_t)0x0400) +#define TIM_DMABurstLength_6Bytes ((uint16_t)0x0500) +#define TIM_DMABurstLength_7Bytes ((uint16_t)0x0600) +#define TIM_DMABurstLength_8Bytes ((uint16_t)0x0700) +#define TIM_DMABurstLength_9Bytes ((uint16_t)0x0800) +#define TIM_DMABurstLength_10Bytes ((uint16_t)0x0900) +#define TIM_DMABurstLength_11Bytes ((uint16_t)0x0A00) +#define TIM_DMABurstLength_12Bytes ((uint16_t)0x0B00) +#define TIM_DMABurstLength_13Bytes ((uint16_t)0x0C00) +#define TIM_DMABurstLength_14Bytes ((uint16_t)0x0D00) +#define TIM_DMABurstLength_15Bytes ((uint16_t)0x0E00) +#define TIM_DMABurstLength_16Bytes ((uint16_t)0x0F00) +#define TIM_DMABurstLength_17Bytes ((uint16_t)0x1000) +#define TIM_DMABurstLength_18Bytes ((uint16_t)0x1100) +#define IS_TIM_DMA_LENGTH(LENGTH) (((LENGTH) == TIM_DMABurstLength_1Byte) || \ + ((LENGTH) == TIM_DMABurstLength_2Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_3Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_4Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_5Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_6Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_7Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_8Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_9Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_10Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_11Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_12Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_13Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_14Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_15Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_16Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_17Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_18Bytes)) +/** + * @} + */ + +/** @defgroup TIM_DMA_sources + * @{ + */ + +#define TIM_DMA_Update ((uint16_t)0x0100) +#define TIM_DMA_CC1 ((uint16_t)0x0200) +#define TIM_DMA_CC2 ((uint16_t)0x0400) +#define TIM_DMA_CC3 ((uint16_t)0x0800) +#define TIM_DMA_CC4 ((uint16_t)0x1000) +#define TIM_DMA_COM ((uint16_t)0x2000) +#define TIM_DMA_Trigger ((uint16_t)0x4000) +#define IS_TIM_DMA_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0x80FF) == 0x0000) && ((SOURCE) != 0x0000)) + +/** + * @} + */ + +/** @defgroup TIM_External_Trigger_Prescaler + * @{ + */ + +#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) +#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) +#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) +#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) +#define IS_TIM_EXT_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ExtTRGPSC_OFF) || \ + ((PRESCALER) == TIM_ExtTRGPSC_DIV2) || \ + ((PRESCALER) == TIM_ExtTRGPSC_DIV4) || \ + ((PRESCALER) == TIM_ExtTRGPSC_DIV8)) +/** + * @} + */ + +/** @defgroup TIM_Internal_Trigger_Selection + * @{ + */ + +#define TIM_TS_ITR0 ((uint16_t)0x0000) +#define TIM_TS_ITR1 ((uint16_t)0x0010) +#define TIM_TS_ITR2 ((uint16_t)0x0020) +#define TIM_TS_ITR3 ((uint16_t)0x0030) +#define TIM_TS_TI1F_ED ((uint16_t)0x0040) +#define TIM_TS_TI1FP1 ((uint16_t)0x0050) +#define TIM_TS_TI2FP2 ((uint16_t)0x0060) +#define TIM_TS_ETRF ((uint16_t)0x0070) +#define IS_TIM_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ + ((SELECTION) == TIM_TS_ITR1) || \ + ((SELECTION) == TIM_TS_ITR2) || \ + ((SELECTION) == TIM_TS_ITR3) || \ + ((SELECTION) == TIM_TS_TI1F_ED) || \ + ((SELECTION) == TIM_TS_TI1FP1) || \ + ((SELECTION) == TIM_TS_TI2FP2) || \ + ((SELECTION) == TIM_TS_ETRF)) +#define IS_TIM_INTERNAL_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ + ((SELECTION) == TIM_TS_ITR1) || \ + ((SELECTION) == TIM_TS_ITR2) || \ + ((SELECTION) == TIM_TS_ITR3)) +/** + * @} + */ + +/** @defgroup TIM_TIx_External_Clock_Source + * @{ + */ + +#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) +#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) +#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) +#define IS_TIM_TIXCLK_SOURCE(SOURCE) (((SOURCE) == TIM_TIxExternalCLK1Source_TI1) || \ + ((SOURCE) == TIM_TIxExternalCLK1Source_TI2) || \ + ((SOURCE) == TIM_TIxExternalCLK1Source_TI1ED)) +/** + * @} + */ + +/** @defgroup TIM_External_Trigger_Polarity + * @{ + */ +#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) +#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) +#define IS_TIM_EXT_POLARITY(POLARITY) (((POLARITY) == TIM_ExtTRGPolarity_Inverted) || \ + ((POLARITY) == TIM_ExtTRGPolarity_NonInverted)) +/** + * @} + */ + +/** @defgroup TIM_Prescaler_Reload_Mode + * @{ + */ + +#define TIM_PSCReloadMode_Update ((uint16_t)0x0000) +#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001) +#define IS_TIM_PRESCALER_RELOAD(RELOAD) (((RELOAD) == TIM_PSCReloadMode_Update) || \ + ((RELOAD) == TIM_PSCReloadMode_Immediate)) +/** + * @} + */ + +/** @defgroup TIM_Forced_Action + * @{ + */ + +#define TIM_ForcedAction_Active ((uint16_t)0x0050) +#define TIM_ForcedAction_InActive ((uint16_t)0x0040) +#define IS_TIM_FORCED_ACTION(ACTION) (((ACTION) == TIM_ForcedAction_Active) || \ + ((ACTION) == TIM_ForcedAction_InActive)) +/** + * @} + */ + +/** @defgroup TIM_Encoder_Mode + * @{ + */ + +#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) +#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) +#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) +#define IS_TIM_ENCODER_MODE(MODE) (((MODE) == TIM_EncoderMode_TI1) || \ + ((MODE) == TIM_EncoderMode_TI2) || \ + ((MODE) == TIM_EncoderMode_TI12)) +/** + * @} + */ + + +/** @defgroup TIM_Event_Source + * @{ + */ + +#define TIM_EventSource_Update ((uint16_t)0x0001) +#define TIM_EventSource_CC1 ((uint16_t)0x0002) +#define TIM_EventSource_CC2 ((uint16_t)0x0004) +#define TIM_EventSource_CC3 ((uint16_t)0x0008) +#define TIM_EventSource_CC4 ((uint16_t)0x0010) +#define TIM_EventSource_COM ((uint16_t)0x0020) +#define TIM_EventSource_Trigger ((uint16_t)0x0040) +#define TIM_EventSource_Break ((uint16_t)0x0080) +#define IS_TIM_EVENT_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0xFF00) == 0x0000) && ((SOURCE) != 0x0000)) + +/** + * @} + */ + +/** @defgroup TIM_Update_Source + * @{ + */ + +#define TIM_UpdateSource_Global ((uint16_t)0x0000) /*!< Source of update is the counter overflow/underflow + or the setting of UG bit, or an update generation + through the slave mode controller. */ +#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /*!< Source of update is counter overflow/underflow. */ +#define IS_TIM_UPDATE_SOURCE(SOURCE) (((SOURCE) == TIM_UpdateSource_Global) || \ + ((SOURCE) == TIM_UpdateSource_Regular)) +/** + * @} + */ + +/** @defgroup TIM_Ouput_Compare_Preload_State + * @{ + */ + +#define TIM_OCPreload_Enable ((uint16_t)0x0008) +#define TIM_OCPreload_Disable ((uint16_t)0x0000) +#define IS_TIM_OCPRELOAD_STATE(STATE) (((STATE) == TIM_OCPreload_Enable) || \ + ((STATE) == TIM_OCPreload_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Ouput_Compare_Fast_State + * @{ + */ + +#define TIM_OCFast_Enable ((uint16_t)0x0004) +#define TIM_OCFast_Disable ((uint16_t)0x0000) +#define IS_TIM_OCFAST_STATE(STATE) (((STATE) == TIM_OCFast_Enable) || \ + ((STATE) == TIM_OCFast_Disable)) + +/** + * @} + */ + +/** @defgroup TIM_Ouput_Compare_Clear_State + * @{ + */ + +#define TIM_OCClear_Enable ((uint16_t)0x0080) +#define TIM_OCClear_Disable ((uint16_t)0x0000) +#define IS_TIM_OCCLEAR_STATE(STATE) (((STATE) == TIM_OCClear_Enable) || \ + ((STATE) == TIM_OCClear_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Trigger_Output_Source + * @{ + */ + +#define TIM_TRGOSource_Reset ((uint16_t)0x0000) +#define TIM_TRGOSource_Enable ((uint16_t)0x0010) +#define TIM_TRGOSource_Update ((uint16_t)0x0020) +#define TIM_TRGOSource_OC1 ((uint16_t)0x0030) +#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) +#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) +#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) +#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) +#define IS_TIM_TRGO_SOURCE(SOURCE) (((SOURCE) == TIM_TRGOSource_Reset) || \ + ((SOURCE) == TIM_TRGOSource_Enable) || \ + ((SOURCE) == TIM_TRGOSource_Update) || \ + ((SOURCE) == TIM_TRGOSource_OC1) || \ + ((SOURCE) == TIM_TRGOSource_OC1Ref) || \ + ((SOURCE) == TIM_TRGOSource_OC2Ref) || \ + ((SOURCE) == TIM_TRGOSource_OC3Ref) || \ + ((SOURCE) == TIM_TRGOSource_OC4Ref)) +/** + * @} + */ + +/** @defgroup TIM_Slave_Mode + * @{ + */ + +#define TIM_SlaveMode_Reset ((uint16_t)0x0004) +#define TIM_SlaveMode_Gated ((uint16_t)0x0005) +#define TIM_SlaveMode_Trigger ((uint16_t)0x0006) +#define TIM_SlaveMode_External1 ((uint16_t)0x0007) +#define IS_TIM_SLAVE_MODE(MODE) (((MODE) == TIM_SlaveMode_Reset) || \ + ((MODE) == TIM_SlaveMode_Gated) || \ + ((MODE) == TIM_SlaveMode_Trigger) || \ + ((MODE) == TIM_SlaveMode_External1)) +/** + * @} + */ + +/** @defgroup TIM_Master_Slave_Mode + * @{ + */ + +#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080) +#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000) +#define IS_TIM_MSM_STATE(STATE) (((STATE) == TIM_MasterSlaveMode_Enable) || \ + ((STATE) == TIM_MasterSlaveMode_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Flags + * @{ + */ + +#define TIM_FLAG_Update ((uint16_t)0x0001) +#define TIM_FLAG_CC1 ((uint16_t)0x0002) +#define TIM_FLAG_CC2 ((uint16_t)0x0004) +#define TIM_FLAG_CC3 ((uint16_t)0x0008) +#define TIM_FLAG_CC4 ((uint16_t)0x0010) +#define TIM_FLAG_COM ((uint16_t)0x0020) +#define TIM_FLAG_Trigger ((uint16_t)0x0040) +#define TIM_FLAG_Break ((uint16_t)0x0080) +#define TIM_FLAG_CC1OF ((uint16_t)0x0200) +#define TIM_FLAG_CC2OF ((uint16_t)0x0400) +#define TIM_FLAG_CC3OF ((uint16_t)0x0800) +#define TIM_FLAG_CC4OF ((uint16_t)0x1000) +#define IS_TIM_GET_FLAG(FLAG) (((FLAG) == TIM_FLAG_Update) || \ + ((FLAG) == TIM_FLAG_CC1) || \ + ((FLAG) == TIM_FLAG_CC2) || \ + ((FLAG) == TIM_FLAG_CC3) || \ + ((FLAG) == TIM_FLAG_CC4) || \ + ((FLAG) == TIM_FLAG_COM) || \ + ((FLAG) == TIM_FLAG_Trigger) || \ + ((FLAG) == TIM_FLAG_Break) || \ + ((FLAG) == TIM_FLAG_CC1OF) || \ + ((FLAG) == TIM_FLAG_CC2OF) || \ + ((FLAG) == TIM_FLAG_CC3OF) || \ + ((FLAG) == TIM_FLAG_CC4OF)) + + +#define IS_TIM_CLEAR_FLAG(TIM_FLAG) ((((TIM_FLAG) & (uint16_t)0xE100) == 0x0000) && ((TIM_FLAG) != 0x0000)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Filer_Value + * @{ + */ + +#define IS_TIM_IC_FILTER(ICFILTER) ((ICFILTER) <= 0xF) +/** + * @} + */ + +/** @defgroup TIM_External_Trigger_Filter + * @{ + */ + +#define IS_TIM_EXT_FILTER(EXTFILTER) ((EXTFILTER) <= 0xF) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions + * @{ + */ + +void TIM_DeInit(TIM_TypeDef* TIMx); +void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct); +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct); +void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); +void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource); +void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength); +void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState); +void TIM_InternalClockConfig(TIM_TypeDef* TIMx); +void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); +void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter); +void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); +void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); +void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); +void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); +void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); +void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); +void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN); +void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); +void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource); +void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode); +void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource); +void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); +void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode); +void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter); +void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload); +void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); +void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); +void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); +void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4); +void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD); +uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx); +uint16_t TIM_GetCounter(TIM_TypeDef* TIMx); +uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); +FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); +void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); +ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); +void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_TIM_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h new file mode 100644 index 0000000..2c3ae4c --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h @@ -0,0 +1,409 @@ +/** + ****************************************************************************** + * @file stm32f10x_usart.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the USART + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_USART_H +#define __STM32F10x_USART_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup USART + * @{ + */ + +/** @defgroup USART_Exported_Types + * @{ + */ + +/** + * @brief USART Init Structure definition + */ + +typedef struct +{ + uint32_t USART_BaudRate; /*!< This member configures the USART communication baud rate. + The baud rate is computed using the following formula: + - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate))) + - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 16) + 0.5 */ + + uint16_t USART_WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref USART_Word_Length */ + + uint16_t USART_StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref USART_Stop_Bits */ + + uint16_t USART_Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref USART_Parity + @note When parity is enabled, the computed parity is inserted + at the MSB position of the transmitted data (9th bit when + the word length is set to 9 data bits; 8th bit when the + word length is set to 8 data bits). */ + + uint16_t USART_Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref USART_Mode */ + + uint16_t USART_HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabled + or disabled. + This parameter can be a value of @ref USART_Hardware_Flow_Control */ +} USART_InitTypeDef; + +/** + * @brief USART Clock Init Structure definition + */ + +typedef struct +{ + + uint16_t USART_Clock; /*!< Specifies whether the USART clock is enabled or disabled. + This parameter can be a value of @ref USART_Clock */ + + uint16_t USART_CPOL; /*!< Specifies the steady state value of the serial clock. + This parameter can be a value of @ref USART_Clock_Polarity */ + + uint16_t USART_CPHA; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref USART_Clock_Phase */ + + uint16_t USART_LastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted + data bit (MSB) has to be output on the SCLK pin in synchronous mode. + This parameter can be a value of @ref USART_Last_Bit */ +} USART_ClockInitTypeDef; + +/** + * @} + */ + +/** @defgroup USART_Exported_Constants + * @{ + */ + +#define IS_USART_ALL_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3) || \ + ((PERIPH) == UART4) || \ + ((PERIPH) == UART5)) + +#define IS_USART_123_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3)) + +#define IS_USART_1234_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3) || \ + ((PERIPH) == UART4)) +/** @defgroup USART_Word_Length + * @{ + */ + +#define USART_WordLength_8b ((uint16_t)0x0000) +#define USART_WordLength_9b ((uint16_t)0x1000) + +#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \ + ((LENGTH) == USART_WordLength_9b)) +/** + * @} + */ + +/** @defgroup USART_Stop_Bits + * @{ + */ + +#define USART_StopBits_1 ((uint16_t)0x0000) +#define USART_StopBits_0_5 ((uint16_t)0x1000) +#define USART_StopBits_2 ((uint16_t)0x2000) +#define USART_StopBits_1_5 ((uint16_t)0x3000) +#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \ + ((STOPBITS) == USART_StopBits_0_5) || \ + ((STOPBITS) == USART_StopBits_2) || \ + ((STOPBITS) == USART_StopBits_1_5)) +/** + * @} + */ + +/** @defgroup USART_Parity + * @{ + */ + +#define USART_Parity_No ((uint16_t)0x0000) +#define USART_Parity_Even ((uint16_t)0x0400) +#define USART_Parity_Odd ((uint16_t)0x0600) +#define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \ + ((PARITY) == USART_Parity_Even) || \ + ((PARITY) == USART_Parity_Odd)) +/** + * @} + */ + +/** @defgroup USART_Mode + * @{ + */ + +#define USART_Mode_Rx ((uint16_t)0x0004) +#define USART_Mode_Tx ((uint16_t)0x0008) +#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00)) +/** + * @} + */ + +/** @defgroup USART_Hardware_Flow_Control + * @{ + */ +#define USART_HardwareFlowControl_None ((uint16_t)0x0000) +#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) +#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) +#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) +#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\ + (((CONTROL) == USART_HardwareFlowControl_None) || \ + ((CONTROL) == USART_HardwareFlowControl_RTS) || \ + ((CONTROL) == USART_HardwareFlowControl_CTS) || \ + ((CONTROL) == USART_HardwareFlowControl_RTS_CTS)) +/** + * @} + */ + +/** @defgroup USART_Clock + * @{ + */ +#define USART_Clock_Disable ((uint16_t)0x0000) +#define USART_Clock_Enable ((uint16_t)0x0800) +#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \ + ((CLOCK) == USART_Clock_Enable)) +/** + * @} + */ + +/** @defgroup USART_Clock_Polarity + * @{ + */ + +#define USART_CPOL_Low ((uint16_t)0x0000) +#define USART_CPOL_High ((uint16_t)0x0400) +#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High)) + +/** + * @} + */ + +/** @defgroup USART_Clock_Phase + * @{ + */ + +#define USART_CPHA_1Edge ((uint16_t)0x0000) +#define USART_CPHA_2Edge ((uint16_t)0x0200) +#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge)) + +/** + * @} + */ + +/** @defgroup USART_Last_Bit + * @{ + */ + +#define USART_LastBit_Disable ((uint16_t)0x0000) +#define USART_LastBit_Enable ((uint16_t)0x0100) +#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \ + ((LASTBIT) == USART_LastBit_Enable)) +/** + * @} + */ + +/** @defgroup USART_Interrupt_definition + * @{ + */ + +#define USART_IT_PE ((uint16_t)0x0028) +#define USART_IT_TXE ((uint16_t)0x0727) +#define USART_IT_TC ((uint16_t)0x0626) +#define USART_IT_RXNE ((uint16_t)0x0525) +#define USART_IT_IDLE ((uint16_t)0x0424) +#define USART_IT_LBD ((uint16_t)0x0846) +#define USART_IT_CTS ((uint16_t)0x096A) +#define USART_IT_ERR ((uint16_t)0x0060) +#define USART_IT_ORE ((uint16_t)0x0360) +#define USART_IT_NE ((uint16_t)0x0260) +#define USART_IT_FE ((uint16_t)0x0160) +#define IS_USART_CONFIG_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ + ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ + ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ERR)) +#define IS_USART_GET_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ + ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ + ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ORE) || \ + ((IT) == USART_IT_NE) || ((IT) == USART_IT_FE)) +#define IS_USART_CLEAR_IT(IT) (((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_LBD) || ((IT) == USART_IT_CTS)) +/** + * @} + */ + +/** @defgroup USART_DMA_Requests + * @{ + */ + +#define USART_DMAReq_Tx ((uint16_t)0x0080) +#define USART_DMAReq_Rx ((uint16_t)0x0040) +#define IS_USART_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFF3F) == 0x00) && ((DMAREQ) != (uint16_t)0x00)) + +/** + * @} + */ + +/** @defgroup USART_WakeUp_methods + * @{ + */ + +#define USART_WakeUp_IdleLine ((uint16_t)0x0000) +#define USART_WakeUp_AddressMark ((uint16_t)0x0800) +#define IS_USART_WAKEUP(WAKEUP) (((WAKEUP) == USART_WakeUp_IdleLine) || \ + ((WAKEUP) == USART_WakeUp_AddressMark)) +/** + * @} + */ + +/** @defgroup USART_LIN_Break_Detection_Length + * @{ + */ + +#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000) +#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020) +#define IS_USART_LIN_BREAK_DETECT_LENGTH(LENGTH) \ + (((LENGTH) == USART_LINBreakDetectLength_10b) || \ + ((LENGTH) == USART_LINBreakDetectLength_11b)) +/** + * @} + */ + +/** @defgroup USART_IrDA_Low_Power + * @{ + */ + +#define USART_IrDAMode_LowPower ((uint16_t)0x0004) +#define USART_IrDAMode_Normal ((uint16_t)0x0000) +#define IS_USART_IRDA_MODE(MODE) (((MODE) == USART_IrDAMode_LowPower) || \ + ((MODE) == USART_IrDAMode_Normal)) +/** + * @} + */ + +/** @defgroup USART_Flags + * @{ + */ + +#define USART_FLAG_CTS ((uint16_t)0x0200) +#define USART_FLAG_LBD ((uint16_t)0x0100) +#define USART_FLAG_TXE ((uint16_t)0x0080) +#define USART_FLAG_TC ((uint16_t)0x0040) +#define USART_FLAG_RXNE ((uint16_t)0x0020) +#define USART_FLAG_IDLE ((uint16_t)0x0010) +#define USART_FLAG_ORE ((uint16_t)0x0008) +#define USART_FLAG_NE ((uint16_t)0x0004) +#define USART_FLAG_FE ((uint16_t)0x0002) +#define USART_FLAG_PE ((uint16_t)0x0001) +#define IS_USART_FLAG(FLAG) (((FLAG) == USART_FLAG_PE) || ((FLAG) == USART_FLAG_TXE) || \ + ((FLAG) == USART_FLAG_TC) || ((FLAG) == USART_FLAG_RXNE) || \ + ((FLAG) == USART_FLAG_IDLE) || ((FLAG) == USART_FLAG_LBD) || \ + ((FLAG) == USART_FLAG_CTS) || ((FLAG) == USART_FLAG_ORE) || \ + ((FLAG) == USART_FLAG_NE) || ((FLAG) == USART_FLAG_FE)) + +#define IS_USART_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFC9F) == 0x00) && ((FLAG) != (uint16_t)0x00)) +#define IS_USART_PERIPH_FLAG(PERIPH, USART_FLAG) ((((*(uint32_t*)&(PERIPH)) != UART4_BASE) &&\ + ((*(uint32_t*)&(PERIPH)) != UART5_BASE)) \ + || ((USART_FLAG) != USART_FLAG_CTS)) +#define IS_USART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 0x0044AA21)) +#define IS_USART_ADDRESS(ADDRESS) ((ADDRESS) <= 0xF) +#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup USART_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Exported_Functions + * @{ + */ + +void USART_DeInit(USART_TypeDef* USARTx); +void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); +void USART_StructInit(USART_InitTypeDef* USART_InitStruct); +void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct); +void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct); +void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); +void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState); +void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address); +void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp); +void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength); +void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); +uint16_t USART_ReceiveData(USART_TypeDef* USARTx); +void USART_SendBreak(USART_TypeDef* USARTx); +void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime); +void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler); +void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode); +void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState); +FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); +void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); +ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); +void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_USART_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h new file mode 100644 index 0000000..2cd7ccd --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * @file stm32f10x_wwdg.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains all the functions prototypes for the WWDG firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_WWDG_H +#define __STM32F10x_WWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup WWDG + * @{ + */ + +/** @defgroup WWDG_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Exported_Constants + * @{ + */ + +/** @defgroup WWDG_Prescaler + * @{ + */ + +#define WWDG_Prescaler_1 ((uint32_t)0x00000000) +#define WWDG_Prescaler_2 ((uint32_t)0x00000080) +#define WWDG_Prescaler_4 ((uint32_t)0x00000100) +#define WWDG_Prescaler_8 ((uint32_t)0x00000180) +#define IS_WWDG_PRESCALER(PRESCALER) (((PRESCALER) == WWDG_Prescaler_1) || \ + ((PRESCALER) == WWDG_Prescaler_2) || \ + ((PRESCALER) == WWDG_Prescaler_4) || \ + ((PRESCALER) == WWDG_Prescaler_8)) +#define IS_WWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0x7F) +#define IS_WWDG_COUNTER(COUNTER) (((COUNTER) >= 0x40) && ((COUNTER) <= 0x7F)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup WWDG_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup WWDG_Exported_Functions + * @{ + */ + +void WWDG_DeInit(void); +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); +void WWDG_SetWindowValue(uint8_t WindowValue); +void WWDG_EnableIT(void); +void WWDG_SetCounter(uint8_t Counter); +void WWDG_Enable(uint8_t Counter); +FlagStatus WWDG_GetFlagStatus(void); +void WWDG_ClearFlag(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_WWDG_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c new file mode 100644 index 0000000..fa3c212 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c @@ -0,0 +1,223 @@ +/** + ****************************************************************************** + * @file misc.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the miscellaneous firmware functions (add-on + * to CMSIS functions). + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "misc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup MISC + * @brief MISC driver modules + * @{ + */ + +/** @defgroup MISC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_Defines + * @{ + */ + +#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) +/** + * @} + */ + +/** @defgroup MISC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_Functions + * @{ + */ + +/** + * @brief Configures the priority grouping: pre-emption priority and subpriority. + * @param NVIC_PriorityGroup: specifies the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority + * 4 bits for subpriority + * @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority + * 3 bits for subpriority + * @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority + * 2 bits for subpriority + * @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority + * 1 bits for subpriority + * @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority + * 0 bits for subpriority + * @retval None + */ +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */ + SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; +} + +/** + * @brief Initializes the NVIC peripheral according to the specified + * parameters in the NVIC_InitStruct. + * @param NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains + * the configuration information for the specified NVIC peripheral. + * @retval None + */ +void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) +{ + uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority)); + assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority)); + + if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) + { + /* Compute the Corresponding IRQ Priority --------------------------------*/ + tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; + tmppre = (0x4 - tmppriority); + tmpsub = tmpsub >> tmppriority; + + tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre; + tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub; + tmppriority = tmppriority << 0x04; + + NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority; + + /* Enable the Selected IRQ Channels --------------------------------------*/ + NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = + (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); + } + else + { + /* Disable the Selected IRQ Channels -------------------------------------*/ + NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = + (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); + } +} + +/** + * @brief Sets the vector table location and Offset. + * @param NVIC_VectTab: specifies if the vector table is in RAM or FLASH memory. + * This parameter can be one of the following values: + * @arg NVIC_VectTab_RAM + * @arg NVIC_VectTab_FLASH + * @param Offset: Vector Table base offset field. This value must be a multiple of 0x100. + * @retval None + */ +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) +{ + /* Check the parameters */ + assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); + assert_param(IS_NVIC_OFFSET(Offset)); + + SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80); +} + +/** + * @brief Selects the condition for the system to enter low power mode. + * @param LowPowerMode: Specifies the new mode for the system to enter low power mode. + * This parameter can be one of the following values: + * @arg NVIC_LP_SEVONPEND + * @arg NVIC_LP_SLEEPDEEP + * @arg NVIC_LP_SLEEPONEXIT + * @param NewState: new state of LP condition. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_NVIC_LP(LowPowerMode)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + SCB->SCR |= LowPowerMode; + } + else + { + SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode); + } +} + +/** + * @brief Configures the SysTick clock source. + * @param SysTick_CLKSource: specifies the SysTick clock source. + * This parameter can be one of the following values: + * @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source. + * @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source. + * @retval None + */ +void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) +{ + /* Check the parameters */ + assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); + if (SysTick_CLKSource == SysTick_CLKSource_HCLK) + { + SysTick->CTRL |= SysTick_CLKSource_HCLK; + } + else + { + SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c new file mode 100644 index 0000000..412d9a9 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c @@ -0,0 +1,1306 @@ +/** + ****************************************************************************** + * @file stm32f10x_adc.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the ADC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_adc.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup ADC + * @brief ADC driver modules + * @{ + */ + +/** @defgroup ADC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_Defines + * @{ + */ + +/* ADC DISCNUM mask */ +#define CR1_DISCNUM_Reset ((uint32_t)0xFFFF1FFF) + +/* ADC DISCEN mask */ +#define CR1_DISCEN_Set ((uint32_t)0x00000800) +#define CR1_DISCEN_Reset ((uint32_t)0xFFFFF7FF) + +/* ADC JAUTO mask */ +#define CR1_JAUTO_Set ((uint32_t)0x00000400) +#define CR1_JAUTO_Reset ((uint32_t)0xFFFFFBFF) + +/* ADC JDISCEN mask */ +#define CR1_JDISCEN_Set ((uint32_t)0x00001000) +#define CR1_JDISCEN_Reset ((uint32_t)0xFFFFEFFF) + +/* ADC AWDCH mask */ +#define CR1_AWDCH_Reset ((uint32_t)0xFFFFFFE0) + +/* ADC Analog watchdog enable mode mask */ +#define CR1_AWDMode_Reset ((uint32_t)0xFF3FFDFF) + +/* CR1 register Mask */ +#define CR1_CLEAR_Mask ((uint32_t)0xFFF0FEFF) + +/* ADC ADON mask */ +#define CR2_ADON_Set ((uint32_t)0x00000001) +#define CR2_ADON_Reset ((uint32_t)0xFFFFFFFE) + +/* ADC DMA mask */ +#define CR2_DMA_Set ((uint32_t)0x00000100) +#define CR2_DMA_Reset ((uint32_t)0xFFFFFEFF) + +/* ADC RSTCAL mask */ +#define CR2_RSTCAL_Set ((uint32_t)0x00000008) + +/* ADC CAL mask */ +#define CR2_CAL_Set ((uint32_t)0x00000004) + +/* ADC SWSTART mask */ +#define CR2_SWSTART_Set ((uint32_t)0x00400000) + +/* ADC EXTTRIG mask */ +#define CR2_EXTTRIG_Set ((uint32_t)0x00100000) +#define CR2_EXTTRIG_Reset ((uint32_t)0xFFEFFFFF) + +/* ADC Software start mask */ +#define CR2_EXTTRIG_SWSTART_Set ((uint32_t)0x00500000) +#define CR2_EXTTRIG_SWSTART_Reset ((uint32_t)0xFFAFFFFF) + +/* ADC JEXTSEL mask */ +#define CR2_JEXTSEL_Reset ((uint32_t)0xFFFF8FFF) + +/* ADC JEXTTRIG mask */ +#define CR2_JEXTTRIG_Set ((uint32_t)0x00008000) +#define CR2_JEXTTRIG_Reset ((uint32_t)0xFFFF7FFF) + +/* ADC JSWSTART mask */ +#define CR2_JSWSTART_Set ((uint32_t)0x00200000) + +/* ADC injected software start mask */ +#define CR2_JEXTTRIG_JSWSTART_Set ((uint32_t)0x00208000) +#define CR2_JEXTTRIG_JSWSTART_Reset ((uint32_t)0xFFDF7FFF) + +/* ADC TSPD mask */ +#define CR2_TSVREFE_Set ((uint32_t)0x00800000) +#define CR2_TSVREFE_Reset ((uint32_t)0xFF7FFFFF) + +/* CR2 register Mask */ +#define CR2_CLEAR_Mask ((uint32_t)0xFFF1F7FD) + +/* ADC SQx mask */ +#define SQR3_SQ_Set ((uint32_t)0x0000001F) +#define SQR2_SQ_Set ((uint32_t)0x0000001F) +#define SQR1_SQ_Set ((uint32_t)0x0000001F) + +/* SQR1 register Mask */ +#define SQR1_CLEAR_Mask ((uint32_t)0xFF0FFFFF) + +/* ADC JSQx mask */ +#define JSQR_JSQ_Set ((uint32_t)0x0000001F) + +/* ADC JL mask */ +#define JSQR_JL_Set ((uint32_t)0x00300000) +#define JSQR_JL_Reset ((uint32_t)0xFFCFFFFF) + +/* ADC SMPx mask */ +#define SMPR1_SMP_Set ((uint32_t)0x00000007) +#define SMPR2_SMP_Set ((uint32_t)0x00000007) + +/* ADC JDRx registers offset */ +#define JDR_Offset ((uint8_t)0x28) + +/* ADC1 DR register base address */ +#define DR_ADDRESS ((uint32_t)0x4001244C) + +/** + * @} + */ + +/** @defgroup ADC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the ADCx peripheral registers to their default reset values. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval None + */ +void ADC_DeInit(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + + if (ADCx == ADC1) + { + /* Enable ADC1 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); + /* Release ADC1 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); + } + else if (ADCx == ADC2) + { + /* Enable ADC2 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE); + /* Release ADC2 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE); + } + else + { + if (ADCx == ADC3) + { + /* Enable ADC3 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3, ENABLE); + /* Release ADC3 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3, DISABLE); + } + } +} + +/** + * @brief Initializes the ADCx peripheral according to the specified parameters + * in the ADC_InitStruct. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure that contains + * the configuration information for the specified ADC peripheral. + * @retval None + */ +void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct) +{ + uint32_t tmpreg1 = 0; + uint8_t tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_MODE(ADC_InitStruct->ADC_Mode)); + assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode)); + assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode)); + assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv)); + assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign)); + assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfChannel)); + + /*---------------------------- ADCx CR1 Configuration -----------------*/ + /* Get the ADCx CR1 value */ + tmpreg1 = ADCx->CR1; + /* Clear DUALMOD and SCAN bits */ + tmpreg1 &= CR1_CLEAR_Mask; + /* Configure ADCx: Dual mode and scan conversion mode */ + /* Set DUALMOD bits according to ADC_Mode value */ + /* Set SCAN bit according to ADC_ScanConvMode value */ + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_Mode | ((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8)); + /* Write to ADCx CR1 */ + ADCx->CR1 = tmpreg1; + + /*---------------------------- ADCx CR2 Configuration -----------------*/ + /* Get the ADCx CR2 value */ + tmpreg1 = ADCx->CR2; + /* Clear CONT, ALIGN and EXTSEL bits */ + tmpreg1 &= CR2_CLEAR_Mask; + /* Configure ADCx: external trigger event and continuous conversion mode */ + /* Set ALIGN bit according to ADC_DataAlign value */ + /* Set EXTSEL bits according to ADC_ExternalTrigConv value */ + /* Set CONT bit according to ADC_ContinuousConvMode value */ + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv | + ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1)); + /* Write to ADCx CR2 */ + ADCx->CR2 = tmpreg1; + + /*---------------------------- ADCx SQR1 Configuration -----------------*/ + /* Get the ADCx SQR1 value */ + tmpreg1 = ADCx->SQR1; + /* Clear L bits */ + tmpreg1 &= SQR1_CLEAR_Mask; + /* Configure ADCx: regular channel sequence length */ + /* Set L bits according to ADC_NbrOfChannel value */ + tmpreg2 |= (uint8_t) (ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1); + tmpreg1 |= (uint32_t)tmpreg2 << 20; + /* Write to ADCx SQR1 */ + ADCx->SQR1 = tmpreg1; +} + +/** + * @brief Fills each ADC_InitStruct member with its default value. + * @param ADC_InitStruct : pointer to an ADC_InitTypeDef structure which will be initialized. + * @retval None + */ +void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct) +{ + /* Reset ADC init structure parameters values */ + /* Initialize the ADC_Mode member */ + ADC_InitStruct->ADC_Mode = ADC_Mode_Independent; + /* initialize the ADC_ScanConvMode member */ + ADC_InitStruct->ADC_ScanConvMode = DISABLE; + /* Initialize the ADC_ContinuousConvMode member */ + ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; + /* Initialize the ADC_ExternalTrigConv member */ + ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; + /* Initialize the ADC_DataAlign member */ + ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; + /* Initialize the ADC_NbrOfChannel member */ + ADC_InitStruct->ADC_NbrOfChannel = 1; +} + +/** + * @brief Enables or disables the specified ADC peripheral. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the ADCx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the ADON bit to wake up the ADC from power down mode */ + ADCx->CR2 |= CR2_ADON_Set; + } + else + { + /* Disable the selected ADC peripheral */ + ADCx->CR2 &= CR2_ADON_Reset; + } +} + +/** + * @brief Enables or disables the specified ADC DMA request. + * @param ADCx: where x can be 1 or 3 to select the ADC peripheral. + * Note: ADC2 hasn't a DMA capability. + * @param NewState: new state of the selected ADC DMA transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_DMA_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC DMA request */ + ADCx->CR2 |= CR2_DMA_Set; + } + else + { + /* Disable the selected ADC DMA request */ + ADCx->CR2 &= CR2_DMA_Reset; + } +} + +/** + * @brief Enables or disables the specified ADC interrupts. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt mask + * @arg ADC_IT_AWD: Analog watchdog interrupt mask + * @arg ADC_IT_JEOC: End of injected conversion interrupt mask + * @param NewState: new state of the specified ADC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState) +{ + uint8_t itmask = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_ADC_IT(ADC_IT)); + /* Get the ADC IT index */ + itmask = (uint8_t)ADC_IT; + if (NewState != DISABLE) + { + /* Enable the selected ADC interrupts */ + ADCx->CR1 |= itmask; + } + else + { + /* Disable the selected ADC interrupts */ + ADCx->CR1 &= (~(uint32_t)itmask); + } +} + +/** + * @brief Resets the selected ADC calibration registers. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval None + */ +void ADC_ResetCalibration(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Resets the selected ADC calibartion registers */ + ADCx->CR2 |= CR2_RSTCAL_Set; +} + +/** + * @brief Gets the selected ADC reset calibration registers status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC reset calibration registers (SET or RESET). + */ +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of RSTCAL bit */ + if ((ADCx->CR2 & CR2_RSTCAL_Set) != (uint32_t)RESET) + { + /* RSTCAL bit is set */ + bitstatus = SET; + } + else + { + /* RSTCAL bit is reset */ + bitstatus = RESET; + } + /* Return the RSTCAL bit status */ + return bitstatus; +} + +/** + * @brief Starts the selected ADC calibration process. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval None + */ +void ADC_StartCalibration(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Enable the selected ADC calibration process */ + ADCx->CR2 |= CR2_CAL_Set; +} + +/** + * @brief Gets the selected ADC calibration status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC calibration (SET or RESET). + */ +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of CAL bit */ + if ((ADCx->CR2 & CR2_CAL_Set) != (uint32_t)RESET) + { + /* CAL bit is set: calibration on going */ + bitstatus = SET; + } + else + { + /* CAL bit is reset: end of calibration */ + bitstatus = RESET; + } + /* Return the CAL bit status */ + return bitstatus; +} + +/** + * @brief Enables or disables the selected ADC software start conversion . + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC software start conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC conversion on external event and start the selected + ADC conversion */ + ADCx->CR2 |= CR2_EXTTRIG_SWSTART_Set; + } + else + { + /* Disable the selected ADC conversion on external event and stop the selected + ADC conversion */ + ADCx->CR2 &= CR2_EXTTRIG_SWSTART_Reset; + } +} + +/** + * @brief Gets the selected ADC Software start conversion Status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC software start conversion (SET or RESET). + */ +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of SWSTART bit */ + if ((ADCx->CR2 & CR2_SWSTART_Set) != (uint32_t)RESET) + { + /* SWSTART bit is set */ + bitstatus = SET; + } + else + { + /* SWSTART bit is reset */ + bitstatus = RESET; + } + /* Return the SWSTART bit status */ + return bitstatus; +} + +/** + * @brief Configures the discontinuous mode for the selected ADC regular + * group channel. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param Number: specifies the discontinuous mode regular channel + * count value. This number must be between 1 and 8. + * @retval None + */ +void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_REGULAR_DISC_NUMBER(Number)); + /* Get the old register value */ + tmpreg1 = ADCx->CR1; + /* Clear the old discontinuous mode channel count */ + tmpreg1 &= CR1_DISCNUM_Reset; + /* Set the discontinuous mode channel count */ + tmpreg2 = Number - 1; + tmpreg1 |= tmpreg2 << 13; + /* Store the new register value */ + ADCx->CR1 = tmpreg1; +} + +/** + * @brief Enables or disables the discontinuous mode on regular group + * channel for the specified ADC + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC discontinuous mode + * on regular group channel. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC regular discontinuous mode */ + ADCx->CR1 |= CR1_DISCEN_Set; + } + else + { + /* Disable the selected ADC regular discontinuous mode */ + ADCx->CR1 &= CR1_DISCEN_Reset; + } +} + +/** + * @brief Configures for the selected ADC regular channel its corresponding + * rank in the sequencer and its sample time. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure. + * This parameter can be one of the following values: + * @arg ADC_Channel_0: ADC Channel0 selected + * @arg ADC_Channel_1: ADC Channel1 selected + * @arg ADC_Channel_2: ADC Channel2 selected + * @arg ADC_Channel_3: ADC Channel3 selected + * @arg ADC_Channel_4: ADC Channel4 selected + * @arg ADC_Channel_5: ADC Channel5 selected + * @arg ADC_Channel_6: ADC Channel6 selected + * @arg ADC_Channel_7: ADC Channel7 selected + * @arg ADC_Channel_8: ADC Channel8 selected + * @arg ADC_Channel_9: ADC Channel9 selected + * @arg ADC_Channel_10: ADC Channel10 selected + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @param Rank: The rank in the regular group sequencer. This parameter must be between 1 to 16. + * @param ADC_SampleTime: The sample time value to be set for the selected channel. + * This parameter can be one of the following values: + * @arg ADC_SampleTime_1Cycles5: Sample time equal to 1.5 cycles + * @arg ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles + * @arg ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles + * @arg ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles + * @arg ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles + * @arg ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles + * @arg ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles + * @arg ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles + * @retval None + */ +void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + assert_param(IS_ADC_REGULAR_RANK(Rank)); + assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); + /* if ADC_Channel_10 ... ADC_Channel_17 is selected */ + if (ADC_Channel > ADC_Channel_9) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR1; + /* Calculate the mask to clear */ + tmpreg2 = SMPR1_SMP_Set << (3 * (ADC_Channel - 10)); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR1 = tmpreg1; + } + else /* ADC_Channel include in ADC_Channel_[0..9] */ + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR2; + /* Calculate the mask to clear */ + tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR2 = tmpreg1; + } + /* For Rank 1 to 6 */ + if (Rank < 7) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR3; + /* Calculate the mask to clear */ + tmpreg2 = SQR3_SQ_Set << (5 * (Rank - 1)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR3 = tmpreg1; + } + /* For Rank 7 to 12 */ + else if (Rank < 13) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR2; + /* Calculate the mask to clear */ + tmpreg2 = SQR2_SQ_Set << (5 * (Rank - 7)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR2 = tmpreg1; + } + /* For Rank 13 to 16 */ + else + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR1; + /* Calculate the mask to clear */ + tmpreg2 = SQR1_SQ_Set << (5 * (Rank - 13)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR1 = tmpreg1; + } +} + +/** + * @brief Enables or disables the ADCx conversion through external trigger. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC external trigger start of conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC conversion on external event */ + ADCx->CR2 |= CR2_EXTTRIG_Set; + } + else + { + /* Disable the selected ADC conversion on external event */ + ADCx->CR2 &= CR2_EXTTRIG_Reset; + } +} + +/** + * @brief Returns the last ADCx conversion result data for regular channel. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The Data conversion value. + */ +uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Return the selected ADC conversion value */ + return (uint16_t) ADCx->DR; +} + +/** + * @brief Returns the last ADC1 and ADC2 conversion result data in dual mode. + * @retval The Data conversion value. + */ +uint32_t ADC_GetDualModeConversionValue(void) +{ + /* Return the dual mode conversion value */ + return (*(__IO uint32_t *) DR_ADDRESS); +} + +/** + * @brief Enables or disables the selected ADC automatic injected group + * conversion after regular one. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC auto injected conversion + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC automatic injected group conversion */ + ADCx->CR1 |= CR1_JAUTO_Set; + } + else + { + /* Disable the selected ADC automatic injected group conversion */ + ADCx->CR1 &= CR1_JAUTO_Reset; + } +} + +/** + * @brief Enables or disables the discontinuous mode for injected group + * channel for the specified ADC + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC discontinuous mode + * on injected group channel. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC injected discontinuous mode */ + ADCx->CR1 |= CR1_JDISCEN_Set; + } + else + { + /* Disable the selected ADC injected discontinuous mode */ + ADCx->CR1 &= CR1_JDISCEN_Reset; + } +} + +/** + * @brief Configures the ADCx external trigger for injected channels conversion. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_ExternalTrigInjecConv: specifies the ADC trigger to start injected conversion. + * This parameter can be one of the following values: + * @arg ADC_ExternalTrigInjecConv_T1_TRGO: Timer1 TRGO event selected (for ADC1, ADC2 and ADC3) + * @arg ADC_ExternalTrigInjecConv_T1_CC4: Timer1 capture compare4 selected (for ADC1, ADC2 and ADC3) + * @arg ADC_ExternalTrigInjecConv_T2_TRGO: Timer2 TRGO event selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T2_CC1: Timer2 capture compare1 selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T3_CC4: Timer3 capture compare4 selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T4_TRGO: Timer4 TRGO event selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4: External interrupt line 15 or Timer8 + * capture compare4 event selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T4_CC3: Timer4 capture compare3 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T8_CC2: Timer8 capture compare2 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T8_CC4: Timer8 capture compare4 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T5_TRGO: Timer5 TRGO event selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T5_CC4: Timer5 capture compare4 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_None: Injected conversion started by software and not + * by external trigger (for ADC1, ADC2 and ADC3) + * @retval None + */ +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_EXT_INJEC_TRIG(ADC_ExternalTrigInjecConv)); + /* Get the old register value */ + tmpreg = ADCx->CR2; + /* Clear the old external event selection for injected group */ + tmpreg &= CR2_JEXTSEL_Reset; + /* Set the external event selection for injected group */ + tmpreg |= ADC_ExternalTrigInjecConv; + /* Store the new register value */ + ADCx->CR2 = tmpreg; +} + +/** + * @brief Enables or disables the ADCx injected channels conversion through + * external trigger + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC external trigger start of + * injected conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC external event selection for injected group */ + ADCx->CR2 |= CR2_JEXTTRIG_Set; + } + else + { + /* Disable the selected ADC external event selection for injected group */ + ADCx->CR2 &= CR2_JEXTTRIG_Reset; + } +} + +/** + * @brief Enables or disables the selected ADC start of the injected + * channels conversion. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC software start injected conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC conversion for injected group on external event and start the selected + ADC injected conversion */ + ADCx->CR2 |= CR2_JEXTTRIG_JSWSTART_Set; + } + else + { + /* Disable the selected ADC conversion on external event for injected group and stop the selected + ADC injected conversion */ + ADCx->CR2 &= CR2_JEXTTRIG_JSWSTART_Reset; + } +} + +/** + * @brief Gets the selected ADC Software start injected conversion Status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC software start injected conversion (SET or RESET). + */ +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of JSWSTART bit */ + if ((ADCx->CR2 & CR2_JSWSTART_Set) != (uint32_t)RESET) + { + /* JSWSTART bit is set */ + bitstatus = SET; + } + else + { + /* JSWSTART bit is reset */ + bitstatus = RESET; + } + /* Return the JSWSTART bit status */ + return bitstatus; +} + +/** + * @brief Configures for the selected ADC injected channel its corresponding + * rank in the sequencer and its sample time. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure. + * This parameter can be one of the following values: + * @arg ADC_Channel_0: ADC Channel0 selected + * @arg ADC_Channel_1: ADC Channel1 selected + * @arg ADC_Channel_2: ADC Channel2 selected + * @arg ADC_Channel_3: ADC Channel3 selected + * @arg ADC_Channel_4: ADC Channel4 selected + * @arg ADC_Channel_5: ADC Channel5 selected + * @arg ADC_Channel_6: ADC Channel6 selected + * @arg ADC_Channel_7: ADC Channel7 selected + * @arg ADC_Channel_8: ADC Channel8 selected + * @arg ADC_Channel_9: ADC Channel9 selected + * @arg ADC_Channel_10: ADC Channel10 selected + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @param Rank: The rank in the injected group sequencer. This parameter must be between 1 and 4. + * @param ADC_SampleTime: The sample time value to be set for the selected channel. + * This parameter can be one of the following values: + * @arg ADC_SampleTime_1Cycles5: Sample time equal to 1.5 cycles + * @arg ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles + * @arg ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles + * @arg ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles + * @arg ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles + * @arg ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles + * @arg ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles + * @arg ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles + * @retval None + */ +void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + assert_param(IS_ADC_INJECTED_RANK(Rank)); + assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); + /* if ADC_Channel_10 ... ADC_Channel_17 is selected */ + if (ADC_Channel > ADC_Channel_9) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR1; + /* Calculate the mask to clear */ + tmpreg2 = SMPR1_SMP_Set << (3*(ADC_Channel - 10)); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3*(ADC_Channel - 10)); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR1 = tmpreg1; + } + else /* ADC_Channel include in ADC_Channel_[0..9] */ + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR2; + /* Calculate the mask to clear */ + tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR2 = tmpreg1; + } + /* Rank configuration */ + /* Get the old register value */ + tmpreg1 = ADCx->JSQR; + /* Get JL value: Number = JL+1 */ + tmpreg3 = (tmpreg1 & JSQR_JL_Set)>> 20; + /* Calculate the mask to clear: ((Rank-1)+(4-JL-1)) */ + tmpreg2 = JSQR_JSQ_Set << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + /* Clear the old JSQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set: ((Rank-1)+(4-JL-1)) */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + /* Set the JSQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->JSQR = tmpreg1; +} + +/** + * @brief Configures the sequencer length for injected channels + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param Length: The sequencer length. + * This parameter must be a number between 1 to 4. + * @retval None + */ +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_LENGTH(Length)); + + /* Get the old register value */ + tmpreg1 = ADCx->JSQR; + /* Clear the old injected sequnence lenght JL bits */ + tmpreg1 &= JSQR_JL_Reset; + /* Set the injected sequnence lenght JL bits */ + tmpreg2 = Length - 1; + tmpreg1 |= tmpreg2 << 20; + /* Store the new register value */ + ADCx->JSQR = tmpreg1; +} + +/** + * @brief Set the injected channels conversion value offset + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_InjectedChannel: the ADC injected channel to set its offset. + * This parameter can be one of the following values: + * @arg ADC_InjectedChannel_1: Injected Channel1 selected + * @arg ADC_InjectedChannel_2: Injected Channel2 selected + * @arg ADC_InjectedChannel_3: Injected Channel3 selected + * @arg ADC_InjectedChannel_4: Injected Channel4 selected + * @param Offset: the offset value for the selected ADC injected channel + * This parameter must be a 12bit value. + * @retval None + */ +void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); + assert_param(IS_ADC_OFFSET(Offset)); + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel; + + /* Set the selected injected channel data offset */ + *(__IO uint32_t *) tmp = (uint32_t)Offset; +} + +/** + * @brief Returns the ADC injected channel conversion result + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_InjectedChannel: the converted ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_InjectedChannel_1: Injected Channel1 selected + * @arg ADC_InjectedChannel_2: Injected Channel2 selected + * @arg ADC_InjectedChannel_3: Injected Channel3 selected + * @arg ADC_InjectedChannel_4: Injected Channel4 selected + * @retval The Data conversion value. + */ +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel + JDR_Offset; + + /* Returns the selected injected channel conversion data value */ + return (uint16_t) (*(__IO uint32_t*) tmp); +} + +/** + * @brief Enables or disables the analog watchdog on single/all regular + * or injected channels + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_AnalogWatchdog: the ADC analog watchdog configuration. + * This parameter can be one of the following values: + * @arg ADC_AnalogWatchdog_SingleRegEnable: Analog watchdog on a single regular channel + * @arg ADC_AnalogWatchdog_SingleInjecEnable: Analog watchdog on a single injected channel + * @arg ADC_AnalogWatchdog_SingleRegOrInjecEnable: Analog watchdog on a single regular or injected channel + * @arg ADC_AnalogWatchdog_AllRegEnable: Analog watchdog on all regular channel + * @arg ADC_AnalogWatchdog_AllInjecEnable: Analog watchdog on all injected channel + * @arg ADC_AnalogWatchdog_AllRegAllInjecEnable: Analog watchdog on all regular and injected channels + * @arg ADC_AnalogWatchdog_None: No channel guarded by the analog watchdog + * @retval None + */ +void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_ANALOG_WATCHDOG(ADC_AnalogWatchdog)); + /* Get the old register value */ + tmpreg = ADCx->CR1; + /* Clear AWDEN, AWDENJ and AWDSGL bits */ + tmpreg &= CR1_AWDMode_Reset; + /* Set the analog watchdog enable mode */ + tmpreg |= ADC_AnalogWatchdog; + /* Store the new register value */ + ADCx->CR1 = tmpreg; +} + +/** + * @brief Configures the high and low thresholds of the analog watchdog. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param HighThreshold: the ADC analog watchdog High threshold value. + * This parameter must be a 12bit value. + * @param LowThreshold: the ADC analog watchdog Low threshold value. + * This parameter must be a 12bit value. + * @retval None + */ +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, + uint16_t LowThreshold) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_THRESHOLD(HighThreshold)); + assert_param(IS_ADC_THRESHOLD(LowThreshold)); + /* Set the ADCx high threshold */ + ADCx->HTR = HighThreshold; + /* Set the ADCx low threshold */ + ADCx->LTR = LowThreshold; +} + +/** + * @brief Configures the analog watchdog guarded single channel + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure for the analog watchdog. + * This parameter can be one of the following values: + * @arg ADC_Channel_0: ADC Channel0 selected + * @arg ADC_Channel_1: ADC Channel1 selected + * @arg ADC_Channel_2: ADC Channel2 selected + * @arg ADC_Channel_3: ADC Channel3 selected + * @arg ADC_Channel_4: ADC Channel4 selected + * @arg ADC_Channel_5: ADC Channel5 selected + * @arg ADC_Channel_6: ADC Channel6 selected + * @arg ADC_Channel_7: ADC Channel7 selected + * @arg ADC_Channel_8: ADC Channel8 selected + * @arg ADC_Channel_9: ADC Channel9 selected + * @arg ADC_Channel_10: ADC Channel10 selected + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @retval None + */ +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + /* Get the old register value */ + tmpreg = ADCx->CR1; + /* Clear the Analog watchdog channel select bits */ + tmpreg &= CR1_AWDCH_Reset; + /* Set the Analog watchdog channel */ + tmpreg |= ADC_Channel; + /* Store the new register value */ + ADCx->CR1 = tmpreg; +} + +/** + * @brief Enables or disables the temperature sensor and Vrefint channel. + * @param NewState: new state of the temperature sensor. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_TempSensorVrefintCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the temperature sensor and Vrefint channel*/ + ADC1->CR2 |= CR2_TSVREFE_Set; + } + else + { + /* Disable the temperature sensor and Vrefint channel*/ + ADC1->CR2 &= CR2_TSVREFE_Reset; + } +} + +/** + * @brief Checks whether the specified ADC flag is set or not. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ADC_FLAG_AWD: Analog watchdog flag + * @arg ADC_FLAG_EOC: End of conversion flag + * @arg ADC_FLAG_JEOC: End of injected group conversion flag + * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag + * @arg ADC_FLAG_STRT: Start of regular group conversion flag + * @retval The new state of ADC_FLAG (SET or RESET). + */ +FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_GET_FLAG(ADC_FLAG)); + /* Check the status of the specified ADC flag */ + if ((ADCx->SR & ADC_FLAG) != (uint8_t)RESET) + { + /* ADC_FLAG is set */ + bitstatus = SET; + } + else + { + /* ADC_FLAG is reset */ + bitstatus = RESET; + } + /* Return the ADC_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the ADCx's pending flags. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg ADC_FLAG_AWD: Analog watchdog flag + * @arg ADC_FLAG_EOC: End of conversion flag + * @arg ADC_FLAG_JEOC: End of injected group conversion flag + * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag + * @arg ADC_FLAG_STRT: Start of regular group conversion flag + * @retval None + */ +void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG)); + /* Clear the selected ADC flags */ + ADCx->SR = ~(uint32_t)ADC_FLAG; +} + +/** + * @brief Checks whether the specified ADC interrupt has occurred or not. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt source to check. + * This parameter can be one of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt mask + * @arg ADC_IT_AWD: Analog watchdog interrupt mask + * @arg ADC_IT_JEOC: End of injected conversion interrupt mask + * @retval The new state of ADC_IT (SET or RESET). + */ +ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t itmask = 0, enablestatus = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_GET_IT(ADC_IT)); + /* Get the ADC IT index */ + itmask = ADC_IT >> 8; + /* Get the ADC_IT enable bit status */ + enablestatus = (ADCx->CR1 & (uint8_t)ADC_IT) ; + /* Check the status of the specified ADC interrupt */ + if (((ADCx->SR & itmask) != (uint32_t)RESET) && enablestatus) + { + /* ADC_IT is set */ + bitstatus = SET; + } + else + { + /* ADC_IT is reset */ + bitstatus = RESET; + } + /* Return the ADC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the ADCx’s interrupt pending bits. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt mask + * @arg ADC_IT_AWD: Analog watchdog interrupt mask + * @arg ADC_IT_JEOC: End of injected conversion interrupt mask + * @retval None + */ +void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT) +{ + uint8_t itmask = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_IT(ADC_IT)); + /* Get the ADC IT index */ + itmask = (uint8_t)(ADC_IT >> 8); + /* Clear the selected ADC interrupt pending bits */ + ADCx->SR = ~(uint32_t)itmask; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c new file mode 100644 index 0000000..f4970f1 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c @@ -0,0 +1,311 @@ +/** + ****************************************************************************** + * @file stm32f10x_bkp.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the BKP firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_bkp.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup BKP + * @brief BKP driver modules + * @{ + */ + +/** @defgroup BKP_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_Defines + * @{ + */ + +/* ------------ BKP registers bit address in the alias region --------------- */ +#define BKP_OFFSET (BKP_BASE - PERIPH_BASE) + +/* --- CR Register ----*/ + +/* Alias word address of TPAL bit */ +#define CR_OFFSET (BKP_OFFSET + 0x30) +#define TPAL_BitNumber 0x01 +#define CR_TPAL_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPAL_BitNumber * 4)) + +/* Alias word address of TPE bit */ +#define TPE_BitNumber 0x00 +#define CR_TPE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPE_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of TPIE bit */ +#define CSR_OFFSET (BKP_OFFSET + 0x34) +#define TPIE_BitNumber 0x02 +#define CSR_TPIE_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TPIE_BitNumber * 4)) + +/* Alias word address of TIF bit */ +#define TIF_BitNumber 0x09 +#define CSR_TIF_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TIF_BitNumber * 4)) + +/* Alias word address of TEF bit */ +#define TEF_BitNumber 0x08 +#define CSR_TEF_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TEF_BitNumber * 4)) + +/* ---------------------- BKP registers bit mask ------------------------ */ + +/* RTCCR register bit mask */ +#define RTCCR_CAL_Mask ((uint16_t)0xFF80) +#define RTCCR_Mask ((uint16_t)0xFC7F) + +/* CSR register bit mask */ +#define CSR_CTE_Set ((uint16_t)0x0001) +#define CSR_CTI_Set ((uint16_t)0x0002) + +/** + * @} + */ + + +/** @defgroup BKP_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the BKP peripheral registers to their default reset values. + * @param None + * @retval None + */ +void BKP_DeInit(void) +{ + RCC_BackupResetCmd(ENABLE); + RCC_BackupResetCmd(DISABLE); +} + +/** + * @brief Configures the Tamper Pin active level. + * @param BKP_TamperPinLevel: specifies the Tamper Pin active level. + * This parameter can be one of the following values: + * @arg BKP_TamperPinLevel_High: Tamper pin active on high level + * @arg BKP_TamperPinLevel_Low: Tamper pin active on low level + * @retval None + */ +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel) +{ + /* Check the parameters */ + assert_param(IS_BKP_TAMPER_PIN_LEVEL(BKP_TamperPinLevel)); + *(__IO uint32_t *) CR_TPAL_BB = BKP_TamperPinLevel; +} + +/** + * @brief Enables or disables the Tamper Pin activation. + * @param NewState: new state of the Tamper Pin activation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void BKP_TamperPinCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_TPE_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Tamper Pin Interrupt. + * @param NewState: new state of the Tamper Pin Interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void BKP_ITConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_TPIE_BB = (uint32_t)NewState; +} + +/** + * @brief Select the RTC output source to output on the Tamper pin. + * @param BKP_RTCOutputSource: specifies the RTC output source. + * This parameter can be one of the following values: + * @arg BKP_RTCOutputSource_None: no RTC output on the Tamper pin. + * @arg BKP_RTCOutputSource_CalibClock: output the RTC clock with frequency + * divided by 64 on the Tamper pin. + * @arg BKP_RTCOutputSource_Alarm: output the RTC Alarm pulse signal on + * the Tamper pin. + * @arg BKP_RTCOutputSource_Second: output the RTC Second pulse signal on + * the Tamper pin. + * @retval None + */ +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_BKP_RTC_OUTPUT_SOURCE(BKP_RTCOutputSource)); + tmpreg = BKP->RTCCR; + /* Clear CCO, ASOE and ASOS bits */ + tmpreg &= RTCCR_Mask; + + /* Set CCO, ASOE and ASOS bits according to BKP_RTCOutputSource value */ + tmpreg |= BKP_RTCOutputSource; + /* Store the new value */ + BKP->RTCCR = tmpreg; +} + +/** + * @brief Sets RTC Clock Calibration value. + * @param CalibrationValue: specifies the RTC Clock Calibration value. + * This parameter must be a number between 0 and 0x7F. + * @retval None + */ +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_BKP_CALIBRATION_VALUE(CalibrationValue)); + tmpreg = BKP->RTCCR; + /* Clear CAL[6:0] bits */ + tmpreg &= RTCCR_CAL_Mask; + /* Set CAL[6:0] bits according to CalibrationValue value */ + tmpreg |= CalibrationValue; + /* Store the new value */ + BKP->RTCCR = tmpreg; +} + +/** + * @brief Writes user data to the specified Data Backup Register. + * @param BKP_DR: specifies the Data Backup Register. + * This parameter can be BKP_DRx where x:[1, 42] + * @param Data: data to write + * @retval None + */ +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_BKP_DR(BKP_DR)); + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + + *(__IO uint32_t *) tmp = Data; +} + +/** + * @brief Reads data from the specified Data Backup Register. + * @param BKP_DR: specifies the Data Backup Register. + * This parameter can be BKP_DRx where x:[1, 42] + * @retval The content of the specified Data Backup Register + */ +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_BKP_DR(BKP_DR)); + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + + return (*(__IO uint16_t *) tmp); +} + +/** + * @brief Checks whether the Tamper Pin Event flag is set or not. + * @param None + * @retval The new state of the Tamper Pin Event flag (SET or RESET). + */ +FlagStatus BKP_GetFlagStatus(void) +{ + return (FlagStatus)(*(__IO uint32_t *) CSR_TEF_BB); +} + +/** + * @brief Clears Tamper Pin Event pending flag. + * @param None + * @retval None + */ +void BKP_ClearFlag(void) +{ + /* Set CTE bit to clear Tamper Pin Event flag */ + BKP->CSR |= CSR_CTE_Set; +} + +/** + * @brief Checks whether the Tamper Pin Interrupt has occurred or not. + * @param None + * @retval The new state of the Tamper Pin Interrupt (SET or RESET). + */ +ITStatus BKP_GetITStatus(void) +{ + return (ITStatus)(*(__IO uint32_t *) CSR_TIF_BB); +} + +/** + * @brief Clears Tamper Pin Interrupt pending bit. + * @param None + * @retval None + */ +void BKP_ClearITPendingBit(void) +{ + /* Set CTI bit to clear Tamper Pin Interrupt pending bit */ + BKP->CSR |= CSR_CTI_Set; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c new file mode 100644 index 0000000..3e2aa23 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c @@ -0,0 +1,990 @@ +/** + ****************************************************************************** + * @file stm32f10x_can.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the CAN firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_can.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup CAN + * @brief CAN driver modules + * @{ + */ + +/** @defgroup CAN_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Private_Defines + * @{ + */ + +/* CAN Master Control Register bits */ +#define MCR_INRQ ((uint32_t)0x00000001) /* Initialization request */ +#define MCR_SLEEP ((uint32_t)0x00000002) /* Sleep mode request */ +#define MCR_TXFP ((uint32_t)0x00000004) /* Transmit FIFO priority */ +#define MCR_RFLM ((uint32_t)0x00000008) /* Receive FIFO locked mode */ +#define MCR_NART ((uint32_t)0x00000010) /* No automatic retransmission */ +#define MCR_AWUM ((uint32_t)0x00000020) /* Automatic wake up mode */ +#define MCR_ABOM ((uint32_t)0x00000040) /* Automatic bus-off management */ +#define MCR_TTCM ((uint32_t)0x00000080) /* time triggered communication */ +#define MCR_RESET ((uint32_t)0x00008000) /* time triggered communication */ +#define MCR_DBF ((uint32_t)0x00010000) /* software master reset */ + +/* CAN Master Status Register bits */ +#define MSR_INAK ((uint32_t)0x00000001) /* Initialization acknowledge */ +#define MSR_WKUI ((uint32_t)0x00000008) /* Wake-up interrupt */ +#define MSR_SLAKI ((uint32_t)0x00000010) /* Sleep acknowledge interrupt */ + +/* CAN Transmit Status Register bits */ +#define TSR_RQCP0 ((uint32_t)0x00000001) /* Request completed mailbox0 */ +#define TSR_TXOK0 ((uint32_t)0x00000002) /* Transmission OK of mailbox0 */ +#define TSR_ABRQ0 ((uint32_t)0x00000080) /* Abort request for mailbox0 */ +#define TSR_RQCP1 ((uint32_t)0x00000100) /* Request completed mailbox1 */ +#define TSR_TXOK1 ((uint32_t)0x00000200) /* Transmission OK of mailbox1 */ +#define TSR_ABRQ1 ((uint32_t)0x00008000) /* Abort request for mailbox1 */ +#define TSR_RQCP2 ((uint32_t)0x00010000) /* Request completed mailbox2 */ +#define TSR_TXOK2 ((uint32_t)0x00020000) /* Transmission OK of mailbox2 */ +#define TSR_ABRQ2 ((uint32_t)0x00800000) /* Abort request for mailbox2 */ +#define TSR_TME0 ((uint32_t)0x04000000) /* Transmit mailbox 0 empty */ +#define TSR_TME1 ((uint32_t)0x08000000) /* Transmit mailbox 1 empty */ +#define TSR_TME2 ((uint32_t)0x10000000) /* Transmit mailbox 2 empty */ + +/* CAN Receive FIFO 0 Register bits */ +#define RF0R_FULL0 ((uint32_t)0x00000008) /* FIFO 0 full */ +#define RF0R_FOVR0 ((uint32_t)0x00000010) /* FIFO 0 overrun */ +#define RF0R_RFOM0 ((uint32_t)0x00000020) /* Release FIFO 0 output mailbox */ + +/* CAN Receive FIFO 1 Register bits */ +#define RF1R_FULL1 ((uint32_t)0x00000008) /* FIFO 1 full */ +#define RF1R_FOVR1 ((uint32_t)0x00000010) /* FIFO 1 overrun */ +#define RF1R_RFOM1 ((uint32_t)0x00000020) /* Release FIFO 1 output mailbox */ + +/* CAN Error Status Register bits */ +#define ESR_EWGF ((uint32_t)0x00000001) /* Error warning flag */ +#define ESR_EPVF ((uint32_t)0x00000002) /* Error passive flag */ +#define ESR_BOFF ((uint32_t)0x00000004) /* Bus-off flag */ + +/* CAN Mailbox Transmit Request */ +#define TMIDxR_TXRQ ((uint32_t)0x00000001) /* Transmit mailbox request */ + +/* CAN Filter Master Register bits */ +#define FMR_FINIT ((uint32_t)0x00000001) /* Filter init mode */ + +/* Time out for INAK bit */ +#define INAK_TimeOut ((uint32_t)0x0000FFFF) + +/* Time out for SLAK bit */ +#define SLAK_TimeOut ((uint32_t)0x0000FFFF) + +/** + * @} + */ + +/** @defgroup CAN_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Private_FunctionPrototypes + * @{ + */ + +static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit); + +/** + * @} + */ + +/** @defgroup CAN_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the CAN peripheral registers to their default reset values. + * @param CANx: where x can be 1 or 2 to select the CAN peripheral. + * @retval None. + */ +void CAN_DeInit(CAN_TypeDef* CANx) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + if (CANx == CAN1) + { + /* Enable CAN1 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE); + /* Release CAN1 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE); + } + else + { + /* Enable CAN2 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, ENABLE); + /* Release CAN2 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, DISABLE); + } +} + +/** + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_InitStruct. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure that + * contains the configuration information for the CAN peripheral. + * @retval Constant indicates initialization succeed which will be + * CANINITFAILED or CANINITOK. + */ +uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct) +{ + uint8_t InitStatus = CANINITFAILED; + uint32_t wait_ack = 0x00000000; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TTCM)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_ABOM)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_AWUM)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_NART)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_RFLM)); + assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TXFP)); + assert_param(IS_CAN_MODE(CAN_InitStruct->CAN_Mode)); + assert_param(IS_CAN_SJW(CAN_InitStruct->CAN_SJW)); + assert_param(IS_CAN_BS1(CAN_InitStruct->CAN_BS1)); + assert_param(IS_CAN_BS2(CAN_InitStruct->CAN_BS2)); + assert_param(IS_CAN_PRESCALER(CAN_InitStruct->CAN_Prescaler)); + + /* exit from sleep mode */ + CANx->MCR &= ~MCR_SLEEP; + + /* Request initialisation */ + CANx->MCR |= MCR_INRQ ; + + /* Wait the acknowledge */ + while (((CANx->MSR & MSR_INAK) != MSR_INAK) && (wait_ack != INAK_TimeOut)) + { + wait_ack++; + } + + /* ...and check acknowledged */ + if ((CANx->MSR & MSR_INAK) != MSR_INAK) + { + InitStatus = CANINITFAILED; + } + else + { + /* Set the time triggered communication mode */ + if (CAN_InitStruct->CAN_TTCM == ENABLE) + { + CANx->MCR |= MCR_TTCM; + } + else + { + CANx->MCR &= ~MCR_TTCM; + } + + /* Set the automatic bus-off management */ + if (CAN_InitStruct->CAN_ABOM == ENABLE) + { + CANx->MCR |= MCR_ABOM; + } + else + { + CANx->MCR &= ~MCR_ABOM; + } + + /* Set the automatic wake-up mode */ + if (CAN_InitStruct->CAN_AWUM == ENABLE) + { + CANx->MCR |= MCR_AWUM; + } + else + { + CANx->MCR &= ~MCR_AWUM; + } + + /* Set the no automatic retransmission */ + if (CAN_InitStruct->CAN_NART == ENABLE) + { + CANx->MCR |= MCR_NART; + } + else + { + CANx->MCR &= ~MCR_NART; + } + + /* Set the receive FIFO locked mode */ + if (CAN_InitStruct->CAN_RFLM == ENABLE) + { + CANx->MCR |= MCR_RFLM; + } + else + { + CANx->MCR &= ~MCR_RFLM; + } + + /* Set the transmit FIFO priority */ + if (CAN_InitStruct->CAN_TXFP == ENABLE) + { + CANx->MCR |= MCR_TXFP; + } + else + { + CANx->MCR &= ~MCR_TXFP; + } + + /* Set the bit timing register */ + CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | + ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | + ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1); + + /* Request leave initialisation */ + CANx->MCR &= ~MCR_INRQ; + + /* Wait the acknowledge */ + wait_ack = 0x00; + + while (((CANx->MSR & MSR_INAK) == MSR_INAK) && (wait_ack != INAK_TimeOut)) + { + wait_ack++; + } + + /* ...and check acknowledged */ + if ((CANx->MSR & MSR_INAK) == MSR_INAK) + { + InitStatus = CANINITFAILED; + } + else + { + InitStatus = CANINITOK ; + } + } + + /* At this step, return the status of initialization */ + return InitStatus; +} + +/** + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_FilterInitStruct. + * @param CAN_FilterInitStruct: pointer to a CAN_FilterInitTypeDef + * structure that contains the configuration information. + * @retval None. + */ +void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct) +{ + uint32_t filter_number_bit_pos = 0; + /* Check the parameters */ + assert_param(IS_CAN_FILTER_NUMBER(CAN_FilterInitStruct->CAN_FilterNumber)); + assert_param(IS_CAN_FILTER_MODE(CAN_FilterInitStruct->CAN_FilterMode)); + assert_param(IS_CAN_FILTER_SCALE(CAN_FilterInitStruct->CAN_FilterScale)); + assert_param(IS_CAN_FILTER_FIFO(CAN_FilterInitStruct->CAN_FilterFIFOAssignment)); + assert_param(IS_FUNCTIONAL_STATE(CAN_FilterInitStruct->CAN_FilterActivation)); + + filter_number_bit_pos = ((uint32_t)0x00000001) << CAN_FilterInitStruct->CAN_FilterNumber; + + /* Initialisation mode for the filter */ + CAN1->FMR |= FMR_FINIT; + + /* Filter Deactivation */ + CAN1->FA1R &= ~(uint32_t)filter_number_bit_pos; + + /* Filter Scale */ + if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit) + { + /* 16-bit scale for the filter */ + CAN1->FS1R &= ~(uint32_t)filter_number_bit_pos; + + /* First 16-bit identifier and First 16-bit mask */ + /* Or First 16-bit identifier and Second 16-bit identifier */ + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); + + /* Second 16-bit identifier and Second 16-bit mask */ + /* Or Third 16-bit identifier and Fourth 16-bit identifier */ + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh); + } + + if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_32bit) + { + /* 32-bit scale for the filter */ + CAN1->FS1R |= filter_number_bit_pos; + /* 32-bit identifier or First 32-bit identifier */ + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); + /* 32-bit mask or Second 32-bit identifier */ + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow); + } + + /* Filter Mode */ + if (CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdMask) + { + /*Id/Mask mode for the filter*/ + CAN1->FM1R &= ~(uint32_t)filter_number_bit_pos; + } + else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ + { + /*Identifier list mode for the filter*/ + CAN1->FM1R |= (uint32_t)filter_number_bit_pos; + } + + /* Filter FIFO assignment */ + if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_FilterFIFO0) + { + /* FIFO 0 assignation for the filter */ + CAN1->FFA1R &= ~(uint32_t)filter_number_bit_pos; + } + + if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_FilterFIFO1) + { + /* FIFO 1 assignation for the filter */ + CAN1->FFA1R |= (uint32_t)filter_number_bit_pos; + } + + /* Filter activation */ + if (CAN_FilterInitStruct->CAN_FilterActivation == ENABLE) + { + CAN1->FA1R |= filter_number_bit_pos; + } + + /* Leave the initialisation mode for the filter */ + CAN1->FMR &= ~FMR_FINIT; +} + +/** + * @brief Fills each CAN_InitStruct member with its default value. + * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure which + * will be initialized. + * @retval None. + */ +void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct) +{ + /* Reset CAN init structure parameters values */ + /* Initialize the time triggered communication mode */ + CAN_InitStruct->CAN_TTCM = DISABLE; + /* Initialize the automatic bus-off management */ + CAN_InitStruct->CAN_ABOM = DISABLE; + /* Initialize the automatic wake-up mode */ + CAN_InitStruct->CAN_AWUM = DISABLE; + /* Initialize the no automatic retransmission */ + CAN_InitStruct->CAN_NART = DISABLE; + /* Initialize the receive FIFO locked mode */ + CAN_InitStruct->CAN_RFLM = DISABLE; + /* Initialize the transmit FIFO priority */ + CAN_InitStruct->CAN_TXFP = DISABLE; + /* Initialize the CAN_Mode member */ + CAN_InitStruct->CAN_Mode = CAN_Mode_Normal; + /* Initialize the CAN_SJW member */ + CAN_InitStruct->CAN_SJW = CAN_SJW_1tq; + /* Initialize the CAN_BS1 member */ + CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq; + /* Initialize the CAN_BS2 member */ + CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq; + /* Initialize the CAN_Prescaler member */ + CAN_InitStruct->CAN_Prescaler = 1; +} + +/** + * @brief Select the start bank filter for slave CAN. + * @note This function applies only to STM32 Connectivity line devices. + * @param CAN_BankNumber: Select the start slave bank filter from 1..27. + * @retval None. + */ +void CAN_SlaveStartBank(uint8_t CAN_BankNumber) +{ + /* Check the parameters */ + assert_param(IS_CAN_BANKNUMBER(CAN_BankNumber)); + /* enter Initialisation mode for the filter */ + CAN1->FMR |= FMR_FINIT; + /* Select the start slave bank */ + CAN1->FMR &= (uint32_t)0xFFFFC0F1 ; + CAN1->FMR |= (uint32_t)(CAN_BankNumber)<<8; + /* Leave Initialisation mode for the filter */ + CAN1->FMR &= ~FMR_FINIT; +} + +/** + * @brief Enables or disables the specified CAN interrupts. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_IT: specifies the CAN interrupt sources to be enabled or disabled. + * This parameter can be: CAN_IT_TME, CAN_IT_FMP0, CAN_IT_FF0, + * CAN_IT_FOV0, CAN_IT_FMP1, CAN_IT_FF1, + * CAN_IT_FOV1, CAN_IT_EWG, CAN_IT_EPV, + * CAN_IT_LEC, CAN_IT_ERR, CAN_IT_WKU or + * CAN_IT_SLK. + * @param NewState: new state of the CAN interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_ITConfig(CAN_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected CAN interrupt */ + CANx->IER |= CAN_IT; + } + else + { + /* Disable the selected CAN interrupt */ + CANx->IER &= ~CAN_IT; + } +} + +/** + * @brief Initiates the transmission of a message. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param TxMessage: pointer to a structure which contains CAN Id, CAN + * DLC and CAN datas. + * @retval The number of the mailbox that is used for transmission + * or CAN_NO_MB if there is no empty mailbox. + */ +uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) +{ + uint8_t transmit_mailbox = 0; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_IDTYPE(TxMessage->IDE)); + assert_param(IS_CAN_RTR(TxMessage->RTR)); + assert_param(IS_CAN_DLC(TxMessage->DLC)); + + /* Select one empty transmit mailbox */ + if ((CANx->TSR&TSR_TME0) == TSR_TME0) + { + transmit_mailbox = 0; + } + else if ((CANx->TSR&TSR_TME1) == TSR_TME1) + { + transmit_mailbox = 1; + } + else if ((CANx->TSR&TSR_TME2) == TSR_TME2) + { + transmit_mailbox = 2; + } + else + { + transmit_mailbox = CAN_NO_MB; + } + + if (transmit_mailbox != CAN_NO_MB) + { + /* Set up the Id */ + CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; + if (TxMessage->IDE == CAN_ID_STD) + { + assert_param(IS_CAN_STDID(TxMessage->StdId)); + CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | TxMessage->RTR); + } + else + { + assert_param(IS_CAN_EXTID(TxMessage->ExtId)); + CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId<<3) | TxMessage->IDE | + TxMessage->RTR); + } + + + /* Set up the DLC */ + TxMessage->DLC &= (uint8_t)0x0000000F; + CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0; + CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC; + + /* Set up the data field */ + CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) | + ((uint32_t)TxMessage->Data[2] << 16) | + ((uint32_t)TxMessage->Data[1] << 8) | + ((uint32_t)TxMessage->Data[0])); + CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) | + ((uint32_t)TxMessage->Data[6] << 16) | + ((uint32_t)TxMessage->Data[5] << 8) | + ((uint32_t)TxMessage->Data[4])); + /* Request transmission */ + CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ; + } + return transmit_mailbox; +} + +/** + * @brief Checks the transmission of a message. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param TransmitMailbox: the number of the mailbox that is used for transmission. + * @retval CANTXOK if the CAN driver transmits the message, CANTXFAILED in an other case. + */ +uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox) +{ + /* RQCP, TXOK and TME bits */ + uint8_t state = 0; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_TRANSMITMAILBOX(TransmitMailbox)); + switch (TransmitMailbox) + { + case (0): state |= (uint8_t)((CANx->TSR & TSR_RQCP0) << 2); + state |= (uint8_t)((CANx->TSR & TSR_TXOK0) >> 0); + state |= (uint8_t)((CANx->TSR & TSR_TME0) >> 26); + break; + case (1): state |= (uint8_t)((CANx->TSR & TSR_RQCP1) >> 6); + state |= (uint8_t)((CANx->TSR & TSR_TXOK1) >> 8); + state |= (uint8_t)((CANx->TSR & TSR_TME1) >> 27); + break; + case (2): state |= (uint8_t)((CANx->TSR & TSR_RQCP2) >> 14); + state |= (uint8_t)((CANx->TSR & TSR_TXOK2) >> 16); + state |= (uint8_t)((CANx->TSR & TSR_TME2) >> 28); + break; + default: + state = CANTXFAILED; + break; + } + switch (state) + { + /* transmit pending */ + case (0x0): state = CANTXPENDING; + break; + /* transmit failed */ + case (0x5): state = CANTXFAILED; + break; + /* transmit succedeed */ + case (0x7): state = CANTXOK; + break; + default: + state = CANTXFAILED; + break; + } + return state; +} + +/** + * @brief Cancels a transmit request. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param Mailbox: Mailbox number. + * @retval None. + */ +void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_TRANSMITMAILBOX(Mailbox)); + /* abort transmission */ + switch (Mailbox) + { + case (0): CANx->TSR |= TSR_ABRQ0; + break; + case (1): CANx->TSR |= TSR_ABRQ1; + break; + case (2): CANx->TSR |= TSR_ABRQ2; + break; + default: + break; + } +} + +/** + * @brief Releases a FIFO. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param FIFONumber: FIFO to release, CAN_FIFO0 or CAN_FIFO1. + * @retval None. + */ +void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_FIFO(FIFONumber)); + /* Release FIFO0 */ + if (FIFONumber == CAN_FIFO0) + { + CANx->RF0R = RF0R_RFOM0; + } + /* Release FIFO1 */ + else /* FIFONumber == CAN_FIFO1 */ + { + CANx->RF1R = RF1R_RFOM1; + } +} + +/** + * @brief Returns the number of pending messages. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. + * @retval NbMessage which is the number of pending message. + */ +uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber) +{ + uint8_t message_pending=0; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_FIFO(FIFONumber)); + if (FIFONumber == CAN_FIFO0) + { + message_pending = (uint8_t)(CANx->RF0R&(uint32_t)0x03); + } + else if (FIFONumber == CAN_FIFO1) + { + message_pending = (uint8_t)(CANx->RF1R&(uint32_t)0x03); + } + else + { + message_pending = 0; + } + return message_pending; +} + +/** + * @brief Receives a message. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. + * @param RxMessage: pointer to a structure receive message which + * contains CAN Id, CAN DLC, CAN datas and FMI number. + * @retval None. + */ +void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_FIFO(FIFONumber)); + /* Get the Id */ + RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RIR; + if (RxMessage->IDE == CAN_ID_STD) + { + RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 21); + } + else + { + RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 3); + } + + RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RIR; + /* Get the DLC */ + RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RDTR; + /* Get the FMI */ + RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDTR >> 8); + /* Get the data field */ + RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDLR; + RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 8); + RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 16); + RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 24); + RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDHR; + RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 8); + RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 16); + RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 24); + /* Release the FIFO */ + CAN_FIFORelease(CANx, FIFONumber); +} + +/** + * @brief Enables or disables the DBG Freeze for CAN. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param NewState: new state of the CAN peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable Debug Freeze */ + CANx->MCR |= MCR_DBF; + } + else + { + /* Disable Debug Freeze */ + CANx->MCR &= ~MCR_DBF; + } +} + +/** + * @brief Enters the low power mode. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @retval CANSLEEPOK if sleep entered, CANSLEEPFAILED in an other case. + */ +uint8_t CAN_Sleep(CAN_TypeDef* CANx) +{ + uint8_t sleepstatus = CANSLEEPFAILED; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + /* Request Sleep mode */ + CANx->MCR = (((CANx->MCR) & (uint32_t)(~MCR_INRQ)) | MCR_SLEEP); + + /* Sleep mode status */ + if ((CANx->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) == CAN_MSR_SLAK) + { + /* Sleep mode not entered */ + sleepstatus = CANSLEEPOK; + } + /* At this step, sleep mode status */ + return (uint8_t)sleepstatus; +} + +/** + * @brief Wakes the CAN up. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @retval CANWAKEUPOK if sleep mode left, CANWAKEUPFAILED in an other case. + */ +uint8_t CAN_WakeUp(CAN_TypeDef* CANx) +{ + uint32_t wait_slak = SLAK_TimeOut ; + uint8_t wakeupstatus = CANWAKEUPFAILED; + + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + /* Wake up request */ + CANx->MCR &= ~MCR_SLEEP; + + /* Sleep mode status */ + while(((CANx->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)&&(wait_slak!=0x00)) + { + wait_slak--; + } + if((CANx->MSR & CAN_MSR_SLAK) != CAN_MSR_SLAK) + { + /* Sleep mode exited */ + wakeupstatus = CANWAKEUPOK; + } + /* At this step, sleep mode status */ + return (uint8_t)wakeupstatus; +} + +/** + * @brief Checks whether the specified CAN flag is set or not. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_FLAG: specifies the flag to check. + * This parameter can be: CAN_FLAG_EWG, CAN_FLAG_EPV or CAN_FLAG_BOF. + * @retval The new state of CAN_FLAG (SET or RESET). + */ +FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_FLAG(CAN_FLAG)); + /* Check the status of the specified CAN flag */ + if ((CANx->ESR & CAN_FLAG) != (uint32_t)RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + /* Return the CAN_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the CAN's pending flags. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_FLAG: specifies the flag to clear. + * @retval None. + */ +void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_FLAG(CAN_FLAG)); + /* Clear the selected CAN flags */ + CANx->ESR &= ~CAN_FLAG; +} + +/** + * @brief Checks whether the specified CAN interrupt has occurred or not. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_IT: specifies the CAN interrupt source to check. + * This parameter can be: CAN_IT_RQCP0, CAN_IT_RQCP1, CAN_IT_RQCP2, + * CAN_IT_FF0, CAN_IT_FOV0, CAN_IT_FF1, + * CAN_IT_FOV1, CAN_IT_EWG, CAN_IT_EPV, + * CAN_IT_BOF, CAN_IT_WKU or CAN_IT_SLK. + * @retval The new state of CAN_IT (SET or RESET). + */ +ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT) +{ + ITStatus pendingbitstatus = RESET; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_ITStatus(CAN_IT)); + switch (CAN_IT) + { + case CAN_IT_RQCP0: + pendingbitstatus = CheckITStatus(CANx->TSR, TSR_RQCP0); + break; + case CAN_IT_RQCP1: + pendingbitstatus = CheckITStatus(CANx->TSR, TSR_RQCP1); + break; + case CAN_IT_RQCP2: + pendingbitstatus = CheckITStatus(CANx->TSR, TSR_RQCP2); + break; + case CAN_IT_FF0: + pendingbitstatus = CheckITStatus(CANx->RF0R, RF0R_FULL0); + break; + case CAN_IT_FOV0: + pendingbitstatus = CheckITStatus(CANx->RF0R, RF0R_FOVR0); + break; + case CAN_IT_FF1: + pendingbitstatus = CheckITStatus(CANx->RF1R, RF1R_FULL1); + break; + case CAN_IT_FOV1: + pendingbitstatus = CheckITStatus(CANx->RF1R, RF1R_FOVR1); + break; + case CAN_IT_EWG: + pendingbitstatus = CheckITStatus(CANx->ESR, ESR_EWGF); + break; + case CAN_IT_EPV: + pendingbitstatus = CheckITStatus(CANx->ESR, ESR_EPVF); + break; + case CAN_IT_BOF: + pendingbitstatus = CheckITStatus(CANx->ESR, ESR_BOFF); + break; + case CAN_IT_SLK: + pendingbitstatus = CheckITStatus(CANx->MSR, MSR_SLAKI); + break; + case CAN_IT_WKU: + pendingbitstatus = CheckITStatus(CANx->MSR, MSR_WKUI); + break; + default : + pendingbitstatus = RESET; + break; + } + /* Return the CAN_IT status */ + return pendingbitstatus; +} + +/** + * @brief Clears the CAN’s interrupt pending bits. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param CAN_IT: specifies the interrupt pending bit to clear. + * @retval None. + */ +void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_ITStatus(CAN_IT)); + switch (CAN_IT) + { + case CAN_IT_RQCP0: + CANx->TSR = TSR_RQCP0; /* rc_w1*/ + break; + case CAN_IT_RQCP1: + CANx->TSR = TSR_RQCP1; /* rc_w1*/ + break; + case CAN_IT_RQCP2: + CANx->TSR = TSR_RQCP2; /* rc_w1*/ + break; + case CAN_IT_FF0: + CANx->RF0R = RF0R_FULL0; /* rc_w1*/ + break; + case CAN_IT_FOV0: + CANx->RF0R = RF0R_FOVR0; /* rc_w1*/ + break; + case CAN_IT_FF1: + CANx->RF1R = RF1R_FULL1; /* rc_w1*/ + break; + case CAN_IT_FOV1: + CANx->RF1R = RF1R_FOVR1; /* rc_w1*/ + break; + case CAN_IT_EWG: + CANx->ESR &= ~ ESR_EWGF; /* rw */ + break; + case CAN_IT_EPV: + CANx->ESR &= ~ ESR_EPVF; /* rw */ + break; + case CAN_IT_BOF: + CANx->ESR &= ~ ESR_BOFF; /* rw */ + break; + case CAN_IT_WKU: + CANx->MSR = MSR_WKUI; /* rc_w1*/ + break; + case CAN_IT_SLK: + CANx->MSR = MSR_SLAKI; /* rc_w1*/ + break; + default : + break; + } +} + +/** + * @brief Checks whether the CAN interrupt has occurred or not. + * @param CAN_Reg: specifies the CAN interrupt register to check. + * @param It_Bit: specifies the interrupt source bit to check. + * @retval The new state of the CAN Interrupt (SET or RESET). + */ +static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit) +{ + ITStatus pendingbitstatus = RESET; + + if ((CAN_Reg & It_Bit) != (uint32_t)RESET) + { + /* CAN_IT is set */ + pendingbitstatus = SET; + } + else + { + /* CAN_IT is reset */ + pendingbitstatus = RESET; + } + return pendingbitstatus; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c new file mode 100644 index 0000000..d0c8d7a --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c @@ -0,0 +1,163 @@ +/** + ****************************************************************************** + * @file stm32f10x_crc.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the CRC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_crc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup CRC + * @brief CRC driver modules + * @{ + */ + +/** @defgroup CRC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Defines + * @{ + */ + +/* CR register bit mask */ + +#define CR_RESET_Set ((uint32_t)0x00000001) + +/** + * @} + */ + +/** @defgroup CRC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Functions + * @{ + */ + +/** + * @brief Resets the CRC Data register (DR). + * @param None + * @retval None + */ +void CRC_ResetDR(void) +{ + /* Reset CRC generator */ + CRC->CR = CR_RESET_Set; +} + +/** + * @brief Computes the 32-bit CRC of a given data word(32-bit). + * @param Data: data word(32-bit) to compute its CRC + * @retval 32-bit CRC + */ +uint32_t CRC_CalcCRC(uint32_t Data) +{ + CRC->DR = Data; + + return (CRC->DR); +} + +/** + * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). + * @param pBuffer: pointer to the buffer containing the data to be computed + * @param BufferLength: length of the buffer to be computed + * @retval 32-bit CRC + */ +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength) +{ + uint32_t index = 0; + + for(index = 0; index < BufferLength; index++) + { + CRC->DR = pBuffer[index]; + } + return (CRC->DR); +} + +/** + * @brief Returns the current CRC value. + * @param None + * @retval 32-bit CRC + */ +uint32_t CRC_GetCRC(void) +{ + return (CRC->DR); +} + +/** + * @brief Stores a 8-bit data in the Independent Data(ID) register. + * @param IDValue: 8-bit value to be stored in the ID register + * @retval None + */ +void CRC_SetIDRegister(uint8_t IDValue) +{ + CRC->IDR = IDValue; +} + +/** + * @brief Returns the 8-bit data stored in the Independent Data(ID) register + * @param None + * @retval 8-bit value of the ID register + */ +uint8_t CRC_GetIDRegister(void) +{ + return (CRC->IDR); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c new file mode 100644 index 0000000..f07e937 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c @@ -0,0 +1,431 @@ +/** + ****************************************************************************** + * @file stm32f10x_dac.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the DAC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_dac.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup DAC + * @brief DAC driver modules + * @{ + */ + +/** @defgroup DAC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_Defines + * @{ + */ + +/* DAC EN mask */ +#define CR_EN_Set ((uint32_t)0x00000001) + +/* DAC DMAEN mask */ +#define CR_DMAEN_Set ((uint32_t)0x00001000) + +/* CR register Mask */ +#define CR_CLEAR_Mask ((uint32_t)0x00000FFE) + +/* DAC SWTRIG mask */ +#define SWTRIGR_SWTRIG_Set ((uint32_t)0x00000001) + +/* DAC Dual Channels SWTRIG masks */ +#define DUAL_SWTRIG_Set ((uint32_t)0x00000003) +#define DUAL_SWTRIG_Reset ((uint32_t)0xFFFFFFFC) + +/* DHR registers offsets */ +#define DHR12R1_Offset ((uint32_t)0x00000008) +#define DHR12R2_Offset ((uint32_t)0x00000014) +#define DHR12RD_Offset ((uint32_t)0x00000020) + +/* DOR register offset */ +#define DOR_Offset ((uint32_t)0x0000002C) +/** + * @} + */ + +/** @defgroup DAC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the DAC peripheral registers to their default reset values. + * @param None + * @retval None + */ +void DAC_DeInit(void) +{ + /* Enable DAC reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE); + /* Release DAC from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE); +} + +/** + * @brief Initializes the DAC peripheral according to the specified + * parameters in the DAC_InitStruct. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure that + * contains the configuration information for the specified DAC channel. + * @retval None + */ +void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + /* Check the DAC parameters */ + assert_param(IS_DAC_TRIGGER(DAC_InitStruct->DAC_Trigger)); + assert_param(IS_DAC_GENERATE_WAVE(DAC_InitStruct->DAC_WaveGeneration)); + assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude)); + assert_param(IS_DAC_OUTPUT_BUFFER_STATE(DAC_InitStruct->DAC_OutputBuffer)); +/*---------------------------- DAC CR Configuration --------------------------*/ + /* Get the DAC CR value */ + tmpreg1 = DAC->CR; + /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */ + tmpreg1 &= ~(CR_CLEAR_Mask << DAC_Channel); + /* Configure for the selected DAC channel: buffer output, trigger, wave genration, + mask/amplitude for wave genration */ + /* Set TSELx and TENx bits according to DAC_Trigger value */ + /* Set WAVEx bits according to DAC_WaveGeneration value */ + /* Set MAMPx bits according to DAC_LFSRUnmask_TriangleAmplitude value */ + /* Set BOFFx bit according to DAC_OutputBuffer value */ + tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration | + DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | DAC_InitStruct->DAC_OutputBuffer); + /* Calculate CR register value depending on DAC_Channel */ + tmpreg1 |= tmpreg2 << DAC_Channel; + /* Write to DAC CR */ + DAC->CR = tmpreg1; +} + +/** + * @brief Fills each DAC_InitStruct member with its default value. + * @param DAC_InitStruct : pointer to a DAC_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct) +{ +/*--------------- Reset DAC init structure parameters values -----------------*/ + /* Initialize the DAC_Trigger member */ + DAC_InitStruct->DAC_Trigger = DAC_Trigger_None; + /* Initialize the DAC_WaveGeneration member */ + DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None; + /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ + DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; + /* Initialize the DAC_OutputBuffer member */ + DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable; +} + +/** + * @brief Enables or disables the specified DAC channel. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param NewState: new state of the DAC channel. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected DAC channel */ + DAC->CR |= CR_EN_Set << DAC_Channel; + } + else + { + /* Disable the selected DAC channel */ + DAC->CR &= ~(CR_EN_Set << DAC_Channel); + } +} + +/** + * @brief Enables or disables the specified DAC channel DMA request. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param NewState: new state of the selected DAC channel DMA request. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected DAC channel DMA request */ + DAC->CR |= CR_DMAEN_Set << DAC_Channel; + } + else + { + /* Disable the selected DAC channel DMA request */ + DAC->CR &= ~(CR_DMAEN_Set << DAC_Channel); + } +} + +/** + * @brief Enables or disables the selected DAC channel software trigger. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param NewState: new state of the selected DAC channel software trigger. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable software trigger for the selected DAC channel */ + DAC->SWTRIGR |= SWTRIGR_SWTRIG_Set << (DAC_Channel >> 4); + } + else + { + /* Disable software trigger for the selected DAC channel */ + DAC->SWTRIGR &= ~(SWTRIGR_SWTRIG_Set << (DAC_Channel >> 4)); + } +} + +/** + * @brief Enables or disables simultaneously the two DAC channels software + * triggers. + * @param NewState: new state of the DAC channels software triggers. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_DualSoftwareTriggerCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable software trigger for both DAC channels */ + DAC->SWTRIGR |= DUAL_SWTRIG_Set ; + } + else + { + /* Disable software trigger for both DAC channels */ + DAC->SWTRIGR &= DUAL_SWTRIG_Reset; + } +} + +/** + * @brief Enables or disables the selected DAC channel wave generation. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_Wave: Specifies the wave type to enable or disable. + * This parameter can be one of the following values: + * @arg DAC_Wave_Noise: noise wave generation + * @arg DAC_Wave_Triangle: triangle wave generation + * @param NewState: new state of the selected DAC channel wave generation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_WAVE(DAC_Wave)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected wave generation for the selected DAC channel */ + DAC->CR |= DAC_Wave << DAC_Channel; + } + else + { + /* Disable the selected wave generation for the selected DAC channel */ + DAC->CR &= ~(DAC_Wave << DAC_Channel); + } +} + +/** + * @brief Set the specified data holding register value for DAC channel1. + * @param DAC_Align: Specifies the data alignement for DAC channel1. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignement selected + * @arg DAC_Align_12b_L: 12bit left data alignement selected + * @arg DAC_Align_12b_R: 12bit right data alignement selected + * @param Data : Data to be loaded in the selected data holding register. + * @retval None + */ +void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_ALIGN(DAC_Align)); + assert_param(IS_DAC_DATA(Data)); + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12R1_Offset + DAC_Align; + + /* Set the DAC channel1 selected data holding register */ + *(__IO uint32_t *) tmp = Data; +} + +/** + * @brief Set the specified data holding register value for DAC channel2. + * @param DAC_Align: Specifies the data alignement for DAC channel2. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignement selected + * @arg DAC_Align_12b_L: 12bit left data alignement selected + * @arg DAC_Align_12b_R: 12bit right data alignement selected + * @param Data : Data to be loaded in the selected data holding register. + * @retval None + */ +void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_ALIGN(DAC_Align)); + assert_param(IS_DAC_DATA(Data)); + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12R2_Offset + DAC_Align; + + /* Set the DAC channel2 selected data holding register */ + *(__IO uint32_t *)tmp = Data; +} + +/** + * @brief Set the specified data holding register value for dual channel + * DAC. + * @param DAC_Align: Specifies the data alignement for dual channel DAC. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignement selected + * @arg DAC_Align_12b_L: 12bit left data alignement selected + * @arg DAC_Align_12b_R: 12bit right data alignement selected + * @param Data2: Data for DAC Channel2 to be loaded in the selected data + * holding register. + * @param Data1: Data for DAC Channel1 to be loaded in the selected data + * holding register. + * @retval None + */ +void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1) +{ + uint32_t data = 0, tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_ALIGN(DAC_Align)); + assert_param(IS_DAC_DATA(Data1)); + assert_param(IS_DAC_DATA(Data2)); + + /* Calculate and set dual DAC data holding register value */ + if (DAC_Align == DAC_Align_8b_R) + { + data = ((uint32_t)Data2 << 8) | Data1; + } + else + { + data = ((uint32_t)Data2 << 16) | Data1; + } + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12RD_Offset + DAC_Align; + + /* Set the dual DAC selected data holding register */ + *(__IO uint32_t *)tmp = data; +} + +/** + * @brief Returns the last data output value of the selected DAC cahnnel. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @retval The selected DAC channel data output value. + */ +uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + + tmp = (uint32_t) DAC_BASE ; + tmp += DOR_Offset + ((uint32_t)DAC_Channel >> 2); + + /* Returns the DAC channel data output register value */ + return (uint16_t) (*(__IO uint32_t*) tmp); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c new file mode 100644 index 0000000..852f365 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c @@ -0,0 +1,152 @@ +/** + ****************************************************************************** + * @file stm32f10x_dbgmcu.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the DBGMCU firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_dbgmcu.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup DBGMCU + * @brief DBGMCU driver modules + * @{ + */ + +/** @defgroup DBGMCU_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Defines + * @{ + */ + +#define IDCODE_DEVID_Mask ((uint32_t)0x00000FFF) +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Functions + * @{ + */ + +/** + * @brief Returns the device revision identifier. + * @param None + * @retval Device revision identifier + */ +uint32_t DBGMCU_GetREVID(void) +{ + return(DBGMCU->IDCODE >> 16); +} + +/** + * @brief Returns the device identifier. + * @param None + * @retval Device identifier + */ +uint32_t DBGMCU_GetDEVID(void) +{ + return(DBGMCU->IDCODE & IDCODE_DEVID_Mask); +} + +/** + * @brief Configures the specified peripheral and low power mode behavior + * when the MCU under Debug mode. + * @param DBGMCU_Periph: specifies the peripheral and low power mode. + * This parameter can be any combination of the following values: + * @arg DBGMCU_SLEEP: Keep debugger connection during SLEEP mode + * @arg DBGMCU_STOP: Keep debugger connection during STOP mode + * @arg DBGMCU_STANDBY: Keep debugger connection during STANDBY mode + * @arg DBGMCU_IWDG_STOP: Debug IWDG stopped when Core is halted + * @arg DBGMCU_WWDG_STOP: Debug WWDG stopped when Core is halted + * @arg DBGMCU_TIM1_STOP: TIM1 counter stopped when Core is halted + * @arg DBGMCU_TIM2_STOP: TIM2 counter stopped when Core is halted + * @arg DBGMCU_TIM3_STOP: TIM3 counter stopped when Core is halted + * @arg DBGMCU_TIM4_STOP: TIM4 counter stopped when Core is halted + * @arg DBGMCU_CAN1_STOP: Debug CAN2 stopped when Core is halted + * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_TIM5_STOP: TIM5 counter stopped when Core is halted + * @arg DBGMCU_TIM6_STOP: TIM6 counter stopped when Core is halted + * @arg DBGMCU_TIM7_STOP: TIM7 counter stopped when Core is halted + * @arg DBGMCU_TIM8_STOP: TIM8 counter stopped when Core is halted + * @arg DBGMCU_CAN2_STOP: Debug CAN2 stopped when Core is halted + * @param NewState: new state of the specified peripheral in Debug mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DBGMCU_PERIPH(DBGMCU_Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + DBGMCU->CR |= DBGMCU_Periph; + } + else + { + DBGMCU->CR &= ~DBGMCU_Periph; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c new file mode 100644 index 0000000..f801b9b --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c @@ -0,0 +1,693 @@ +/** + ****************************************************************************** + * @file stm32f10x_dma.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the DMA firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_dma.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup DMA + * @brief DMA driver modules + * @{ + */ + +/** @defgroup DMA_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup DMA_Private_Defines + * @{ + */ + +/* DMA ENABLE mask */ +#define CCR_ENABLE_Set ((uint32_t)0x00000001) +#define CCR_ENABLE_Reset ((uint32_t)0xFFFFFFFE) + +/* DMA1 Channelx interrupt pending bit masks */ +#define DMA1_Channel1_IT_Mask ((uint32_t)0x0000000F) +#define DMA1_Channel2_IT_Mask ((uint32_t)0x000000F0) +#define DMA1_Channel3_IT_Mask ((uint32_t)0x00000F00) +#define DMA1_Channel4_IT_Mask ((uint32_t)0x0000F000) +#define DMA1_Channel5_IT_Mask ((uint32_t)0x000F0000) +#define DMA1_Channel6_IT_Mask ((uint32_t)0x00F00000) +#define DMA1_Channel7_IT_Mask ((uint32_t)0x0F000000) + +/* DMA2 Channelx interrupt pending bit masks */ +#define DMA2_Channel1_IT_Mask ((uint32_t)0x0000000F) +#define DMA2_Channel2_IT_Mask ((uint32_t)0x000000F0) +#define DMA2_Channel3_IT_Mask ((uint32_t)0x00000F00) +#define DMA2_Channel4_IT_Mask ((uint32_t)0x0000F000) +#define DMA2_Channel5_IT_Mask ((uint32_t)0x000F0000) + +/* DMA2 FLAG mask */ +#define FLAG_Mask ((uint32_t)0x10000000) + +/* DMA registers Masks */ +#define CCR_CLEAR_Mask ((uint32_t)0xFFFF800F) + +/** + * @} + */ + +/** @defgroup DMA_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the DMAy Channelx registers to their default reset + * values. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @retval None + */ +void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + /* Disable the selected DMAy Channelx */ + DMAy_Channelx->CCR &= CCR_ENABLE_Reset; + /* Reset DMAy Channelx control register */ + DMAy_Channelx->CCR = 0; + + /* Reset DMAy Channelx remaining bytes register */ + DMAy_Channelx->CNDTR = 0; + + /* Reset DMAy Channelx peripheral address register */ + DMAy_Channelx->CPAR = 0; + + /* Reset DMAy Channelx memory address register */ + DMAy_Channelx->CMAR = 0; + + if (DMAy_Channelx == DMA1_Channel1) + { + /* Reset interrupt pending bits for DMA1 Channel1 */ + DMA1->IFCR |= DMA1_Channel1_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel2) + { + /* Reset interrupt pending bits for DMA1 Channel2 */ + DMA1->IFCR |= DMA1_Channel2_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel3) + { + /* Reset interrupt pending bits for DMA1 Channel3 */ + DMA1->IFCR |= DMA1_Channel3_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel4) + { + /* Reset interrupt pending bits for DMA1 Channel4 */ + DMA1->IFCR |= DMA1_Channel4_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel5) + { + /* Reset interrupt pending bits for DMA1 Channel5 */ + DMA1->IFCR |= DMA1_Channel5_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel6) + { + /* Reset interrupt pending bits for DMA1 Channel6 */ + DMA1->IFCR |= DMA1_Channel6_IT_Mask; + } + else if (DMAy_Channelx == DMA1_Channel7) + { + /* Reset interrupt pending bits for DMA1 Channel7 */ + DMA1->IFCR |= DMA1_Channel7_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel1) + { + /* Reset interrupt pending bits for DMA2 Channel1 */ + DMA2->IFCR |= DMA2_Channel1_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel2) + { + /* Reset interrupt pending bits for DMA2 Channel2 */ + DMA2->IFCR |= DMA2_Channel2_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel3) + { + /* Reset interrupt pending bits for DMA2 Channel3 */ + DMA2->IFCR |= DMA2_Channel3_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel4) + { + /* Reset interrupt pending bits for DMA2 Channel4 */ + DMA2->IFCR |= DMA2_Channel4_IT_Mask; + } + else + { + if (DMAy_Channelx == DMA2_Channel5) + { + /* Reset interrupt pending bits for DMA2 Channel5 */ + DMA2->IFCR |= DMA2_Channel5_IT_Mask; + } + } +} + +/** + * @brief Initializes the DMAy Channelx according to the specified + * parameters in the DMA_InitStruct. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param DMA_InitStruct: pointer to a DMA_InitTypeDef structure that + * contains the configuration information for the specified DMA Channel. + * @retval None + */ +void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + assert_param(IS_DMA_DIR(DMA_InitStruct->DMA_DIR)); + assert_param(IS_DMA_BUFFER_SIZE(DMA_InitStruct->DMA_BufferSize)); + assert_param(IS_DMA_PERIPHERAL_INC_STATE(DMA_InitStruct->DMA_PeripheralInc)); + assert_param(IS_DMA_MEMORY_INC_STATE(DMA_InitStruct->DMA_MemoryInc)); + assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(DMA_InitStruct->DMA_PeripheralDataSize)); + assert_param(IS_DMA_MEMORY_DATA_SIZE(DMA_InitStruct->DMA_MemoryDataSize)); + assert_param(IS_DMA_MODE(DMA_InitStruct->DMA_Mode)); + assert_param(IS_DMA_PRIORITY(DMA_InitStruct->DMA_Priority)); + assert_param(IS_DMA_M2M_STATE(DMA_InitStruct->DMA_M2M)); + +/*--------------------------- DMAy Channelx CCR Configuration -----------------*/ + /* Get the DMAy_Channelx CCR value */ + tmpreg = DMAy_Channelx->CCR; + /* Clear MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */ + tmpreg &= CCR_CLEAR_Mask; + /* Configure DMAy Channelx: data transfer, data size, priority level and mode */ + /* Set DIR bit according to DMA_DIR value */ + /* Set CIRC bit according to DMA_Mode value */ + /* Set PINC bit according to DMA_PeripheralInc value */ + /* Set MINC bit according to DMA_MemoryInc value */ + /* Set PSIZE bits according to DMA_PeripheralDataSize value */ + /* Set MSIZE bits according to DMA_MemoryDataSize value */ + /* Set PL bits according to DMA_Priority value */ + /* Set the MEM2MEM bit according to DMA_M2M value */ + tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode | + DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc | + DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize | + DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M; + + /* Write to DMAy Channelx CCR */ + DMAy_Channelx->CCR = tmpreg; + +/*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/ + /* Write to DMAy Channelx CNDTR */ + DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize; + +/*--------------------------- DMAy Channelx CPAR Configuration ----------------*/ + /* Write to DMAy Channelx CPAR */ + DMAy_Channelx->CPAR = DMA_InitStruct->DMA_PeripheralBaseAddr; + +/*--------------------------- DMAy Channelx CMAR Configuration ----------------*/ + /* Write to DMAy Channelx CMAR */ + DMAy_Channelx->CMAR = DMA_InitStruct->DMA_MemoryBaseAddr; +} + +/** + * @brief Fills each DMA_InitStruct member with its default value. + * @param DMA_InitStruct : pointer to a DMA_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct) +{ +/*-------------- Reset DMA init structure parameters values ------------------*/ + /* Initialize the DMA_PeripheralBaseAddr member */ + DMA_InitStruct->DMA_PeripheralBaseAddr = 0; + /* Initialize the DMA_MemoryBaseAddr member */ + DMA_InitStruct->DMA_MemoryBaseAddr = 0; + /* Initialize the DMA_DIR member */ + DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralSRC; + /* Initialize the DMA_BufferSize member */ + DMA_InitStruct->DMA_BufferSize = 0; + /* Initialize the DMA_PeripheralInc member */ + DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable; + /* Initialize the DMA_MemoryInc member */ + DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable; + /* Initialize the DMA_PeripheralDataSize member */ + DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + /* Initialize the DMA_MemoryDataSize member */ + DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + /* Initialize the DMA_Mode member */ + DMA_InitStruct->DMA_Mode = DMA_Mode_Normal; + /* Initialize the DMA_Priority member */ + DMA_InitStruct->DMA_Priority = DMA_Priority_Low; + /* Initialize the DMA_M2M member */ + DMA_InitStruct->DMA_M2M = DMA_M2M_Disable; +} + +/** + * @brief Enables or disables the specified DMAy Channelx. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param NewState: new state of the DMAy Channelx. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMAy Channelx */ + DMAy_Channelx->CCR |= CCR_ENABLE_Set; + } + else + { + /* Disable the selected DMAy Channelx */ + DMAy_Channelx->CCR &= CCR_ENABLE_Reset; + } +} + +/** + * @brief Enables or disables the specified DMAy Channelx interrupts. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param DMA_IT: specifies the DMA interrupts sources to be enabled + * or disabled. + * This parameter can be any combination of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask + * @arg DMA_IT_HT: Half transfer interrupt mask + * @arg DMA_IT_TE: Transfer error interrupt mask + * @param NewState: new state of the specified DMA interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + assert_param(IS_DMA_CONFIG_IT(DMA_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected DMA interrupts */ + DMAy_Channelx->CCR |= DMA_IT; + } + else + { + /* Disable the selected DMA interrupts */ + DMAy_Channelx->CCR &= ~DMA_IT; + } +} + +/** + * @brief Returns the number of remaining data units in the current + * DMAy Channelx transfer. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @retval The number of remaining data units in the current DMAy Channelx + * transfer. + */ +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + /* Return the number of remaining data units for DMAy Channelx */ + return ((uint16_t)(DMAy_Channelx->CNDTR)); +} + +/** + * @brief Checks whether the specified DMAy Channelx flag is set or not. + * @param DMA_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. + * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. + * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. + * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. + * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. + * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. + * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. + * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. + * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. + * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. + * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. + * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. + * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. + * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. + * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. + * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. + * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. + * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. + * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. + * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. + * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. + * @retval The new state of DMA_FLAG (SET or RESET). + */ +FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_DMA_GET_FLAG(DMA_FLAG)); + + /* Calculate the used DMA */ + if ((DMA_FLAG & FLAG_Mask) != (uint32_t)RESET) + { + /* Get DMA2 ISR register value */ + tmpreg = DMA2->ISR ; + } + else + { + /* Get DMA1 ISR register value */ + tmpreg = DMA1->ISR ; + } + + /* Check the status of the specified DMA flag */ + if ((tmpreg & DMA_FLAG) != (uint32_t)RESET) + { + /* DMA_FLAG is set */ + bitstatus = SET; + } + else + { + /* DMA_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the DMA_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the DMAy Channelx's pending flags. + * @param DMA_FLAG: specifies the flag to clear. + * This parameter can be any combination (for the same DMA) of the following values: + * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. + * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. + * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. + * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. + * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. + * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. + * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. + * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. + * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. + * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. + * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. + * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. + * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. + * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. + * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. + * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. + * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. + * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. + * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. + * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. + * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. + * @retval None + */ +void DMA_ClearFlag(uint32_t DMA_FLAG) +{ + /* Check the parameters */ + assert_param(IS_DMA_CLEAR_FLAG(DMA_FLAG)); + /* Calculate the used DMA */ + + if ((DMA_FLAG & FLAG_Mask) != (uint32_t)RESET) + { + /* Clear the selected DMA flags */ + DMA2->IFCR = DMA_FLAG; + } + else + { + /* Clear the selected DMA flags */ + DMA1->IFCR = DMA_FLAG; + } +} + +/** + * @brief Checks whether the specified DMAy Channelx interrupt has occurred or not. + * @param DMA_IT: specifies the DMA interrupt source to check. + * This parameter can be one of the following values: + * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. + * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. + * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. + * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. + * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. + * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. + * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. + * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. + * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. + * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. + * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. + * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. + * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. + * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. + * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. + * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. + * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. + * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. + * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. + * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. + * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt. + * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. + * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. + * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. + * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. + * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. + * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. + * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. + * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. + * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. + * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. + * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. + * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. + * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. + * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. + * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. + * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. + * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. + * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. + * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. + * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. + * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. + * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. + * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. + * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. + * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. + * @retval The new state of DMA_IT (SET or RESET). + */ +ITStatus DMA_GetITStatus(uint32_t DMA_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_DMA_GET_IT(DMA_IT)); + + /* Calculate the used DMA */ + if ((DMA_IT & FLAG_Mask) != (uint32_t)RESET) + { + /* Get DMA2 ISR register value */ + tmpreg = DMA2->ISR ; + } + else + { + /* Get DMA1 ISR register value */ + tmpreg = DMA1->ISR ; + } + + /* Check the status of the specified DMA interrupt */ + if ((tmpreg & DMA_IT) != (uint32_t)RESET) + { + /* DMA_IT is set */ + bitstatus = SET; + } + else + { + /* DMA_IT is reset */ + bitstatus = RESET; + } + /* Return the DMA_IT status */ + return bitstatus; +} + +/** + * @brief Clears the DMAy Channelx’s interrupt pending bits. + * @param DMA_IT: specifies the DMA interrupt pending bit to clear. + * This parameter can be any combination (for the same DMA) of the following values: + * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. + * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. + * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. + * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. + * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. + * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. + * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. + * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. + * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. + * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. + * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. + * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. + * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. + * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. + * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. + * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. + * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. + * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. + * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. + * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. + * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt. + * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. + * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. + * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. + * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. + * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. + * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. + * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. + * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. + * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. + * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. + * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. + * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. + * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. + * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. + * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. + * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. + * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. + * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. + * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. + * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. + * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. + * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. + * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. + * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. + * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. + * @retval None + */ +void DMA_ClearITPendingBit(uint32_t DMA_IT) +{ + /* Check the parameters */ + assert_param(IS_DMA_CLEAR_IT(DMA_IT)); + + /* Calculate the used DMA */ + if ((DMA_IT & FLAG_Mask) != (uint32_t)RESET) + { + /* Clear the selected DMA interrupt pending bits */ + DMA2->IFCR = DMA_IT; + } + else + { + /* Clear the selected DMA interrupt pending bits */ + DMA1->IFCR = DMA_IT; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c new file mode 100644 index 0000000..6963200 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c @@ -0,0 +1,268 @@ +/** + ****************************************************************************** + * @file stm32f10x_exti.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the EXTI firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_exti.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup EXTI + * @brief EXTI driver modules + * @{ + */ + +/** @defgroup EXTI_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Defines + * @{ + */ + +#define EXTI_LineNone ((uint32_t)0x00000) /* No interrupt selected */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the EXTI peripheral registers to their default reset values. + * @param None + * @retval None + */ +void EXTI_DeInit(void) +{ + EXTI->IMR = 0x00000000; + EXTI->EMR = 0x00000000; + EXTI->RTSR = 0x00000000; + EXTI->FTSR = 0x00000000; + EXTI->PR = 0x000FFFFF; +} + +/** + * @brief Initializes the EXTI peripheral according to the specified + * parameters in the EXTI_InitStruct. + * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure + * that contains the configuration information for the EXTI peripheral. + * @retval None + */ +void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) +{ + uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode)); + assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger)); + assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line)); + assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd)); + + tmp = (uint32_t)EXTI_BASE; + + if (EXTI_InitStruct->EXTI_LineCmd != DISABLE) + { + /* Clear EXTI line configuration */ + EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line; + + tmp += EXTI_InitStruct->EXTI_Mode; + + *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; + + /* Clear Rising Falling edge configuration */ + EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line; + + /* Select the trigger for the selected external interrupts */ + if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) + { + /* Rising Falling edge */ + EXTI->RTSR |= EXTI_InitStruct->EXTI_Line; + EXTI->FTSR |= EXTI_InitStruct->EXTI_Line; + } + else + { + tmp = (uint32_t)EXTI_BASE; + tmp += EXTI_InitStruct->EXTI_Trigger; + + *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; + } + } + else + { + tmp += EXTI_InitStruct->EXTI_Mode; + + /* Disable the selected external lines */ + *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line; + } +} + +/** + * @brief Fills each EXTI_InitStruct member with its reset value. + * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) +{ + EXTI_InitStruct->EXTI_Line = EXTI_LineNone; + EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_InitStruct->EXTI_LineCmd = DISABLE; +} + +/** + * @brief Generates a Software interrupt. + * @param EXTI_Line: specifies the EXTI lines to be enabled or disabled. + * This parameter can be any combination of EXTI_Linex where x can be (0..19). + * @retval None + */ +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->SWIER |= EXTI_Line; +} + +/** + * @brief Checks whether the specified EXTI line flag is set or not. + * @param EXTI_Line: specifies the EXTI line flag to check. + * This parameter can be: + * @arg EXTI_Linex: External interrupt line x where x(0..19) + * @retval The new state of EXTI_Line (SET or RESET). + */ +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_GET_EXTI_LINE(EXTI_Line)); + + if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the EXTI’s line pending flags. + * @param EXTI_Line: specifies the EXTI lines flags to clear. + * This parameter can be any combination of EXTI_Linex where x can be (0..19). + * @retval None + */ +void EXTI_ClearFlag(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->PR = EXTI_Line; +} + +/** + * @brief Checks whether the specified EXTI line is asserted or not. + * @param EXTI_Line: specifies the EXTI line to check. + * This parameter can be: + * @arg EXTI_Linex: External interrupt line x where x(0..19) + * @retval The new state of EXTI_Line (SET or RESET). + */ +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + /* Check the parameters */ + assert_param(IS_GET_EXTI_LINE(EXTI_Line)); + + enablestatus = EXTI->IMR & EXTI_Line; + if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the EXTI’s line pending bits. + * @param EXTI_Line: specifies the EXTI lines to clear. + * This parameter can be any combination of EXTI_Linex where x can be (0..19). + * @retval None + */ +void EXTI_ClearITPendingBit(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->PR = EXTI_Line; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c new file mode 100644 index 0000000..ec194dc --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c @@ -0,0 +1,878 @@ +/** + ****************************************************************************** + * @file stm32f10x_flash.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the FLASH firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_flash.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup FLASH + * @brief FLASH driver modules + * @{ + */ + +/** @defgroup FLASH_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_Defines + * @{ + */ + +/* Flash Access Control Register bits */ +#define ACR_LATENCY_Mask ((uint32_t)0x00000038) +#define ACR_HLFCYA_Mask ((uint32_t)0xFFFFFFF7) +#define ACR_PRFTBE_Mask ((uint32_t)0xFFFFFFEF) + +/* Flash Access Control Register bits */ +#define ACR_PRFTBS_Mask ((uint32_t)0x00000020) + +/* Flash Control Register bits */ +#define CR_PG_Set ((uint32_t)0x00000001) +#define CR_PG_Reset ((uint32_t)0x00001FFE) +#define CR_PER_Set ((uint32_t)0x00000002) +#define CR_PER_Reset ((uint32_t)0x00001FFD) +#define CR_MER_Set ((uint32_t)0x00000004) +#define CR_MER_Reset ((uint32_t)0x00001FFB) +#define CR_OPTPG_Set ((uint32_t)0x00000010) +#define CR_OPTPG_Reset ((uint32_t)0x00001FEF) +#define CR_OPTER_Set ((uint32_t)0x00000020) +#define CR_OPTER_Reset ((uint32_t)0x00001FDF) +#define CR_STRT_Set ((uint32_t)0x00000040) +#define CR_LOCK_Set ((uint32_t)0x00000080) + +/* FLASH Mask */ +#define RDPRT_Mask ((uint32_t)0x00000002) +#define WRP0_Mask ((uint32_t)0x000000FF) +#define WRP1_Mask ((uint32_t)0x0000FF00) +#define WRP2_Mask ((uint32_t)0x00FF0000) +#define WRP3_Mask ((uint32_t)0xFF000000) + +/* FLASH Keys */ +#define RDP_Key ((uint16_t)0x00A5) +#define FLASH_KEY1 ((uint32_t)0x45670123) +#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) + +/* Delay definition */ +#define EraseTimeout ((uint32_t)0x00000FFF) +#define ProgramTimeout ((uint32_t)0x0000000F) + +/** + * @} + */ + +/** @defgroup FLASH_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_FunctionPrototypes + * @{ + */ + +static void delay(void); +/** + * @} + */ + +/** @defgroup FLASH_Private_Functions + * @{ + */ + +/** + * @brief Sets the code latency value. + * @param FLASH_Latency: specifies the FLASH Latency value. + * This parameter can be one of the following values: + * @arg FLASH_Latency_0: FLASH Zero Latency cycle + * @arg FLASH_Latency_1: FLASH One Latency cycle + * @arg FLASH_Latency_2: FLASH Two Latency cycles + * @retval None + */ +void FLASH_SetLatency(uint32_t FLASH_Latency) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_FLASH_LATENCY(FLASH_Latency)); + + /* Read the ACR register */ + tmpreg = FLASH->ACR; + + /* Sets the Latency value */ + tmpreg &= ACR_LATENCY_Mask; + tmpreg |= FLASH_Latency; + + /* Write the ACR register */ + FLASH->ACR = tmpreg; +} + +/** + * @brief Enables or disables the Half cycle flash access. + * @param FLASH_HalfCycleAccess: specifies the FLASH Half cycle Access mode. + * This parameter can be one of the following values: + * @arg FLASH_HalfCycleAccess_Enable: FLASH Half Cycle Enable + * @arg FLASH_HalfCycleAccess_Disable: FLASH Half Cycle Disable + * @retval None + */ +void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess) +{ + /* Check the parameters */ + assert_param(IS_FLASH_HALFCYCLEACCESS_STATE(FLASH_HalfCycleAccess)); + + /* Enable or disable the Half cycle access */ + FLASH->ACR &= ACR_HLFCYA_Mask; + FLASH->ACR |= FLASH_HalfCycleAccess; +} + +/** + * @brief Enables or disables the Prefetch Buffer. + * @param FLASH_PrefetchBuffer: specifies the Prefetch buffer status. + * This parameter can be one of the following values: + * @arg FLASH_PrefetchBuffer_Enable: FLASH Prefetch Buffer Enable + * @arg FLASH_PrefetchBuffer_Disable: FLASH Prefetch Buffer Disable + * @retval None + */ +void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer) +{ + /* Check the parameters */ + assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer)); + + /* Enable or disable the Prefetch Buffer */ + FLASH->ACR &= ACR_PRFTBE_Mask; + FLASH->ACR |= FLASH_PrefetchBuffer; +} + +/** + * @brief Unlocks the FLASH Program Erase Controller. + * @param None + * @retval None + */ +void FLASH_Unlock(void) +{ + /* Authorize the FPEC Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; +} + +/** + * @brief Locks the FLASH Program Erase Controller. + * @param None + * @retval None + */ +void FLASH_Lock(void) +{ + /* Set the Lock Bit to lock the FPEC and the FCR */ + FLASH->CR |= CR_LOCK_Set; +} + +/** + * @brief Erases a specified FLASH page. + * @param Page_Address: The page address to be erased. + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ErasePage(uint32_t Page_Address) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Page_Address)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase the page */ + FLASH->CR|= CR_PER_Set; + FLASH->AR = Page_Address; + FLASH->CR|= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the erase operation is completed, disable the PER Bit */ + FLASH->CR &= CR_PER_Reset; + } + } + /* Return the Erase Status */ + return status; +} + +/** + * @brief Erases all FLASH pages. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllPages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR |= CR_MER_Set; + FLASH->CR |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the erase operation is completed, disable the MER Bit */ + FLASH->CR &= CR_MER_Reset; + } + } + /* Return the Erase Status */ + return status; +} + +/** + * @brief Erases the FLASH option bytes. + * @note This functions erases all option bytes and then deactivates the Read + * protection. If the user needs to keep the Read protection activated, + * he has to enable it after this function call (using + * FLASH_ReadOutProtection function) + * @param None + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseOptionBytes(void) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + + /* if the previous operation is completed, proceed to erase the option bytes */ + FLASH->CR |= CR_OPTER_Set; + FLASH->CR |= CR_STRT_Set; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the erase operation is completed, disable the OPTER Bit */ + FLASH->CR &= CR_OPTER_Reset; + + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + /* Disable the Read protection */ + OB->RDP= RDP_Key; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + else + { + if (status != FLASH_TIMEOUT) + { + /* Disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + } + /* Return the erase status */ + return status; +} + +/** + * @brief Programs a word at a specified address. + * @param Address: specifies the address to be programmed. + * @param Data: specifies the data to be programmed. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new first + half word */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = (uint16_t)Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new second + half word */ + tmp = Address + 2; + + *(__IO uint16_t*) tmp = Data >> 16; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status != FLASH_TIMEOUT) + { + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + } + else + { + if (status != FLASH_TIMEOUT) + { + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + } + } + /* Return the Program Status */ + return status; +} + +/** + * @brief Programs a half word at a specified address. + * @param Address: specifies the address to be programmed. + * @param Data: specifies the data to be programmed. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new data */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + } + /* Return the Program Status */ + return status; +} + +/** + * @brief Programs a half word at a specified Option Byte Data address. + * @param Address: specifies the address to be programmed. + * This parameter can be 0x1FFFF804 or 0x1FFFF806. + * @param Data: specifies the data to be programmed. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_OB_DATA_ADDRESS(Address)); + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status == FLASH_COMPLETE) + { + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + /* Enables the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + *(__IO uint16_t*)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the Option Byte Data Program Status */ + return status; +} + +/** + * @brief Write protects the desired pages + * @param FLASH_Pages: specifies the address of the pages to be write protected. + * This parameter can be: + * @arg For @b STM32_Low-density_devices: value between FLASH_WRProt_Pages0to3 and FLASH_WRProt_Pages28to31 + * @arg For @b STM32_Medium-density_devices: value between FLASH_WRProt_Pages0to3 + * and FLASH_WRProt_Pages124to127 + * @arg For @b STM32_High-density_devices: value between FLASH_WRProt_Pages0to1 and + * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to255 + * @arg For @b STM32_Connectivity_line_devices: value between FLASH_WRProt_Pages0to1 and + * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to127 + * @arg FLASH_WRProt_AllPages + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages) +{ + uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF; + + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_FLASH_WRPROT_PAGE(FLASH_Pages)); + + FLASH_Pages = (uint32_t)(~FLASH_Pages); + WRP0_Data = (uint16_t)(FLASH_Pages & WRP0_Mask); + WRP1_Data = (uint16_t)((FLASH_Pages & WRP1_Mask) >> 8); + WRP2_Data = (uint16_t)((FLASH_Pages & WRP2_Mask) >> 16); + WRP3_Data = (uint16_t)((FLASH_Pages & WRP3_Mask) >> 24); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Authorizes the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + FLASH->CR |= CR_OPTPG_Set; + if(WRP0_Data != 0xFF) + { + OB->WRP0 = WRP0_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF)) + { + OB->WRP1 = WRP1_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF)) + { + OB->WRP2 = WRP2_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + + if((status == FLASH_COMPLETE)&& (WRP3_Data != 0xFF)) + { + OB->WRP3 = WRP3_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the write protection operation Status */ + return status; +} + +/** + * @brief Enables or disables the read out protection. + * @note If the user has already programmed the other option bytes before calling + * this function, he must re-program them since this function erases all option bytes. + * @param Newstate: new state of the ReadOut Protection. + * This parameter can be: ENABLE or DISABLE. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* Authorizes the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + FLASH->CR |= CR_OPTER_Set; + FLASH->CR |= CR_STRT_Set; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* if the erase operation is completed, disable the OPTER Bit */ + FLASH->CR &= CR_OPTER_Reset; + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + if(NewState != DISABLE) + { + OB->RDP = 0x00; + } + else + { + OB->RDP = RDP_Key; + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + else + { + if(status != FLASH_TIMEOUT) + { + /* Disable the OPTER Bit */ + FLASH->CR &= CR_OPTER_Reset; + } + } + } + /* Return the protection operation Status */ + return status; +} + +/** + * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. + * @param OB_IWDG: Selects the IWDG mode + * This parameter can be one of the following values: + * @arg OB_IWDG_SW: Software IWDG selected + * @arg OB_IWDG_HW: Hardware IWDG selected + * @param OB_STOP: Reset event when entering STOP mode. + * This parameter can be one of the following values: + * @arg OB_STOP_NoRST: No reset generated when entering in STOP + * @arg OB_STOP_RST: Reset generated when entering in STOP + * @param OB_STDBY: Reset event when entering Standby mode. + * This parameter can be one of the following values: + * @arg OB_STDBY_NoRST: No reset generated when entering in STANDBY + * @arg OB_STDBY_RST: Reset generated when entering in STANDBY + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_OB_IWDG_SOURCE(OB_IWDG)); + assert_param(IS_OB_STOP_SOURCE(OB_STOP)); + assert_param(IS_OB_STDBY_SOURCE(OB_STDBY)); + + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + + OB->USER = OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)0xF8))); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the Option Byte program Status */ + return status; +} + +/** + * @brief Returns the FLASH User Option Bytes values. + * @param None + * @retval The FLASH User Option Bytes values:IWDG_SW(Bit0), RST_STOP(Bit1) + * and RST_STDBY(Bit2). + */ +uint32_t FLASH_GetUserOptionByte(void) +{ + /* Return the User Option Byte */ + return (uint32_t)(FLASH->OBR >> 2); +} + +/** + * @brief Returns the FLASH Write Protection Option Bytes Register value. + * @param None + * @retval The FLASH Write Protection Option Bytes Register value + */ +uint32_t FLASH_GetWriteProtectionOptionByte(void) +{ + /* Return the Falsh write protection Register value */ + return (uint32_t)(FLASH->WRPR); +} + +/** + * @brief Checks whether the FLASH Read Out Protection Status is set or not. + * @param None + * @retval FLASH ReadOut Protection Status(SET or RESET) + */ +FlagStatus FLASH_GetReadOutProtectionStatus(void) +{ + FlagStatus readoutstatus = RESET; + if ((FLASH->OBR & RDPRT_Mask) != (uint32_t)RESET) + { + readoutstatus = SET; + } + else + { + readoutstatus = RESET; + } + return readoutstatus; +} + +/** + * @brief Checks whether the FLASH Prefetch Buffer status is set or not. + * @param None + * @retval FLASH Prefetch Buffer Status (SET or RESET). + */ +FlagStatus FLASH_GetPrefetchBufferStatus(void) +{ + FlagStatus bitstatus = RESET; + + if ((FLASH->ACR & ACR_PRFTBS_Mask) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the new state of FLASH Prefetch Buffer Status (SET or RESET) */ + return bitstatus; +} + +/** + * @brief Enables or disables the specified FLASH interrupts. + * @param FLASH_IT: specifies the FLASH interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg FLASH_IT_ERROR: FLASH Error Interrupt + * @arg FLASH_IT_EOP: FLASH end of operation Interrupt + * @param NewState: new state of the specified Flash interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FLASH_ITConfig(uint16_t FLASH_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FLASH_IT(FLASH_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if(NewState != DISABLE) + { + /* Enable the interrupt sources */ + FLASH->CR |= FLASH_IT; + } + else + { + /* Disable the interrupt sources */ + FLASH->CR &= ~(uint32_t)FLASH_IT; + } +} + +/** + * @brief Checks whether the specified FLASH flag is set or not. + * @param FLASH_FLAG: specifies the FLASH flag to check. + * This parameter can be one of the following values: + * @arg FLASH_FLAG_BSY: FLASH Busy flag + * @arg FLASH_FLAG_PGERR: FLASH Program error flag + * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag + * @arg FLASH_FLAG_EOP: FLASH End of Operation flag + * @arg FLASH_FLAG_OPTERR: FLASH Option Byte error flag + * @retval The new state of FLASH_FLAG (SET or RESET). + */ +FlagStatus FLASH_GetFlagStatus(uint16_t FLASH_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ; + if(FLASH_FLAG == FLASH_FLAG_OPTERR) + { + if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + /* Return the new state of FLASH_FLAG (SET or RESET) */ + return bitstatus; +} + +/** + * @brief Clears the FLASH’s pending flags. + * @param FLASH_FLAG: specifies the FLASH flags to clear. + * This parameter can be any combination of the following values: + * @arg FLASH_FLAG_PGERR: FLASH Program error flag + * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag + * @arg FLASH_FLAG_EOP: FLASH End of Operation flag + * @retval None + */ +void FLASH_ClearFlag(uint16_t FLASH_FLAG) +{ + /* Check the parameters */ + assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ; + + /* Clear the flags */ + FLASH->SR = FLASH_FLAG; +} + +/** + * @brief Returns the FLASH Status. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE + */ +FLASH_Status FLASH_GetStatus(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->SR & FLASH_FLAG_PGERR) != 0) + { + flashstatus = FLASH_ERROR_PG; + } + else + { + if((FLASH->SR & FLASH_FLAG_WRPRTERR) != 0 ) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + } + /* Return the Flash Status */ + return flashstatus; +} + +/** + * @brief Waits for a Flash operation to complete or a TIMEOUT to occur. + * @param Timeout: FLASH progamming Timeout + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check for the Flash Status */ + status = FLASH_GetStatus(); + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while((status == FLASH_BUSY) && (Timeout != 0x00)) + { + delay(); + status = FLASH_GetStatus(); + Timeout--; + } + if(Timeout == 0x00 ) + { + status = FLASH_TIMEOUT; + } + /* Return the operation status */ + return status; +} + +/** + * @brief Inserts a time delay. + * @param None + * @retval None + */ +static void delay(void) +{ + __IO uint32_t i = 0; + for(i = 0xFF; i != 0; i--) + { + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c new file mode 100644 index 0000000..9b7b077 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c @@ -0,0 +1,858 @@ +/** + ****************************************************************************** + * @file stm32f10x_fsmc.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the FSMC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_fsmc.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup FSMC + * @brief FSMC driver modules + * @{ + */ + +/** @defgroup FSMC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup FSMC_Private_Defines + * @{ + */ + +/* --------------------- FSMC registers bit mask ---------------------------- */ + +/* FSMC BCRx Mask */ +#define BCR_MBKEN_Set ((uint32_t)0x00000001) +#define BCR_MBKEN_Reset ((uint32_t)0x000FFFFE) +#define BCR_FACCEN_Set ((uint32_t)0x00000040) + +/* FSMC PCRx Mask */ +#define PCR_PBKEN_Set ((uint32_t)0x00000004) +#define PCR_PBKEN_Reset ((uint32_t)0x000FFFFB) +#define PCR_ECCEN_Set ((uint32_t)0x00000040) +#define PCR_ECCEN_Reset ((uint32_t)0x000FFFBF) +#define PCR_MemoryType_NAND ((uint32_t)0x00000008) +/** + * @} + */ + +/** @defgroup FSMC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the FSMC NOR/SRAM Banks registers to their default + * reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @retval None + */ +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + + /* FSMC_Bank1_NORSRAM1 */ + if(FSMC_Bank == FSMC_Bank1_NORSRAM1) + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB; + } + /* FSMC_Bank1_NORSRAM2, FSMC_Bank1_NORSRAM3 or FSMC_Bank1_NORSRAM4 */ + else + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2; + } + FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF; + FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; +} + +/** + * @brief Deinitializes the FSMC NAND Banks registers to their default reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval None + */ +void FSMC_NANDDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Set the FSMC_Bank2 registers to their reset values */ + FSMC_Bank2->PCR2 = 0x00000018; + FSMC_Bank2->SR2 = 0x00000040; + FSMC_Bank2->PMEM2 = 0xFCFCFCFC; + FSMC_Bank2->PATT2 = 0xFCFCFCFC; + } + /* FSMC_Bank3_NAND */ + else + { + /* Set the FSMC_Bank3 registers to their reset values */ + FSMC_Bank3->PCR3 = 0x00000018; + FSMC_Bank3->SR3 = 0x00000040; + FSMC_Bank3->PMEM3 = 0xFCFCFCFC; + FSMC_Bank3->PATT3 = 0xFCFCFCFC; + } +} + +/** + * @brief Deinitializes the FSMC PCCARD Bank registers to their default reset values. + * @param None + * @retval None + */ +void FSMC_PCCARDDeInit(void) +{ + /* Set the FSMC_Bank4 registers to their reset values */ + FSMC_Bank4->PCR4 = 0x00000018; + FSMC_Bank4->SR4 = 0x00000000; + FSMC_Bank4->PMEM4 = 0xFCFCFCFC; + FSMC_Bank4->PATT4 = 0xFCFCFCFC; + FSMC_Bank4->PIO4 = 0xFCFCFCFC; +} + +/** + * @brief Initializes the FSMC NOR/SRAM Banks according to the specified + * parameters in the FSMC_NORSRAMInitStruct. + * @param FSMC_NORSRAMInitStruct : pointer to a FSMC_NORSRAMInitTypeDef + * structure that contains the configuration information for + * the FSMC NOR/SRAM specified Banks. + * @retval None + */ +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Check the parameters */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_NORSRAMInitStruct->FSMC_Bank)); + assert_param(IS_FSMC_MUX(FSMC_NORSRAMInitStruct->FSMC_DataAddressMux)); + assert_param(IS_FSMC_MEMORY(FSMC_NORSRAMInitStruct->FSMC_MemoryType)); + assert_param(IS_FSMC_MEMORY_WIDTH(FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth)); + assert_param(IS_FSMC_BURSTMODE(FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode)); + assert_param(IS_FSMC_WAIT_POLARITY(FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity)); + assert_param(IS_FSMC_WRAP_MODE(FSMC_NORSRAMInitStruct->FSMC_WrapMode)); + assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive)); + assert_param(IS_FSMC_WRITE_OPERATION(FSMC_NORSRAMInitStruct->FSMC_WriteOperation)); + assert_param(IS_FSMC_WAITE_SIGNAL(FSMC_NORSRAMInitStruct->FSMC_WaitSignal)); + assert_param(IS_FSMC_EXTENDED_MODE(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode)); + assert_param(IS_FSMC_WRITE_BURST(FSMC_NORSRAMInitStruct->FSMC_WriteBurst)); + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode)); + + /* Bank1 NOR/SRAM control register configuration */ + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | + FSMC_NORSRAMInitStruct->FSMC_MemoryType | + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | + FSMC_NORSRAMInitStruct->FSMC_WrapMode | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | + FSMC_NORSRAMInitStruct->FSMC_WriteOperation | + FSMC_NORSRAMInitStruct->FSMC_WaitSignal | + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | + FSMC_NORSRAMInitStruct->FSMC_WriteBurst; + if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) + { + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)BCR_FACCEN_Set; + } + /* Bank1 NOR/SRAM timing register configuration */ + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; + + + /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ + if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) + { + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode)); + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4 )| + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; + } + else + { + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; + } +} + +/** + * @brief Initializes the FSMC NAND Banks according to the specified + * parameters in the FSMC_NANDInitStruct. + * @param FSMC_NANDInitStruct : pointer to a FSMC_NANDInitTypeDef + * structure that contains the configuration information for the FSMC NAND specified Banks. + * @retval None + */ +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000; + + /* Check the parameters */ + assert_param( IS_FSMC_NAND_BANK(FSMC_NANDInitStruct->FSMC_Bank)); + assert_param( IS_FSMC_WAIT_FEATURE(FSMC_NANDInitStruct->FSMC_Waitfeature)); + assert_param( IS_FSMC_MEMORY_WIDTH(FSMC_NANDInitStruct->FSMC_MemoryDataWidth)); + assert_param( IS_FSMC_ECC_STATE(FSMC_NANDInitStruct->FSMC_ECC)); + assert_param( IS_FSMC_ECCPAGE_SIZE(FSMC_NANDInitStruct->FSMC_ECCPageSize)); + assert_param( IS_FSMC_TCLR_TIME(FSMC_NANDInitStruct->FSMC_TCLRSetupTime)); + assert_param( IS_FSMC_TAR_TIME(FSMC_NANDInitStruct->FSMC_TARSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + + /* Set the tmppcr value according to FSMC_NANDInitStruct parameters */ + tmppcr = (uint32_t)FSMC_NANDInitStruct->FSMC_Waitfeature | + PCR_MemoryType_NAND | + FSMC_NANDInitStruct->FSMC_MemoryDataWidth | + FSMC_NANDInitStruct->FSMC_ECC | + FSMC_NANDInitStruct->FSMC_ECCPageSize | + (FSMC_NANDInitStruct->FSMC_TCLRSetupTime << 9 )| + (FSMC_NANDInitStruct->FSMC_TARSetupTime << 13); + + /* Set tmppmem value according to FSMC_CommonSpaceTimingStructure parameters */ + tmppmem = (uint32_t)FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + /* Set tmppatt value according to FSMC_AttributeSpaceTimingStructure parameters */ + tmppatt = (uint32_t)FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* FSMC_Bank2_NAND registers configuration */ + FSMC_Bank2->PCR2 = tmppcr; + FSMC_Bank2->PMEM2 = tmppmem; + FSMC_Bank2->PATT2 = tmppatt; + } + else + { + /* FSMC_Bank3_NAND registers configuration */ + FSMC_Bank3->PCR3 = tmppcr; + FSMC_Bank3->PMEM3 = tmppmem; + FSMC_Bank3->PATT3 = tmppatt; + } +} + +/** + * @brief Initializes the FSMC PCCARD Bank according to the specified + * parameters in the FSMC_PCCARDInitStruct. + * @param FSMC_PCCARDInitStruct : pointer to a FSMC_PCCARDInitTypeDef + * structure that contains the configuration information for the FSMC PCCARD Bank. + * @retval None + */ +void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + /* Check the parameters */ + assert_param(IS_FSMC_WAIT_FEATURE(FSMC_PCCARDInitStruct->FSMC_Waitfeature)); + assert_param(IS_FSMC_TCLR_TIME(FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime)); + assert_param(IS_FSMC_TAR_TIME(FSMC_PCCARDInitStruct->FSMC_TARSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime)); + + /* Set the PCR4 register value according to FSMC_PCCARDInitStruct parameters */ + FSMC_Bank4->PCR4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_Waitfeature | + FSMC_MemoryDataWidth_16b | + (FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime << 9) | + (FSMC_PCCARDInitStruct->FSMC_TARSetupTime << 13); + + /* Set PMEM4 register value according to FSMC_CommonSpaceTimingStructure parameters */ + FSMC_Bank4->PMEM4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + /* Set PATT4 register value according to FSMC_AttributeSpaceTimingStructure parameters */ + FSMC_Bank4->PATT4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + /* Set PIO4 register value according to FSMC_IOSpaceTimingStructure parameters */ + FSMC_Bank4->PIO4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime << 24); +} + +/** + * @brief Fills each FSMC_NORSRAMInitStruct member with its default value. + * @param FSMC_NORSRAMInitStruct: pointer to a FSMC_NORSRAMInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Reset NOR/SRAM Init structure parameters values */ + FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; + FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStruct->FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; +} + +/** + * @brief Fills each FSMC_NANDInitStruct member with its default value. + * @param FSMC_NANDInitStruct: pointer to a FSMC_NANDInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + /* Reset NAND Init structure parameters values */ + FSMC_NANDInitStruct->FSMC_Bank = FSMC_Bank2_NAND; + FSMC_NANDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_NANDInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NANDInitStruct->FSMC_ECC = FSMC_ECC_Disable; + FSMC_NANDInitStruct->FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes; + FSMC_NANDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Fills each FSMC_PCCARDInitStruct member with its default value. + * @param FSMC_PCCARDInitStruct: pointer to a FSMC_PCCARDInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + /* Reset PCCARD Init structure parameters values */ + FSMC_PCCARDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Enables or disables the specified NOR/SRAM Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NOR/SRAM Bank by setting the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] |= BCR_MBKEN_Set; + } + else + { + /* Disable the selected NOR/SRAM Bank by clearing the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] &= BCR_MBKEN_Reset; + } +} + +/** + * @brief Enables or disables the specified NAND Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank by setting the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_PBKEN_Set; + } + else + { + FSMC_Bank3->PCR3 |= PCR_PBKEN_Set; + } + } + else + { + /* Disable the selected NAND Bank by clearing the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_PBKEN_Reset; + } + else + { + FSMC_Bank3->PCR3 &= PCR_PBKEN_Reset; + } + } +} + +/** + * @brief Enables or disables the PCCARD Memory Bank. + * @param NewState: new state of the PCCARD Memory Bank. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_PCCARDCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the PCCARD Bank by setting the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 |= PCR_PBKEN_Set; + } + else + { + /* Disable the PCCARD Bank by clearing the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 &= PCR_PBKEN_Reset; + } +} + +/** + * @brief Enables or disables the FSMC NAND ECC feature. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC NAND ECC feature. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank ECC function by setting the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_ECCEN_Set; + } + else + { + FSMC_Bank3->PCR3 |= PCR_ECCEN_Set; + } + } + else + { + /* Disable the selected NAND Bank ECC function by clearing the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_ECCEN_Reset; + } + else + { + FSMC_Bank3->PCR3 &= PCR_ECCEN_Reset; + } + } +} + +/** + * @brief Returns the error correction code register value. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval The Error Correction Code (ECC) value. + */ +uint32_t FSMC_GetECC(uint32_t FSMC_Bank) +{ + uint32_t eccval = 0x00000000; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the ECCR2 register value */ + eccval = FSMC_Bank2->ECCR2; + } + else + { + /* Get the ECCR3 register value */ + eccval = FSMC_Bank3->ECCR3; + } + /* Return the error correction code value */ + return(eccval); +} + +/** + * @brief Enables or disables the specified FSMC interrupts. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @param NewState: new state of the specified FSMC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState) +{ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 |= FSMC_IT; + } + } + else + { + /* Disable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + + FSMC_Bank2->SR2 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 &= (uint32_t)~FSMC_IT; + } + } +} + +/** + * @brief Checks whether the specified FSMC flag is set or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising egde detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling egde detection Flag. + * @arg FSMC_FLAG_FEMPT: Fifo empty Flag. + * @retval The new state of FSMC_FLAG (SET or RESET). + */ +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpsr = 0x00000000; + + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_FLAG(FSMC_FLAG)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + /* Get the flag status */ + if ((tmpsr & FSMC_FLAG) != (uint16_t)RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the FSMC’s pending flags. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising egde detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling egde detection Flag. + * @retval None + */ +void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_CLEAR_FLAG(FSMC_FLAG)) ; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~FSMC_FLAG; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~FSMC_FLAG; + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~FSMC_FLAG; + } +} + +/** + * @brief Checks whether the specified FSMC interrupt has occurred or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt source to check. + * This parameter can be one of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval The new state of FSMC_IT (SET or RESET). + */ +ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0; + + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + itstatus = tmpsr & FSMC_IT; + + itenable = tmpsr & (FSMC_IT >> 3); + if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the FSMC’s interrupt pending bits. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval None + */ +void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~(FSMC_IT >> 3); + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~(FSMC_IT >> 3); + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~(FSMC_IT >> 3); + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c new file mode 100644 index 0000000..262992e --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c @@ -0,0 +1,617 @@ +/** + ****************************************************************************** + * @file stm32f10x_gpio.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the GPIO firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_gpio.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup GPIO + * @brief GPIO driver modules + * @{ + */ + +/** @defgroup GPIO_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Defines + * @{ + */ + +/* ------------ RCC registers bit address in the alias region ----------------*/ +#define AFIO_OFFSET (AFIO_BASE - PERIPH_BASE) + +/* --- EVENTCR Register -----*/ + +/* Alias word address of EVOE bit */ +#define EVCR_OFFSET (AFIO_OFFSET + 0x00) +#define EVOE_BitNumber ((uint8_t)0x07) +#define EVCR_EVOE_BB (PERIPH_BB_BASE + (EVCR_OFFSET * 32) + (EVOE_BitNumber * 4)) + + +/* --- MAPR Register ---*/ +/* Alias word address of MII_RMII_SEL bit */ +#define MAPR_OFFSET (AFIO_OFFSET + 0x04) +#define MII_RMII_SEL_BitNumber ((uint8_t)0x17) +#define MAPR_MII_RMII_SEL_BB (PERIPH_BB_BASE + (MAPR_OFFSET * 32) + (MII_RMII_SEL_BitNumber * 4)) + + +#define EVCR_PORTPINCONFIG_MASK ((uint16_t)0xFF80) +#define LSB_MASK ((uint16_t)0xFFFF) +#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000) +#define DBGAFR_SWJCFG_MASK ((uint32_t)0xF0FFFFFF) +#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000) +#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000) +/** + * @} + */ + +/** @defgroup GPIO_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the GPIOx peripheral registers to their default reset values. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval None + */ +void GPIO_DeInit(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + if (GPIOx == GPIOA) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE); + } + else if (GPIOx == GPIOB) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE); + } + else if (GPIOx == GPIOC) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE); + } + else if (GPIOx == GPIOD) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE); + } + else if (GPIOx == GPIOE) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE); + } + else if (GPIOx == GPIOF) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE); + } + else + { + if (GPIOx == GPIOG) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE); + } + } +} + +/** + * @brief Deinitializes the Alternate Functions (remap, event control + * and EXTI configuration) registers to their default reset values. + * @param None + * @retval None + */ +void GPIO_AFIODeInit(void) +{ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE); +} + +/** + * @brief Initializes the GPIOx peripheral according to the specified + * parameters in the GPIO_InitStruct. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that + * contains the configuration information for the specified GPIO peripheral. + * @retval None + */ +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) +{ + uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; + uint32_t tmpreg = 0x00, pinmask = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); + assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); + +/*---------------------------- GPIO Mode Configuration -----------------------*/ + currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F); + if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00) + { + /* Check the parameters */ + assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); + /* Output mode */ + currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed; + } +/*---------------------------- GPIO CRL Configuration ------------------------*/ + /* Configure the eight low port pins */ + if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00) + { + tmpreg = GPIOx->CRL; + for (pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = ((uint32_t)0x01) << pinpos; + /* Get the port pins position */ + currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; + if (currentpin == pos) + { + pos = pinpos << 2; + /* Clear the corresponding low control register bits */ + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + /* Write the mode configuration in the corresponding bits */ + tmpreg |= (currentmode << pos); + /* Reset the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BRR = (((uint32_t)0x01) << pinpos); + } + else + { + /* Set the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSRR = (((uint32_t)0x01) << pinpos); + } + } + } + } + GPIOx->CRL = tmpreg; + } +/*---------------------------- GPIO CRH Configuration ------------------------*/ + /* Configure the eight high port pins */ + if (GPIO_InitStruct->GPIO_Pin > 0x00FF) + { + tmpreg = GPIOx->CRH; + for (pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = (((uint32_t)0x01) << (pinpos + 0x08)); + /* Get the port pins position */ + currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos); + if (currentpin == pos) + { + pos = pinpos << 2; + /* Clear the corresponding high control register bits */ + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + /* Write the mode configuration in the corresponding bits */ + tmpreg |= (currentmode << pos); + /* Reset the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + /* Set the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + } + } + GPIOx->CRH = tmpreg; + } +} + +/** + * @brief Fills each GPIO_InitStruct member with its default value. + * @param GPIO_InitStruct : pointer to a GPIO_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) +{ + /* Reset GPIO init structure parameters values */ + GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; + GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING; +} + +/** + * @brief Reads the specified input port pin. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @retval The input port pin value. + */ +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + return bitstatus; +} + +/** + * @brief Reads the specified GPIO input data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval GPIO input data port value. + */ +uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + return ((uint16_t)GPIOx->IDR); +} + +/** + * @brief Reads the specified output data port bit. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @retval The output port pin value. + */ +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + return bitstatus; +} + +/** + * @brief Reads the specified GPIO output data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval GPIO output data port value. + */ +uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + return ((uint16_t)GPIOx->ODR); +} + +/** + * @brief Sets the selected data port bits. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + GPIOx->BSRR = GPIO_Pin; +} + +/** + * @brief Clears the selected data port bits. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + GPIOx->BRR = GPIO_Pin; +} + +/** + * @brief Sets or clears the selected data port bit. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to be written. + * This parameter can be one of GPIO_Pin_x where x can be (0..15). + * @param BitVal: specifies the value to be written to the selected bit. + * This parameter can be one of the BitAction enum values: + * @arg Bit_RESET: to clear the port pin + * @arg Bit_SET: to set the port pin + * @retval None + */ +void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + assert_param(IS_GPIO_BIT_ACTION(BitVal)); + + if (BitVal != Bit_RESET) + { + GPIOx->BSRR = GPIO_Pin; + } + else + { + GPIOx->BRR = GPIO_Pin; + } +} + +/** + * @brief Writes data to the specified GPIO data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param PortVal: specifies the value to be written to the port output data register. + * @retval None + */ +void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + GPIOx->ODR = PortVal; +} + +/** + * @brief Locks GPIO Pins configuration registers. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint32_t tmp = 0x00010000; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + tmp |= GPIO_Pin; + /* Set LCKK bit */ + GPIOx->LCKR = tmp; + /* Reset LCKK bit */ + GPIOx->LCKR = GPIO_Pin; + /* Set LCKK bit */ + GPIOx->LCKR = tmp; + /* Read LCKK bit*/ + tmp = GPIOx->LCKR; + /* Read LCKK bit*/ + tmp = GPIOx->LCKR; +} + +/** + * @brief Selects the GPIO pin used as Event output. + * @param GPIO_PortSource: selects the GPIO port to be used as source + * for Event output. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..E). + * @param GPIO_PinSource: specifies the pin for the Event output. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * @retval None + */ +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmpreg = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_EVENTOUT_PORT_SOURCE(GPIO_PortSource)); + assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); + + tmpreg = AFIO->EVCR; + /* Clear the PORT[6:4] and PIN[3:0] bits */ + tmpreg &= EVCR_PORTPINCONFIG_MASK; + tmpreg |= (uint32_t)GPIO_PortSource << 0x04; + tmpreg |= GPIO_PinSource; + AFIO->EVCR = tmpreg; +} + +/** + * @brief Enables or disables the Event Output. + * @param NewState: new state of the Event output. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void GPIO_EventOutputCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) EVCR_EVOE_BB = (uint32_t)NewState; +} + +/** + * @brief Changes the mapping of the specified pin. + * @param GPIO_Remap: selects the pin to remap. + * This parameter can be one of the following values: + * @arg GPIO_Remap_SPI1 + * @arg GPIO_Remap_I2C1 + * @arg GPIO_Remap_USART1 + * @arg GPIO_Remap_USART2 + * @arg GPIO_PartialRemap_USART3 + * @arg GPIO_FullRemap_USART3 + * @arg GPIO_PartialRemap_TIM1 + * @arg GPIO_FullRemap_TIM1 + * @arg GPIO_PartialRemap1_TIM2 + * @arg GPIO_PartialRemap2_TIM2 + * @arg GPIO_FullRemap_TIM2 + * @arg GPIO_PartialRemap_TIM3 + * @arg GPIO_FullRemap_TIM3 + * @arg GPIO_Remap_TIM4 + * @arg GPIO_Remap1_CAN1 + * @arg GPIO_Remap2_CAN1 + * @arg GPIO_Remap_PD01 + * @arg GPIO_Remap_TIM5CH4_LSI + * @arg GPIO_Remap_ADC1_ETRGINJ + * @arg GPIO_Remap_ADC1_ETRGREG + * @arg GPIO_Remap_ADC2_ETRGINJ + * @arg GPIO_Remap_ADC2_ETRGREG + * @arg GPIO_Remap_ETH + * @arg GPIO_Remap_CAN2 + * @arg GPIO_Remap_SWJ_NoJTRST + * @arg GPIO_Remap_SWJ_JTAGDisable + * @arg GPIO_Remap_SWJ_Disable + * @arg GPIO_Remap_SPI3 + * @arg GPIO_Remap_TIM2ITR1_PTP_SOF + * @arg GPIO_Remap_PTP_PPS + * @note If the GPIO_Remap_TIM2ITR1_PTP_SOF is enabled the TIM2 ITR1 is connected + * to Ethernet PTP output. When Reset TIM2 ITR1 is connected to USB OTG SOF output. + * @param NewState: new state of the port pin remapping. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) +{ + uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_REMAP(GPIO_Remap)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + tmpreg = AFIO->MAPR; + + tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10; + tmp = GPIO_Remap & LSB_MASK; + + if ((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) + { + tmpreg &= DBGAFR_SWJCFG_MASK; + AFIO->MAPR &= DBGAFR_SWJCFG_MASK; + } + else if ((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) + { + tmp1 = ((uint32_t)0x03) << tmpmask; + tmpreg &= ~tmp1; + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + else + { + tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15)*0x10)); + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + + if (NewState != DISABLE) + { + tmpreg |= (tmp << ((GPIO_Remap >> 0x15)*0x10)); + } + + AFIO->MAPR = tmpreg; +} + +/** + * @brief Selects the GPIO pin used as EXTI Line. + * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). + * @param GPIO_PinSource: specifies the EXTI line to be configured. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * @retval None + */ +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmp = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource)); + assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); + + tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); + AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; + AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); +} + +/** + * @brief Selects the Ethernet media interface. + * @note This function applies only to STM32 Connectivity line devices. + * @param GPIO_ETH_MediaInterface: specifies the Media Interface mode. + * This parameter can be one of the following values: + * @arg GPIO_ETH_MediaInterface_MII: MII mode + * @arg GPIO_ETH_MediaInterface_RMII: RMII mode + * @retval None + */ +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface) +{ + assert_param(IS_GPIO_ETH_MEDIA_INTERFACE(GPIO_ETH_MediaInterface)); + + /* Configure MII_RMII selection bit */ + *(__IO uint32_t *) MAPR_MII_RMII_SEL_BB = GPIO_ETH_MediaInterface; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c new file mode 100644 index 0000000..efcb211 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c @@ -0,0 +1,1152 @@ +/** + ****************************************************************************** + * @file stm32f10x_i2c.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the I2C firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_i2c.h" +#include "stm32f10x_rcc.h" + + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup I2C + * @brief I2C driver modules + * @{ + */ + +/** @defgroup I2C_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_Defines + * @{ + */ + +/* I2C SPE mask */ +#define CR1_PE_Set ((uint16_t)0x0001) +#define CR1_PE_Reset ((uint16_t)0xFFFE) + +/* I2C START mask */ +#define CR1_START_Set ((uint16_t)0x0100) +#define CR1_START_Reset ((uint16_t)0xFEFF) + +/* I2C STOP mask */ +#define CR1_STOP_Set ((uint16_t)0x0200) +#define CR1_STOP_Reset ((uint16_t)0xFDFF) + +/* I2C ACK mask */ +#define CR1_ACK_Set ((uint16_t)0x0400) +#define CR1_ACK_Reset ((uint16_t)0xFBFF) + +/* I2C ENGC mask */ +#define CR1_ENGC_Set ((uint16_t)0x0040) +#define CR1_ENGC_Reset ((uint16_t)0xFFBF) + +/* I2C SWRST mask */ +#define CR1_SWRST_Set ((uint16_t)0x8000) +#define CR1_SWRST_Reset ((uint16_t)0x7FFF) + +/* I2C PEC mask */ +#define CR1_PEC_Set ((uint16_t)0x1000) +#define CR1_PEC_Reset ((uint16_t)0xEFFF) + +/* I2C ENPEC mask */ +#define CR1_ENPEC_Set ((uint16_t)0x0020) +#define CR1_ENPEC_Reset ((uint16_t)0xFFDF) + +/* I2C ENARP mask */ +#define CR1_ENARP_Set ((uint16_t)0x0010) +#define CR1_ENARP_Reset ((uint16_t)0xFFEF) + +/* I2C NOSTRETCH mask */ +#define CR1_NOSTRETCH_Set ((uint16_t)0x0080) +#define CR1_NOSTRETCH_Reset ((uint16_t)0xFF7F) + +/* I2C registers Masks */ +#define CR1_CLEAR_Mask ((uint16_t)0xFBF5) + +/* I2C DMAEN mask */ +#define CR2_DMAEN_Set ((uint16_t)0x0800) +#define CR2_DMAEN_Reset ((uint16_t)0xF7FF) + +/* I2C LAST mask */ +#define CR2_LAST_Set ((uint16_t)0x1000) +#define CR2_LAST_Reset ((uint16_t)0xEFFF) + +/* I2C FREQ mask */ +#define CR2_FREQ_Reset ((uint16_t)0xFFC0) + +/* I2C ADD0 mask */ +#define OAR1_ADD0_Set ((uint16_t)0x0001) +#define OAR1_ADD0_Reset ((uint16_t)0xFFFE) + +/* I2C ENDUAL mask */ +#define OAR2_ENDUAL_Set ((uint16_t)0x0001) +#define OAR2_ENDUAL_Reset ((uint16_t)0xFFFE) + +/* I2C ADD2 mask */ +#define OAR2_ADD2_Reset ((uint16_t)0xFF01) + +/* I2C F/S mask */ +#define CCR_FS_Set ((uint16_t)0x8000) + +/* I2C CCR mask */ +#define CCR_CCR_Set ((uint16_t)0x0FFF) + +/* I2C FLAG mask */ +#define FLAG_Mask ((uint32_t)0x00FFFFFF) + +/* I2C Interrupt Enable mask */ +#define ITEN_Mask ((uint32_t)0x07000000) + +/** + * @} + */ + +/** @defgroup I2C_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the I2Cx peripheral registers to their default reset values. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval None + */ +void I2C_DeInit(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + if (I2Cx == I2C1) + { + /* Enable I2C1 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); + /* Release I2C1 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); + } + else + { + /* Enable I2C2 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE); + /* Release I2C2 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); + } +} + +/** + * @brief Initializes the I2Cx peripheral according to the specified + * parameters in the I2C_InitStruct. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_InitStruct: pointer to a I2C_InitTypeDef structure that + * contains the configuration information for the specified I2C peripheral. + * @retval None + */ +void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct) +{ + uint16_t tmpreg = 0, freqrange = 0; + uint16_t result = 0x04; + uint32_t pclk1 = 8000000; + RCC_ClocksTypeDef rcc_clocks; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed)); + assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode)); + assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle)); + assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1)); + assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack)); + assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress)); + +/*---------------------------- I2Cx CR2 Configuration ------------------------*/ + /* Get the I2Cx CR2 value */ + tmpreg = I2Cx->CR2; + /* Clear frequency FREQ[5:0] bits */ + tmpreg &= CR2_FREQ_Reset; + /* Get pclk1 frequency value */ + RCC_GetClocksFreq(&rcc_clocks); + pclk1 = rcc_clocks.PCLK1_Frequency; + /* Set frequency bits depending on pclk1 value */ + freqrange = (uint16_t)(pclk1 / 1000000); + tmpreg |= freqrange; + /* Write to I2Cx CR2 */ + I2Cx->CR2 = tmpreg; + +/*---------------------------- I2Cx CCR Configuration ------------------------*/ + /* Disable the selected I2C peripheral to configure TRISE */ + I2Cx->CR1 &= CR1_PE_Reset; + /* Reset tmpreg value */ + /* Clear F/S, DUTY and CCR[11:0] bits */ + tmpreg = 0; + + /* Configure speed in standard mode */ + if (I2C_InitStruct->I2C_ClockSpeed <= 100000) + { + /* Standard mode speed calculate */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1)); + /* Test if CCR value is under 0x4*/ + if (result < 0x04) + { + /* Set minimum allowed value */ + result = 0x04; + } + /* Set speed value for standard mode */ + tmpreg |= result; + /* Set Maximum Rise Time for standard mode */ + I2Cx->TRISE = freqrange + 1; + } + /* Configure speed in fast mode */ + else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/ + { + if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2) + { + /* Fast mode speed calculate: Tlow/Thigh = 2 */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3)); + } + else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/ + { + /* Fast mode speed calculate: Tlow/Thigh = 16/9 */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25)); + /* Set DUTY bit */ + result |= I2C_DutyCycle_16_9; + } + + /* Test if CCR value is under 0x1*/ + if ((result & CCR_CCR_Set) == 0) + { + /* Set minimum allowed value */ + result |= (uint16_t)0x0001; + } + /* Set speed value and set F/S bit for fast mode */ + tmpreg |= (uint16_t)(result | CCR_FS_Set); + /* Set Maximum Rise Time for fast mode */ + I2Cx->TRISE = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1); + } + + /* Write to I2Cx CCR */ + I2Cx->CCR = tmpreg; + /* Enable the selected I2C peripheral */ + I2Cx->CR1 |= CR1_PE_Set; + +/*---------------------------- I2Cx CR1 Configuration ------------------------*/ + /* Get the I2Cx CR1 value */ + tmpreg = I2Cx->CR1; + /* Clear ACK, SMBTYPE and SMBUS bits */ + tmpreg &= CR1_CLEAR_Mask; + /* Configure I2Cx: mode and acknowledgement */ + /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */ + /* Set ACK bit according to I2C_Ack value */ + tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack); + /* Write to I2Cx CR1 */ + I2Cx->CR1 = tmpreg; + +/*---------------------------- I2Cx OAR1 Configuration -----------------------*/ + /* Set I2Cx Own Address1 and acknowledged address */ + I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1); +} + +/** + * @brief Fills each I2C_InitStruct member with its default value. + * @param I2C_InitStruct: pointer to an I2C_InitTypeDef structure which will be initialized. + * @retval None + */ +void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct) +{ +/*---------------- Reset I2C init structure parameters values ----------------*/ + /* initialize the I2C_ClockSpeed member */ + I2C_InitStruct->I2C_ClockSpeed = 5000; + /* Initialize the I2C_Mode member */ + I2C_InitStruct->I2C_Mode = I2C_Mode_I2C; + /* Initialize the I2C_DutyCycle member */ + I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2; + /* Initialize the I2C_OwnAddress1 member */ + I2C_InitStruct->I2C_OwnAddress1 = 0; + /* Initialize the I2C_Ack member */ + I2C_InitStruct->I2C_Ack = I2C_Ack_Disable; + /* Initialize the I2C_AcknowledgedAddress member */ + I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; +} + +/** + * @brief Enables or disables the specified I2C peripheral. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C peripheral */ + I2Cx->CR1 |= CR1_PE_Set; + } + else + { + /* Disable the selected I2C peripheral */ + I2Cx->CR1 &= CR1_PE_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C DMA requests. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C DMA transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C DMA requests */ + I2Cx->CR2 |= CR2_DMAEN_Set; + } + else + { + /* Disable the selected I2C DMA requests */ + I2Cx->CR2 &= CR2_DMAEN_Reset; + } +} + +/** + * @brief Specifies that the next DMA transfer is the last one. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C DMA last transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Next DMA transfer is the last transfer */ + I2Cx->CR2 |= CR2_LAST_Set; + } + else + { + /* Next DMA transfer is not the last transfer */ + I2Cx->CR2 &= CR2_LAST_Reset; + } +} + +/** + * @brief Generates I2Cx communication START condition. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C START condition generation. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Generate a START condition */ + I2Cx->CR1 |= CR1_START_Set; + } + else + { + /* Disable the START condition generation */ + I2Cx->CR1 &= CR1_START_Reset; + } +} + +/** + * @brief Generates I2Cx communication STOP condition. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C STOP condition generation. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Generate a STOP condition */ + I2Cx->CR1 |= CR1_STOP_Set; + } + else + { + /* Disable the STOP condition generation */ + I2Cx->CR1 &= CR1_STOP_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C acknowledge feature. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C Acknowledgement. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the acknowledgement */ + I2Cx->CR1 |= CR1_ACK_Set; + } + else + { + /* Disable the acknowledgement */ + I2Cx->CR1 &= CR1_ACK_Reset; + } +} + +/** + * @brief Configures the specified I2C own address2. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Address: specifies the 7bit I2C own address2. + * @retval None. + */ +void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address) +{ + uint16_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + /* Get the old register value */ + tmpreg = I2Cx->OAR2; + + /* Reset I2Cx Own address2 bit [7:1] */ + tmpreg &= OAR2_ADD2_Reset; + + /* Set I2Cx Own address2 */ + tmpreg |= (uint16_t)((uint16_t)Address & (uint16_t)0x00FE); + + /* Store the new register value */ + I2Cx->OAR2 = tmpreg; +} + +/** + * @brief Enables or disables the specified I2C dual addressing mode. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C dual addressing mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable dual addressing mode */ + I2Cx->OAR2 |= OAR2_ENDUAL_Set; + } + else + { + /* Disable dual addressing mode */ + I2Cx->OAR2 &= OAR2_ENDUAL_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C general call feature. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C General call. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable generall call */ + I2Cx->CR1 |= CR1_ENGC_Set; + } + else + { + /* Disable generall call */ + I2Cx->CR1 &= CR1_ENGC_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C interrupts. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_IT: specifies the I2C interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg I2C_IT_BUF: Buffer interrupt mask + * @arg I2C_IT_EVT: Event interrupt mask + * @arg I2C_IT_ERR: Error interrupt mask + * @param NewState: new state of the specified I2C interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_I2C_CONFIG_IT(I2C_IT)); + + if (NewState != DISABLE) + { + /* Enable the selected I2C interrupts */ + I2Cx->CR2 |= I2C_IT; + } + else + { + /* Disable the selected I2C interrupts */ + I2Cx->CR2 &= (uint16_t)~I2C_IT; + } +} + +/** + * @brief Sends a data byte through the I2Cx peripheral. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Data: Byte to be transmitted.. + * @retval None + */ +void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Write in the DR register the data to be sent */ + I2Cx->DR = Data; +} + +/** + * @brief Returns the most recent received data by the I2Cx peripheral. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval The value of the received data. + */ +uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Return the data in the DR register */ + return (uint8_t)I2Cx->DR; +} + +/** + * @brief Transmits the address byte to select the slave device. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Address: specifies the slave address which will be transmitted + * @param I2C_Direction: specifies whether the I2C device will be a + * Transmitter or a Receiver. This parameter can be one of the following values + * @arg I2C_Direction_Transmitter: Transmitter mode + * @arg I2C_Direction_Receiver: Receiver mode + * @retval None. + */ +void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_DIRECTION(I2C_Direction)); + /* Test on the direction to set/reset the read/write bit */ + if (I2C_Direction != I2C_Direction_Transmitter) + { + /* Set the address bit0 for read */ + Address |= OAR1_ADD0_Set; + } + else + { + /* Reset the address bit0 for write */ + Address &= OAR1_ADD0_Reset; + } + /* Send the address */ + I2Cx->DR = Address; +} + +/** + * @brief Reads the specified I2C register and returns its value. + * @param I2C_Register: specifies the register to read. + * This parameter can be one of the following values: + * @arg I2C_Register_CR1: CR1 register. + * @arg I2C_Register_CR2: CR2 register. + * @arg I2C_Register_OAR1: OAR1 register. + * @arg I2C_Register_OAR2: OAR2 register. + * @arg I2C_Register_DR: DR register. + * @arg I2C_Register_SR1: SR1 register. + * @arg I2C_Register_SR2: SR2 register. + * @arg I2C_Register_CCR: CCR register. + * @arg I2C_Register_TRISE: TRISE register. + * @retval The value of the read register. + */ +uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_REGISTER(I2C_Register)); + + tmp = (uint32_t) I2Cx; + tmp += I2C_Register; + + /* Return the selected register value */ + return (*(__IO uint16_t *) tmp); +} + +/** + * @brief Enables or disables the specified I2C software reset. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C software reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Peripheral under reset */ + I2Cx->CR1 |= CR1_SWRST_Set; + } + else + { + /* Peripheral not under reset */ + I2Cx->CR1 &= CR1_SWRST_Reset; + } +} + +/** + * @brief Drives the SMBusAlert pin high or low for the specified I2C. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_SMBusAlert: specifies SMBAlert pin level. + * This parameter can be one of the following values: + * @arg I2C_SMBusAlert_Low: SMBAlert pin driven low + * @arg I2C_SMBusAlert_High: SMBAlert pin driven high + * @retval None + */ +void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_SMBUS_ALERT(I2C_SMBusAlert)); + if (I2C_SMBusAlert == I2C_SMBusAlert_Low) + { + /* Drive the SMBusAlert pin Low */ + I2Cx->CR1 |= I2C_SMBusAlert_Low; + } + else + { + /* Drive the SMBusAlert pin High */ + I2Cx->CR1 &= I2C_SMBusAlert_High; + } +} + +/** + * @brief Enables or disables the specified I2C PEC transfer. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C PEC transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C PEC transmission */ + I2Cx->CR1 |= CR1_PEC_Set; + } + else + { + /* Disable the selected I2C PEC transmission */ + I2Cx->CR1 &= CR1_PEC_Reset; + } +} + +/** + * @brief Selects the specified I2C PEC position. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_PECPosition: specifies the PEC position. + * This parameter can be one of the following values: + * @arg I2C_PECPosition_Next: indicates that the next byte is PEC + * @arg I2C_PECPosition_Current: indicates that current byte is PEC + * @retval None + */ +void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_PEC_POSITION(I2C_PECPosition)); + if (I2C_PECPosition == I2C_PECPosition_Next) + { + /* Next byte in shift register is PEC */ + I2Cx->CR1 |= I2C_PECPosition_Next; + } + else + { + /* Current byte in shift register is PEC */ + I2Cx->CR1 &= I2C_PECPosition_Current; + } +} + +/** + * @brief Enables or disables the PEC value calculation of the transfered bytes. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx PEC value calculation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C PEC calculation */ + I2Cx->CR1 |= CR1_ENPEC_Set; + } + else + { + /* Disable the selected I2C PEC calculation */ + I2Cx->CR1 &= CR1_ENPEC_Reset; + } +} + +/** + * @brief Returns the PEC value for the specified I2C. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval The PEC value. + */ +uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Return the selected I2C PEC value */ + return ((I2Cx->SR2) >> 8); +} + +/** + * @brief Enables or disables the specified I2C ARP. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx ARP. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C ARP */ + I2Cx->CR1 |= CR1_ENARP_Set; + } + else + { + /* Disable the selected I2C ARP */ + I2Cx->CR1 &= CR1_ENARP_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C Clock stretching. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx Clock stretching. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState == DISABLE) + { + /* Enable the selected I2C Clock stretching */ + I2Cx->CR1 |= CR1_NOSTRETCH_Set; + } + else + { + /* Disable the selected I2C Clock stretching */ + I2Cx->CR1 &= CR1_NOSTRETCH_Reset; + } +} + +/** + * @brief Selects the specified I2C fast mode duty cycle. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_DutyCycle: specifies the fast mode duty cycle. + * This parameter can be one of the following values: + * @arg I2C_DutyCycle_2: I2C fast mode Tlow/Thigh = 2 + * @arg I2C_DutyCycle_16_9: I2C fast mode Tlow/Thigh = 16/9 + * @retval None + */ +void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle)); + if (I2C_DutyCycle != I2C_DutyCycle_16_9) + { + /* I2C fast mode Tlow/Thigh=2 */ + I2Cx->CCR &= I2C_DutyCycle_2; + } + else + { + /* I2C fast mode Tlow/Thigh=16/9 */ + I2Cx->CCR |= I2C_DutyCycle_16_9; + } +} + +/** + * @brief Returns the last I2Cx Event. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval The last event + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Read the I2Cx status register */ + flag1 = I2Cx->SR1; + flag2 = I2Cx->SR2; + flag2 = flag2 << 16; + /* Get the last event value from I2C status register */ + lastevent = (flag1 | flag2) & FLAG_Mask; + /* Return status */ + return lastevent; +} + +/** + * @brief Checks whether the last I2Cx Event is equal to the one passed + * as parameter. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_EVENT: specifies the event to be checked. + * This parameter can be one of the following values: + * @arg I2C_EVENT_SLAVE_ADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2 + * @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3 + * @arg I2C_EVENT_SLAVE_ACK_FAILURE : EV3-2 + * @arg I2C_EVENT_MASTER_MODE_SELECT : EV5 + * @arg I2C_EVENT_MASTER_MODE_SELECTED : EV6 + * @arg I2C_EVENT_MASTER_BYTE_RECEIVED : EV7 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8 + * @arg I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9 + * @arg I2C_EVENT_SLAVE_STOP_DETECTED : EV4 + * @retval An ErrorStatus enumuration value: + * - SUCCESS: Last event is equal to the I2C_EVENT + * - ERROR: Last event is different from the I2C_EVENT + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + ErrorStatus status = ERROR; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_EVENT(I2C_EVENT)); + /* Read the I2Cx status register */ + flag1 = I2Cx->SR1; + flag2 = I2Cx->SR2; + flag2 = flag2 << 16; + /* Get the last event value from I2C status register */ + lastevent = (flag1 | flag2) & FLAG_Mask; + /* Check whether the last event is equal to I2C_EVENT */ + if (lastevent == I2C_EVENT ) + { + /* SUCCESS: last event is equal to I2C_EVENT */ + status = SUCCESS; + } + else + { + /* ERROR: last event is different from I2C_EVENT */ + status = ERROR; + } + /* Return status */ + return status; +} + +/** + * @brief Checks whether the specified I2C flag is set or not. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg I2C_FLAG_DUALF: Dual flag (Slave mode) + * @arg I2C_FLAG_SMBHOST: SMBus host header (Slave mode) + * @arg I2C_FLAG_SMBDEFAULT: SMBus default header (Slave mode) + * @arg I2C_FLAG_GENCALL: General call header flag (Slave mode) + * @arg I2C_FLAG_TRA: Transmitter/Receiver flag + * @arg I2C_FLAG_BUSY: Bus busy flag + * @arg I2C_FLAG_MSL: Master/Slave flag + * @arg I2C_FLAG_SMBALERT: SMBus Alert flag + * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_FLAG_PECERR: PEC error in reception flag + * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * @arg I2C_FLAG_TXE: Data register empty flag (Transmitter) + * @arg I2C_FLAG_RXNE: Data register not empty (Receiver) flag + * @arg I2C_FLAG_STOPF: Stop detection flag (Slave mode) + * @arg I2C_FLAG_ADD10: 10-bit header sent flag (Master mode) + * @arg I2C_FLAG_BTF: Byte transfer finished flag + * @arg I2C_FLAG_ADDR: Address sent flag (Master mode) “ADSL” + * Address matched flag (Slave mode)”ENDAD” + * @arg I2C_FLAG_SB: Start bit flag (Master mode) + * @retval The new state of I2C_FLAG (SET or RESET). + */ +FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) +{ + FlagStatus bitstatus = RESET; + __IO uint32_t i2creg = 0, i2cxbase = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_GET_FLAG(I2C_FLAG)); + + /* Get the I2Cx peripheral base address */ + i2cxbase = (uint32_t)I2Cx; + + /* Read flag register index */ + i2creg = I2C_FLAG >> 28; + + /* Get bit[23:0] of the flag */ + I2C_FLAG &= FLAG_Mask; + + if(i2creg != 0) + { + /* Get the I2Cx SR1 register address */ + i2cxbase += 0x14; + } + else + { + /* Flag in I2Cx SR2 Register */ + I2C_FLAG = (uint32_t)(I2C_FLAG >> 16); + /* Get the I2Cx SR2 register address */ + i2cxbase += 0x18; + } + + if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET) + { + /* I2C_FLAG is set */ + bitstatus = SET; + } + else + { + /* I2C_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the I2C_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the I2Cx's pending flags. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg I2C_FLAG_SMBALERT: SMBus Alert flag + * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_FLAG_PECERR: PEC error in reception flag + * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * + * @note + * - STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_SR1 register (I2C_GetFlagStatus()) followed by a write operation + * to I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). + * - ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_SR1 (I2C_GetFlagStatus()) followed by writing the + * second byte of the address in DR register. + * - BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_SR1 register (I2C_GetFlagStatus()) followed by a + * read/write to I2C_DR register (I2C_SendData()). + * - ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetFlagStatus()) followed by a read operation to + * I2C_SR2 register ((void)(I2Cx->SR2)). + * - SB (Start Bit) is cleared software sequence: a read operation to I2C_SR1 + * register (I2C_GetFlagStatus()) followed by a write operation to I2C_DR + * register (I2C_SendData()). + * @retval None + */ +void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) +{ + uint32_t flagpos = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLEAR_FLAG(I2C_FLAG)); + /* Get the I2C flag position */ + flagpos = I2C_FLAG & FLAG_Mask; + /* Clear the selected I2C flag */ + I2Cx->SR1 = (uint16_t)~flagpos; +} + +/** + * @brief Checks whether the specified I2C interrupt has occurred or not. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg I2C_IT_SMBALERT: SMBus Alert flag + * @arg I2C_IT_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_IT_PECERR: PEC error in reception flag + * @arg I2C_IT_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_IT_AF: Acknowledge failure flag + * @arg I2C_IT_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_IT_BERR: Bus error flag + * @arg I2C_IT_TXE: Data register empty flag (Transmitter) + * @arg I2C_IT_RXNE: Data register not empty (Receiver) flag + * @arg I2C_IT_STOPF: Stop detection flag (Slave mode) + * @arg I2C_IT_ADD10: 10-bit header sent flag (Master mode) + * @arg I2C_IT_BTF: Byte transfer finished flag + * @arg I2C_IT_ADDR: Address sent flag (Master mode) “ADSL” + * Address matched flag (Slave mode)”ENDAD” + * @arg I2C_IT_SB: Start bit flag (Master mode) + * @retval The new state of I2C_IT (SET or RESET). + */ +ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_GET_IT(I2C_IT)); + /* Check if the interrupt source is enabled or not */ + enablestatus = (uint32_t)(((I2C_IT & ITEN_Mask) >> 16) & (I2Cx->CR2)) ; + /* Get bit[23:0] of the flag */ + I2C_IT &= FLAG_Mask; + /* Check the status of the specified I2C flag */ + if (((I2Cx->SR1 & I2C_IT) != (uint32_t)RESET) && enablestatus) + { + /* I2C_IT is set */ + bitstatus = SET; + } + else + { + /* I2C_IT is reset */ + bitstatus = RESET; + } + /* Return the I2C_IT status */ + return bitstatus; +} + +/** + * @brief Clears the I2Cx’s interrupt pending bits. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg I2C_IT_SMBALERT: SMBus Alert interrupt + * @arg I2C_IT_TIMEOUT: Timeout or Tlow error interrupt + * @arg I2C_IT_PECERR: PEC error in reception interrupt + * @arg I2C_IT_OVR: Overrun/Underrun interrupt (Slave mode) + * @arg I2C_IT_AF: Acknowledge failure interrupt + * @arg I2C_IT_ARLO: Arbitration lost interrupt (Master mode) + * @arg I2C_IT_BERR: Bus error interrupt + * + * @note + * - STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). + * - ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_SR1 (I2C_GetITStatus()) followed by writing the second + * byte of the address in I2C_DR register. + * - BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_SR1 register (I2C_GetITStatus()) followed by a + * read/write to I2C_DR register (I2C_SendData()). + * - ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetITStatus()) followed by a read operation to + * I2C_SR2 register ((void)(I2Cx->SR2)). + * - SB (Start Bit) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_DR register (I2C_SendData()). + * @retval None + */ +void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT) +{ + uint32_t flagpos = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLEAR_IT(I2C_IT)); + /* Get the I2C flag position */ + flagpos = I2C_IT & FLAG_Mask; + /* Clear the selected I2C flag */ + I2Cx->SR1 = (uint16_t)~flagpos; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c new file mode 100644 index 0000000..11f6dbc --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c @@ -0,0 +1,189 @@ +/** + ****************************************************************************** + * @file stm32f10x_iwdg.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the IWDG firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_iwdg.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup IWDG + * @brief IWDG driver modules + * @{ + */ + +/** @defgroup IWDG_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_Defines + * @{ + */ + +/* ---------------------- IWDG registers bit mask ----------------------------*/ + +/* KR register bit mask */ +#define KR_KEY_Reload ((uint16_t)0xAAAA) +#define KR_KEY_Enable ((uint16_t)0xCCCC) + +/** + * @} + */ + +/** @defgroup IWDG_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_Functions + * @{ + */ + +/** + * @brief Enables or disables write access to IWDG_PR and IWDG_RLR registers. + * @param IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers. + * This parameter can be one of the following values: + * @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers + * @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers + * @retval None + */ +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) +{ + /* Check the parameters */ + assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); + IWDG->KR = IWDG_WriteAccess; +} + +/** + * @brief Sets IWDG Prescaler value. + * @param IWDG_Prescaler: specifies the IWDG Prescaler value. + * This parameter can be one of the following values: + * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 + * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 + * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 + * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 + * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 + * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 + * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 + * @retval None + */ +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); + IWDG->PR = IWDG_Prescaler; +} + +/** + * @brief Sets IWDG Reload value. + * @param Reload: specifies the IWDG Reload value. + * This parameter must be a number between 0 and 0x0FFF. + * @retval None + */ +void IWDG_SetReload(uint16_t Reload) +{ + /* Check the parameters */ + assert_param(IS_IWDG_RELOAD(Reload)); + IWDG->RLR = Reload; +} + +/** + * @brief Reloads IWDG counter with value defined in the reload register + * (write access to IWDG_PR and IWDG_RLR registers disabled). + * @param None + * @retval None + */ +void IWDG_ReloadCounter(void) +{ + IWDG->KR = KR_KEY_Reload; +} + +/** + * @brief Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled). + * @param None + * @retval None + */ +void IWDG_Enable(void) +{ + IWDG->KR = KR_KEY_Enable; +} + +/** + * @brief Checks whether the specified IWDG flag is set or not. + * @param IWDG_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg IWDG_FLAG_PVU: Prescaler Value Update on going + * @arg IWDG_FLAG_RVU: Reload Value Update on going + * @retval The new state of IWDG_FLAG (SET or RESET). + */ +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_IWDG_FLAG(IWDG_FLAG)); + if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c new file mode 100644 index 0000000..2c8143b --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c @@ -0,0 +1,311 @@ +/** + ****************************************************************************** + * @file stm32f10x_pwr.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the PWR firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_pwr.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup PWR + * @brief PWR driver modules + * @{ + */ + +/** @defgroup PWR_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_Defines + * @{ + */ + +/* --------- PWR registers bit address in the alias region ---------- */ +#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of DBP bit */ +#define CR_OFFSET (PWR_OFFSET + 0x00) +#define DBP_BitNumber 0x08 +#define CR_DBP_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (DBP_BitNumber * 4)) + +/* Alias word address of PVDE bit */ +#define PVDE_BitNumber 0x04 +#define CR_PVDE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PVDE_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of EWUP bit */ +#define CSR_OFFSET (PWR_OFFSET + 0x04) +#define EWUP_BitNumber 0x08 +#define CSR_EWUP_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (EWUP_BitNumber * 4)) + +/* ------------------ PWR registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_PDDS_Set ((uint32_t)0x00000002) +#define CR_DS_Mask ((uint32_t)0xFFFFFFFC) +#define CR_CWUF_Set ((uint32_t)0x00000004) +#define CR_PLS_Mask ((uint32_t)0xFFFFFF1F) + +/* --------- Cortex System Control register bit mask ---------------- */ + +/* Cortex System Control register address */ +#define SCB_SysCtrl ((uint32_t)0xE000ED10) + +/* SLEEPDEEP bit mask */ +#define SysCtrl_SLEEPDEEP_Set ((uint32_t)0x00000004) +/** + * @} + */ + +/** @defgroup PWR_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the PWR peripheral registers to their default reset values. + * @param None + * @retval None + */ +void PWR_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE); +} + +/** + * @brief Enables or disables access to the RTC and backup registers. + * @param NewState: new state of the access to the RTC and backup registers. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_BackupAccessCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Power Voltage Detector(PVD). + * @param NewState: new state of the PVD. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_PVDCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). + * @param PWR_PVDLevel: specifies the PVD detection level + * This parameter can be one of the following values: + * @arg PWR_PVDLevel_2V2: PVD detection level set to 2.2V + * @arg PWR_PVDLevel_2V3: PVD detection level set to 2.3V + * @arg PWR_PVDLevel_2V4: PVD detection level set to 2.4V + * @arg PWR_PVDLevel_2V5: PVD detection level set to 2.5V + * @arg PWR_PVDLevel_2V6: PVD detection level set to 2.6V + * @arg PWR_PVDLevel_2V7: PVD detection level set to 2.7V + * @arg PWR_PVDLevel_2V8: PVD detection level set to 2.8V + * @arg PWR_PVDLevel_2V9: PVD detection level set to 2.9V + * @retval None + */ +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel)); + tmpreg = PWR->CR; + /* Clear PLS[7:5] bits */ + tmpreg &= CR_PLS_Mask; + /* Set PLS[7:5] bits according to PWR_PVDLevel value */ + tmpreg |= PWR_PVDLevel; + /* Store the new value */ + PWR->CR = tmpreg; +} + +/** + * @brief Enables or disables the WakeUp Pin functionality. + * @param NewState: new state of the WakeUp Pin functionality. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_WakeUpPinCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState; +} + +/** + * @brief Enters STOP mode. + * @param PWR_Regulator: specifies the regulator state in STOP mode. + * This parameter can be one of the following values: + * @arg PWR_Regulator_ON: STOP mode with regulator ON + * @arg PWR_Regulator_LowPower: STOP mode with regulator in low power mode + * @param PWR_STOPEntry: specifies if STOP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_STOPEntry_WFI: enter STOP mode with WFI instruction + * @arg PWR_STOPEntry_WFE: enter STOP mode with WFE instruction + * @retval None + */ +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(PWR_Regulator)); + assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry)); + + /* Select the regulator state in STOP mode ---------------------------------*/ + tmpreg = PWR->CR; + /* Clear PDDS and LPDS bits */ + tmpreg &= CR_DS_Mask; + /* Set LPDS bit according to PWR_Regulator value */ + tmpreg |= PWR_Regulator; + /* Store the new value */ + PWR->CR = tmpreg; + /* Set SLEEPDEEP bit of Cortex System Control Register */ + *(__IO uint32_t *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set; + + /* Select STOP mode entry --------------------------------------------------*/ + if(PWR_STOPEntry == PWR_STOPEntry_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __WFE(); + } +} + +/** + * @brief Enters STANDBY mode. + * @param None + * @retval None + */ +void PWR_EnterSTANDBYMode(void) +{ + /* Clear Wake-up flag */ + PWR->CR |= CR_CWUF_Set; + /* Select STANDBY mode */ + PWR->CR |= CR_PDDS_Set; + /* Set SLEEPDEEP bit of Cortex System Control Register */ + *(__IO uint32_t *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set; +/* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM ) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); +} + +/** + * @brief Checks whether the specified PWR flag is set or not. + * @param PWR_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag + * @arg PWR_FLAG_SB: StandBy flag + * @arg PWR_FLAG_PVDO: PVD Output + * @retval The new state of PWR_FLAG (SET or RESET). + */ +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_PWR_GET_FLAG(PWR_FLAG)); + + if ((PWR->CSR & PWR_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the PWR's pending flags. + * @param PWR_FLAG: specifies the flag to clear. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag + * @arg PWR_FLAG_SB: StandBy flag + * @retval None + */ +void PWR_ClearFlag(uint32_t PWR_FLAG) +{ + /* Check the parameters */ + assert_param(IS_PWR_CLEAR_FLAG(PWR_FLAG)); + + PWR->CR |= PWR_FLAG << 2; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c new file mode 100644 index 0000000..c19915c --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c @@ -0,0 +1,1447 @@ +/** + ****************************************************************************** + * @file stm32f10x_rcc.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the RCC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup RCC + * @brief RCC driver modules + * @{ + */ + +/** @defgroup RCC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Defines + * @{ + */ + +/* ------------ RCC registers bit address in the alias region ----------- */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of HSION bit */ +#define CR_OFFSET (RCC_OFFSET + 0x00) +#define HSION_BitNumber 0x00 +#define CR_HSION_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BitNumber * 4)) + +/* Alias word address of PLLON bit */ +#define PLLON_BitNumber 0x18 +#define CR_PLLON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BitNumber * 4)) + +#ifdef STM32F10X_CL + /* Alias word address of PLL2ON bit */ + #define PLL2ON_BitNumber 0x1A + #define CR_PLL2ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL2ON_BitNumber * 4)) + + /* Alias word address of PLL3ON bit */ + #define PLL3ON_BitNumber 0x1C + #define CR_PLL3ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL3ON_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* Alias word address of CSSON bit */ +#define CSSON_BitNumber 0x13 +#define CR_CSSON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BitNumber * 4)) + +/* --- CFGR Register ---*/ + +/* Alias word address of USBPRE bit */ +#define CFGR_OFFSET (RCC_OFFSET + 0x04) + +#ifndef STM32F10X_CL + #define USBPRE_BitNumber 0x16 + #define CFGR_USBPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (USBPRE_BitNumber * 4)) +#else + #define OTGFSPRE_BitNumber 0x16 + #define CFGR_OTGFSPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (OTGFSPRE_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* --- BDCR Register ---*/ + +/* Alias word address of RTCEN bit */ +#define BDCR_OFFSET (RCC_OFFSET + 0x20) +#define RTCEN_BitNumber 0x0F +#define BDCR_RTCEN_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (RTCEN_BitNumber * 4)) + +/* Alias word address of BDRST bit */ +#define BDRST_BitNumber 0x10 +#define BDCR_BDRST_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (BDRST_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of LSION bit */ +#define CSR_OFFSET (RCC_OFFSET + 0x24) +#define LSION_BitNumber 0x00 +#define CSR_LSION_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4)) + +#ifdef STM32F10X_CL +/* --- CFGR2 Register ---*/ + + /* Alias word address of I2S2SRC bit */ + #define CFGR2_OFFSET (RCC_OFFSET + 0x2C) + #define I2S2SRC_BitNumber 0x11 + #define CFGR2_I2S2SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S2SRC_BitNumber * 4)) + + /* Alias word address of I2S3SRC bit */ + #define I2S3SRC_BitNumber 0x12 + #define CFGR2_I2S3SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S3SRC_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* ---------------------- RCC registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF) +#define CR_HSEBYP_Set ((uint32_t)0x00040000) +#define CR_HSEON_Reset ((uint32_t)0xFFFEFFFF) +#define CR_HSEON_Set ((uint32_t)0x00010000) +#define CR_HSITRIM_Mask ((uint32_t)0xFFFFFF07) + +/* CFGR register bit mask */ +#ifndef STM32F10X_CL + #define CFGR_PLL_Mask ((uint32_t)0xFFC0FFFF) +#else + #define CFGR_PLL_Mask ((uint32_t)0xFFC2FFFF) +#endif /* STM32F10X_CL */ + +#define CFGR_PLLMull_Mask ((uint32_t)0x003C0000) +#define CFGR_PLLSRC_Mask ((uint32_t)0x00010000) +#define CFGR_PLLXTPRE_Mask ((uint32_t)0x00020000) +#define CFGR_SWS_Mask ((uint32_t)0x0000000C) +#define CFGR_SW_Mask ((uint32_t)0xFFFFFFFC) +#define CFGR_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F) +#define CFGR_HPRE_Set_Mask ((uint32_t)0x000000F0) +#define CFGR_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF) +#define CFGR_PPRE1_Set_Mask ((uint32_t)0x00000700) +#define CFGR_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF) +#define CFGR_PPRE2_Set_Mask ((uint32_t)0x00003800) +#define CFGR_ADCPRE_Reset_Mask ((uint32_t)0xFFFF3FFF) +#define CFGR_ADCPRE_Set_Mask ((uint32_t)0x0000C000) + +/* CSR register bit mask */ +#define CSR_RMVF_Set ((uint32_t)0x01000000) + +#ifdef STM32F10X_CL +/* CFGR2 register bit mask */ + #define CFGR2_PREDIV1SRC ((uint32_t)0x00010000) + #define CFGR2_PREDIV1 ((uint32_t)0x0000000F) + #define CFGR2_PREDIV2 ((uint32_t)0x000000F0) + #define CFGR2_PLL2MUL ((uint32_t)0x00000F00) + #define CFGR2_PLL3MUL ((uint32_t)0x0000F000) +#endif /* STM32F10X_CL */ + +/* RCC Flag Mask */ +#define FLAG_Mask ((uint8_t)0x1F) + +#ifndef HSI_Value +/* Typical Value of the HSI in Hz */ + #define HSI_Value ((uint32_t)8000000) +#endif /* HSI_Value */ + +/* CIR register byte 2 (Bits[15:8]) base address */ +#define CIR_BYTE2_ADDRESS ((uint32_t)0x40021009) + +/* CIR register byte 3 (Bits[23:16]) base address */ +#define CIR_BYTE3_ADDRESS ((uint32_t)0x4002100A) + +/* CFGR register byte 4 (Bits[31:24]) base address */ +#define CFGR_BYTE4_ADDRESS ((uint32_t)0x40021007) + +/* BDCR register base address */ +#define BDCR_ADDRESS (PERIPH_BASE + BDCR_OFFSET) + +#ifndef HSEStartUp_TimeOut +/* Time out for HSE start up */ + #define HSEStartUp_TimeOut ((uint16_t)0x0500) +#endif /* HSEStartUp_TimeOut */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Variables + * @{ + */ + +static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; +static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8}; + +/** + * @} + */ + +/** @defgroup RCC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Functions + * @{ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @param None + * @retval None + */ +void RCC_DeInit(void) +{ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ +#ifndef STM32F10X_CL + RCC->CFGR &= (uint32_t)0xF8FF0000; +#else + RCC->CFGR &= (uint32_t)0xF0FF0000; +#endif /* STM32F10X_CL */ + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC->CFGR &= (uint32_t)0xFF80FFFF; + +#ifndef STM32F10X_CL + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; +#else + /* Reset PLL2ON and PLL3ON bits */ + RCC->CR &= (uint32_t)0xEBFFFFFF; + + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x00FF0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#endif /* STM32F10X_CL */ +} + +/** + * @brief Configures the External High Speed oscillator (HSE). + * @note HSE can not be stopped if it is used directly or through the PLL as system clock. + * @param RCC_HSE: specifies the new state of the HSE. + * This parameter can be one of the following values: + * @arg RCC_HSE_OFF: HSE oscillator OFF + * @arg RCC_HSE_ON: HSE oscillator ON + * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock + * @retval None + */ +void RCC_HSEConfig(uint32_t RCC_HSE) +{ + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_HSE)); + /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ + /* Reset HSEON bit */ + RCC->CR &= CR_HSEON_Reset; + /* Reset HSEBYP bit */ + RCC->CR &= CR_HSEBYP_Reset; + /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */ + switch(RCC_HSE) + { + case RCC_HSE_ON: + /* Set HSEON bit */ + RCC->CR |= CR_HSEON_Set; + break; + + case RCC_HSE_Bypass: + /* Set HSEBYP and HSEON bits */ + RCC->CR |= CR_HSEBYP_Set | CR_HSEON_Set; + break; + + default: + break; + } +} + +/** + * @brief Waits for HSE start-up. + * @param None + * @retval An ErrorStatus enumuration value: + * - SUCCESS: HSE oscillator is stable and ready to use + * - ERROR: HSE oscillator not yet ready + */ +ErrorStatus RCC_WaitForHSEStartUp(void) +{ + __IO uint32_t StartUpCounter = 0; + ErrorStatus status = ERROR; + FlagStatus HSEStatus = RESET; + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); + StartUpCounter++; + } while((StartUpCounter != HSEStartUp_TimeOut) && (HSEStatus == RESET)); + + if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) + { + status = SUCCESS; + } + else + { + status = ERROR; + } + return (status); +} + +/** + * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. + * @param HSICalibrationValue: specifies the calibration trimming value. + * This parameter must be a number between 0 and 0x1F. + * @retval None + */ +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_CALIBRATION_VALUE(HSICalibrationValue)); + tmpreg = RCC->CR; + /* Clear HSITRIM[4:0] bits */ + tmpreg &= CR_HSITRIM_Mask; + /* Set the HSITRIM[4:0] bits according to HSICalibrationValue value */ + tmpreg |= (uint32_t)HSICalibrationValue << 3; + /* Store the new value */ + RCC->CR = tmpreg; +} + +/** + * @brief Enables or disables the Internal High Speed oscillator (HSI). + * @note HSI can not be stopped if it is used directly or through the PLL as system clock. + * @param NewState: new state of the HSI. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_HSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_HSION_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the PLL clock source and multiplication factor. + * @note This function must be used only when the PLL is disabled. + * @param RCC_PLLSource: specifies the PLL entry clock source. + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry + * @arg RCC_PLLSource_PREDIV1: PREDIV1 clock selected as PLL clock entry + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry + * @arg RCC_PLLSource_HSE_Div1: HSE oscillator clock selected as PLL clock entry + * @arg RCC_PLLSource_HSE_Div2: HSE oscillator clock divided by 2 selected as PLL clock entry + * @param RCC_PLLMul: specifies the PLL multiplication factor. + * For @b STM32_Connectivity_line_devices, this parameter can be RCC_PLLMul_x where x:{[4,9], 6_5} + * For @b other_STM32_devices, this parameter can be RCC_PLLMul_x where x:[2,16] + * @retval None + */ +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource)); + assert_param(IS_RCC_PLL_MUL(RCC_PLLMul)); + + tmpreg = RCC->CFGR; + /* Clear PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ + tmpreg &= CFGR_PLL_Mask; + /* Set the PLL configuration bits */ + tmpreg |= RCC_PLLSource | RCC_PLLMul; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Enables or disables the PLL. + * @note The PLL can not be disabled if it is used as system clock. + * @param NewState: new state of the PLL. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLLCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_PLLON_BB = (uint32_t)NewState; +} + +#ifdef STM32F10X_CL +/** + * @brief Configures the PREDIV1 division factor. + * @note + * - This function must be used only when the PLL is disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PREDIV1_Source: specifies the PREDIV1 clock source. + * This parameter can be one of the following values: + * @arg RCC_PREDIV1_Source_HSE: HSE selected as PREDIV1 clock + * @arg RCC_PREDIV1_Source_PLL2: PLL2 selected as PREDIV1 clock + * @param RCC_PREDIV1_Div: specifies the PREDIV1 clock division factor. + * This parameter can be RCC_PREDIV1_Divx where x:[1,16] + * @retval None + */ +void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PREDIV1_SOURCE(RCC_PREDIV1_Source)); + assert_param(IS_RCC_PREDIV1(RCC_PREDIV1_Div)); + + tmpreg = RCC->CFGR2; + /* Clear PREDIV1[3:0] and PREDIV1SRC bits */ + tmpreg &= ~(CFGR2_PREDIV1 | CFGR2_PREDIV1SRC); + /* Set the PREDIV1 clock source and division factor */ + tmpreg |= RCC_PREDIV1_Source | RCC_PREDIV1_Div ; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + + +/** + * @brief Configures the PREDIV2 division factor. + * @note + * - This function must be used only when both PLL2 and PLL3 are disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PREDIV2_Div: specifies the PREDIV2 clock division factor. + * This parameter can be RCC_PREDIV2_Divx where x:[1,16] + * @retval None + */ +void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PREDIV2(RCC_PREDIV2_Div)); + + tmpreg = RCC->CFGR2; + /* Clear PREDIV2[3:0] bits */ + tmpreg &= ~CFGR2_PREDIV2; + /* Set the PREDIV2 division factor */ + tmpreg |= RCC_PREDIV2_Div; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + +/** + * @brief Configures the PLL2 multiplication factor. + * @note + * - This function must be used only when the PLL2 is disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PLL2Mul: specifies the PLL2 multiplication factor. + * This parameter can be RCC_PLL2Mul_x where x:{[8,14], 16, 20} + * @retval None + */ +void RCC_PLL2Config(uint32_t RCC_PLL2Mul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL2_MUL(RCC_PLL2Mul)); + + tmpreg = RCC->CFGR2; + /* Clear PLL2Mul[3:0] bits */ + tmpreg &= ~CFGR2_PLL2MUL; + /* Set the PLL2 configuration bits */ + tmpreg |= RCC_PLL2Mul; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + + +/** + * @brief Enables or disables the PLL2. + * @note + * - The PLL2 can not be disabled if it is used indirectly as system clock + * (i.e. it is used as PLL clock entry that is used as System clock). + * - This function applies only to STM32 Connectivity line devices. + * @param NewState: new state of the PLL2. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLL2Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_PLL2ON_BB = (uint32_t)NewState; +} + + +/** + * @brief Configures the PLL3 multiplication factor. + * @note + * - This function must be used only when the PLL3 is disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PLL3Mul: specifies the PLL3 multiplication factor. + * This parameter can be RCC_PLL3Mul_x where x:{[8,14], 16, 20} + * @retval None + */ +void RCC_PLL3Config(uint32_t RCC_PLL3Mul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL3_MUL(RCC_PLL3Mul)); + + tmpreg = RCC->CFGR2; + /* Clear PLL3Mul[3:0] bits */ + tmpreg &= ~CFGR2_PLL3MUL; + /* Set the PLL3 configuration bits */ + tmpreg |= RCC_PLL3Mul; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + + +/** + * @brief Enables or disables the PLL3. + * @note This function applies only to STM32 Connectivity line devices. + * @param NewState: new state of the PLL3. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLL3Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_PLL3ON_BB = (uint32_t)NewState; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the system clock (SYSCLK). + * @param RCC_SYSCLKSource: specifies the clock source used as system clock. + * This parameter can be one of the following values: + * @arg RCC_SYSCLKSource_HSI: HSI selected as system clock + * @arg RCC_SYSCLKSource_HSE: HSE selected as system clock + * @arg RCC_SYSCLKSource_PLLCLK: PLL selected as system clock + * @retval None + */ +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource)); + tmpreg = RCC->CFGR; + /* Clear SW[1:0] bits */ + tmpreg &= CFGR_SW_Mask; + /* Set SW[1:0] bits according to RCC_SYSCLKSource value */ + tmpreg |= RCC_SYSCLKSource; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Returns the clock source used as system clock. + * @param None + * @retval The clock source used as system clock. The returned value can + * be one of the following: + * - 0x00: HSI used as system clock + * - 0x04: HSE used as system clock + * - 0x08: PLL used as system clock + */ +uint8_t RCC_GetSYSCLKSource(void) +{ + return ((uint8_t)(RCC->CFGR & CFGR_SWS_Mask)); +} + +/** + * @brief Configures the AHB clock (HCLK). + * @param RCC_SYSCLK: defines the AHB clock divider. This clock is derived from + * the system clock (SYSCLK). + * This parameter can be one of the following values: + * @arg RCC_SYSCLK_Div1: AHB clock = SYSCLK + * @arg RCC_SYSCLK_Div2: AHB clock = SYSCLK/2 + * @arg RCC_SYSCLK_Div4: AHB clock = SYSCLK/4 + * @arg RCC_SYSCLK_Div8: AHB clock = SYSCLK/8 + * @arg RCC_SYSCLK_Div16: AHB clock = SYSCLK/16 + * @arg RCC_SYSCLK_Div64: AHB clock = SYSCLK/64 + * @arg RCC_SYSCLK_Div128: AHB clock = SYSCLK/128 + * @arg RCC_SYSCLK_Div256: AHB clock = SYSCLK/256 + * @arg RCC_SYSCLK_Div512: AHB clock = SYSCLK/512 + * @retval None + */ +void RCC_HCLKConfig(uint32_t RCC_SYSCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_HCLK(RCC_SYSCLK)); + tmpreg = RCC->CFGR; + /* Clear HPRE[3:0] bits */ + tmpreg &= CFGR_HPRE_Reset_Mask; + /* Set HPRE[3:0] bits according to RCC_SYSCLK value */ + tmpreg |= RCC_SYSCLK; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the Low Speed APB clock (PCLK1). + * @param RCC_HCLK: defines the APB1 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB1 clock = HCLK + * @arg RCC_HCLK_Div2: APB1 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB1 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB1 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB1 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK1Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + tmpreg = RCC->CFGR; + /* Clear PPRE1[2:0] bits */ + tmpreg &= CFGR_PPRE1_Reset_Mask; + /* Set PPRE1[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the High Speed APB clock (PCLK2). + * @param RCC_HCLK: defines the APB2 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB2 clock = HCLK + * @arg RCC_HCLK_Div2: APB2 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB2 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB2 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB2 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK2Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + tmpreg = RCC->CFGR; + /* Clear PPRE2[2:0] bits */ + tmpreg &= CFGR_PPRE2_Reset_Mask; + /* Set PPRE2[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK << 3; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Enables or disables the specified RCC interrupts. + * @param RCC_IT: specifies the RCC interrupt sources to be enabled or disabled. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * + * @param NewState: new state of the specified RCC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_IT(RCC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Perform Byte access to RCC_CIR bits to enable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS |= RCC_IT; + } + else + { + /* Perform Byte access to RCC_CIR bits to disable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT; + } +} + +#ifndef STM32F10X_CL +/** + * @brief Configures the USB clock (USBCLK). + * @param RCC_USBCLKSource: specifies the USB clock source. This clock is + * derived from the PLL output. + * This parameter can be one of the following values: + * @arg RCC_USBCLKSource_PLLCLK_1Div5: PLL clock divided by 1,5 selected as USB + * clock source + * @arg RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB clock source + * @retval None + */ +void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource)); + + *(__IO uint32_t *) CFGR_USBPRE_BB = RCC_USBCLKSource; +} +#else +/** + * @brief Configures the USB OTG FS clock (OTGFSCLK). + * This function applies only to STM32 Connectivity line devices. + * @param RCC_OTGFSCLKSource: specifies the USB OTG FS clock source. + * This clock is derived from the PLL output. + * This parameter can be one of the following values: + * @arg RCC_OTGFSCLKSource_PLLVCO_Div3: PLL VCO clock divided by 2 selected as USB OTG FS clock source + * @arg RCC_OTGFSCLKSource_PLLVCO_Div2: PLL VCO clock divided by 2 selected as USB OTG FS clock source + * @retval None + */ +void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_OTGFSCLK_SOURCE(RCC_OTGFSCLKSource)); + + *(__IO uint32_t *) CFGR_OTGFSPRE_BB = RCC_OTGFSCLKSource; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the ADC clock (ADCCLK). + * @param RCC_PCLK2: defines the ADC clock divider. This clock is derived from + * the APB2 clock (PCLK2). + * This parameter can be one of the following values: + * @arg RCC_PCLK2_Div2: ADC clock = PCLK2/2 + * @arg RCC_PCLK2_Div4: ADC clock = PCLK2/4 + * @arg RCC_PCLK2_Div6: ADC clock = PCLK2/6 + * @arg RCC_PCLK2_Div8: ADC clock = PCLK2/8 + * @retval None + */ +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_ADCCLK(RCC_PCLK2)); + tmpreg = RCC->CFGR; + /* Clear ADCPRE[1:0] bits */ + tmpreg &= CFGR_ADCPRE_Reset_Mask; + /* Set ADCPRE[1:0] bits according to RCC_PCLK2 value */ + tmpreg |= RCC_PCLK2; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +#ifdef STM32F10X_CL +/** + * @brief Configures the I2S2 clock source(I2S2CLK). + * @note + * - This function must be called before enabling I2S2 APB clock. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_I2S2CLKSource: specifies the I2S2 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2S2CLKSource_SYSCLK: system clock selected as I2S2 clock entry + * @arg RCC_I2S2CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S2 clock entry + * @retval None + */ +void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_I2S2CLK_SOURCE(RCC_I2S2CLKSource)); + + *(__IO uint32_t *) CFGR2_I2S2SRC_BB = RCC_I2S2CLKSource; +} + +/** + * @brief Configures the I2S3 clock source(I2S2CLK). + * @note + * - This function must be called before enabling I2S3 APB clock. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_I2S3CLKSource: specifies the I2S3 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2S3CLKSource_SYSCLK: system clock selected as I2S3 clock entry + * @arg RCC_I2S3CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S3 clock entry + * @retval None + */ +void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_I2S3CLK_SOURCE(RCC_I2S3CLKSource)); + + *(__IO uint32_t *) CFGR2_I2S3SRC_BB = RCC_I2S3CLKSource; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the External Low Speed oscillator (LSE). + * @param RCC_LSE: specifies the new state of the LSE. + * This parameter can be one of the following values: + * @arg RCC_LSE_OFF: LSE oscillator OFF + * @arg RCC_LSE_ON: LSE oscillator ON + * @arg RCC_LSE_Bypass: LSE oscillator bypassed with external clock + * @retval None + */ +void RCC_LSEConfig(uint8_t RCC_LSE) +{ + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_LSE)); + /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/ + /* Reset LSEON bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; + /* Reset LSEBYP bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; + /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */ + switch(RCC_LSE) + { + case RCC_LSE_ON: + /* Set LSEON bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON; + break; + + case RCC_LSE_Bypass: + /* Set LSEBYP and LSEON bits */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON; + break; + + default: + break; + } +} + +/** + * @brief Enables or disables the Internal Low Speed oscillator (LSI). + * @note LSI can not be disabled if the IWDG is running. + * @param NewState: new state of the LSI. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_LSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the RTC clock (RTCCLK). + * @note Once the RTC clock is selected it can’t be changed unless the Backup domain is reset. + * @param RCC_RTCCLKSource: specifies the RTC clock source. + * This parameter can be one of the following values: + * @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock + * @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock + * @arg RCC_RTCCLKSource_HSE_Div128: HSE clock divided by 128 selected as RTC clock + * @retval None + */ +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource)); + /* Select the RTC clock source */ + RCC->BDCR |= RCC_RTCCLKSource; +} + +/** + * @brief Enables or disables the RTC clock. + * @note This function must be used only after the RTC clock was selected using the RCC_RTCCLKConfig function. + * @param NewState: new state of the RTC clock. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_RTCCLKCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState; +} + +/** + * @brief Returns the frequencies of different on chip clocks. + * @param RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold + * the clocks frequencies. + * @retval None + */ +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0; + +#ifdef STM32F10X_CL + uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0; +#endif /* STM32F10X_CL */ + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & CFGR_SWS_Mask; + + switch (tmp) + { + case 0x00: /* HSI used as system clock */ + RCC_Clocks->SYSCLK_Frequency = HSI_Value; + break; + case 0x04: /* HSE used as system clock */ + RCC_Clocks->SYSCLK_Frequency = HSE_Value; + break; + case 0x08: /* PLL used as system clock */ + + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmull = RCC->CFGR & CFGR_PLLMull_Mask; + pllsource = RCC->CFGR & CFGR_PLLSRC_Mask; + +#ifndef STM32F10X_CL + pllmull = ( pllmull >> 18) + 2; + + if (pllsource == 0x00) + {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull; + } + else + {/* HSE selected as PLL clock entry */ + if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (uint32_t)RESET) + {/* HSE oscillator clock divided by 2 */ + RCC_Clocks->SYSCLK_Frequency = (HSE_Value >> 1) * pllmull; + } + else + { + RCC_Clocks->SYSCLK_Frequency = HSE_Value * pllmull; + } + } +#else + pllmull = pllmull >> 18; + + if (pllmull != 0x0D) + { + pllmull += 2; + } + else + { /* PLL multiplication factor = PLL input clock * 6.5 */ + pllmull = 13 / 2; + } + + if (pllsource == 0x00) + {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull; + } + else + {/* PREDIV1 selected as PLL clock entry */ + + /* Get PREDIV1 clock source and division factor */ + prediv1source = RCC->CFGR2 & CFGR2_PREDIV1SRC; + prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1; + + if (prediv1source == 0) + { /* HSE oscillator clock selected as PREDIV1 clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSE_Value / prediv1factor) * pllmull; + } + else + {/* PLL2 clock selected as PREDIV1 clock entry */ + + /* Get PREDIV2 division factor and PLL2 multiplication factor */ + prediv2factor = ((RCC->CFGR2 & CFGR2_PREDIV2) >> 4) + 1; + pll2mull = ((RCC->CFGR2 & CFGR2_PLL2MUL) >> 8 ) + 2; + RCC_Clocks->SYSCLK_Frequency = (((HSE_Value / prediv2factor) * pll2mull) / prediv1factor) * pllmull; + } + } +#endif /* STM32F10X_CL */ + break; + + default: + RCC_Clocks->SYSCLK_Frequency = HSI_Value; + break; + } + + /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/ + /* Get HCLK prescaler */ + tmp = RCC->CFGR & CFGR_HPRE_Set_Mask; + tmp = tmp >> 4; + presc = APBAHBPrescTable[tmp]; + /* HCLK clock frequency */ + RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; + /* Get PCLK1 prescaler */ + tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask; + tmp = tmp >> 8; + presc = APBAHBPrescTable[tmp]; + /* PCLK1 clock frequency */ + RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + /* Get PCLK2 prescaler */ + tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask; + tmp = tmp >> 11; + presc = APBAHBPrescTable[tmp]; + /* PCLK2 clock frequency */ + RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + /* Get ADCCLK prescaler */ + tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask; + tmp = tmp >> 14; + presc = ADCPrescTable[tmp]; + /* ADCCLK clock frequency */ + RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; +} + +/** + * @brief Enables or disables the AHB peripheral clock. + * @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values: + * @arg RCC_AHBPeriph_DMA1 + * @arg RCC_AHBPeriph_DMA2 + * @arg RCC_AHBPeriph_SRAM + * @arg RCC_AHBPeriph_FLITF + * @arg RCC_AHBPeriph_CRC + * @arg RCC_AHBPeriph_OTG_FS + * @arg RCC_AHBPeriph_ETH_MAC + * @arg RCC_AHBPeriph_ETH_MAC_Tx + * @arg RCC_AHBPeriph_ETH_MAC_Rx + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values: + * @arg RCC_AHBPeriph_DMA1 + * @arg RCC_AHBPeriph_DMA2 + * @arg RCC_AHBPeriph_SRAM + * @arg RCC_AHBPeriph_FLITF + * @arg RCC_AHBPeriph_CRC + * @arg RCC_AHBPeriph_FSMC + * @arg RCC_AHBPeriph_SDIO + * + * @note SRAM and FLITF clock can be disabled only during sleep mode. + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBENR |= RCC_AHBPeriph; + } + else + { + RCC->AHBENR &= ~RCC_AHBPeriph; + } +} + +/** + * @brief Enables or disables the High Speed APB (APB2) peripheral clock. + * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, + * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, + * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, + * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, + * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3 + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB2ENR |= RCC_APB2Periph; + } + else + { + RCC->APB2ENR &= ~RCC_APB2Periph; + } +} + +/** + * @brief Enables or disables the Low Speed APB (APB1) peripheral clock. + * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, + * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, + * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, + * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, + * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, + * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, + * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB1ENR |= RCC_APB1Periph; + } + else + { + RCC->APB1ENR &= ~RCC_APB1Periph; + } +} + +#ifdef STM32F10X_CL +/** + * @brief Forces or releases AHB peripheral reset. + * @note This function applies only to STM32 Connectivity line devices. + * @param RCC_AHBPeriph: specifies the AHB peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_AHBPeriph_OTG_FS + * @arg RCC_AHBPeriph_ETH_MAC + * @param NewState: new state of the specified peripheral reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_AHB_PERIPH_RESET(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBRSTR |= RCC_AHBPeriph; + } + else + { + RCC->AHBRSTR &= ~RCC_AHBPeriph; + } +} +#endif /* STM32F10X_CL */ + +/** + * @brief Forces or releases High Speed APB (APB2) peripheral reset. + * @param RCC_APB2Periph: specifies the APB2 peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, + * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, + * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, + * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, + * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3 + * @param NewState: new state of the specified peripheral reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB2RSTR |= RCC_APB2Periph; + } + else + { + RCC->APB2RSTR &= ~RCC_APB2Periph; + } +} + +/** + * @brief Forces or releases Low Speed APB (APB1) peripheral reset. + * @param RCC_APB1Periph: specifies the APB1 peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, + * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, + * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, + * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, + * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, + * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, + * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + RCC->APB1RSTR |= RCC_APB1Periph; + } + else + { + RCC->APB1RSTR &= ~RCC_APB1Periph; + } +} + +/** + * @brief Forces or releases the Backup domain reset. + * @param NewState: new state of the Backup domain reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_BackupResetCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) BDCR_BDRST_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Clock Security System. + * @param NewState: new state of the Clock Security System.. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_ClockSecuritySystemCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_CSSON_BB = (uint32_t)NewState; +} + +/** + * @brief Selects the clock source to output on MCO pin. + * @param RCC_MCO: specifies the clock source to output. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_MCO_NoClock: No clock selected + * @arg RCC_MCO_SYSCLK: System clock selected + * @arg RCC_MCO_HSI: HSI oscillator clock selected + * @arg RCC_MCO_HSE: HSE oscillator clock selected + * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected + * @arg RCC_MCO_PLL2CLK: PLL2 clock selected + * @arg RCC_MCO_PLL3CLK_Div2: PLL3 clock divided by 2 selected + * @arg RCC_MCO_XT1: External 3-25 MHz oscillator clock selected + * @arg RCC_MCO_PLL3CLK: PLL3 clock selected + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_MCO_NoClock: No clock selected + * @arg RCC_MCO_SYSCLK: System clock selected + * @arg RCC_MCO_HSI: HSI oscillator clock selected + * @arg RCC_MCO_HSE: HSE oscillator clock selected + * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected + * + * @retval None + */ +void RCC_MCOConfig(uint8_t RCC_MCO) +{ + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCO)); + + /* Perform Byte access to MCO bits to select the MCO source */ + *(__IO uint8_t *) CFGR_BYTE4_ADDRESS = RCC_MCO; +} + +/** + * @brief Checks whether the specified RCC flag is set or not. + * @param RCC_FLAG: specifies the flag to check. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready + * @arg RCC_FLAG_PLLRDY: PLL clock ready + * @arg RCC_FLAG_PLL2RDY: PLL2 clock ready + * @arg RCC_FLAG_PLL3RDY: PLL3 clock ready + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready + * @arg RCC_FLAG_PINRST: Pin reset + * @arg RCC_FLAG_PORRST: POR/PDR reset + * @arg RCC_FLAG_SFTRST: Software reset + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset + * @arg RCC_FLAG_LPWRRST: Low Power reset + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready + * @arg RCC_FLAG_PLLRDY: PLL clock ready + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready + * @arg RCC_FLAG_PINRST: Pin reset + * @arg RCC_FLAG_PORRST: POR/PDR reset + * @arg RCC_FLAG_SFTRST: Software reset + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset + * @arg RCC_FLAG_LPWRRST: Low Power reset + * + * @retval The new state of RCC_FLAG (SET or RESET). + */ +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) +{ + uint32_t tmp = 0; + uint32_t statusreg = 0; + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RCC_FLAG(RCC_FLAG)); + + /* Get the RCC register index */ + tmp = RCC_FLAG >> 5; + if (tmp == 1) /* The flag to check is in CR register */ + { + statusreg = RCC->CR; + } + else if (tmp == 2) /* The flag to check is in BDCR register */ + { + statusreg = RCC->BDCR; + } + else /* The flag to check is in CSR register */ + { + statusreg = RCC->CSR; + } + + /* Get the flag position */ + tmp = RCC_FLAG & FLAG_Mask; + if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the RCC reset flags. + * @note The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, + * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST + * @param None + * @retval None + */ +void RCC_ClearFlag(void) +{ + /* Set RMVF bit to clear the reset flags */ + RCC->CSR |= CSR_RMVF_Set; +} + +/** + * @brief Checks whether the specified RCC interrupt has occurred or not. + * @param RCC_IT: specifies the RCC interrupt source to check. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * @retval The new state of RCC_IT (SET or RESET). + */ +ITStatus RCC_GetITStatus(uint8_t RCC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RCC_GET_IT(RCC_IT)); + + /* Check the status of the specified RCC interrupt */ + if ((RCC->CIR & RCC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the RCC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the RCC’s interrupt pending bits. + * @param RCC_IT: specifies the interrupt pending bit to clear. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * + * @arg RCC_IT_CSS: Clock Security System interrupt + * @retval None + */ +void RCC_ClearITPendingBit(uint8_t RCC_IT) +{ + /* Check the parameters */ + assert_param(IS_RCC_CLEAR_IT(RCC_IT)); + + /* Perform Byte access to RCC_CIR[23:16] bits to clear the selected interrupt + pending bits */ + *(__IO uint8_t *) CIR_BYTE3_ADDRESS = RCC_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c new file mode 100644 index 0000000..3bafe7e --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c @@ -0,0 +1,341 @@ +/** + ****************************************************************************** + * @file stm32f10x_rtc.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the RTC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_rtc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup RTC + * @brief RTC driver modules + * @{ + */ + +/** @defgroup RTC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup RTC_Private_Defines + * @{ + */ + +#define CRL_CNF_Set ((uint16_t)0x0010) /*!< Configuration Flag Enable Mask */ +#define CRL_CNF_Reset ((uint16_t)0xFFEF) /*!< Configuration Flag Disable Mask */ +#define RTC_LSB_Mask ((uint32_t)0x0000FFFF) /*!< RTC LSB Mask */ +#define PRLH_MSB_Mask ((uint32_t)0x000F0000) /*!< RTC Prescaler MSB Mask */ + +/** + * @} + */ + +/** @defgroup RTC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Private_Functions + * @{ + */ + +/** + * @brief Enables or disables the specified RTC interrupts. + * @param RTC_IT: specifies the RTC interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg RTC_IT_OW: Overflow interrupt + * @arg RTC_IT_ALR: Alarm interrupt + * @arg RTC_IT_SEC: Second interrupt + * @param NewState: new state of the specified RTC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RTC_IT(RTC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RTC->CRH |= RTC_IT; + } + else + { + RTC->CRH &= (uint16_t)~RTC_IT; + } +} + +/** + * @brief Enters the RTC configuration mode. + * @param None + * @retval None + */ +void RTC_EnterConfigMode(void) +{ + /* Set the CNF flag to enter in the Configuration Mode */ + RTC->CRL |= CRL_CNF_Set; +} + +/** + * @brief Exits from the RTC configuration mode. + * @param None + * @retval None + */ +void RTC_ExitConfigMode(void) +{ + /* Reset the CNF flag to exit from the Configuration Mode */ + RTC->CRL &= CRL_CNF_Reset; +} + +/** + * @brief Gets the RTC counter value. + * @param None + * @retval RTC counter value. + */ +uint32_t RTC_GetCounter(void) +{ + uint16_t tmp = 0; + tmp = RTC->CNTL; + return (((uint32_t)RTC->CNTH << 16 ) | tmp) ; +} + +/** + * @brief Sets the RTC counter value. + * @param CounterValue: RTC counter new value. + * @retval None + */ +void RTC_SetCounter(uint32_t CounterValue) +{ + RTC_EnterConfigMode(); + /* Set RTC COUNTER MSB word */ + RTC->CNTH = CounterValue >> 16; + /* Set RTC COUNTER LSB word */ + RTC->CNTL = (CounterValue & RTC_LSB_Mask); + RTC_ExitConfigMode(); +} + +/** + * @brief Sets the RTC prescaler value. + * @param PrescalerValue: RTC prescaler new value. + * @retval None + */ +void RTC_SetPrescaler(uint32_t PrescalerValue) +{ + /* Check the parameters */ + assert_param(IS_RTC_PRESCALER(PrescalerValue)); + + RTC_EnterConfigMode(); + /* Set RTC PRESCALER MSB word */ + RTC->PRLH = (PrescalerValue & PRLH_MSB_Mask) >> 16; + /* Set RTC PRESCALER LSB word */ + RTC->PRLL = (PrescalerValue & RTC_LSB_Mask); + RTC_ExitConfigMode(); +} + +/** + * @brief Sets the RTC alarm value. + * @param AlarmValue: RTC alarm new value. + * @retval None + */ +void RTC_SetAlarm(uint32_t AlarmValue) +{ + RTC_EnterConfigMode(); + /* Set the ALARM MSB word */ + RTC->ALRH = AlarmValue >> 16; + /* Set the ALARM LSB word */ + RTC->ALRL = (AlarmValue & RTC_LSB_Mask); + RTC_ExitConfigMode(); +} + +/** + * @brief Gets the RTC divider value. + * @param None + * @retval RTC Divider value. + */ +uint32_t RTC_GetDivider(void) +{ + uint32_t tmp = 0x00; + tmp = ((uint32_t)RTC->DIVH & (uint32_t)0x000F) << 16; + tmp |= RTC->DIVL; + return tmp; +} + +/** + * @brief Waits until last write operation on RTC registers has finished. + * @note This function must be called before any write to RTC registers. + * @param None + * @retval None + */ +void RTC_WaitForLastTask(void) +{ + /* Loop until RTOFF flag is set */ + while ((RTC->CRL & RTC_FLAG_RTOFF) == (uint16_t)RESET) + { + } +} + +/** + * @brief Waits until the RTC registers (RTC_CNT, RTC_ALR and RTC_PRL) + * are synchronized with RTC APB clock. + * @note This function must be called before any read operation after an APB reset + * or an APB clock stop. + * @param None + * @retval None + */ +void RTC_WaitForSynchro(void) +{ + /* Clear RSF flag */ + RTC->CRL &= (uint16_t)~RTC_FLAG_RSF; + /* Loop until RSF flag is set */ + while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET) + { + } +} + +/** + * @brief Checks whether the specified RTC flag is set or not. + * @param RTC_FLAG: specifies the flag to check. + * This parameter can be one the following values: + * @arg RTC_FLAG_RTOFF: RTC Operation OFF flag + * @arg RTC_FLAG_RSF: Registers Synchronized flag + * @arg RTC_FLAG_OW: Overflow flag + * @arg RTC_FLAG_ALR: Alarm flag + * @arg RTC_FLAG_SEC: Second flag + * @retval The new state of RTC_FLAG (SET or RESET). + */ +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_RTC_GET_FLAG(RTC_FLAG)); + + if ((RTC->CRL & RTC_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the RTC’s pending flags. + * @param RTC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg RTC_FLAG_RSF: Registers Synchronized flag. This flag is cleared only after + * an APB reset or an APB Clock stop. + * @arg RTC_FLAG_OW: Overflow flag + * @arg RTC_FLAG_ALR: Alarm flag + * @arg RTC_FLAG_SEC: Second flag + * @retval None + */ +void RTC_ClearFlag(uint16_t RTC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_RTC_CLEAR_FLAG(RTC_FLAG)); + + /* Clear the coressponding RTC flag */ + RTC->CRL &= (uint16_t)~RTC_FLAG; +} + +/** + * @brief Checks whether the specified RTC interrupt has occured or not. + * @param RTC_IT: specifies the RTC interrupts sources to check. + * This parameter can be one of the following values: + * @arg RTC_IT_OW: Overflow interrupt + * @arg RTC_IT_ALR: Alarm interrupt + * @arg RTC_IT_SEC: Second interrupt + * @retval The new state of the RTC_IT (SET or RESET). + */ +ITStatus RTC_GetITStatus(uint16_t RTC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RTC_GET_IT(RTC_IT)); + + bitstatus = (ITStatus)(RTC->CRL & RTC_IT); + if (((RTC->CRH & RTC_IT) != (uint16_t)RESET) && (bitstatus != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the RTC’s interrupt pending bits. + * @param RTC_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg RTC_IT_OW: Overflow interrupt + * @arg RTC_IT_ALR: Alarm interrupt + * @arg RTC_IT_SEC: Second interrupt + * @retval None + */ +void RTC_ClearITPendingBit(uint16_t RTC_IT) +{ + /* Check the parameters */ + assert_param(IS_RTC_IT(RTC_IT)); + + /* Clear the coressponding RTC pending bit */ + RTC->CRL &= (uint16_t)~RTC_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c new file mode 100644 index 0000000..e23372f --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c @@ -0,0 +1,798 @@ +/** + ****************************************************************************** + * @file stm32f10x_sdio.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the SDIO firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_sdio.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup SDIO + * @brief SDIO driver modules + * @{ + */ + +/** @defgroup SDIO_Private_TypesDefinitions + * @{ + */ + +/* ------------ SDIO registers bit address in the alias region ----------- */ +#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) + +/* --- CLKCR Register ---*/ + +/* Alias word address of CLKEN bit */ +#define CLKCR_OFFSET (SDIO_OFFSET + 0x04) +#define CLKEN_BitNumber 0x08 +#define CLKCR_CLKEN_BB (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4)) + +/* --- CMD Register ---*/ + +/* Alias word address of SDIOSUSPEND bit */ +#define CMD_OFFSET (SDIO_OFFSET + 0x0C) +#define SDIOSUSPEND_BitNumber 0x0B +#define CMD_SDIOSUSPEND_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4)) + +/* Alias word address of ENCMDCOMPL bit */ +#define ENCMDCOMPL_BitNumber 0x0C +#define CMD_ENCMDCOMPL_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4)) + +/* Alias word address of NIEN bit */ +#define NIEN_BitNumber 0x0D +#define CMD_NIEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4)) + +/* Alias word address of ATACMD bit */ +#define ATACMD_BitNumber 0x0E +#define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4)) + +/* --- DCTRL Register ---*/ + +/* Alias word address of DMAEN bit */ +#define DCTRL_OFFSET (SDIO_OFFSET + 0x2C) +#define DMAEN_BitNumber 0x03 +#define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4)) + +/* Alias word address of RWSTART bit */ +#define RWSTART_BitNumber 0x08 +#define DCTRL_RWSTART_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4)) + +/* Alias word address of RWSTOP bit */ +#define RWSTOP_BitNumber 0x09 +#define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4)) + +/* Alias word address of RWMOD bit */ +#define RWMOD_BitNumber 0x0A +#define DCTRL_RWMOD_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4)) + +/* Alias word address of SDIOEN bit */ +#define SDIOEN_BitNumber 0x0B +#define DCTRL_SDIOEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4)) + +/* ---------------------- SDIO registers bit mask ------------------------ */ + +/* --- CLKCR Register ---*/ + +/* CLKCR register clear mask */ +#define CLKCR_CLEAR_MASK ((uint32_t)0xFFFF8100) + +/* --- PWRCTRL Register ---*/ + +/* SDIO PWRCTRL Mask */ +#define PWR_PWRCTRL_MASK ((uint32_t)0xFFFFFFFC) + +/* --- DCTRL Register ---*/ + +/* SDIO DCTRL Clear Mask */ +#define DCTRL_CLEAR_MASK ((uint32_t)0xFFFFFF08) + +/* --- CMD Register ---*/ + +/* CMD Register clear mask */ +#define CMD_CLEAR_MASK ((uint32_t)0xFFFFF800) + +/* SDIO RESP Registers Address */ +#define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14)) + +/** + * @} + */ + +/** @defgroup SDIO_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the SDIO peripheral registers to their default reset values. + * @param None + * @retval None + */ +void SDIO_DeInit(void) +{ + SDIO->POWER = 0x00000000; + SDIO->CLKCR = 0x00000000; + SDIO->ARG = 0x00000000; + SDIO->CMD = 0x00000000; + SDIO->DTIMER = 0x00000000; + SDIO->DLEN = 0x00000000; + SDIO->DCTRL = 0x00000000; + SDIO->ICR = 0x00C007FF; + SDIO->MASK = 0x00000000; +} + +/** + * @brief Initializes the SDIO peripheral according to the specified + * parameters in the SDIO_InitStruct. + * @param SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure + * that contains the configuration information for the SDIO peripheral. + * @retval None + */ +void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge)); + assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass)); + assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave)); + assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide)); + assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl)); + +/*---------------------------- SDIO CLKCR Configuration ------------------------*/ + /* Get the SDIO CLKCR value */ + tmpreg = SDIO->CLKCR; + + /* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits */ + tmpreg &= CLKCR_CLEAR_MASK; + + /* Set CLKDIV bits according to SDIO_ClockDiv value */ + /* Set PWRSAV bit according to SDIO_ClockPowerSave value */ + /* Set BYPASS bit according to SDIO_ClockBypass value */ + /* Set WIDBUS bits according to SDIO_BusWide value */ + /* Set NEGEDGE bits according to SDIO_ClockEdge value */ + /* Set HWFC_EN bits according to SDIO_HardwareFlowControl value */ + tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv | SDIO_InitStruct->SDIO_ClockPowerSave | + SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide | + SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl); + + /* Write to SDIO CLKCR */ + SDIO->CLKCR = tmpreg; +} + +/** + * @brief Fills each SDIO_InitStruct member with its default value. + * @param SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which + * will be initialized. + * @retval None + */ +void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct) +{ + /* SDIO_InitStruct members default value */ + SDIO_InitStruct->SDIO_ClockDiv = 0x00; + SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising; + SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable; + SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; + SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b; + SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; +} + +/** + * @brief Enables or disables the SDIO Clock. + * @param NewState: new state of the SDIO Clock. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_ClockCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState; +} + +/** + * @brief Sets the power status of the controller. + * @param SDIO_PowerState: new state of the Power state. + * This parameter can be one of the following values: + * @arg SDIO_PowerState_OFF + * @arg SDIO_PowerState_ON + * @retval None + */ +void SDIO_SetPowerState(uint32_t SDIO_PowerState) +{ + /* Check the parameters */ + assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState)); + + SDIO->POWER &= PWR_PWRCTRL_MASK; + SDIO->POWER |= SDIO_PowerState; +} + +/** + * @brief Gets the power status of the controller. + * @param None + * @retval Power status of the controller. The returned value can + * be one of the following: + * - 0x00: Power OFF + * - 0x02: Power UP + * - 0x03: Power ON + */ +uint32_t SDIO_GetPowerState(void) +{ + return (SDIO->POWER & (~PWR_PWRCTRL_MASK)); +} + +/** + * @brief Enables or disables the SDIO interrupts. + * @param SDIO_IT: specifies the SDIO interrupt sources to be enabled or disabled. + * This parameter can be one or a combination of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide + * bus mode interrupt + * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_IT_TXACT: Data transmit in progress interrupt + * @arg SDIO_IT_RXACT: Data receive in progress interrupt + * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt + * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt + * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt + * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt + * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt + * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt + * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt + * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @param NewState: new state of the specified SDIO interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SDIO_IT(SDIO_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the SDIO interrupts */ + SDIO->MASK |= SDIO_IT; + } + else + { + /* Disable the SDIO interrupts */ + SDIO->MASK &= ~SDIO_IT; + } +} + +/** + * @brief Enables or disables the SDIO DMA request. + * @param NewState: new state of the selected SDIO DMA request. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_DMACmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState; +} + +/** + * @brief Initializes the SDIO Command according to the specified + * parameters in the SDIO_CmdInitStruct and send the command. + * @param SDIO_CmdInitStruct : pointer to a SDIO_CmdInitTypeDef + * structure that contains the configuration information for the SDIO command. + * @retval None + */ +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex)); + assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response)); + assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait)); + assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM)); + +/*---------------------------- SDIO ARG Configuration ------------------------*/ + /* Set the SDIO Argument value */ + SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument; + +/*---------------------------- SDIO CMD Configuration ------------------------*/ + /* Get the SDIO CMD value */ + tmpreg = SDIO->CMD; + /* Clear CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN bits */ + tmpreg &= CMD_CLEAR_MASK; + /* Set CMDINDEX bits according to SDIO_CmdIndex value */ + /* Set WAITRESP bits according to SDIO_Response value */ + /* Set WAITINT and WAITPEND bits according to SDIO_Wait value */ + /* Set CPSMEN bits according to SDIO_CPSM value */ + tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response + | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM; + + /* Write to SDIO CMD */ + SDIO->CMD = tmpreg; +} + +/** + * @brief Fills each SDIO_CmdInitStruct member with its default value. + * @param SDIO_CmdInitStruct: pointer to an SDIO_CmdInitTypeDef + * structure which will be initialized. + * @retval None + */ +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct) +{ + /* SDIO_CmdInitStruct members default value */ + SDIO_CmdInitStruct->SDIO_Argument = 0x00; + SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00; + SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No; + SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No; + SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable; +} + +/** + * @brief Returns command index of last command for which response received. + * @param None + * @retval Returns the command index of the last command response received. + */ +uint8_t SDIO_GetCommandResponse(void) +{ + return (uint8_t)(SDIO->RESPCMD); +} + +/** + * @brief Returns response received from the card for the last command. + * @param SDIO_RESP: Specifies the SDIO response register. + * This parameter can be one of the following values: + * @arg SDIO_RESP1: Response Register 1 + * @arg SDIO_RESP2: Response Register 2 + * @arg SDIO_RESP3: Response Register 3 + * @arg SDIO_RESP4: Response Register 4 + * @retval The Corresponding response register value. + */ +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_RESP(SDIO_RESP)); + + tmp = SDIO_RESP_ADDR + SDIO_RESP; + + return (*(__IO uint32_t *) tmp); +} + +/** + * @brief Initializes the SDIO data path according to the specified + * parameters in the SDIO_DataInitStruct. + * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure that + * contains the configuration information for the SDIO command. + * @retval None + */ +void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength)); + assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize)); + assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir)); + assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode)); + assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM)); + +/*---------------------------- SDIO DTIMER Configuration ---------------------*/ + /* Set the SDIO Data TimeOut value */ + SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut; + +/*---------------------------- SDIO DLEN Configuration -----------------------*/ + /* Set the SDIO DataLength value */ + SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength; + +/*---------------------------- SDIO DCTRL Configuration ----------------------*/ + /* Get the SDIO DCTRL value */ + tmpreg = SDIO->DCTRL; + /* Clear DEN, DTMODE, DTDIR and DBCKSIZE bits */ + tmpreg &= DCTRL_CLEAR_MASK; + /* Set DEN bit according to SDIO_DPSM value */ + /* Set DTMODE bit according to SDIO_TransferMode value */ + /* Set DTDIR bit according to SDIO_TransferDir value */ + /* Set DBCKSIZE bits according to SDIO_DataBlockSize value */ + tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir + | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM; + + /* Write to SDIO DCTRL */ + SDIO->DCTRL = tmpreg; +} + +/** + * @brief Fills each SDIO_DataInitStruct member with its default value. + * @param SDIO_DataInitStruct: pointer to an SDIO_DataInitTypeDef structure which + * will be initialized. + * @retval None + */ +void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct) +{ + /* SDIO_DataInitStruct members default value */ + SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF; + SDIO_DataInitStruct->SDIO_DataLength = 0x00; + SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b; + SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard; + SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block; + SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable; +} + +/** + * @brief Returns number of remaining data bytes to be transferred. + * @param None + * @retval Number of remaining data bytes to be transferred + */ +uint32_t SDIO_GetDataCounter(void) +{ + return SDIO->DCOUNT; +} + +/** + * @brief Read one data word from Rx FIFO. + * @param None + * @retval Data received + */ +uint32_t SDIO_ReadData(void) +{ + return SDIO->FIFO; +} + +/** + * @brief Write one data word to Tx FIFO. + * @param Data: 32-bit data word to write. + * @retval None + */ +void SDIO_WriteData(uint32_t Data) +{ + SDIO->FIFO = Data; +} + +/** + * @brief Returns the number of words left to be written to or read from FIFO. + * @param None + * @retval Remaining number of words. + */ +uint32_t SDIO_GetFIFOCount(void) +{ + return SDIO->FIFOCNT; +} + +/** + * @brief Starts the SD I/O Read Wait operation. + * @param NewState: new state of the Start SDIO Read Wait operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_StartSDIOReadWait(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_RWSTART_BB = (uint32_t) NewState; +} + +/** + * @brief Stops the SD I/O Read Wait operation. + * @param NewState: new state of the Stop SDIO Read Wait operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_StopSDIOReadWait(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) NewState; +} + +/** + * @brief Sets one of the two options of inserting read wait interval. + * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode. + * This parametre can be: + * @arg SDIO_ReadWaitMode_CLK: Read Wait control by stopping SDIOCLK + * @arg SDIO_ReadWaitMode_DATA2: Read Wait control using SDIO_DATA2 + * @retval None + */ +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) +{ + /* Check the parameters */ + assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode)); + + *(__IO uint32_t *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode; +} + +/** + * @brief Enables or disables the SD I/O Mode Operation. + * @param NewState: new state of SDIO specific operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SetSDIOOperation(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_SDIOEN_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the SD I/O Mode suspend command sending. + * @param NewState: new state of the SD I/O Mode suspend command. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_SDIOSUSPEND_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the command completion signal. + * @param NewState: new state of command completion signal. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_CommandCompletionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_ENCMDCOMPL_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the CE-ATA interrupt. + * @param NewState: new state of CE-ATA interrupt. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_CEATAITCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)((~((uint32_t)NewState)) & ((uint32_t)0x1)); +} + +/** + * @brief Sends CE-ATA command (CMD61). + * @param NewState: new state of CE-ATA command. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SendCEATACmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)NewState; +} + +/** + * @brief Checks whether the specified SDIO flag is set or not. + * @param SDIO_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) + * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) + * @arg SDIO_FLAG_CTIMEOUT: Command response timeout + * @arg SDIO_FLAG_DTIMEOUT: Data timeout + * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error + * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error + * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) + * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) + * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide + * bus mode. + * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) + * @arg SDIO_FLAG_CMDACT: Command transfer in progress + * @arg SDIO_FLAG_TXACT: Data transmit in progress + * @arg SDIO_FLAG_RXACT: Data receive in progress + * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty + * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full + * @arg SDIO_FLAG_TXFIFOF: Transmit FIFO full + * @arg SDIO_FLAG_RXFIFOF: Receive FIFO full + * @arg SDIO_FLAG_TXFIFOE: Transmit FIFO empty + * @arg SDIO_FLAG_RXFIFOE: Receive FIFO empty + * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO + * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO + * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received + * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 + * @retval The new state of SDIO_FLAG (SET or RESET). + */ +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_SDIO_FLAG(SDIO_FLAG)); + + if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the SDIO's pending flags. + * @param SDIO_FLAG: specifies the flag to clear. + * This parameter can be one or a combination of the following values: + * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) + * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) + * @arg SDIO_FLAG_CTIMEOUT: Command response timeout + * @arg SDIO_FLAG_DTIMEOUT: Data timeout + * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error + * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error + * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) + * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) + * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide + * bus mode + * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) + * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received + * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 + * @retval None + */ +void SDIO_ClearFlag(uint32_t SDIO_FLAG) +{ + /* Check the parameters */ + assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG)); + + SDIO->ICR = SDIO_FLAG; +} + +/** + * @brief Checks whether the specified SDIO interrupt has occurred or not. + * @param SDIO_IT: specifies the SDIO interrupt source to check. + * This parameter can be one of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide + * bus mode interrupt + * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_IT_TXACT: Data transmit in progress interrupt + * @arg SDIO_IT_RXACT: Data receive in progress interrupt + * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt + * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt + * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt + * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt + * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt + * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt + * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt + * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @retval The new state of SDIO_IT (SET or RESET). + */ +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT) +{ + ITStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_SDIO_GET_IT(SDIO_IT)); + if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the SDIO’s interrupt pending bits. + * @param SDIO_IT: specifies the interrupt pending bit to clear. + * This parameter can be one or a combination of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide + * bus mode interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 + * @retval None + */ +void SDIO_ClearITPendingBit(uint32_t SDIO_IT) +{ + /* Check the parameters */ + assert_param(IS_SDIO_CLEAR_IT(SDIO_IT)); + + SDIO->ICR = SDIO_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c new file mode 100644 index 0000000..427de6b --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c @@ -0,0 +1,907 @@ +/** + ****************************************************************************** + * @file stm32f10x_spi.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the SPI firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_spi.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup SPI + * @brief SPI driver modules + * @{ + */ + +/** @defgroup SPI_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + + +/** @defgroup SPI_Private_Defines + * @{ + */ + +/* SPI SPE mask */ +#define CR1_SPE_Set ((uint16_t)0x0040) +#define CR1_SPE_Reset ((uint16_t)0xFFBF) + +/* I2S I2SE mask */ +#define I2SCFGR_I2SE_Set ((uint16_t)0x0400) +#define I2SCFGR_I2SE_Reset ((uint16_t)0xFBFF) + +/* SPI CRCNext mask */ +#define CR1_CRCNext_Set ((uint16_t)0x1000) + +/* SPI CRCEN mask */ +#define CR1_CRCEN_Set ((uint16_t)0x2000) +#define CR1_CRCEN_Reset ((uint16_t)0xDFFF) + +/* SPI SSOE mask */ +#define CR2_SSOE_Set ((uint16_t)0x0004) +#define CR2_SSOE_Reset ((uint16_t)0xFFFB) + +/* SPI registers Masks */ +#define CR1_CLEAR_Mask ((uint16_t)0x3040) +#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040) + +/* SPI or I2S mode selection masks */ +#define SPI_Mode_Select ((uint16_t)0xF7FF) +#define I2S_Mode_Select ((uint16_t)0x0800) + +/* I2S clock source selection masks */ +#define I2S2_CLOCK_SRC ((uint32_t)(0x00020000)) +#define I2S3_CLOCK_SRC ((uint32_t)(0x00040000)) +#define I2S_MUL_MASK ((uint32_t)(0x0000F000)) +#define I2S_DIV_MASK ((uint32_t)(0x000000F0)) + +/** + * @} + */ + +/** @defgroup SPI_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the SPIx peripheral registers to their default + * reset values (Affects also the I2Ss). + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @retval None + */ +void SPI_I2S_DeInit(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + if (SPIx == SPI1) + { + /* Enable SPI1 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); + /* Release SPI1 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); + } + else if (SPIx == SPI2) + { + /* Enable SPI2 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); + /* Release SPI2 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); + } + else + { + if (SPIx == SPI3) + { + /* Enable SPI3 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE); + /* Release SPI3 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE); + } + } +} + +/** + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the SPI_InitStruct. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral. + * @retval None + */ +void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) +{ + uint16_t tmpreg = 0; + + /* check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Check the SPI parameters */ + assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction)); + assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode)); + assert_param(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize)); + assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL)); + assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA)); + assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS)); + assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler)); + assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit)); + assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial)); + +/*---------------------------- SPIx CR1 Configuration ------------------------*/ + /* Get the SPIx CR1 value */ + tmpreg = SPIx->CR1; + /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */ + tmpreg &= CR1_CLEAR_Mask; + /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler + master/salve mode, CPOL and CPHA */ + /* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */ + /* Set SSM, SSI and MSTR bits according to SPI_Mode and SPI_NSS values */ + /* Set LSBFirst bit according to SPI_FirstBit value */ + /* Set BR bits according to SPI_BaudRatePrescaler value */ + /* Set CPOL bit according to SPI_CPOL value */ + /* Set CPHA bit according to SPI_CPHA value */ + tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode | + SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL | + SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS | + SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); + /* Write to SPIx CR1 */ + SPIx->CR1 = tmpreg; + + /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ + SPIx->I2SCFGR &= SPI_Mode_Select; + +/*---------------------------- SPIx CRCPOLY Configuration --------------------*/ + /* Write to SPIx CRCPOLY */ + SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial; +} + +/** + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the I2S_InitStruct. + * @param SPIx: where x can be 2 or 3 to select the SPI peripheral + * (configured in I2S mode). + * @param I2S_InitStruct: pointer to an I2S_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral + * configured in I2S mode. + * @note + * The function calculates the optimal prescaler needed to obtain the most + * accurate audio frequency (depending on the I2S clock source, the PLL values + * and the product configuration). But in case the prescaler value is greater + * than 511, the default value (0x02) will be configured instead. * + * @retval None + */ +void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct) +{ + uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; + uint32_t tmp = 0; + RCC_ClocksTypeDef RCC_Clocks; + uint32_t sourceclock = 0; + + /* Check the I2S parameters */ + assert_param(IS_SPI_23_PERIPH(SPIx)); + assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode)); + assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard)); + assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat)); + assert_param(IS_I2S_MCLK_OUTPUT(I2S_InitStruct->I2S_MCLKOutput)); + assert_param(IS_I2S_AUDIO_FREQ(I2S_InitStruct->I2S_AudioFreq)); + assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL)); + +/*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/ + /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ + SPIx->I2SCFGR &= I2SCFGR_CLEAR_Mask; + SPIx->I2SPR = 0x0002; + + /* Get the I2SCFGR register value */ + tmpreg = SPIx->I2SCFGR; + + /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/ + if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default) + { + i2sodd = (uint16_t)0; + i2sdiv = (uint16_t)2; + } + /* If the requested audio frequency is not the default, compute the prescaler */ + else + { + /* Check the frame length (For the Prescaler computing) */ + if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b) + { + /* Packet length is 16 bits */ + packetlength = 1; + } + else + { + /* Packet length is 32 bits */ + packetlength = 2; + } + + /* Get the I2S clock source mask depending on the peripheral number */ + if(((uint32_t)SPIx) == SPI2_BASE) + { + /* The mask is relative to I2S2 */ + tmp = I2S2_CLOCK_SRC; + } + else + { + /* The mask is relative to I2S3 */ + tmp = I2S3_CLOCK_SRC; + } + + /* Check the I2S clock source configuration depending on the Device: + Only Connectivity line devices have the PLL3 VCO clock */ +#ifdef STM32F10X_CL + if((RCC->CFGR2 & tmp) != 0) + { + /* Get the configuration bits of RCC PLL3 multiplier */ + tmp = (uint32_t)((RCC->CFGR2 & I2S_MUL_MASK) >> 12); + + /* Get the value of the PLL3 multiplier */ + if((tmp > 5) && (tmp < 15)) + { + /* Multplier is between 8 and 14 (value 15 is forbidden) */ + tmp += 2; + } + else + { + if (tmp == 15) + { + /* Multiplier is 20 */ + tmp = 20; + } + } + /* Get the PREDIV2 value */ + sourceclock = (uint32_t)(((RCC->CFGR2 & I2S_DIV_MASK) >> 4) + 1); + + /* Calculate the Source Clock frequency based on PLL3 and PREDIV2 values */ + sourceclock = (uint32_t) ((HSE_Value / sourceclock) * tmp * 2); + } + else + { + /* I2S Clock source is System clock: Get System Clock frequency */ + RCC_GetClocksFreq(&RCC_Clocks); + + /* Get the source clock value: based on System Clock value */ + sourceclock = RCC_Clocks.SYSCLK_Frequency; + } +#else /* STM32F10X_HD */ + /* I2S Clock source is System clock: Get System Clock frequency */ + RCC_GetClocksFreq(&RCC_Clocks); + + /* Get the source clock value: based on System Clock value */ + sourceclock = RCC_Clocks.SYSCLK_Frequency; +#endif /* STM32F10X_CL */ + + /* Compute the Real divider depending on the MCLK output state with a flaoting point */ + if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable) + { + /* MCLK output is enabled */ + tmp = (uint16_t)(((((sourceclock / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + else + { + /* MCLK output is disabled */ + tmp = (uint16_t)(((((sourceclock / (32 * packetlength)) *10 ) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + + /* Remove the flaoting point */ + tmp = tmp / 10; + + /* Check the parity of the divider */ + i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); + + /* Compute the i2sdiv prescaler */ + i2sdiv = (uint16_t)((tmp - i2sodd) / 2); + + /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ + i2sodd = (uint16_t) (i2sodd << 8); + } + + /* Test if the divider is 1 or 0 or greater than 0xFF */ + if ((i2sdiv < 2) || (i2sdiv > 0xFF)) + { + /* Set the default values */ + i2sdiv = 2; + i2sodd = 0; + } + + /* Write to SPIx I2SPR register the computed value */ + SPIx->I2SPR = (uint16_t)(i2sdiv | (uint16_t)(i2sodd | (uint16_t)I2S_InitStruct->I2S_MCLKOutput)); + + /* Configure the I2S with the SPI_InitStruct values */ + tmpreg |= (uint16_t)(I2S_Mode_Select | (uint16_t)(I2S_InitStruct->I2S_Mode | \ + (uint16_t)(I2S_InitStruct->I2S_Standard | (uint16_t)(I2S_InitStruct->I2S_DataFormat | \ + (uint16_t)I2S_InitStruct->I2S_CPOL)))); + + /* Write to SPIx I2SCFGR */ + SPIx->I2SCFGR = tmpreg; +} + +/** + * @brief Fills each SPI_InitStruct member with its default value. + * @param SPI_InitStruct : pointer to a SPI_InitTypeDef structure which will be initialized. + * @retval None + */ +void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct) +{ +/*--------------- Reset SPI init structure parameters values -----------------*/ + /* Initialize the SPI_Direction member */ + SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex; + /* initialize the SPI_Mode member */ + SPI_InitStruct->SPI_Mode = SPI_Mode_Slave; + /* initialize the SPI_DataSize member */ + SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b; + /* Initialize the SPI_CPOL member */ + SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low; + /* Initialize the SPI_CPHA member */ + SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge; + /* Initialize the SPI_NSS member */ + SPI_InitStruct->SPI_NSS = SPI_NSS_Hard; + /* Initialize the SPI_BaudRatePrescaler member */ + SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; + /* Initialize the SPI_FirstBit member */ + SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB; + /* Initialize the SPI_CRCPolynomial member */ + SPI_InitStruct->SPI_CRCPolynomial = 7; +} + +/** + * @brief Fills each I2S_InitStruct member with its default value. + * @param I2S_InitStruct : pointer to a I2S_InitTypeDef structure which will be initialized. + * @retval None + */ +void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct) +{ +/*--------------- Reset I2S init structure parameters values -----------------*/ + /* Initialize the I2S_Mode member */ + I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx; + + /* Initialize the I2S_Standard member */ + I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips; + + /* Initialize the I2S_DataFormat member */ + I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b; + + /* Initialize the I2S_MCLKOutput member */ + I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable; + + /* Initialize the I2S_AudioFreq member */ + I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default; + + /* Initialize the I2S_CPOL member */ + I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low; +} + +/** + * @brief Enables or disables the specified SPI peripheral. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI peripheral */ + SPIx->CR1 |= CR1_SPE_Set; + } + else + { + /* Disable the selected SPI peripheral */ + SPIx->CR1 &= CR1_SPE_Reset; + } +} + +/** + * @brief Enables or disables the specified SPI peripheral (in I2S mode). + * @param SPIx: where x can be 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_23_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI peripheral (in I2S mode) */ + SPIx->I2SCFGR |= I2SCFGR_I2SE_Set; + } + else + { + /* Disable the selected SPI peripheral (in I2S mode) */ + SPIx->I2SCFGR &= I2SCFGR_I2SE_Reset; + } +} + +/** + * @brief Enables or disables the specified SPI/I2S interrupts. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_IT: specifies the SPI/I2S interrupt source to be enabled or disabled. + * This parameter can be one of the following values: + * @arg SPI_I2S_IT_TXE: Tx buffer empty interrupt mask + * @arg SPI_I2S_IT_RXNE: Rx buffer not empty interrupt mask + * @arg SPI_I2S_IT_ERR: Error interrupt mask + * @param NewState: new state of the specified SPI/I2S interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) +{ + uint16_t itpos = 0, itmask = 0 ; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_SPI_I2S_CONFIG_IT(SPI_I2S_IT)); + + /* Get the SPI/I2S IT index */ + itpos = SPI_I2S_IT >> 4; + + /* Set the IT mask */ + itmask = (uint16_t)1 << (uint16_t)itpos; + + if (NewState != DISABLE) + { + /* Enable the selected SPI/I2S interrupt */ + SPIx->CR2 |= itmask; + } + else + { + /* Disable the selected SPI/I2S interrupt */ + SPIx->CR2 &= (uint16_t)~itmask; + } +} + +/** + * @brief Enables or disables the SPIx/I2Sx DMA interface. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_DMAReq: specifies the SPI/I2S DMA transfer request to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg SPI_I2S_DMAReq_Tx: Tx buffer DMA transfer request + * @arg SPI_I2S_DMAReq_Rx: Rx buffer DMA transfer request + * @param NewState: new state of the selected SPI/I2S DMA transfer request. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_SPI_I2S_DMAREQ(SPI_I2S_DMAReq)); + if (NewState != DISABLE) + { + /* Enable the selected SPI/I2S DMA requests */ + SPIx->CR2 |= SPI_I2S_DMAReq; + } + else + { + /* Disable the selected SPI/I2S DMA requests */ + SPIx->CR2 &= (uint16_t)~SPI_I2S_DMAReq; + } +} + +/** + * @brief Transmits a Data through the SPIx/I2Sx peripheral. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param Data : Data to be transmitted. + * @retval None + */ +void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Write in the DR register the data to be sent */ + SPIx->DR = Data; +} + +/** + * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @retval The value of the received data. + */ +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Return the data in the DR register */ + return SPIx->DR; +} + +/** + * @brief Configures internally by software the NSS pin for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_NSSInternalSoft: specifies the SPI NSS internal state. + * This parameter can be one of the following values: + * @arg SPI_NSSInternalSoft_Set: Set NSS pin internally + * @arg SPI_NSSInternalSoft_Reset: Reset NSS pin internally + * @retval None + */ +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_NSS_INTERNAL(SPI_NSSInternalSoft)); + if (SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset) + { + /* Set NSS pin internally by software */ + SPIx->CR1 |= SPI_NSSInternalSoft_Set; + } + else + { + /* Reset NSS pin internally by software */ + SPIx->CR1 &= SPI_NSSInternalSoft_Reset; + } +} + +/** + * @brief Enables or disables the SS output for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx SS output. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI SS output */ + SPIx->CR2 |= CR2_SSOE_Set; + } + else + { + /* Disable the selected SPI SS output */ + SPIx->CR2 &= CR2_SSOE_Reset; + } +} + +/** + * @brief Configures the data size for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_DataSize: specifies the SPI data size. + * This parameter can be one of the following values: + * @arg SPI_DataSize_16b: Set data frame format to 16bit + * @arg SPI_DataSize_8b: Set data frame format to 8bit + * @retval None + */ +void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_DATASIZE(SPI_DataSize)); + /* Clear DFF bit */ + SPIx->CR1 &= (uint16_t)~SPI_DataSize_16b; + /* Set new DFF bit value */ + SPIx->CR1 |= SPI_DataSize; +} + +/** + * @brief Transmit the SPIx CRC value. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @retval None + */ +void SPI_TransmitCRC(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Enable the selected SPI CRC transmission */ + SPIx->CR1 |= CR1_CRCNext_Set; +} + +/** + * @brief Enables or disables the CRC value calculation of the transfered bytes. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx CRC value calculation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI CRC calculation */ + SPIx->CR1 |= CR1_CRCEN_Set; + } + else + { + /* Disable the selected SPI CRC calculation */ + SPIx->CR1 &= CR1_CRCEN_Reset; + } +} + +/** + * @brief Returns the transmit or the receive CRC register value for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_CRC: specifies the CRC register to be read. + * This parameter can be one of the following values: + * @arg SPI_CRC_Tx: Selects Tx CRC register + * @arg SPI_CRC_Rx: Selects Rx CRC register + * @retval The selected CRC register value.. + */ +uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC) +{ + uint16_t crcreg = 0; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_CRC(SPI_CRC)); + if (SPI_CRC != SPI_CRC_Rx) + { + /* Get the Tx CRC register */ + crcreg = SPIx->TXCRCR; + } + else + { + /* Get the Rx CRC register */ + crcreg = SPIx->RXCRCR; + } + /* Return the selected CRC register */ + return crcreg; +} + +/** + * @brief Returns the CRC Polynomial register value for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @retval The CRC Polynomial register value. + */ +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Return the CRC polynomial register */ + return SPIx->CRCPR; +} + +/** + * @brief Selects the data transfer direction in bi-directional mode for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_Direction: specifies the data transfer direction in bi-directional mode. + * This parameter can be one of the following values: + * @arg SPI_Direction_Tx: Selects Tx transmission direction + * @arg SPI_Direction_Rx: Selects Rx receive direction + * @retval None + */ +void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_DIRECTION(SPI_Direction)); + if (SPI_Direction == SPI_Direction_Tx) + { + /* Set the Tx only mode */ + SPIx->CR1 |= SPI_Direction_Tx; + } + else + { + /* Set the Rx only mode */ + SPIx->CR1 &= SPI_Direction_Rx; + } +} + +/** + * @brief Checks whether the specified SPI/I2S flag is set or not. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_FLAG: specifies the SPI/I2S flag to check. + * This parameter can be one of the following values: + * @arg SPI_I2S_FLAG_TXE: Transmit buffer empty flag. + * @arg SPI_I2S_FLAG_RXNE: Receive buffer not empty flag. + * @arg SPI_I2S_FLAG_BSY: Busy flag. + * @arg SPI_I2S_FLAG_OVR: Overrun flag. + * @arg SPI_FLAG_MODF: Mode Fault flag. + * @arg SPI_FLAG_CRCERR: CRC Error flag. + * @arg I2S_FLAG_UDR: Underrun Error flag. + * @arg I2S_FLAG_CHSIDE: Channel Side flag. + * @retval The new state of SPI_I2S_FLAG (SET or RESET). + */ +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG)); + /* Check the status of the specified SPI/I2S flag */ + if ((SPIx->SR & SPI_I2S_FLAG) != (uint16_t)RESET) + { + /* SPI_I2S_FLAG is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_FLAG is reset */ + bitstatus = RESET; + } + /* Return the SPI_I2S_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the SPIx CRC Error (CRCERR) flag. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * @param SPI_I2S_FLAG: specifies the SPI flag to clear. + * This function clears only CRCERR flag. + * @note + * - OVR (OverRun error) flag is cleared by software sequence: a read + * operation to SPI_DR register (SPI_I2S_ReceiveData()) followed by a read + * operation to SPI_SR register (SPI_I2S_GetFlagStatus()). + * - UDR (UnderRun error) flag is cleared by a read operation to + * SPI_SR register (SPI_I2S_GetFlagStatus()). + * - MODF (Mode Fault) flag is cleared by software sequence: a read/write + * operation to SPI_SR register (SPI_I2S_GetFlagStatus()) followed by a + * write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). + * @retval None + */ +void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_CLEAR_FLAG(SPI_I2S_FLAG)); + + /* Clear the selected SPI CRC Error (CRCERR) flag */ + SPIx->SR = (uint16_t)~SPI_I2S_FLAG; +} + +/** + * @brief Checks whether the specified SPI/I2S interrupt has occurred or not. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_IT: specifies the SPI/I2S interrupt source to check. + * This parameter can be one of the following values: + * @arg SPI_I2S_IT_TXE: Transmit buffer empty interrupt. + * @arg SPI_I2S_IT_RXNE: Receive buffer not empty interrupt. + * @arg SPI_I2S_IT_OVR: Overrun interrupt. + * @arg SPI_IT_MODF: Mode Fault interrupt. + * @arg SPI_IT_CRCERR: CRC Error interrupt. + * @arg I2S_IT_UDR: Underrun Error interrupt. + * @retval The new state of SPI_I2S_IT (SET or RESET). + */ +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itpos = 0, itmask = 0, enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_GET_IT(SPI_I2S_IT)); + + /* Get the SPI/I2S IT index */ + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + + /* Get the SPI/I2S IT mask */ + itmask = SPI_I2S_IT >> 4; + + /* Set the IT mask */ + itmask = 0x01 << itmask; + + /* Get the SPI_I2S_IT enable bit status */ + enablestatus = (SPIx->CR2 & itmask) ; + + /* Check the status of the specified SPI/I2S interrupt */ + if (((SPIx->SR & itpos) != (uint16_t)RESET) && enablestatus) + { + /* SPI_I2S_IT is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_IT is reset */ + bitstatus = RESET; + } + /* Return the SPI_I2S_IT status */ + return bitstatus; +} + +/** + * @brief Clears the SPIx CRC Error (CRCERR) interrupt pending bit. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * @param SPI_I2S_IT: specifies the SPI interrupt pending bit to clear. + * This function clears only CRCERR intetrrupt pending bit. + * @note + * - OVR (OverRun Error) interrupt pending bit is cleared by software + * sequence: a read operation to SPI_DR register (SPI_I2S_ReceiveData()) + * followed by a read operation to SPI_SR register (SPI_I2S_GetITStatus()). + * - UDR (UnderRun Error) interrupt pending bit is cleared by a read + * operation to SPI_SR register (SPI_I2S_GetITStatus()). + * - MODF (Mode Fault) interrupt pending bit is cleared by software sequence: + * a read/write operation to SPI_SR register (SPI_I2S_GetITStatus()) + * followed by a write operation to SPI_CR1 register (SPI_Cmd() to enable + * the SPI). + * @retval None + */ +void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) +{ + uint16_t itpos = 0; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_CLEAR_IT(SPI_I2S_IT)); + + /* Get the SPI IT index */ + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + + /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */ + SPIx->SR = (uint16_t)~itpos; +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c new file mode 100644 index 0000000..b7daab9 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c @@ -0,0 +1,2799 @@ +/** + ****************************************************************************** + * @file stm32f10x_tim.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the TIM firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_tim.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup TIM + * @brief TIM driver modules + * @{ + */ + +/** @defgroup TIM_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Defines + * @{ + */ + +/* ---------------------- TIM registers bit mask ------------------------ */ +#define CR1_CEN_Set ((uint16_t)0x0001) +#define CR1_CEN_Reset ((uint16_t)0x03FE) +#define CR1_UDIS_Set ((uint16_t)0x0002) +#define CR1_UDIS_Reset ((uint16_t)0x03FD) +#define CR1_URS_Set ((uint16_t)0x0004) +#define CR1_URS_Reset ((uint16_t)0x03FB) +#define CR1_OPM_Reset ((uint16_t)0x03F7) +#define CR1_CounterMode_Mask ((uint16_t)0x038F) +#define CR1_ARPE_Set ((uint16_t)0x0080) +#define CR1_ARPE_Reset ((uint16_t)0x037F) +#define CR1_CKD_Mask ((uint16_t)0x00FF) +#define CR2_CCPC_Set ((uint16_t)0x0001) +#define CR2_CCPC_Reset ((uint16_t)0xFFFE) +#define CR2_CCUS_Set ((uint16_t)0x0004) +#define CR2_CCUS_Reset ((uint16_t)0xFFFB) +#define CR2_CCDS_Set ((uint16_t)0x0008) +#define CR2_CCDS_Reset ((uint16_t)0xFFF7) +#define CR2_MMS_Mask ((uint16_t)0xFF8F) +#define CR2_TI1S_Set ((uint16_t)0x0080) +#define CR2_TI1S_Reset ((uint16_t)0xFF7F) +#define CR2_OIS1_Reset ((uint16_t)0x7EFF) +#define CR2_OIS1N_Reset ((uint16_t)0x7DFF) +#define CR2_OIS2_Reset ((uint16_t)0x7BFF) +#define CR2_OIS2N_Reset ((uint16_t)0x77FF) +#define CR2_OIS3_Reset ((uint16_t)0x6FFF) +#define CR2_OIS3N_Reset ((uint16_t)0x5FFF) +#define CR2_OIS4_Reset ((uint16_t)0x3FFF) +#define SMCR_SMS_Mask ((uint16_t)0xFFF8) +#define SMCR_ETR_Mask ((uint16_t)0x00FF) +#define SMCR_TS_Mask ((uint16_t)0xFF8F) +#define SMCR_MSM_Reset ((uint16_t)0xFF7F) +#define SMCR_ECE_Set ((uint16_t)0x4000) +#define CCMR_CC13S_Mask ((uint16_t)0xFFFC) +#define CCMR_CC24S_Mask ((uint16_t)0xFCFF) +#define CCMR_TI13Direct_Set ((uint16_t)0x0001) +#define CCMR_TI24Direct_Set ((uint16_t)0x0100) +#define CCMR_OC13FE_Reset ((uint16_t)0xFFFB) +#define CCMR_OC24FE_Reset ((uint16_t)0xFBFF) +#define CCMR_OC13PE_Reset ((uint16_t)0xFFF7) +#define CCMR_OC24PE_Reset ((uint16_t)0xF7FF) +#define CCMR_OC13M_Mask ((uint16_t)0xFF8F) +#define CCMR_OC24M_Mask ((uint16_t)0x8FFF) +#define CCMR_OC13CE_Reset ((uint16_t)0xFF7F) +#define CCMR_OC24CE_Reset ((uint16_t)0x7FFF) +#define CCMR_IC13PSC_Mask ((uint16_t)0xFFF3) +#define CCMR_IC24PSC_Mask ((uint16_t)0xF3FF) +#define CCMR_IC13F_Mask ((uint16_t)0xFF0F) +#define CCMR_IC24F_Mask ((uint16_t)0x0FFF) +#define CCMR_Offset ((uint16_t)0x0018) +#define CCER_CCE_Set ((uint16_t)0x0001) +#define CCER_CCNE_Set ((uint16_t)0x0004) +#define CCER_CC1P_Reset ((uint16_t)0xFFFD) +#define CCER_CC2P_Reset ((uint16_t)0xFFDF) +#define CCER_CC3P_Reset ((uint16_t)0xFDFF) +#define CCER_CC4P_Reset ((uint16_t)0xDFFF) +#define CCER_CC1NP_Reset ((uint16_t)0xFFF7) +#define CCER_CC2NP_Reset ((uint16_t)0xFF7F) +#define CCER_CC3NP_Reset ((uint16_t)0xF7FF) +#define CCER_CC1E_Set ((uint16_t)0x0001) +#define CCER_CC1E_Reset ((uint16_t)0xFFFE) +#define CCER_CC1NE_Reset ((uint16_t)0xFFFB) +#define CCER_CC2E_Set ((uint16_t)0x0010) +#define CCER_CC2E_Reset ((uint16_t)0xFFEF) +#define CCER_CC2NE_Reset ((uint16_t)0xFFBF) +#define CCER_CC3E_Set ((uint16_t)0x0100) +#define CCER_CC3E_Reset ((uint16_t)0xFEFF) +#define CCER_CC3NE_Reset ((uint16_t)0xFBFF) +#define CCER_CC4E_Set ((uint16_t)0x1000) +#define CCER_CC4E_Reset ((uint16_t)0xEFFF) +#define BDTR_MOE_Set ((uint16_t)0x8000) +#define BDTR_MOE_Reset ((uint16_t)0x7FFF) +/** + * @} + */ + +/** @defgroup TIM_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_FunctionPrototypes + * @{ + */ + +static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +/** + * @} + */ + +/** @defgroup TIM_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the TIMx peripheral registers to their default reset values. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @retval None + */ +void TIM_DeInit(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + + if (TIMx == TIM1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE); + } + else if (TIMx == TIM2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE); + } + else if (TIMx == TIM3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE); + } + else if (TIMx == TIM4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); + } + else if (TIMx == TIM5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE); + } + else if (TIMx == TIM6) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE); + } + else if (TIMx == TIM7) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE); + } + else + { + if (TIMx == TIM8) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE); + } + } +} + +/** + * @brief Initializes the TIMx Time Base Unit peripheral according to + * the specified parameters in the TIM_TimeBaseInitStruct. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef + * structure that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode)); + assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision)); + /* Select the Counter Mode and set the clock division */ + TIMx->CR1 &= CR1_CKD_Mask & CR1_CounterMode_Mask; + TIMx->CR1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision | + TIM_TimeBaseInitStruct->TIM_CounterMode; + + /* Set the Autoreload value */ + TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ; + + /* Set the Prescaler value */ + TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; + + if ((((uint32_t) TIMx) == TIM1_BASE) || (((uint32_t) TIMx) == TIM8_BASE)) + { + /* Set the Repetition Counter value */ + TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; + } + + /* Generate an update event to reload the Prescaler value immediatly */ + TIMx->EGR = TIM_PSCReloadMode_Immediate; +} + +/** + * @brief Initializes the TIMx Channel1 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= CCER_CC1E_Reset; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= CCMR_OC13M_Mask & CCMR_CC13S_Mask; + + /* Select the Output Compare Mode */ + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= CCER_CC1P_Reset; + /* Set the Output Compare Polarity */ + tmpccer |= TIM_OCInitStruct->TIM_OCPolarity; + + /* Set the Output State */ + tmpccer |= TIM_OCInitStruct->TIM_OutputState; + + if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) TIMx == TIM8_BASE)) + { + assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); + assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); + + /* Reset the Output N Polarity level */ + tmpccer &= CCER_CC1NP_Reset; + /* Set the Output N Polarity */ + tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity; + /* Reset the Output N State */ + tmpccer &= CCER_CC1NE_Reset; + + /* Set the Output N State */ + tmpccer |= TIM_OCInitStruct->TIM_OutputNState; + /* Reset the Ouput Compare and Output Compare N IDLE State */ + tmpcr2 &= CR2_OIS1_Reset; + tmpcr2 &= CR2_OIS1N_Reset; + /* Set the Output Idle state */ + tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState; + /* Set the Output N Idle state */ + tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState; + } + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIMx Channel2 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= CCER_CC2E_Reset; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= CCMR_OC24M_Mask & CCMR_CC24S_Mask; + + /* Select the Output Compare Mode */ + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + + /* Reset the Output Polarity level */ + tmpccer &= CCER_CC2P_Reset; + /* Set the Output Compare Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4); + + /* Set the Output State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4); + + if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) TIMx == TIM8_BASE)) + { + assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); + assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); + + /* Reset the Output N Polarity level */ + tmpccer &= CCER_CC2NP_Reset; + /* Set the Output N Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4); + /* Reset the Output N State */ + tmpccer &= CCER_CC2NE_Reset; + + /* Set the Output N State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4); + /* Reset the Ouput Compare and Output Compare N IDLE State */ + tmpcr2 &= CR2_OIS2_Reset; + tmpcr2 &= CR2_OIS2N_Reset; + /* Set the Output Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2); + /* Set the Output N Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 2); + } + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIMx Channel3 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= CCER_CC3E_Reset; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= CCMR_OC13M_Mask & CCMR_CC13S_Mask; + + /* Select the Output Compare Mode */ + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= CCER_CC3P_Reset; + /* Set the Output Compare Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8); + + /* Set the Output State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8); + + if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) TIMx == TIM8_BASE)) + { + assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); + assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); + + /* Reset the Output N Polarity level */ + tmpccer &= CCER_CC3NP_Reset; + /* Set the Output N Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 8); + /* Reset the Output N State */ + tmpccer &= CCER_CC3NE_Reset; + + /* Set the Output N State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 8); + /* Reset the Ouput Compare and Output Compare N IDLE State */ + tmpcr2 &= CR2_OIS3_Reset; + tmpcr2 &= CR2_OIS3N_Reset; + /* Set the Output Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 4); + /* Set the Output N Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 4); + } + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIMx Channel4 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 2: Reset the CC4E Bit */ + TIMx->CCER &= CCER_CC4E_Reset; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= CCMR_OC24M_Mask & CCMR_CC24S_Mask; + + /* Select the Output Compare Mode */ + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + + /* Reset the Output Polarity level */ + tmpccer &= CCER_CC4P_Reset; + /* Set the Output Compare Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12); + + /* Set the Output State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12); + + if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) TIMx == TIM8_BASE)) + { + assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); + /* Reset the Ouput Compare IDLE State */ + tmpcr2 &= CR2_OIS4_Reset; + /* Set the Output Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 6); + } + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR4 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_ICInitStruct->TIM_Channel)); + assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); + assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler)); + assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter)); + + if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + /* TI1 Configuration */ + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2) + { + /* TI2 Configuration */ + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3) + { + /* TI3 Configuration */ + TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + /* TI4 Configuration */ + TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/** + * @brief Configures the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct to measure an external PWM signal. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure + * that contains the configuration information for the specified TIM peripheral. + * @retval None + */ +void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) +{ + uint16_t icoppositepolarity = TIM_ICPolarity_Rising; + uint16_t icoppositeselection = TIM_ICSelection_DirectTI; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Select the Opposite Input Polarity */ + if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising) + { + icoppositepolarity = TIM_ICPolarity_Falling; + } + else + { + icoppositepolarity = TIM_ICPolarity_Rising; + } + /* Select the Opposite Input */ + if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI) + { + icoppositeselection = TIM_ICSelection_IndirectTI; + } + else + { + icoppositeselection = TIM_ICSelection_DirectTI; + } + if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + /* TI1 Configuration */ + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + /* TI2 Configuration */ + TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + /* TI2 Configuration */ + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + /* TI1 Configuration */ + TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/** + * @brief Configures the: Break feature, dead time, Lock level, the OSSI, + * the OSSR State and the AOE(automatic output enable). + * @param TIMx: where x can be 1 or 8 to select the TIM + * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure that + * contains the BDTR Register configuration information for the TIM peripheral. + * @retval None + */ +void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_18_PERIPH(TIMx)); + assert_param(IS_TIM_OSSR_STATE(TIM_BDTRInitStruct->TIM_OSSRState)); + assert_param(IS_TIM_OSSI_STATE(TIM_BDTRInitStruct->TIM_OSSIState)); + assert_param(IS_TIM_LOCK_LEVEL(TIM_BDTRInitStruct->TIM_LOCKLevel)); + assert_param(IS_TIM_BREAK_STATE(TIM_BDTRInitStruct->TIM_Break)); + assert_param(IS_TIM_BREAK_POLARITY(TIM_BDTRInitStruct->TIM_BreakPolarity)); + assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTRInitStruct->TIM_AutomaticOutput)); + /* Set the Lock level, the Break enable Bit and the Ploarity, the OSSR State, + the OSSI State, the dead time value and the Automatic Output Enable Bit */ + TIMx->BDTR = (uint32_t)TIM_BDTRInitStruct->TIM_OSSRState | TIM_BDTRInitStruct->TIM_OSSIState | + TIM_BDTRInitStruct->TIM_LOCKLevel | TIM_BDTRInitStruct->TIM_DeadTime | + TIM_BDTRInitStruct->TIM_Break | TIM_BDTRInitStruct->TIM_BreakPolarity | + TIM_BDTRInitStruct->TIM_AutomaticOutput; +} + +/** + * @brief Fills each TIM_TimeBaseInitStruct member with its default value. + * @param TIM_TimeBaseInitStruct : pointer to a TIM_TimeBaseInitTypeDef + * structure which will be initialized. + * @retval None + */ +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) +{ + /* Set the default configuration */ + TIM_TimeBaseInitStruct->TIM_Period = 0xFFFF; + TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000; + TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1; + TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000; +} + +/** + * @brief Fills each TIM_OCInitStruct member with its default value. + * @param TIM_OCInitStruct : pointer to a TIM_OCInitTypeDef structure which will + * be initialized. + * @retval None + */ +void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + /* Set the default configuration */ + TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing; + TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable; + TIM_OCInitStruct->TIM_OutputNState = TIM_OutputNState_Disable; + TIM_OCInitStruct->TIM_Pulse = 0x0000; + TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High; + TIM_OCInitStruct->TIM_OCNPolarity = TIM_OCPolarity_High; + TIM_OCInitStruct->TIM_OCIdleState = TIM_OCIdleState_Reset; + TIM_OCInitStruct->TIM_OCNIdleState = TIM_OCNIdleState_Reset; +} + +/** + * @brief Fills each TIM_ICInitStruct member with its default value. + * @param TIM_ICInitStruct : pointer to a TIM_ICInitTypeDef structure which will + * be initialized. + * @retval None + */ +void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct) +{ + /* Set the default configuration */ + TIM_ICInitStruct->TIM_Channel = TIM_Channel_1; + TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising; + TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI; + TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1; + TIM_ICInitStruct->TIM_ICFilter = 0x00; +} + +/** + * @brief Fills each TIM_BDTRInitStruct member with its default value. + * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure which + * will be initialized. + * @retval None + */ +void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct) +{ + /* Set the default configuration */ + TIM_BDTRInitStruct->TIM_OSSRState = TIM_OSSRState_Disable; + TIM_BDTRInitStruct->TIM_OSSIState = TIM_OSSIState_Disable; + TIM_BDTRInitStruct->TIM_LOCKLevel = TIM_LOCKLevel_OFF; + TIM_BDTRInitStruct->TIM_DeadTime = 0x00; + TIM_BDTRInitStruct->TIM_Break = TIM_Break_Disable; + TIM_BDTRInitStruct->TIM_BreakPolarity = TIM_BreakPolarity_Low; + TIM_BDTRInitStruct->TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; +} + +/** + * @brief Enables or disables the specified TIM peripheral. + * @param TIMx: where x can be 1 to 8 to select the TIMx peripheral. + * @param NewState: new state of the TIMx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the TIM Counter */ + TIMx->CR1 |= CR1_CEN_Set; + } + else + { + /* Disable the TIM Counter */ + TIMx->CR1 &= CR1_CEN_Reset; + } +} + +/** + * @brief Enables or disables the TIM peripheral Main Outputs. + * @param TIMx: where x can be 1 or 8 to select the TIMx peripheral. + * @param NewState: new state of the TIM peripheral Main Outputs. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_18_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the TIM Main Output */ + TIMx->BDTR |= BDTR_MOE_Set; + } + else + { + /* Disable the TIM Main Output */ + TIMx->BDTR &= BDTR_MOE_Reset; + } +} + +/** + * @brief Enables or disables the specified TIM interrupts. + * @param TIMx: where x can be 1 to 8 to select the TIMx peripheral. + * @param TIM_IT: specifies the TIM interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg TIM_IT_Update: TIM update Interrupt source + * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source + * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source + * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source + * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source + * @arg TIM_IT_COM: TIM Commutation Interrupt source + * @arg TIM_IT_Trigger: TIM Trigger Interrupt source + * @arg TIM_IT_Break: TIM Break Interrupt source + * @note + * - TIM6 and TIM7 can only generate an update interrupt. + * - TIM_IT_COM and TIM_IT_Break are used only with TIM1 and TIM8. + * @param NewState: new state of the TIM interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_IT(TIM_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt sources */ + TIMx->DIER |= TIM_IT; + } + else + { + /* Disable the Interrupt sources */ + TIMx->DIER &= (uint16_t)~TIM_IT; + } +} + +/** + * @brief Configures the TIMx event to be generate by software. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param TIM_EventSource: specifies the event source. + * This parameter can be one or more of the following values: + * @arg TIM_EventSource_Update: Timer update Event source + * @arg TIM_EventSource_CC1: Timer Capture Compare 1 Event source + * @arg TIM_EventSource_CC2: Timer Capture Compare 2 Event source + * @arg TIM_EventSource_CC3: Timer Capture Compare 3 Event source + * @arg TIM_EventSource_CC4: Timer Capture Compare 4 Event source + * @arg TIM_EventSource_COM: Timer COM event source + * @arg TIM_EventSource_Trigger: Timer Trigger Event source + * @arg TIM_EventSource_Break: Timer Break event source + * @note + * - TIM6 and TIM7 can only generate an update event. + * - TIM_EventSource_COM and TIM_EventSource_Break are used only with TIM1 and TIM8. + * @retval None + */ +void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_EVENT_SOURCE(TIM_EventSource)); + + /* Set the event sources */ + TIMx->EGR = TIM_EventSource; +} + +/** + * @brief Configures the TIMx’s DMA interface. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_DMABase: DMA Base address. + * This parameter can be one of the following values: + * @arg TIM_DMABase_CR, TIM_DMABase_CR2, TIM_DMABase_SMCR, + * TIM_DMABase_DIER, TIM1_DMABase_SR, TIM_DMABase_EGR, + * TIM_DMABase_CCMR1, TIM_DMABase_CCMR2, TIM_DMABase_CCER, + * TIM_DMABase_CNT, TIM_DMABase_PSC, TIM_DMABase_ARR, + * TIM_DMABase_RCR, TIM_DMABase_CCR1, TIM_DMABase_CCR2, + * TIM_DMABase_CCR3, TIM_DMABase_CCR4, TIM_DMABase_BDTR, + * TIM_DMABase_DCR. + * @param TIM_DMABurstLength: DMA Burst length. + * This parameter can be one value between: + * TIM_DMABurstLength_1Byte and TIM_DMABurstLength_18Bytes. + * @retval None + */ +void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_DMA_BASE(TIM_DMABase)); + assert_param(IS_TIM_DMA_LENGTH(TIM_DMABurstLength)); + /* Set the DMA Base and the DMA Burst Length */ + TIMx->DCR = TIM_DMABase | TIM_DMABurstLength; +} + +/** + * @brief Enables or disables the TIMx’s DMA Requests. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param TIM_DMASource: specifies the DMA Request sources. + * This parameter can be any combination of the following values: + * @arg TIM_DMA_Update: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_Trigger: TIM Trigger DMA source + * @param NewState: new state of the DMA Request sources. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_DMA_SOURCE(TIM_DMASource)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA sources */ + TIMx->DIER |= TIM_DMASource; + } + else + { + /* Disable the DMA sources */ + TIMx->DIER &= (uint16_t)~TIM_DMASource; + } +} + +/** + * @brief Configures the TIMx interrnal Clock + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @retval None + */ +void TIM_InternalClockConfig(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Disable slave mode to clock the prescaler directly with the internal clock */ + TIMx->SMCR &= SMCR_SMS_Mask; +} + +/** + * @brief Configures the TIMx Internal Trigger as External Clock + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ITRSource: Trigger source. + * This parameter can be one of the following values: + * @param TIM_TS_ITR0: Internal Trigger 0 + * @param TIM_TS_ITR1: Internal Trigger 1 + * @param TIM_TS_ITR2: Internal Trigger 2 + * @param TIM_TS_ITR3: Internal Trigger 3 + * @retval None + */ +void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource)); + /* Select the Internal Trigger */ + TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource); + /* Select the External clock mode1 */ + TIMx->SMCR |= TIM_SlaveMode_External1; +} + +/** + * @brief Configures the TIMx Trigger as External Clock + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_TIxExternalCLKSource: Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TIxExternalCLK1Source_TI1ED: TI1 Edge Detector + * @arg TIM_TIxExternalCLK1Source_TI1: Filtered Timer Input 1 + * @arg TIM_TIxExternalCLK1Source_TI2: Filtered Timer Input 2 + * @param TIM_ICPolarity: specifies the TIx Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param ICFilter : specifies the filter value. + * This parameter must be a value between 0x0 and 0xF. + * @retval None + */ +void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_TIXCLK_SOURCE(TIM_TIxExternalCLKSource)); + assert_param(IS_TIM_IC_POLARITY(TIM_ICPolarity)); + assert_param(IS_TIM_IC_FILTER(ICFilter)); + /* Configure the Timer Input Clock Source */ + if (TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2) + { + TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + else + { + TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + /* Select the Trigger source */ + TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource); + /* Select the External clock mode1 */ + TIMx->SMCR |= TIM_SlaveMode_External1; +} + +/** + * @brief Configures the External clock Mode1 + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. + * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. + * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. + * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity: The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. + * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. + * @param ExtTRGFilter: External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); + assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); + assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); + /* Configure the ETR Clock source */ + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the SMS Bits */ + tmpsmcr &= SMCR_SMS_Mask; + /* Select the External clock mode1 */ + tmpsmcr |= TIM_SlaveMode_External1; + /* Select the Trigger selection : ETRF */ + tmpsmcr &= SMCR_TS_Mask; + tmpsmcr |= TIM_TS_ETRF; + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Configures the External clock Mode2 + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. + * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. + * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. + * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity: The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. + * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. + * @param ExtTRGFilter: External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); + assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); + assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); + /* Configure the ETR Clock source */ + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + /* Enable the External clock mode2 */ + TIMx->SMCR |= SMCR_ECE_Set; +} + +/** + * @brief Configures the TIMx External Trigger (ETR). + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. + * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. + * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. + * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity: The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. + * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. + * @param ExtTRGFilter: External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); + assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); + assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); + tmpsmcr = TIMx->SMCR; + /* Reset the ETR Bits */ + tmpsmcr &= SMCR_ETR_Mask; + /* Set the Prescaler, the Filter value and the Polarity */ + tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8))); + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Configures the TIMx Prescaler. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param Prescaler: specifies the Prescaler Register value + * @param TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode + * This parameter can be one of the following values: + * @arg TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event. + * @arg TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediatly. + * @retval None + */ +void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode)); + /* Set the Prescaler value */ + TIMx->PSC = Prescaler; + /* Set or reset the UG Bit */ + TIMx->EGR = TIM_PSCReloadMode; +} + +/** + * @brief Specifies the TIMx Counter Mode to be used. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_CounterMode: specifies the Counter Mode to be used + * This parameter can be one of the following values: + * @arg TIM_CounterMode_Up: TIM Up Counting Mode + * @arg TIM_CounterMode_Down: TIM Down Counting Mode + * @arg TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1 + * @arg TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2 + * @arg TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3 + * @retval None + */ +void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode) +{ + uint16_t tmpcr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode)); + tmpcr1 = TIMx->CR1; + /* Reset the CMS and DIR Bits */ + tmpcr1 &= CR1_CounterMode_Mask; + /* Set the Counter Mode */ + tmpcr1 |= TIM_CounterMode; + /* Write to TIMx CR1 register */ + TIMx->CR1 = tmpcr1; +} + +/** + * @brief Selects the Input Trigger source + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_InputTriggerSource: The Input Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal Trigger 0 + * @arg TIM_TS_ITR1: Internal Trigger 1 + * @arg TIM_TS_ITR2: Internal Trigger 2 + * @arg TIM_TS_ITR3: Internal Trigger 3 + * @arg TIM_TS_TI1F_ED: TI1 Edge Detector + * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 + * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 + * @arg TIM_TS_ETRF: External Trigger input + * @retval None + */ +void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) +{ + uint16_t tmpsmcr = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource)); + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the TS Bits */ + tmpsmcr &= SMCR_TS_Mask; + /* Set the Input Trigger source */ + tmpsmcr |= TIM_InputTriggerSource; + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Configures the TIMx Encoder Interface. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_EncoderMode: specifies the TIMx Encoder Mode. + * This parameter can be one of the following values: + * @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level. + * @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level. + * @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending + * on the level of the other input. + * @param TIM_IC1Polarity: specifies the IC1 Polarity + * This parmeter can be one of the following values: + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @param TIM_IC2Polarity: specifies the IC2 Polarity + * This parmeter can be one of the following values: + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @retval None + */ +void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) +{ + uint16_t tmpsmcr = 0; + uint16_t tmpccmr1 = 0; + uint16_t tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode)); + assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity)); + assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity)); + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = TIMx->CCMR1; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Set the encoder Mode */ + tmpsmcr &= SMCR_SMS_Mask; + tmpsmcr |= TIM_EncoderMode; + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmr1 &= CCMR_CC13S_Mask & CCMR_CC24S_Mask; + tmpccmr1 |= CCMR_TI13Direct_Set | CCMR_TI24Direct_Set; + + /* Set the TI1 and the TI2 Polarities */ + tmpccer &= CCER_CC1P_Reset & CCER_CC2P_Reset; + tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4)); + + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmr1; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Forces the TIMx output 1 waveform to active or inactive level. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC1REF + * @arg TIM_ForcedAction_InActive: Force inactive level on OC1REF. + * @retval None + */ +void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1M Bits */ + tmpccmr1 &= CCMR_OC13M_Mask; + /* Configure The Forced output Mode */ + tmpccmr1 |= TIM_ForcedAction; + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Forces the TIMx output 2 waveform to active or inactive level. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC2REF + * @arg TIM_ForcedAction_InActive: Force inactive level on OC2REF. + * @retval None + */ +void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2M Bits */ + tmpccmr1 &= CCMR_OC24M_Mask; + /* Configure The Forced output Mode */ + tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8); + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Forces the TIMx output 3 waveform to active or inactive level. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC3REF + * @arg TIM_ForcedAction_InActive: Force inactive level on OC3REF. + * @retval None + */ +void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC1M Bits */ + tmpccmr2 &= CCMR_OC13M_Mask; + /* Configure The Forced output Mode */ + tmpccmr2 |= TIM_ForcedAction; + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Forces the TIMx output 4 waveform to active or inactive level. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC4REF + * @arg TIM_ForcedAction_InActive: Force inactive level on OC4REF. + * @retval None + */ +void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC2M Bits */ + tmpccmr2 &= CCMR_OC24M_Mask; + /* Configure The Forced output Mode */ + tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8); + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Enables or disables TIMx peripheral Preload register on ARR. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param NewState: new state of the TIMx peripheral Preload register + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the ARR Preload Bit */ + TIMx->CR1 |= CR1_ARPE_Set; + } + else + { + /* Reset the ARR Preload Bit */ + TIMx->CR1 &= CR1_ARPE_Reset; + } +} + +/** + * @brief Selects the TIM peripheral Commutation event. + * @param TIMx: where x can be 1 or 8 to select the TIMx peripheral + * @param NewState: new state of the Commutation event. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_18_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the COM Bit */ + TIMx->CR2 |= CR2_CCUS_Set; + } + else + { + /* Reset the COM Bit */ + TIMx->CR2 &= CR2_CCUS_Reset; + } +} + +/** + * @brief Selects the TIMx peripheral Capture Compare DMA source. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param NewState: new state of the Capture Compare DMA source + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the CCDS Bit */ + TIMx->CR2 |= CR2_CCDS_Set; + } + else + { + /* Reset the CCDS Bit */ + TIMx->CR2 &= CR2_CCDS_Reset; + } +} + +/** + * @brief Sets or Resets the TIM peripheral Capture Compare Preload Control bit. + * @param TIMx: where x can be 1 or 8 to select the TIMx peripheral + * @param NewState: new state of the Capture Compare Preload Control bit + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_18_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the CCPC Bit */ + TIMx->CR2 |= CR2_CCPC_Set; + } + else + { + /* Reset the CCPC Bit */ + TIMx->CR2 &= CR2_CCPC_Reset; + } +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR1. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable + * @arg TIM_OCPreload_Disable + * @retval None + */ +void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1PE Bit */ + tmpccmr1 &= CCMR_OC13PE_Reset; + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr1 |= TIM_OCPreload; + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR2. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable + * @arg TIM_OCPreload_Disable + * @retval None + */ +void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2PE Bit */ + tmpccmr1 &= CCMR_OC24PE_Reset; + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8); + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR3. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable + * @arg TIM_OCPreload_Disable + * @retval None + */ +void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC3PE Bit */ + tmpccmr2 &= CCMR_OC13PE_Reset; + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr2 |= TIM_OCPreload; + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR4. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable + * @arg TIM_OCPreload_Disable + * @retval None + */ +void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC4PE Bit */ + tmpccmr2 &= CCMR_OC24PE_Reset; + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8); + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Configures the TIMx Output Compare 1 Fast feature. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable + * @arg TIM_OCFast_Disable: TIM output compare fast disable + * @retval None + */ +void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1FE Bit */ + tmpccmr1 &= CCMR_OC13FE_Reset; + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr1 |= TIM_OCFast; + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Configures the TIMx Output Compare 2 Fast feature. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable + * @arg TIM_OCFast_Disable: TIM output compare fast disable + * @retval None + */ +void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2FE Bit */ + tmpccmr1 &= CCMR_OC24FE_Reset; + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr1 |= (uint16_t)(TIM_OCFast << 8); + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Configures the TIMx Output Compare 3 Fast feature. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable + * @arg TIM_OCFast_Disable: TIM output compare fast disable + * @retval None + */ +void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC3FE Bit */ + tmpccmr2 &= CCMR_OC13FE_Reset; + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr2 |= TIM_OCFast; + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Configures the TIMx Output Compare 4 Fast feature. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable + * @arg TIM_OCFast_Disable: TIM output compare fast disable + * @retval None + */ +void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC4FE Bit */ + tmpccmr2 &= CCMR_OC24FE_Reset; + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr2 |= (uint16_t)(TIM_OCFast << 8); + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Clears or safeguards the OCREF1 signal on an external event + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable + * @arg TIM_OCClear_Disable: TIM Output clear disable + * @retval None + */ +void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1CE Bit */ + tmpccmr1 &= CCMR_OC13CE_Reset; + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr1 |= TIM_OCClear; + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Clears or safeguards the OCREF2 signal on an external event + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable + * @arg TIM_OCClear_Disable: TIM Output clear disable + * @retval None + */ +void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2CE Bit */ + tmpccmr1 &= CCMR_OC24CE_Reset; + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr1 |= (uint16_t)(TIM_OCClear << 8); + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Clears or safeguards the OCREF3 signal on an external event + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable + * @arg TIM_OCClear_Disable: TIM Output clear disable + * @retval None + */ +void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC3CE Bit */ + tmpccmr2 &= CCMR_OC13CE_Reset; + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr2 |= TIM_OCClear; + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Clears or safeguards the OCREF4 signal on an external event + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable + * @arg TIM_OCClear_Disable: TIM Output clear disable + * @retval None + */ +void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC4CE Bit */ + tmpccmr2 &= CCMR_OC24CE_Reset; + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr2 |= (uint16_t)(TIM_OCClear << 8); + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Configures the TIMx channel 1 polarity. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC1 Polarity + * This parmeter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high + * @arg TIM_OCPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + tmpccer = TIMx->CCER; + /* Set or Reset the CC1P Bit */ + tmpccer &= CCER_CC1P_Reset; + tmpccer |= TIM_OCPolarity; + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx Channel 1N polarity. + * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. + * @param TIM_OCNPolarity: specifies the OC1N Polarity + * This parmeter can be one of the following values: + * @arg TIM_OCNPolarity_High: Output Compare active high + * @arg TIM_OCNPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_18_PERIPH(TIMx)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC1NP Bit */ + tmpccer &= CCER_CC1NP_Reset; + tmpccer |= TIM_OCNPolarity; + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx channel 2 polarity. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC2 Polarity + * This parmeter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high + * @arg TIM_OCPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + tmpccer = TIMx->CCER; + /* Set or Reset the CC2P Bit */ + tmpccer &= CCER_CC2P_Reset; + tmpccer |= (uint16_t)(TIM_OCPolarity << 4); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx Channel 2N polarity. + * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. + * @param TIM_OCNPolarity: specifies the OC2N Polarity + * This parmeter can be one of the following values: + * @arg TIM_OCNPolarity_High: Output Compare active high + * @arg TIM_OCNPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_18_PERIPH(TIMx)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC2NP Bit */ + tmpccer &= CCER_CC2NP_Reset; + tmpccer |= (uint16_t)(TIM_OCNPolarity << 4); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx channel 3 polarity. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC3 Polarity + * This parmeter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high + * @arg TIM_OCPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + tmpccer = TIMx->CCER; + /* Set or Reset the CC3P Bit */ + tmpccer &= CCER_CC3P_Reset; + tmpccer |= (uint16_t)(TIM_OCPolarity << 8); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx Channel 3N polarity. + * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. + * @param TIM_OCNPolarity: specifies the OC3N Polarity + * This parmeter can be one of the following values: + * @arg TIM_OCNPolarity_High: Output Compare active high + * @arg TIM_OCNPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_18_PERIPH(TIMx)); + assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC3NP Bit */ + tmpccer &= CCER_CC3NP_Reset; + tmpccer |= (uint16_t)(TIM_OCNPolarity << 8); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx channel 4 polarity. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC4 Polarity + * This parmeter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high + * @arg TIM_OCPolarity_Low: Output Compare active low + * @retval None + */ +void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + tmpccer = TIMx->CCER; + /* Set or Reset the CC4P Bit */ + tmpccer &= CCER_CC4P_Reset; + tmpccer |= (uint16_t)(TIM_OCPolarity << 12); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel x. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_Channel: specifies the TIM Channel + * This parmeter can be one of the following values: + * @arg TIM_Channel_1: TIM Channel 1 + * @arg TIM_Channel_2: TIM Channel 2 + * @arg TIM_Channel_3: TIM Channel 3 + * @arg TIM_Channel_4: TIM Channel 4 + * @param TIM_CCx: specifies the TIM Channel CCxE bit new state. + * This parameter can be: TIM_CCx_Enable or TIM_CCx_Disable. + * @retval None + */ +void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx) +{ + uint16_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_Channel)); + assert_param(IS_TIM_CCX(TIM_CCx)); + + tmp = CCER_CCE_Set << TIM_Channel; + + /* Reset the CCxE Bit */ + TIMx->CCER &= (uint16_t)~ tmp; + + /* Set or reset the CCxE Bit */ + TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel); +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel xN. + * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. + * @param TIM_Channel: specifies the TIM Channel + * This parmeter can be one of the following values: + * @arg TIM_Channel_1: TIM Channel 1 + * @arg TIM_Channel_2: TIM Channel 2 + * @arg TIM_Channel_3: TIM Channel 3 + * @param TIM_CCxN: specifies the TIM Channel CCxNE bit new state. + * This parameter can be: TIM_CCxN_Enable or TIM_CCxN_Disable. + * @retval None + */ +void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN) +{ + uint16_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_TIM_18_PERIPH(TIMx)); + assert_param(IS_TIM_COMPLEMENTARY_CHANNEL(TIM_Channel)); + assert_param(IS_TIM_CCXN(TIM_CCxN)); + + tmp = CCER_CCNE_Set << TIM_Channel; + + /* Reset the CCxNE Bit */ + TIMx->CCER &= (uint16_t) ~tmp; + + /* Set or reset the CCxNE Bit */ + TIMx->CCER |= (uint16_t)(TIM_CCxN << TIM_Channel); +} + +/** + * @brief Selects the TIM Ouput Compare Mode. + * @note This function disables the selected channel before changing the Ouput + * Compare Mode. + * User has to enable this channel using TIM_CCxCmd and TIM_CCxNCmd functions. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_Channel: specifies the TIM Channel + * This parmeter can be one of the following values: + * @arg TIM_Channel_1: TIM Channel 1 + * @arg TIM_Channel_2: TIM Channel 2 + * @arg TIM_Channel_3: TIM Channel 3 + * @arg TIM_Channel_4: TIM Channel 4 + * @param TIM_OCMode: specifies the TIM Output Compare Mode. + * This paramter can be one of the following values: + * @arg TIM_OCMode_Timing + * @arg TIM_OCMode_Active + * @arg TIM_OCMode_Toggle + * @arg TIM_OCMode_PWM1 + * @arg TIM_OCMode_PWM2 + * @arg TIM_ForcedAction_Active + * @arg TIM_ForcedAction_InActive + * @retval None + */ +void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) +{ + uint32_t tmp = 0; + uint16_t tmp1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_Channel)); + assert_param(IS_TIM_OCM(TIM_OCMode)); + + tmp = (uint32_t) TIMx; + tmp += CCMR_Offset; + + tmp1 = CCER_CCE_Set << (uint16_t)TIM_Channel; + + /* Disable the Channel: Reset the CCxE Bit */ + TIMx->CCER &= (uint16_t) ~tmp1; + + if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) + { + tmp += (TIM_Channel>>1); + + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= CCMR_OC13M_Mask; + + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= TIM_OCMode; + } + else + { + tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1; + + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= CCMR_OC24M_Mask; + + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); + } +} + +/** + * @brief Enables or Disables the TIMx Update event. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param NewState: new state of the TIMx UDIS bit + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the Update Disable Bit */ + TIMx->CR1 |= CR1_UDIS_Set; + } + else + { + /* Reset the Update Disable Bit */ + TIMx->CR1 &= CR1_UDIS_Reset; + } +} + +/** + * @brief Configures the TIMx Update Request Interrupt source. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param TIM_UpdateSource: specifies the Update source. + * This parameter can be one of the following values: + * @arg TIM_UpdateSource_Regular: Source of update is the counter overflow/underflow + or the setting of UG bit, or an update generation + through the slave mode controller. + * @arg TIM_UpdateSource_Global: Source of update is counter overflow/underflow. + * @retval None + */ +void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_UPDATE_SOURCE(TIM_UpdateSource)); + if (TIM_UpdateSource != TIM_UpdateSource_Global) + { + /* Set the URS Bit */ + TIMx->CR1 |= CR1_URS_Set; + } + else + { + /* Reset the URS Bit */ + TIMx->CR1 &= CR1_URS_Reset; + } +} + +/** + * @brief Enables or disables the TIMx’s Hall sensor interface. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param NewState: new state of the TIMx Hall sensor interface. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Set the TI1S Bit */ + TIMx->CR2 |= CR2_TI1S_Set; + } + else + { + /* Reset the TI1S Bit */ + TIMx->CR2 &= CR2_TI1S_Reset; + } +} + +/** + * @brief Selects the TIMx’s One Pulse Mode. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param TIM_OPMode: specifies the OPM Mode to be used. + * This parameter can be one of the following values: + * @arg TIM_OPMode_Single + * @arg TIM_OPMode_Repetitive + * @retval None + */ +void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_OPM_MODE(TIM_OPMode)); + /* Reset the OPM Bit */ + TIMx->CR1 &= CR1_OPM_Reset; + /* Configure the OPM Mode */ + TIMx->CR1 |= TIM_OPMode; +} + +/** + * @brief Selects the TIMx Trigger Output Mode. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param TIM_TRGOSource: specifies the Trigger Output source. + * This paramter can be one of the following values: + * + * - For all TIMx + * @arg TIM_TRGOSource_Reset: The UG bit in the TIM_EGR register is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_Enable: The Counter Enable CEN is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_Update: The update event is selected as the trigger output (TRGO). + * + * - For all TIMx except TIM6 and TIM7 + * @arg TIM_TRGOSource_OC1: The trigger output sends a positive pulse when the CC1IF flag + * is to be set, as soon as a capture or compare match occurs (TRGO). + * @arg TIM_TRGOSource_OC1Ref: OC1REF signal is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_OC2Ref: OC2REF signal is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_OC3Ref: OC3REF signal is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output (TRGO). + * + * @retval None + */ +void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_TRGO_SOURCE(TIM_TRGOSource)); + /* Reset the MMS Bits */ + TIMx->CR2 &= CR2_MMS_Mask; + /* Select the TRGO source */ + TIMx->CR2 |= TIM_TRGOSource; +} + +/** + * @brief Selects the TIMx Slave Mode. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_SlaveMode: specifies the Timer Slave Mode. + * This paramter can be one of the following values: + * @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes + * the counter and triggers an update of the registers. + * @arg TIM_SlaveMode_Gated: The counter clock is enabled when the trigger signal (TRGI) is high. + * @arg TIM_SlaveMode_Trigger: The counter starts at a rising edge of the trigger TRGI. + * @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter. + * @retval None + */ +void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_SLAVE_MODE(TIM_SlaveMode)); + /* Reset the SMS Bits */ + TIMx->SMCR &= SMCR_SMS_Mask; + /* Select the Slave Mode */ + TIMx->SMCR |= TIM_SlaveMode; +} + +/** + * @brief Sets or Resets the TIMx Master/Slave Mode. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_MasterSlaveMode: specifies the Timer Master Slave Mode. + * This paramter can be one of the following values: + * @arg TIM_MasterSlaveMode_Enable: synchronization between the current timer + * and its slaves (through TRGO). + * @arg TIM_MasterSlaveMode_Disable: No action + * @retval None + */ +void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_MSM_STATE(TIM_MasterSlaveMode)); + /* Reset the MSM Bit */ + TIMx->SMCR &= SMCR_MSM_Reset; + + /* Set or Reset the MSM Bit */ + TIMx->SMCR |= TIM_MasterSlaveMode; +} + +/** + * @brief Sets the TIMx Counter Register value + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param Counter: specifies the Counter register new value. + * @retval None + */ +void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + /* Set the Counter Register value */ + TIMx->CNT = Counter; +} + +/** + * @brief Sets the TIMx Autoreload Register value + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param Autoreload: specifies the Autoreload register new value. + * @retval None + */ +void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + /* Set the Autoreload Register value */ + TIMx->ARR = Autoreload; +} + +/** + * @brief Sets the TIMx Capture Compare1 Register value + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param Compare1: specifies the Capture Compare1 register new value. + * @retval None + */ +void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Set the Capture Compare1 Register value */ + TIMx->CCR1 = Compare1; +} + +/** + * @brief Sets the TIMx Capture Compare2 Register value + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param Compare2: specifies the Capture Compare2 register new value. + * @retval None + */ +void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Set the Capture Compare2 Register value */ + TIMx->CCR2 = Compare2; +} + +/** + * @brief Sets the TIMx Capture Compare3 Register value + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param Compare3: specifies the Capture Compare3 register new value. + * @retval None + */ +void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Set the Capture Compare3 Register value */ + TIMx->CCR3 = Compare3; +} + +/** + * @brief Sets the TIMx Capture Compare4 Register value + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param Compare4: specifies the Capture Compare4 register new value. + * @retval None + */ +void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Set the Capture Compare4 Register value */ + TIMx->CCR4 = Compare4; +} + +/** + * @brief Sets the TIMx Input Capture 1 prescaler. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture1 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + /* Reset the IC1PSC Bits */ + TIMx->CCMR1 &= CCMR_IC13PSC_Mask; + /* Set the IC1PSC value */ + TIMx->CCMR1 |= TIM_ICPSC; +} + +/** + * @brief Sets the TIMx Input Capture 2 prescaler. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture2 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + /* Reset the IC2PSC Bits */ + TIMx->CCMR1 &= CCMR_IC24PSC_Mask; + /* Set the IC2PSC value */ + TIMx->CCMR1 |= (uint16_t)(TIM_ICPSC << 8); +} + +/** + * @brief Sets the TIMx Input Capture 3 prescaler. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture3 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + /* Reset the IC3PSC Bits */ + TIMx->CCMR2 &= CCMR_IC13PSC_Mask; + /* Set the IC3PSC value */ + TIMx->CCMR2 |= TIM_ICPSC; +} + +/** + * @brief Sets the TIMx Input Capture 4 prescaler. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture4 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + /* Reset the IC4PSC Bits */ + TIMx->CCMR2 &= CCMR_IC24PSC_Mask; + /* Set the IC4PSC value */ + TIMx->CCMR2 |= (uint16_t)(TIM_ICPSC << 8); +} + +/** + * @brief Sets the TIMx Clock Division value. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_CKD: specifies the clock division value. + * This parameter can be one of the following value: + * @arg TIM_CKD_DIV1: TDTS = Tck_tim + * @arg TIM_CKD_DIV2: TDTS = 2*Tck_tim + * @arg TIM_CKD_DIV4: TDTS = 4*Tck_tim + * @retval None + */ +void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + assert_param(IS_TIM_CKD_DIV(TIM_CKD)); + /* Reset the CKD Bits */ + TIMx->CR1 &= CR1_CKD_Mask; + /* Set the CKD value */ + TIMx->CR1 |= TIM_CKD; +} + +/** + * @brief Gets the TIMx Input Capture 1 value. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @retval Capture Compare 1 Register value. + */ +uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Get the Capture 1 Register value */ + return TIMx->CCR1; +} + +/** + * @brief Gets the TIMx Input Capture 2 value. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @retval Capture Compare 2 Register value. + */ +uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Get the Capture 2 Register value */ + return TIMx->CCR2; +} + +/** + * @brief Gets the TIMx Input Capture 3 value. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @retval Capture Compare 3 Register value. + */ +uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Get the Capture 3 Register value */ + return TIMx->CCR3; +} + +/** + * @brief Gets the TIMx Input Capture 4 value. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @retval Capture Compare 4 Register value. + */ +uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_123458_PERIPH(TIMx)); + /* Get the Capture 4 Register value */ + return TIMx->CCR4; +} + +/** + * @brief Gets the TIMx Counter value. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @retval Counter Register value. + */ +uint16_t TIM_GetCounter(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + /* Get the Counter Register value */ + return TIMx->CNT; +} + +/** + * @brief Gets the TIMx Prescaler value. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @retval Prescaler Register value. + */ +uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + /* Get the Prescaler Register value */ + return TIMx->PSC; +} + +/** + * @brief Checks whether the specified TIM flag is set or not. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param TIM_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg TIM_FLAG_Update: TIM update Flag + * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag + * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag + * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag + * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag + * @arg TIM_FLAG_COM: TIM Commutation Flag + * @arg TIM_FLAG_Trigger: TIM Trigger Flag + * @arg TIM_FLAG_Break: TIM Break Flag + * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag + * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag + * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag + * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag + * @note + * - TIM6 and TIM7 can have only one update flag. + * - TIM_FLAG_COM and TIM_FLAG_Break are used only with TIM1 and TIM8. + * @retval The new state of TIM_FLAG (SET or RESET). + */ +FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_GET_FLAG(TIM_FLAG)); + + if ((TIMx->SR & TIM_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the TIMx's pending flags. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param TIM_FLAG: specifies the flag bit to clear. + * This parameter can be any combination of the following values: + * @arg TIM_FLAG_Update: TIM update Flag + * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag + * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag + * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag + * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag + * @arg TIM_FLAG_COM: TIM Commutation Flag + * @arg TIM_FLAG_Trigger: TIM Trigger Flag + * @arg TIM_FLAG_Break: TIM Break Flag + * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag + * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag + * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag + * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag + * @note + * - TIM6 and TIM7 can have only one update flag. + * - TIM_FLAG_COM and TIM_FLAG_Break are used only with TIM1 and TIM8. + * @retval None + */ +void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG)); + + /* Clear the flags */ + TIMx->SR = (uint16_t)~TIM_FLAG; +} + +/** + * @brief Checks whether the TIM interrupt has occurred or not. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param TIM_IT: specifies the TIM interrupt source to check. + * This parameter can be one of the following values: + * @arg TIM_IT_Update: TIM update Interrupt source + * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source + * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source + * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source + * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source + * @arg TIM_IT_COM: TIM Commutation Interrupt source + * @arg TIM_IT_Trigger: TIM Trigger Interrupt source + * @arg TIM_IT_Break: TIM Break Interrupt source + * @note + * - TIM6 and TIM7 can generate only an update interrupt. + * - TIM_IT_COM and TIM_IT_Break are used only with TIM1 and TIM8. + * @retval The new state of the TIM_IT(SET or RESET). + */ +ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itstatus = 0x0, itenable = 0x0; + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_GET_IT(TIM_IT)); + + itstatus = TIMx->SR & TIM_IT; + + itenable = TIMx->DIER & TIM_IT; + if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the TIMx's interrupt pending bits. + * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. + * @param TIM_IT: specifies the pending bit to clear. + * This parameter can be any combination of the following values: + * @arg TIM_IT_Update: TIM1 update Interrupt source + * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source + * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source + * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source + * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source + * @arg TIM_IT_COM: TIM Commutation Interrupt source + * @arg TIM_IT_Trigger: TIM Trigger Interrupt source + * @arg TIM_IT_Break: TIM Break Interrupt source + * @note + * - TIM6 and TIM7 can generate only an update interrupt. + * - TIM_IT_COM and TIM_IT_Break are used only with TIM1 and TIM8. + * @retval None + */ +void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_IT(TIM_IT)); + /* Clear the IT pending Bit */ + TIMx->SR = (uint16_t)~TIM_IT; +} + +/** + * @brief Configure the TI1 as Input. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 1 is selected to be connected to IC1. + * @arg TIM_ICSelection_IndirectTI: TIM Input 1 is selected to be connected to IC2. + * @arg TIM_ICSelection_TRC: TIM Input 1 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0; + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= CCER_CC1E_Reset; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + /* Select the Input and set the filter */ + tmpccmr1 &= CCMR_CC13S_Mask & CCMR_IC13F_Mask; + tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= CCER_CC1P_Reset; + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)CCER_CC1E_Set); + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 2 is selected to be connected to IC2. + * @arg TIM_ICSelection_IndirectTI: TIM Input 2 is selected to be connected to IC1. + * @arg TIM_ICSelection_TRC: TIM Input 2 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0; + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= CCER_CC2E_Reset; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 4); + /* Select the Input and set the filter */ + tmpccmr1 &= CCMR_CC24S_Mask & CCMR_IC24F_Mask; + tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12); + tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8); + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= CCER_CC2P_Reset; + tmpccer |= (uint16_t)(tmp | (uint16_t)CCER_CC2E_Set); + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 3 is selected to be connected to IC3. + * @arg TIM_ICSelection_IndirectTI: TIM Input 3 is selected to be connected to IC4. + * @arg TIM_ICSelection_TRC: TIM Input 3 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + /* Disable the Channel 3: Reset the CC3E Bit */ + TIMx->CCER &= CCER_CC3E_Reset; + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 8); + /* Select the Input and set the filter */ + tmpccmr2 &= CCMR_CC13S_Mask & CCMR_IC13F_Mask; + tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= CCER_CC3P_Reset; + tmpccer |= (uint16_t)(tmp | (uint16_t)CCER_CC3E_Set); + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI1 as Input. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising + * @arg TIM_ICPolarity_Falling + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 4 is selected to be connected to IC4. + * @arg TIM_ICSelection_IndirectTI: TIM Input 4 is selected to be connected to IC3. + * @arg TIM_ICSelection_TRC: TIM Input 4 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= CCER_CC4E_Reset; + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 12); + + /* Select the Input and set the filter */ + tmpccmr2 &= CCMR_CC24S_Mask & CCMR_IC24F_Mask; + tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8); + tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12); + + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= CCER_CC4P_Reset; + tmpccer |= (uint16_t)(tmp | (uint16_t)CCER_CC4E_Set); + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer ; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c new file mode 100644 index 0000000..c73e0ac --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c @@ -0,0 +1,968 @@ +/** + ****************************************************************************** + * @file stm32f10x_usart.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the USART firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_usart.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup USART + * @brief USART driver modules + * @{ + */ + +/** @defgroup USART_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Defines + * @{ + */ + +#define CR1_UE_Set ((uint16_t)0x2000) /*!< USART Enable Mask */ +#define CR1_UE_Reset ((uint16_t)0xDFFF) /*!< USART Disable Mask */ + +#define CR1_WAKE_Mask ((uint16_t)0xF7FF) /*!< USART WakeUp Method Mask */ + +#define CR1_RWU_Set ((uint16_t)0x0002) /*!< USART mute mode Enable Mask */ +#define CR1_RWU_Reset ((uint16_t)0xFFFD) /*!< USART mute mode Enable Mask */ +#define CR1_SBK_Set ((uint16_t)0x0001) /*!< USART Break Character send Mask */ +#define CR1_CLEAR_Mask ((uint16_t)0xE9F3) /*!< USART CR1 Mask */ + +#define CR2_Address_Mask ((uint16_t)0xFFF0) /*!< USART address Mask */ + +#define CR2_LINEN_Set ((uint16_t)0x4000) /*!< USART LIN Enable Mask */ +#define CR2_LINEN_Reset ((uint16_t)0xBFFF) /*!< USART LIN Disable Mask */ + +#define CR2_LBDL_Mask ((uint16_t)0xFFDF) /*!< USART LIN Break detection Mask */ +#define CR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /*!< USART CR2 STOP Bits Mask */ +#define CR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /*!< USART CR2 Clock Mask */ + +#define CR3_SCEN_Set ((uint16_t)0x0020) /*!< USART SC Enable Mask */ +#define CR3_SCEN_Reset ((uint16_t)0xFFDF) /*!< USART SC Disable Mask */ + +#define CR3_NACK_Set ((uint16_t)0x0010) /*!< USART SC NACK Enable Mask */ +#define CR3_NACK_Reset ((uint16_t)0xFFEF) /*!< USART SC NACK Disable Mask */ + +#define CR3_HDSEL_Set ((uint16_t)0x0008) /*!< USART Half-Duplex Enable Mask */ +#define CR3_HDSEL_Reset ((uint16_t)0xFFF7) /*!< USART Half-Duplex Disable Mask */ + +#define CR3_IRLP_Mask ((uint16_t)0xFFFB) /*!< USART IrDA LowPower mode Mask */ +#define CR3_CLEAR_Mask ((uint16_t)0xFCFF) /*!< USART CR3 Mask */ + +#define CR3_IREN_Set ((uint16_t)0x0002) /*!< USART IrDA Enable Mask */ +#define CR3_IREN_Reset ((uint16_t)0xFFFD) /*!< USART IrDA Disable Mask */ +#define GTPR_LSB_Mask ((uint16_t)0x00FF) /*!< Guard Time Register LSB Mask */ +#define GTPR_MSB_Mask ((uint16_t)0xFF00) /*!< Guard Time Register MSB Mask */ +#define IT_Mask ((uint16_t)0x001F) /*!< USART Interrupt Mask */ + +/** + * @} + */ + +/** @defgroup USART_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the USARTx peripheral registers to their default reset values. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: USART1, USART2, USART3, UART4 or UART5. + * @retval None + */ +void USART_DeInit(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + if (USARTx == USART1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); + } + else if (USARTx == USART2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); + } + else if (USARTx == USART3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); + } + else if (USARTx == UART4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); + } + else + { + if (USARTx == UART5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); + } + } +} + +/** + * @brief Initializes the USARTx peripheral according to the specified + * parameters in the USART_InitStruct . + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_InitStruct: pointer to a USART_InitTypeDef structure + * that contains the configuration information for the specified USART peripheral. + * @retval None + */ +void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) +{ + uint32_t tmpreg = 0x00, apbclock = 0x00; + uint32_t integerdivider = 0x00; + uint32_t fractionaldivider = 0x00; + uint32_t usartxbase = 0; + RCC_ClocksTypeDef RCC_ClocksStatus; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate)); + assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength)); + assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits)); + assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity)); + assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode)); + assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl)); + /* The hardware flow control is available only for USART1, USART2 and USART3 */ + if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + usartxbase = (uint32_t)USARTx; + +/*---------------------------- USART CR2 Configuration -----------------------*/ + tmpreg = USARTx->CR2; + /* Clear STOP[13:12] bits */ + tmpreg &= CR2_STOP_CLEAR_Mask; + /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit ------------*/ + /* Set STOP[13:12] bits according to USART_StopBits value */ + tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; + + /* Write to USART CR2 */ + USARTx->CR2 = (uint16_t)tmpreg; + +/*---------------------------- USART CR1 Configuration -----------------------*/ + tmpreg = USARTx->CR1; + /* Clear M, PCE, PS, TE and RE bits */ + tmpreg &= CR1_CLEAR_Mask; + /* Configure the USART Word Length, Parity and mode ----------------------- */ + /* Set the M bits according to USART_WordLength value */ + /* Set PCE and PS bits according to USART_Parity value */ + /* Set TE and RE bits according to USART_Mode value */ + tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity | + USART_InitStruct->USART_Mode; + /* Write to USART CR1 */ + USARTx->CR1 = (uint16_t)tmpreg; + +/*---------------------------- USART CR3 Configuration -----------------------*/ + tmpreg = USARTx->CR3; + /* Clear CTSE and RTSE bits */ + tmpreg &= CR3_CLEAR_Mask; + /* Configure the USART HFC -------------------------------------------------*/ + /* Set CTSE and RTSE bits according to USART_HardwareFlowControl value */ + tmpreg |= USART_InitStruct->USART_HardwareFlowControl; + /* Write to USART CR3 */ + USARTx->CR3 = (uint16_t)tmpreg; + +/*---------------------------- USART BRR Configuration -----------------------*/ + /* Configure the USART Baud Rate -------------------------------------------*/ + RCC_GetClocksFreq(&RCC_ClocksStatus); + if (usartxbase == USART1_BASE) + { + apbclock = RCC_ClocksStatus.PCLK2_Frequency; + } + else + { + apbclock = RCC_ClocksStatus.PCLK1_Frequency; + } + /* Determine the integer part */ + integerdivider = ((0x19 * apbclock) / (0x04 * (USART_InitStruct->USART_BaudRate))); + tmpreg = (integerdivider / 0x64) << 0x04; + /* Determine the fractional part */ + fractionaldivider = integerdivider - (0x64 * (tmpreg >> 0x04)); + tmpreg |= ((((fractionaldivider * 0x10) + 0x32) / 0x64)) & ((uint8_t)0x0F); + /* Write to USART BRR */ + USARTx->BRR = (uint16_t)tmpreg; +} + +/** + * @brief Fills each USART_InitStruct member with its default value. + * @param USART_InitStruct: pointer to a USART_InitTypeDef structure + * which will be initialized. + * @retval None + */ +void USART_StructInit(USART_InitTypeDef* USART_InitStruct) +{ + /* USART_InitStruct members default value */ + USART_InitStruct->USART_BaudRate = 9600; + USART_InitStruct->USART_WordLength = USART_WordLength_8b; + USART_InitStruct->USART_StopBits = USART_StopBits_1; + USART_InitStruct->USART_Parity = USART_Parity_No ; + USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; +} + +/** + * @brief Initializes the USARTx peripheral Clock according to the + * specified parameters in the USART_ClockInitStruct . + * @param USARTx: where x can be 1, 2, 3 to select the USART peripheral. + * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef + * structure that contains the configuration information for the specified + * USART peripheral. + * @note The Smart Card mode is not available for UART4 and UART5. + * @retval None + */ +void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct) +{ + uint32_t tmpreg = 0x00; + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + assert_param(IS_USART_CLOCK(USART_ClockInitStruct->USART_Clock)); + assert_param(IS_USART_CPOL(USART_ClockInitStruct->USART_CPOL)); + assert_param(IS_USART_CPHA(USART_ClockInitStruct->USART_CPHA)); + assert_param(IS_USART_LASTBIT(USART_ClockInitStruct->USART_LastBit)); + +/*---------------------------- USART CR2 Configuration -----------------------*/ + tmpreg = USARTx->CR2; + /* Clear CLKEN, CPOL, CPHA and LBCL bits */ + tmpreg &= CR2_CLOCK_CLEAR_Mask; + /* Configure the USART Clock, CPOL, CPHA and LastBit ------------*/ + /* Set CLKEN bit according to USART_Clock value */ + /* Set CPOL bit according to USART_CPOL value */ + /* Set CPHA bit according to USART_CPHA value */ + /* Set LBCL bit according to USART_LastBit value */ + tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL | + USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit; + /* Write to USART CR2 */ + USARTx->CR2 = (uint16_t)tmpreg; +} + +/** + * @brief Fills each USART_ClockInitStruct member with its default value. + * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef + * structure which will be initialized. + * @retval None + */ +void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct) +{ + /* USART_ClockInitStruct members default value */ + USART_ClockInitStruct->USART_Clock = USART_Clock_Disable; + USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low; + USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge; + USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable; +} + +/** + * @brief Enables or disables the specified USART peripheral. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USARTx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected USART by setting the UE bit in the CR1 register */ + USARTx->CR1 |= CR1_UE_Set; + } + else + { + /* Disable the selected USART by clearing the UE bit in the CR1 register */ + USARTx->CR1 &= CR1_UE_Reset; + } +} + +/** + * @brief Enables or disables the specified USART interrupts. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @arg USART_IT_TXE: Tansmit Data Register empty interrupt + * @arg USART_IT_TC: Transmission complete interrupt + * @arg USART_IT_RXNE: Receive Data register not empty interrupt + * @arg USART_IT_IDLE: Idle line detection interrupt + * @arg USART_IT_PE: Parity Error interrupt + * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) + * @param NewState: new state of the specified USARTx interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) +{ + uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; + uint32_t usartxbase = 0x00; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CONFIG_IT(USART_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + usartxbase = (uint32_t)USARTx; + + /* Get the USART register index */ + usartreg = (((uint8_t)USART_IT) >> 0x05); + + /* Get the interrupt position */ + itpos = USART_IT & IT_Mask; + itmask = (((uint32_t)0x01) << itpos); + + if (usartreg == 0x01) /* The IT is in CR1 register */ + { + usartxbase += 0x0C; + } + else if (usartreg == 0x02) /* The IT is in CR2 register */ + { + usartxbase += 0x10; + } + else /* The IT is in CR3 register */ + { + usartxbase += 0x14; + } + if (NewState != DISABLE) + { + *(__IO uint32_t*)usartxbase |= itmask; + } + else + { + *(__IO uint32_t*)usartxbase &= ~itmask; + } +} + +/** + * @brief Enables or disables the USART’s DMA interface. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3 or UART4. + * @param USART_DMAReq: specifies the DMA request. + * This parameter can be any combination of the following values: + * @arg USART_DMAReq_Tx: USART DMA transmit request + * @arg USART_DMAReq_Rx: USART DMA receive request + * @param NewState: new state of the DMA Request sources. + * This parameter can be: ENABLE or DISABLE. + * @note The DMA mode is not available for UART5. + * @retval None + */ +void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_1234_PERIPH(USARTx)); + assert_param(IS_USART_DMAREQ(USART_DMAReq)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the DMA transfer for selected requests by setting the DMAT and/or + DMAR bits in the USART CR3 register */ + USARTx->CR3 |= USART_DMAReq; + } + else + { + /* Disable the DMA transfer for selected requests by clearing the DMAT and/or + DMAR bits in the USART CR3 register */ + USARTx->CR3 &= (uint16_t)~USART_DMAReq; + } +} + +/** + * @brief Sets the address of the USART node. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_Address: Indicates the address of the USART node. + * @retval None + */ +void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_ADDRESS(USART_Address)); + + /* Clear the USART address */ + USARTx->CR2 &= CR2_Address_Mask; + /* Set the USART address node */ + USARTx->CR2 |= USART_Address; +} + +/** + * @brief Selects the USART WakeUp method. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_WakeUp: specifies the USART wakeup method. + * This parameter can be one of the following values: + * @arg USART_WakeUp_IdleLine: WakeUp by an idle line detection + * @arg USART_WakeUp_AddressMark: WakeUp by an address mark + * @retval None + */ +void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_WAKEUP(USART_WakeUp)); + + USARTx->CR1 &= CR1_WAKE_Mask; + USARTx->CR1 |= USART_WakeUp; +} + +/** + * @brief Determines if the USART is in mute mode or not. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART mute mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the USART mute mode by setting the RWU bit in the CR1 register */ + USARTx->CR1 |= CR1_RWU_Set; + } + else + { + /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ + USARTx->CR1 &= CR1_RWU_Reset; + } +} + +/** + * @brief Sets the USART LIN Break detection length. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_LINBreakDetectLength: specifies the LIN break detection length. + * This parameter can be one of the following values: + * @arg USART_LINBreakDetectLength_10b: 10-bit break detection + * @arg USART_LINBreakDetectLength_11b: 11-bit break detection + * @retval None + */ +void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_LIN_BREAK_DETECT_LENGTH(USART_LINBreakDetectLength)); + + USARTx->CR2 &= CR2_LBDL_Mask; + USARTx->CR2 |= USART_LINBreakDetectLength; +} + +/** + * @brief Enables or disables the USART’s LIN mode. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART LIN mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ + USARTx->CR2 |= CR2_LINEN_Set; + } + else + { + /* Disable the LIN mode by clearing the LINEN bit in the CR2 register */ + USARTx->CR2 &= CR2_LINEN_Reset; + } +} + +/** + * @brief Transmits single data through the USARTx peripheral. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param Data: the data to transmit. + * @retval None + */ +void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_DATA(Data)); + + /* Transmit Data */ + USARTx->DR = (Data & (uint16_t)0x01FF); +} + +/** + * @brief Returns the most recent received data by the USARTx peripheral. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @retval The received data. + */ +uint16_t USART_ReceiveData(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Receive Data */ + return (uint16_t)(USARTx->DR & (uint16_t)0x01FF); +} + +/** + * @brief Transmits break characters. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @retval None + */ +void USART_SendBreak(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Send break characters */ + USARTx->CR1 |= CR1_SBK_Set; +} + +/** + * @brief Sets the specified USART guard time. + * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. + * @param USART_GuardTime: specifies the guard time. + * @note The guard time bits are not available for UART4 and UART5. + * @retval None + */ +void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + + /* Clear the USART Guard time */ + USARTx->GTPR &= GTPR_LSB_Mask; + /* Set the USART guard time */ + USARTx->GTPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); +} + +/** + * @brief Sets the system clock prescaler. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_Prescaler: specifies the prescaler clock. + * @note The function is used for IrDA mode with UART4 and UART5. + * @retval None + */ +void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Clear the USART prescaler */ + USARTx->GTPR &= GTPR_MSB_Mask; + /* Set the USART prescaler */ + USARTx->GTPR |= USART_Prescaler; +} + +/** + * @brief Enables or disables the USART’s Smart Card mode. + * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @note The Smart Card mode is not available for UART4 and UART5. + * @retval None + */ +void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the SC mode by setting the SCEN bit in the CR3 register */ + USARTx->CR3 |= CR3_SCEN_Set; + } + else + { + /* Disable the SC mode by clearing the SCEN bit in the CR3 register */ + USARTx->CR3 &= CR3_SCEN_Reset; + } +} + +/** + * @brief Enables or disables NACK transmission. + * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. + * @param NewState: new state of the NACK transmission. + * This parameter can be: ENABLE or DISABLE. + * @note The Smart Card mode is not available for UART4 and UART5. + * @retval None + */ +void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the NACK transmission by setting the NACK bit in the CR3 register */ + USARTx->CR3 |= CR3_NACK_Set; + } + else + { + /* Disable the NACK transmission by clearing the NACK bit in the CR3 register */ + USARTx->CR3 &= CR3_NACK_Reset; + } +} + +/** + * @brief Enables or disables the USART’s Half Duplex communication. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART Communication. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ + USARTx->CR3 |= CR3_HDSEL_Set; + } + else + { + /* Disable the Half-Duplex mode by clearing the HDSEL bit in the CR3 register */ + USARTx->CR3 &= CR3_HDSEL_Reset; + } +} + +/** + * @brief Configures the USART’s IrDA interface. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IrDAMode: specifies the IrDA mode. + * This parameter can be one of the following values: + * @arg USART_IrDAMode_LowPower + * @arg USART_IrDAMode_Normal + * @retval None + */ +void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_IRDA_MODE(USART_IrDAMode)); + + USARTx->CR3 &= CR3_IRLP_Mask; + USARTx->CR3 |= USART_IrDAMode; +} + +/** + * @brief Enables or disables the USART’s IrDA interface. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the IrDA mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ + USARTx->CR3 |= CR3_IREN_Set; + } + else + { + /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ + USARTx->CR3 &= CR3_IREN_Reset; + } +} + +/** + * @brief Checks whether the specified USART flag is set or not. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) + * @arg USART_FLAG_LBD: LIN Break detection flag + * @arg USART_FLAG_TXE: Transmit data register empty flag + * @arg USART_FLAG_TC: Transmission Complete flag + * @arg USART_FLAG_RXNE: Receive data register not empty flag + * @arg USART_FLAG_IDLE: Idle Line detection flag + * @arg USART_FLAG_ORE: OverRun Error flag + * @arg USART_FLAG_NE: Noise Error flag + * @arg USART_FLAG_FE: Framing Error flag + * @arg USART_FLAG_PE: Parity Error flag + * @retval The new state of USART_FLAG (SET or RESET). + */ +FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_FLAG(USART_FLAG)); + /* The CTS flag is not available for UART4 and UART5 */ + if (USART_FLAG == USART_FLAG_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the USARTx's pending flags. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). + * @arg USART_FLAG_LBD: LIN Break detection flag. + * @arg USART_FLAG_TC: Transmission Complete flag. + * @arg USART_FLAG_RXNE: Receive data register not empty flag. + * + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) flags are cleared by software + * sequence: a read operation to USART_SR register (USART_GetFlagStatus()) + * followed by a read operation to USART_DR register (USART_ReceiveData()). + * - RXNE flag can be also cleared by a read to the USART_DR register + * (USART_ReceiveData()). + * - TC flag can be also cleared by software sequence: a read operation to + * USART_SR register (USART_GetFlagStatus()) followed by a write operation + * to USART_DR register (USART_SendData()). + * - TXE flag is cleared only by a write to the USART_DR register + * (USART_SendData()). + * @retval None + */ +void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CLEAR_FLAG(USART_FLAG)); + /* The CTS flag is not available for UART4 and UART5 */ + if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + USARTx->SR = (uint16_t)~USART_FLAG; +} + +/** + * @brief Checks whether the specified USART interrupt has occurred or not. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the USART interrupt source to check. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @arg USART_IT_TXE: Tansmit Data Register empty interrupt + * @arg USART_IT_TC: Transmission complete interrupt + * @arg USART_IT_RXNE: Receive Data register not empty interrupt + * @arg USART_IT_IDLE: Idle line detection interrupt + * @arg USART_IT_ORE: OverRun Error interrupt + * @arg USART_IT_NE: Noise Error interrupt + * @arg USART_IT_FE: Framing Error interrupt + * @arg USART_IT_PE: Parity Error interrupt + * @retval The new state of USART_IT (SET or RESET). + */ +ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) +{ + uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00; + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_GET_IT(USART_IT)); + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + /* Get the USART register index */ + usartreg = (((uint8_t)USART_IT) >> 0x05); + /* Get the interrupt position */ + itmask = USART_IT & IT_Mask; + itmask = (uint32_t)0x01 << itmask; + + if (usartreg == 0x01) /* The IT is in CR1 register */ + { + itmask &= USARTx->CR1; + } + else if (usartreg == 0x02) /* The IT is in CR2 register */ + { + itmask &= USARTx->CR2; + } + else /* The IT is in CR3 register */ + { + itmask &= USARTx->CR3; + } + + bitpos = USART_IT >> 0x08; + bitpos = (uint32_t)0x01 << bitpos; + bitpos &= USARTx->SR; + if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** + * @brief Clears the USARTx’s interrupt pending bits. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @arg USART_IT_TC: Transmission complete interrupt. + * @arg USART_IT_RXNE: Receive Data register not empty interrupt. + * + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) pending bits are cleared by + * software sequence: a read operation to USART_SR register + * (USART_GetITStatus()) followed by a read operation to USART_DR register + * (USART_ReceiveData()). + * - RXNE pending bit can be also cleared by a read to the USART_DR register + * (USART_ReceiveData()). + * - TC pending bit can be also cleared by software sequence: a read + * operation to USART_SR register (USART_GetITStatus()) followed by a write + * operation to USART_DR register (USART_SendData()). + * - TXE pending bit is cleared only by a write to the USART_DR register + * (USART_SendData()). + * @retval None + */ +void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT) +{ + uint16_t bitpos = 0x00, itmask = 0x00; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CLEAR_IT(USART_IT)); + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + bitpos = USART_IT >> 0x08; + itmask = ((uint16_t)0x01 << (uint16_t)bitpos); + USARTx->SR = (uint16_t)~itmask; +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c new file mode 100644 index 0000000..e5b74af --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c @@ -0,0 +1,223 @@ +/** + ****************************************************************************** + * @file stm32f10x_wwdg.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file provides all the WWDG firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_wwdg.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup WWDG + * @brief WWDG driver modules + * @{ + */ + +/** @defgroup WWDG_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_Defines + * @{ + */ + +/* ----------- WWDG registers bit address in the alias region ----------- */ +#define WWDG_OFFSET (WWDG_BASE - PERIPH_BASE) + +/* Alias word address of EWI bit */ +#define CFR_OFFSET (WWDG_OFFSET + 0x04) +#define EWI_BitNumber 0x09 +#define CFR_EWI_BB (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4)) + +/* --------------------- WWDG registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_WDGA_Set ((uint32_t)0x00000080) + +/* CFR register bit mask */ +#define CFR_WDGTB_Mask ((uint32_t)0xFFFFFE7F) +#define CFR_W_Mask ((uint32_t)0xFFFFFF80) +#define BIT_Mask ((uint8_t)0x7F) + +/** + * @} + */ + +/** @defgroup WWDG_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the WWDG peripheral registers to their default reset values. + * @param None + * @retval None + */ +void WWDG_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE); +} + +/** + * @brief Sets the WWDG Prescaler. + * @param WWDG_Prescaler: specifies the WWDG Prescaler. + * This parameter can be one of the following values: + * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1 + * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2 + * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4 + * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8 + * @retval None + */ +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_WWDG_PRESCALER(WWDG_Prescaler)); + /* Clear WDGTB[1:0] bits */ + tmpreg = WWDG->CFR & CFR_WDGTB_Mask; + /* Set WDGTB[1:0] bits according to WWDG_Prescaler value */ + tmpreg |= WWDG_Prescaler; + /* Store the new value */ + WWDG->CFR = tmpreg; +} + +/** + * @brief Sets the WWDG window value. + * @param WindowValue: specifies the window value to be compared to the downcounter. + * This parameter value must be lower than 0x80. + * @retval None + */ +void WWDG_SetWindowValue(uint8_t WindowValue) +{ + __IO uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_WWDG_WINDOW_VALUE(WindowValue)); + /* Clear W[6:0] bits */ + + tmpreg = WWDG->CFR & CFR_W_Mask; + + /* Set W[6:0] bits according to WindowValue value */ + tmpreg |= WindowValue & (uint32_t) BIT_Mask; + + /* Store the new value */ + WWDG->CFR = tmpreg; +} + +/** + * @brief Enables the WWDG Early Wakeup interrupt(EWI). + * @param None + * @retval None + */ +void WWDG_EnableIT(void) +{ + *(__IO uint32_t *) CFR_EWI_BB = (uint32_t)ENABLE; +} + +/** + * @brief Sets the WWDG counter value. + * @param Counter: specifies the watchdog counter value. + * This parameter must be a number between 0x40 and 0x7F. + * @retval None + */ +void WWDG_SetCounter(uint8_t Counter) +{ + /* Check the parameters */ + assert_param(IS_WWDG_COUNTER(Counter)); + /* Write to T[6:0] bits to configure the counter value, no need to do + a read-modify-write; writing a 0 to WDGA bit does nothing */ + WWDG->CR = Counter & BIT_Mask; +} + +/** + * @brief Enables WWDG and load the counter value. + * @param Counter: specifies the watchdog counter value. + * This parameter must be a number between 0x40 and 0x7F. + * @retval None + */ +void WWDG_Enable(uint8_t Counter) +{ + /* Check the parameters */ + assert_param(IS_WWDG_COUNTER(Counter)); + WWDG->CR = CR_WDGA_Set | Counter; +} + +/** + * @brief Checks whether the Early Wakeup interrupt flag is set or not. + * @param None + * @retval The new state of the Early Wakeup interrupt flag (SET or RESET) + */ +FlagStatus WWDG_GetFlagStatus(void) +{ + return (FlagStatus)(WWDG->SR); +} + +/** + * @brief Clears Early Wakeup interrupt flag. + * @param None + * @retval None + */ +void WWDG_ClearFlag(void) +{ + WWDG->SR = (uint32_t)RESET; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/main.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/main.c new file mode 100644 index 0000000..623ab27 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/main.c @@ -0,0 +1,619 @@ + +/******************************************************************************* +// GY-52 MPU3050 IIC²âÊÔ³ÌÐò +// ʹÓõ¥Æ¬»úSTM32F103C8T6 +// ¾§Õñ£º8.00M +// ±àÒë»·¾³ Keil uVision4 +// ʱ¼ä£º2011Äê9ÔÂ1ÈÕ +// ÓëÄ£¿éÁ¬½Ó GPIOB6->SCL GPIOB7->SDA +// ʹÓãºSTM32F103C8T6´®¿Ú1Á¬½ÓµçÄÔ +// µçÄÔ´®¿ÚÖúÊÖÏÔʾ£¬²¨ÌØÂÊ£º115200 +// QQ£º531389319 +*******************************************************************************/ + +#include "stm32f10x_lib.h" +#include //Keil library + +GPIO_InitTypeDef GPIO_InitStructure; +ErrorStatus HSEStartUpStatus; + +#define uchar unsigned char +#define uint unsigned int + +//¶¨ÒåMPU3050ÄÚ²¿µØÖ·******************** +#define WHO 0x00 +#define SMPL 0x15 +#define DLPF 0x16 +#define INT_C 0x17 +#define INT_S 0x1A +#define TMP_H 0x1B +#define TMP_L 0x1C +#define GX_H 0x1D +#define GX_L 0x1E +#define GY_H 0x1F +#define GY_L 0x20 +#define GZ_H 0x21 +#define GZ_L 0x22 +#define PWR_M 0x3E +//**************************** + +#define MPU3050_Addr 0xD0 //¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALT ADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä + +unsigned char TX_DATA[4]; //ÏÔʾ¾Ý»º´æÇø +unsigned char BUF[10]; //½ÓÊÕÊý¾Ý»º´æÇø +char test=0; //IICÓõ½ +short T_X,T_Y,T_Z,T_T; //X,Y,ZÖᣬÎÂ¶È + +//************************************ +/*Ä£ÄâIIC¶Ë¿ÚÊä³öÊäÈ붨Òå*/ +#define SCL_H GPIOB->BSRR = GPIO_Pin_6 +#define SCL_L GPIOB->BRR = GPIO_Pin_6 + +#define SDA_H GPIOB->BSRR = GPIO_Pin_7 +#define SDA_L GPIOB->BRR = GPIO_Pin_7 + +#define SCL_read GPIOB->IDR & GPIO_Pin_6 +#define SDA_read GPIOB->IDR & GPIO_Pin_7 + +/* º¯ÊýÉêÃ÷ -----------------------------------------------*/ +void RCC_Configuration(void); +void GPIO_Configuration(void); +void NVIC_Configuration(void); +void USART1_Configuration(void); +void WWDG_Configuration(void); +void Delay(u32 nTime); +void Delayms(vu32 m); +/* ±äÁ¿¶¨Òå ----------------------------------------------*/ + + /*******************************/ +void DATA_printf(uchar *s,short temp_data) +{ + if(temp_data<0){ + temp_data=-temp_data; + *s='-'; + } + else *s=' '; + *++s =temp_data/100+0x30; + temp_data=temp_data%100; //È¡ÓàÔËËã + *++s =temp_data/10+0x30; + temp_data=temp_data%10; //È¡ÓàÔËËã + *++s =temp_data+0x30; +} + +/******************************************************************************* +* Function Name : I2C_GPIO_Config +* Description : Configration Simulation IIC GPIO +* Input : None +* Output : None +* Return : None +****************************************************************************** */ +void I2C_GPIO_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; + GPIO_Init(GPIOB, &GPIO_InitStructure); +} + +/******************************************************************************* +* Function Name : I2C_delay +* Description : Simulation IIC Timing series delay +* Input : None +* Output : None +* Return : None +****************************************************************************** */ +void I2C_delay(void) +{ + + u8 i=30; //ÕâÀï¿ÉÒÔÓÅ»¯ËÙ¶È £¬¾­²âÊÔ×îµÍµ½5»¹ÄÜдÈë + while(i) + { + i--; + } +} + +void delay5ms(void) +{ + + int i=5000; + while(i) + { + i--; + } +} +/******************************************************************************* +* Function Name : I2C_Start +* Description : Master Start Simulation IIC Communication +* Input : None +* Output : None +* Return : Wheather Start +****************************************************************************** */ +bool I2C_Start(void) +{ + SDA_H; + SCL_H; + I2C_delay(); + if(!SDA_read)return FALSE; //SDAÏßΪµÍµçƽÔò×ÜÏßæ,Í˳ö + SDA_L; + I2C_delay(); + if(SDA_read) return FALSE; //SDAÏßΪ¸ßµçƽÔò×ÜÏß³ö´í,Í˳ö + SDA_L; + I2C_delay(); + return TRUE; +} +/******************************************************************************* +* Function Name : I2C_Stop +* Description : Master Stop Simulation IIC Communication +* Input : None +* Output : None +* Return : None +****************************************************************************** */ +void I2C_Stop(void) +{ + SCL_L; + I2C_delay(); + SDA_L; + I2C_delay(); + SCL_H; + I2C_delay(); + SDA_H; + I2C_delay(); +} +/******************************************************************************* +* Function Name : I2C_Ack +* Description : Master Send Acknowledge Single +* Input : None +* Output : None +* Return : None +****************************************************************************** */ +void I2C_Ack(void) +{ + SCL_L; + I2C_delay(); + SDA_L; + I2C_delay(); + SCL_H; + I2C_delay(); + SCL_L; + I2C_delay(); +} +/******************************************************************************* +* Function Name : I2C_NoAck +* Description : Master Send No Acknowledge Single +* Input : None +* Output : None +* Return : None +****************************************************************************** */ +void I2C_NoAck(void) +{ + SCL_L; + I2C_delay(); + SDA_H; + I2C_delay(); + SCL_H; + I2C_delay(); + SCL_L; + I2C_delay(); +} +/******************************************************************************* +* Function Name : I2C_WaitAck +* Description : Master Reserive Slave Acknowledge Single +* Input : None +* Output : None +* Return : Wheather Reserive Slave Acknowledge Single +****************************************************************************** */ +bool I2C_WaitAck(void) //·µ»ØΪ:=1ÓÐACK,=0ÎÞACK +{ + SCL_L; + I2C_delay(); + SDA_H; + I2C_delay(); + SCL_H; + I2C_delay(); + if(SDA_read) + { + SCL_L; + I2C_delay(); + return FALSE; + } + SCL_L; + I2C_delay(); + return TRUE; +} +/******************************************************************************* +* Function Name : I2C_SendByte +* Description : Master Send a Byte to Slave +* Input : Will Send Date +* Output : None +* Return : None +****************************************************************************** */ +void I2C_SendByte(u8 SendByte) //Êý¾Ý´Ó¸ßλµ½µÍλ// +{ + u8 i=8; + while(i--) + { + SCL_L; + I2C_delay(); + if(SendByte&0x80) + SDA_H; + else + SDA_L; + SendByte<<=1; + I2C_delay(); + SCL_H; + I2C_delay(); + } + SCL_L; +} +/******************************************************************************* +* Function Name : I2C_RadeByte +* Description : Master Reserive a Byte From Slave +* Input : None +* Output : None +* Return : Date From Slave +****************************************************************************** */ +unsigned char I2C_RadeByte(void) //Êý¾Ý´Ó¸ßλµ½µÍλ// +{ + u8 i=8; + u8 ReceiveByte=0; + + SDA_H; + while(i--) + { + ReceiveByte<<=1; + SCL_L; + I2C_delay(); + SCL_H; + I2C_delay(); + if(SDA_read) + { + ReceiveByte|=0x01; + } + } + SCL_L; + return ReceiveByte; +} +//ZRX +//µ¥×Ö½ÚдÈë******************************************* + +bool Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data) //void +{ + if(!I2C_Start())return FALSE; + I2C_SendByte(SlaveAddress); //·¢ËÍÉ豸µØÖ·+дÐźÅ//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//ÉèÖøßÆðʼµØÖ·+Æ÷¼þµØÖ· + if(!I2C_WaitAck()){I2C_Stop(); return FALSE;} + I2C_SendByte(REG_Address ); //ÉèÖõÍÆðʼµØÖ· + I2C_WaitAck(); + I2C_SendByte(REG_data); + I2C_WaitAck(); + I2C_Stop(); + delay5ms(); + return TRUE; +} + +//µ¥×Ö½Ú¶ÁÈ¡***************************************** +unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address) +{ unsigned char REG_data; + if(!I2C_Start())return FALSE; + I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//ÉèÖøßÆðʼµØÖ·+Æ÷¼þµØÖ· + if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;} + I2C_SendByte((u8) REG_Address); //ÉèÖõÍÆðʼµØÖ· + I2C_WaitAck(); + I2C_Start(); + I2C_SendByte(SlaveAddress+1); + I2C_WaitAck(); + + REG_data= I2C_RadeByte(); + I2C_NoAck(); + I2C_Stop(); + //return TRUE; + return REG_data; + +} + +/* +******************************************************************************** +** º¯ÊýÃû³Æ £º RCC_Configuration(void) +** º¯Êý¹¦ÄÜ £º ʱÖÓ³õʼ»¯ +** Êä Èë £º ÎÞ +** Êä ³ö £º ÎÞ +** ·µ »Ø £º ÎÞ +******************************************************************************** +*/ +void RCC_Configuration(void) +{ + /* RCC system reset(for debug purpose) */ + RCC_DeInit(); + + /* Enable HSE */ + RCC_HSEConfig(RCC_HSE_ON); + + /* Wait till HSE is ready */ + HSEStartUpStatus = RCC_WaitForHSEStartUp(); + + if(HSEStartUpStatus == SUCCESS) + { + /* HCLK = SYSCLK */ + RCC_HCLKConfig(RCC_SYSCLK_Div1); + + /* PCLK2 = HCLK */ + RCC_PCLK2Config(RCC_HCLK_Div1); + + /* PCLK1 = HCLK/2 */ + RCC_PCLK1Config(RCC_HCLK_Div2); + + /* Flash 2 wait state */ + FLASH_SetLatency(FLASH_Latency_2); + /* Enable Prefetch Buffer */ + FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); + + /* PLLCLK = 8MHz * 9 = 72 MHz */ + RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); + + /* Enable PLL */ + RCC_PLLCmd(ENABLE); + + /* Wait till PLL is ready */ + while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) + { + } + + /* Select PLL as system clock source */ + RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); + + /* Wait till PLL is used as system clock source */ + while(RCC_GetSYSCLKSource() != 0x08) + { + } + } + /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD , ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF , ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO , ENABLE); +} + +/* +******************************************************************************** +** º¯ÊýÃû³Æ £º GPIO_Configuration(void) +** º¯Êý¹¦ÄÜ £º ¶Ë¿Ú³õʼ»¯ +** Êä Èë £º ÎÞ +** Êä ³ö £º ÎÞ +** ·µ »Ø £º ÎÞ +******************************************************************************** +*/ +void GPIO_Configuration(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE ); + /* Configure USART1 Tx (PA.09) as alternate function push-pull */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // Ñ¡ÖйܽÅ9 + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // ¸´ÓÃÍÆÍìÊä³ö + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // ×î¸ßÊä³öËÙÂÊ50MHz + GPIO_Init(GPIOA, &GPIO_InitStructure); // Ñ¡ÔñA¶Ë¿Ú + + /* Configure USART1 Rx (PA.10) as input floating */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //Ñ¡ÖйܽÅ10 + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //¸¡¿ÕÊäÈë + GPIO_Init(GPIOA, &GPIO_InitStructure); //Ñ¡ÔñA¶Ë¿Ú + +} + +/* +******************************************************************************** +** º¯ÊýÃû³Æ £º USART1_Configuration(void) +** º¯Êý¹¦ÄÜ £º ´®¿Ú1³õʼ»¯ +** Êä Èë £º ÎÞ +** Êä ³ö £º ÎÞ +** ·µ »Ø £º ÎÞ +******************************************************************************** +*/ +void USART1_Configuration(void) +{ + +USART_InitTypeDef USART_InitStructure; +USART_ClockInitTypeDef USART_ClockInitStructure; + +RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 |RCC_APB2Periph_USART1, ENABLE ); + +USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; // ʱÖӵ͵çƽ»î¶¯ +USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; // ʱÖӵ͵çƽ +USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; // ʱÖÓµÚ¶þ¸ö±ßÑؽøÐÐÊý¾Ý²¶»ñ +USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; // ×îºóһλÊý¾ÝµÄʱÖÓÂö³å²»´ÓSCLKÊä³ö +/* Configure the USART1 synchronous paramters */ +USART_ClockInit(USART1, &USART_ClockInitStructure); // ʱÖÓ²ÎÊý³õʼ»¯ÉèÖà + +USART_InitStructure.USART_BaudRate = 115200; // ²¨ÌØÂÊΪ£º115200 +USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8λÊý¾Ý +USART_InitStructure.USART_StopBits = USART_StopBits_1; // ÔÚÖ¡½áβ´«Êä1¸öֹͣλ +USART_InitStructure.USART_Parity = USART_Parity_No ; // ÆæżʧÄÜ +USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // Ó²¼þÁ÷¿ØÖÆʧÄÜ + +USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // ·¢ËÍʹÄÜ+½ÓÊÕʹÄÜ +/* Configure USART1 basic and asynchronous paramters */ +USART_Init(USART1, &USART_InitStructure); + + /* Enable USART1 */ +USART_ClearFlag(USART1, USART_IT_RXNE); //ÇåÖжϣ¬ÒÔÃâÒ»ÆôÓÃÖжϺóÁ¢¼´²úÉúÖÐ¶Ï +USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //ʹÄÜUSART1ÖжÏÔ´ +USART_Cmd(USART1, ENABLE); //USART1×Ü¿ª¹Ø£º¿ªÆô +} + + +/* +******************************************************************************** +** º¯ÊýÃû³Æ £º NVIC_Configuration(void) +** º¯Êý¹¦ÄÜ £º Öжϳõʼ»¯ +** Êä Èë £º ÎÞ +** Êä ³ö £º ÎÞ +** ·µ »Ø £º ÎÞ +******************************************************************************** +*/ +void NVIC_Configuration(void) +{ + NVIC_InitTypeDef NVIC_InitStructure; + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); + + NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_Init(&NVIC_InitStructure); + +} + + /* +******************************************************************************** +** º¯ÊýÃû³Æ £º WWDG_Configuration(void) +** º¯Êý¹¦ÄÜ £º ¿´ÃŹ·³õʼ»¯ +** Êä Èë £º ÎÞ +** Êä ³ö £º ÎÞ +** ·µ »Ø £º ÎÞ +******************************************************************************** +*/ +void WWDG_Configuration(void) +{ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); + WWDG_SetPrescaler(WWDG_Prescaler_8); // WWDG clock counter = (PCLK1/4096)/8 = 244 Hz (~4 ms) + WWDG_SetWindowValue(0x41); // Set Window value to 0x41 + WWDG_Enable(0x50); // Enable WWDG and set counter value to 0x7F, WWDG timeout = ~4 ms * 64 = 262 ms + WWDG_ClearFlag(); // Clear EWI flag + WWDG_EnableIT(); // Enable EW interrupt +} + +/* +******************************************************************************** +** º¯ÊýÃû³Æ £º Delay(vu32 nCount) +** º¯Êý¹¦ÄÜ £º ÑÓʱº¯Êý +** Êä Èë £º ÎÞ +** Êä ³ö £º ÎÞ +** ·µ »Ø £º ÎÞ +******************************************************************************** +*/ + void Delay(vu32 nCount) +{ + for(; nCount != 0; nCount--); +} + +/* +******************************************************************************** +** º¯ÊýÃû³Æ £º void Delayms(vu32 m) +** º¯Êý¹¦ÄÜ £º ³¤ÑÓʱº¯Êý m=1,ÑÓʱ1ms +** Êä Èë £º ÎÞ +** Êä ³ö £º ÎÞ +** ·µ »Ø £º ÎÞ +******************************************************************************** +*/ + void Delayms(vu32 m) +{ + u32 i; + + for(; m != 0; m--) + for (i=0; i<50000; i++); +} + +/* +******************************************************************************** +** º¯ÊýÃû³Æ £º WWDG_IRQHandler(void) +** º¯Êý¹¦ÄÜ £º ´°¿ÚÌáÇ°»½ÐÑÖÐ¶Ï +** Êä Èë £º ÎÞ +** Êä ³ö £º ÎÞ +** ·µ »Ø £º ÎÞ +******************************************************************************** +*/ + +void WWDG_IRQHandler(void) +{ + /* Update WWDG counter */ + WWDG_SetCounter(0x50); + + /* Clear EWI flag */ + WWDG_ClearFlag(); +} + //************************************************ +void USART1_SendData(uchar SendData) +{ +USART_SendData(USART1, SendData); +Delayms(1); +} +//³õʼ»¯MPU3050£¬¸ù¾ÝÐèÒªÇë²Î¿¼pdf½øÐÐÐÞ¸Ä************************ +void Init_MPU3050(void) +{ + Single_Write(MPU3050_Addr,PWR_M, 0x80); // + Single_Write(MPU3050_Addr,SMPL, 0x07); // + Single_Write(MPU3050_Addr,DLPF, 0x1E); //¡À2000¡ã + Single_Write(MPU3050_Addr,INT_C, 0x00 ); // + Single_Write(MPU3050_Addr,PWR_M, 0x00); // +} + +//******¶ÁÈ¡MPU3050Êý¾Ý**************************************** +void READ_MPU3050(void) +{ + BUF[0]=Single_Read(MPU3050_Addr,GX_L); + BUF[1]=Single_Read(MPU3050_Addr,GX_H); + T_X= (BUF[1]<<8)|BUF[0]; + T_X/=16.4; //¶ÁÈ¡¼ÆËãXÖáÊý¾Ý + + BUF[2]=Single_Read(MPU3050_Addr,GY_L); + BUF[3]=Single_Read(MPU3050_Addr,GY_H); + T_Y= (BUF[3]<<8)|BUF[2]; + T_Y/=16.4; //¶ÁÈ¡¼ÆËãYÖáÊý¾Ý + BUF[4]=Single_Read(MPU3050_Addr,GZ_L); + BUF[5]=Single_Read(MPU3050_Addr,GZ_H); + T_Z= (BUF[5]<<8)|BUF[4]; + T_Z/=16.4; //¶ÁÈ¡¼ÆËãZÖáÊý¾Ý + + BUF[6]=Single_Read(MPU3050_Addr,TMP_L); + BUF[7]=Single_Read(MPU3050_Addr,TMP_H); + T_T=(BUF[7]<<8)|BUF[6]; + T_T = 35+ ((double) (T_T + 13200)) / 280;// ¶ÁÈ¡¼ÆËã³öÎÂ¶È +} + //********´®¿Ú·¢ËÍÊý¾Ý*************************************** + void Send_data(uchar axis) + {uchar i; + USART1_SendData(axis); + USART1_SendData(':'); + for(i=0;i<4;i++)USART1_SendData(TX_DATA[i]); + USART1_SendData(' '); + USART1_SendData(' '); + } + + /* +******************************************************************************** +** º¯ÊýÃû³Æ £º main(void) +** º¯Êý¹¦ÄÜ £º Ö÷º¯Êý +** Êä Èë £º ÎÞ +** Êä ³ö £º ÎÞ +** ·µ »Ø £º ÎÞ +******************************************************************************** +*/ +int main(void) +{ + RCC_Configuration(); //ÅäÖÃRCC + GPIO_Configuration(); //ÅäÖÃGPIO + USART1_Configuration(); //ÅäÖô®¿Ú1 + I2C_GPIO_Config(); //ÅäÖÃIICʹÓÃ¶Ë¿Ú + Delayms(10); //ÑÓʱ + Init_MPU3050(); //³õʼ»¯MPU3050 + while(1) + { + READ_MPU3050(); //¶ÁÈ¡MPU3050Êý¾Ý + DATA_printf(TX_DATA,T_X);//ת»»XÖáÊý¾Ýµ½Êý×é + Send_data('X'); //·¢ËÍXÖáÊý + DATA_printf(TX_DATA,T_Y);//ת»»YÖáÊý¾Ýµ½Êý×é + Send_data('Y'); //·¢ËÍYÖáÊý + DATA_printf(TX_DATA,T_Z);//ת»»ZÖáÊý¾Ýµ½Êý×é + Send_data('Z'); //·¢ËÍZÖáÊý + DATA_printf(TX_DATA,T_T);//ת»»Î¶ÈÊý¾Ýµ½Êý×é + Send_data('T'); //·¢ËÍζÈÊý¾Ý + USART1_SendData(0X0D); //»»ÐÐ + USART1_SendData(0X0A); //»Ø³µ + Delayms(5); //ÑÓʱ + } +} + +/*************½áÊø***************/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/stm32f10x_conf.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/stm32f10x_conf.h new file mode 100644 index 0000000..af5dfdb --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/stm32f10x_conf.h @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * @file Project/Template/stm32f10x_conf.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief Library configuration file. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CONF_H +#define __STM32F10x_CONF_H + +/* Includes ------------------------------------------------------------------*/ +/* Uncomment the line below to enable peripheral header file inclusion */ +/* #include "stm32f10x_adc.h" */ +/* #include "stm32f10x_bkp.h" */ +/* #include "stm32f10x_can.h" */ +/* #include "stm32f10x_crc.h" */ +/* #include "stm32f10x_dac.h" */ +/* #include "stm32f10x_dbgmcu.h" */ +/* #include "stm32f10x_dma.h" */ +//#include "stm32f10x_exti.h" +/* #include "stm32f10x_flash.h" */ +//#include "stm32f10x_fsmc.h" +#include "stm32f10x_gpio.h" +/* #include "stm32f10x_i2c.h" */ +/* #include "stm32f10x_iwdg.h" */ +/* #include "stm32f10x_pwr.h" */ +#include "stm32f10x_rcc.h" +/* #include "stm32f10x_rtc.h" */ +/* #include "stm32f10x_sdio.h" */ +//#include "stm32f10x_spi.h" +#include "stm32f10x_tim.h" +#include "stm32f10x_usart.h" +#include "stm32f10x_wwdg.h" +#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Uncomment the line below to expanse the "assert_param" macro in the + Standard Peripheral Library drivers code */ +/* #define USE_FULL_ASSERT 1 */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT + +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0) +#endif /* USE_FULL_ASSERT */ + +#endif /* __STM32F10x_CONF_H */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/stm32f10x_it.c b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/stm32f10x_it.c new file mode 100644 index 0000000..9353c10 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/stm32f10x_it.c @@ -0,0 +1,159 @@ +/** + ****************************************************************************** + * @file Project/Template/stm32f10x_it.c + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief Main Interrupt Service Routines. + * This file provides template for all exceptions handler and + * peripherals interrupt service routine. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_it.h" + +/** @addtogroup Template_Project + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************/ +/* Cortex-M3 Processor Exceptions Handlers */ +/******************************************************************************/ + +/** + * @brief This function handles NMI exception. + * @param None + * @retval None + */ +void NMI_Handler(void) +{ +} + +/** + * @brief This function handles Hard Fault exception. + * @param None + * @retval None + */ +void HardFault_Handler(void) +{ + /* Go to infinite loop when Hard Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Memory Manage exception. + * @param None + * @retval None + */ +void MemManage_Handler(void) +{ + /* Go to infinite loop when Memory Manage exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Bus Fault exception. + * @param None + * @retval None + */ +void BusFault_Handler(void) +{ + /* Go to infinite loop when Bus Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Usage Fault exception. + * @param None + * @retval None + */ +void UsageFault_Handler(void) +{ + /* Go to infinite loop when Usage Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles SVCall exception. + * @param None + * @retval None + */ +void SVC_Handler(void) +{ +} + +/** + * @brief This function handles Debug Monitor exception. + * @param None + * @retval None + */ +void DebugMon_Handler(void) +{ +} + +/** + * @brief This function handles PendSVC exception. + * @param None + * @retval None + */ +void PendSV_Handler(void) +{ +} + +/** + * @brief This function handles SysTick Handler. + * @param None + * @retval None + */ +void SysTick_Handler(void) +{ +} + +/******************************************************************************/ +/* STM32F10x Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32f10x_xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles PPP interrupt request. + * @param None + * @retval None + */ +/*void PPP_IRQHandler(void) +{ +}*/ + +/** + * @} + */ + + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/stm32f10x_it.h b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/stm32f10x_it.h new file mode 100644 index 0000000..65f4f0a --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/SRC/stm32f10x_it.h @@ -0,0 +1,53 @@ +/** + ****************************************************************************** + * @file Project/Template/stm32f10x_it.h + * @author MCD Application Team + * @version V3.1.2 + * @date 09/28/2009 + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_IT_H +#define __STM32F10x_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_IT_H */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/core_cm3.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/core_cm3.crf new file mode 100644 index 0000000..107a6f9 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/core_cm3.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/core_cm3.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/core_cm3.d new file mode 100644 index 0000000..7d3aa09 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/core_cm3.d @@ -0,0 +1,2 @@ +core_cm3.o: Libraries\CMSIS\Core\CM3\core_cm3.c +core_cm3.o: C:\Keil\ARM\RV31\INC\stdint.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/core_cm3.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/core_cm3.o new file mode 100644 index 0000000..1dde976 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/core_cm3.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/iic_driver.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/iic_driver.crf new file mode 100644 index 0000000..dca360d Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/iic_driver.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/iic_driver.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/iic_driver.d new file mode 100644 index 0000000..e09c0b7 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/iic_driver.d @@ -0,0 +1,30 @@ +iic_driver.o: ..\Motor_IO_Gyro_Uart\Motor_IO_Gyro_Uart\User\iic_driver.c +iic_driver.o: ..\Motor_IO_Gyro_Uart\Motor_IO_Gyro_Uart\User\iic_driver.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_lib.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_map.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_conf.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_type.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\cortexm3_macro.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_adc.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_bkp.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_can.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_crc.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_dac.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_dbgmcu.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_dma.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_exti.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_flash.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_fsmc.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_gpio.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_i2c.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_iwdg.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_nvic.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_pwr.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_rcc.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_rtc.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_sdio.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_spi.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_systick.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_tim.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_usart.h +iic_driver.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_wwdg.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/iic_driver.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/iic_driver.o new file mode 100644 index 0000000..86f508c Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/iic_driver.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.Uv2.bak b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.Uv2.bak new file mode 100644 index 0000000..099a940 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.Uv2.bak @@ -0,0 +1,114 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + +Target (Target 1), 0x0004 // Tools: 'ARM-ADS' + +Group (SRC) +Group (LIB) +Group (STARTUP) +Group (CM3) + +File 1,1,<.\SRC\main.c> +File 1,1,<.\SRC\stm32f10x_it.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c> +File 3,2,<.\Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s> +File 4,1,<.\Libraries\CMSIS\Core\CM3\core_cm3.c> +File 4,1,<.\Libraries\CMSIS\Core\CM3\system_stm32f10x.c> + + +Options 1,0,0 // Target 'Target 1' + Device (STM32F103RB) + Vendor (STMicroelectronics) + Cpu (IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3")) + FlashUt () + StupF ("STARTUP\ST\STM32F10x.s" ("STM32 Startup Code")) + FlashDR (UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000)) + DevID () + Rgf (stm32f10x_lib.h) + Mem () + C () + A () + RL () + OH () + DBC_IFX () + DBC_CMS () + DBC_AMS () + DBC_LMS () + UseEnv=0 + EnvBin () + EnvInc () + EnvLib () + EnvReg (ST\STM32F10x\) + OrgReg (ST\STM32F10x\) + TgStat=16 + OutDir (.\) + OutName (lunzhou) + GenApp=1 + GenLib=0 + GenHex=1 + Debug=1 + Browse=1 + LstDir (.\) + HexSel=1 + MG32K=0 + TGMORE=0 + RunUsr 0 0 <> + RunUsr 1 0 <> + BrunUsr 0 0 <> + BrunUsr 1 0 <> + CrunUsr 0 0 <> + CrunUsr 1 0 <> + SVCSID <> + GLFLAGS=1790 + ADSFLGA { 243,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ACPUTYP ("Cortex-M3") + RVDEV () + ADSTFLGA { 0,12,0,2,163,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSIRAM { 0,0,0,0,32,0,80,0,0 } + OCMADSIROM { 1,0,0,0,8,0,0,2,0 } + OCMADSXRAM { 0,0,0,0,0,0,0,0,0 } + OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,80,0,0,0,0,0,0,0,0,0,0,0 } + RV_STAVEC () + ADSCCFLG { 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSCMISC () + ADSCDEFN () + ADSCUDEF () + ADSCINCD (.\SRC;.\Libraries\STM32F10x_StdPeriph_Driver\inc;.\Libraries\CMSIS\Core\CM3) + ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSAMISC () + ADSADEFN () + ADSAUDEF () + ADSAINCD () + PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + IncBld=1 + AlwaysBuild=0 + GenAsm=0 + AsmAsm=0 + PublicsOnly=0 + StopCode=3 + CustArgs () + LibMods () + ADSLDFG { 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSLDTA (0x08000000) + ADSLDDA (0x20000000) + ADSLDSC () + ADSLDIB () + ADSLDIC () + ADSLDMC () + ADSLDIF () + ADSLDDW () + OPTDL (SARMCM3.DLL)()(DARMSTM.DLL)(-pSTM32F103RB)(SARMCM3.DLL)()(TARMSTM.DLL)(-pSTM32F103RB) + OPTDBG 180221,8,()()()()()()()()()() (Segger\JL2CM3.dll)()()() + FLASH1 { 9,0,0,0,1,0,0,0,6,16,0,0,0,0,0,0,0,0,0,0 } + FLASH2 (Segger\JL2CM3.dll) + FLASH3 ("" ()) + FLASH4 () +EndOpt + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.axf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.axf new file mode 100644 index 0000000..7e01084 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.axf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.hex b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.hex new file mode 100644 index 0000000..09a3af9 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.hex @@ -0,0 +1,609 @@ +:020000040800F2 +:1000000000040020671A0008590900085B0900086D +:100010005F09000863090008670900080000000084 +:100020000000000000000000000000006B09000854 +:100030006D090008000000006F0900087109000840 +:10004000C7060008871A0008871A0008871A0008E0 +:10005000871A0008871A0008871A0008871A0008FC +:10006000871A0008871A0008871A0008871A0008EC +:10007000871A0008871A0008871A0008871A0008DC +:10008000871A0008871A0008871A0008871A0008CC +:10009000871A0008871A0008871A0008871A0008BC +:1000A000871A0008871A0008871A0008871A0008AC +:1000B000871A0008871A0008871A0008871A00089C +:1000C000871A0008871A0008871A0008871A00088C +:1000D000871A0008871A0008871A0008871A00087C +:1000E000871A0008871A0008871A0008871A00086C +:1000F000871A0008871A0008871A0008871A00085C +:10010000871A0008871A0008871A0008871A00084B +:10011000871A0008871A0008871A0008871A00083B +:10012000871A0008871A0008871A0008871A00082B +:1001300000F002F800F03CF80AA090E8000C8244BD +:100140008344AAF10107DA4501D100F031F8AFF29A +:10015000090EBAE80F0013F0010F18BFFB1A43F0A5 +:10016000010318473024000050240000103A24BF37 +:1001700078C878C1FAD8520724BF30C830C144BF0C +:1001800004680C607047000000230024002500264E +:10019000103A28BF78C1FBD8520728BF30C148BFEA +:1001A0000B6070471FB5AFF300801FBD10B510BDC9 +:1001B00001F081FC1146FFF7F5FF00F073FB01F041 +:1001C0009FFCFFF7F3FF01F0A5FC0000002904DA13 +:1001D0004A4211B22D22027001E0202202706422F4 +:1001E00091FBF2F23032D3B2421C104613706422FB +:1001F00091FBF2F302FB131211B20A2291FBF2F20D +:100200003032D3B2421C104613700A2291FBF2F333 +:1002100002FB131211B201F13002D3B2421C10469C +:100220001370704708B54020ADF8000003208DF82A +:10023000020014208DF803006946FF4801F046F8DB +:100240008020ADF8000003208DF8020014208DF806 +:1002500003006946F84801F039F808BD1E2001E0A6 +:10026000411EC8B20028FBD1704741F2883000E03F +:10027000401E0028FCD1704700B58020EE491031A7 +:1002800008604020ED49C1F8100CFFF7E7FFEA488D +:100290000830006808B9012000E0002010F0800F4D +:1002A00001D0002000BD8020E34914310860FFF731 +:1002B000D5FFE248D0F8080C10F0800F01D00020E4 +:1002C000F0E78020DC4914310860FFF7C7FF012008 +:1002D000E8E700B54020D84914310860FFF7BEFFB9 +:1002E0008020D649C1F8140CFFF7B8FF4020D2494E +:1002F00010310860FFF7B2FF8020D049C1F8100C20 +:10030000FFF7ACFF00BD00B54020CB4914310860B9 +:10031000FFF7A4FF8020C949C1F8140CFFF79EFF26 +:100320004020C54910310860FFF798FF4020C349BD +:10033000C1F8140CFFF792FF00BD00B54020BE4984 +:1003400014310860FFF78AFF8020BC49C1F8100C07 +:10035000FFF784FF4020B84910310860FFF77EFFA7 +:100360004020B649C1F8140CFFF778FF00BD00B576 +:100370004020B14914310860FFF770FF8020AF4979 +:10038000C1F8100CFFF76AFF4020AB49103108603C +:10039000FFF764FFA948D0F8080C10F0800F07D0D1 +:1003A0004020A54914310860FFF758FF002000BD28 +:1003B0004020A14914310860FFF750FF0120F6E703 +:1003C00000B5034608221BE040209B491431086019 +:1003D000FFF744FF13F0800F04D0802096491031BE +:1003E000086003E080209449143108605806030E29 +:1003F000FFF734FF4020904910310860FFF72EFFCF +:100400001000A2F10101CAB2DED140208A491431A4 +:10041000086000BD00B50822002380208649103105 +:10042000086015E05806030E402083491431086027 +:10043000FFF714FF40208149C1F8100CFFF70EFFB1 +:100440007D480830006810F0800F01D043F00103B0 +:100450001000A2F10101CAB2E4D140207649143162 +:100460000860184600BD70B504460D461646FFF7F5 +:1004700003FF08B9002070BD2046FFF7A1FFFFF77A +:1004800076FF18B9FFF725FF0020F4E72846FFF7AD +:1004900097FFFFF76CFF3046FFF792FFFFF767FF0C +:1004A000FFF717FFFFF7E1FE0120E4E770B5044610 +:1004B0000D46FFF7E1FE08B9002070BD2046FFF7AA +:1004C0007FFFFFF754FF30B9FFF703FF01205C49BE +:1004D00008700020F1E72846FFF772FFFFF747FF9B +:1004E000FFF7CAFE601CC0B2FFF76AFFFFF73FFFCD +:1004F000FFF790FF0646FFF720FFFFF7EAFE3046C2 +:10050000DBE710B500F036FA4FF4803000F052FA15 +:1005100000F08FFA4B49087008460078012826D170 +:10052000002000F0C5FA002000F0D2FA4FF48060FD +:1005300000F0C6FA022000F0FDFF102001F00DF8D7 +:100540004FF4E0114FF4803000F097FA012000F0F2 +:100550009FFA00BF392000F050FA0028FAD002209C +:1005600000F099FA00BF00F09EFA0828FBD10121A3 +:100570000C2000F065FB0121302000F061FB01211F +:10058000C02000F05DFB012140F2011000F058FB9B +:1005900010BD08B501213C2000F052FB4FF4007063 +:1005A000ADF8000018208DF8030003208DF802003C +:1005B0006946254800F08AFE4FF48060ADF80000DF +:1005C00004208DF8030069461F4800F07FFE08BD37 +:1005D00000B587B001214FF4904000F031FB0020BE +:1005E000ADF80400ADF806004FF40070ADF8080057 +:1005F0000020ADF80A0001A9144800F020FC4FF4D7 +:10060000E13003900020ADF81000ADF81200ADF815 +:100610001400ADF818000C20ADF8160003A90B4823 +:1006200000F0B3FB40F22551084800F0F1FC012234 +:1006300040F2255105480BE0000C0140000001404C +:1006400000000020060000200008014000380140A2 +:1006500000F017FC0121B34800F007FC07B000BD13 +:1006600008B54FF4E06000F061FD00208DF8000057 +:100670008DF80100684600F05EFD08BD10B501214F +:10068000C80200F0EAFA4FF4C07000F018FD4120F3 +:1006900000F01FFD502000F032FD00F03BFD00F0A7 +:1006A00024FD10BD00E0401E0028FCD1704707E08B +:1006B000002100E0491C4CF250329142FAD3401E16 +:1006C0000028F5D1704710B5502000F012FD00F061 +:1006D00021FD10BD10B504462146924800F034FCBF +:1006E0000120FFF7E4FF10BD00B580223E21D0209D +:1006F000FFF7B9FE07221521D020FFF7B4FE1E2216 +:100700001621D020FFF7AFFE00221721D020FFF7DF +:10071000AAFE00223E21D020FFF7A5FE00BD00B5B5 +:1007200087B01E21D020FFF7C1FE7F4908701D2130 +:10073000D020FFF7BBFE7C49487008460078497816 +:1007400040EA012000B2794908800846B0F900006B +:1007500001F026FDCDE9040175A00CC8049801F054 +:10076000D1FACDE9020101F0CDFC00B26F49088059 +:100770002021D020FFF79AFE6B4988701F21D020DE +:10078000FFF794FE6849C87008468078C97840EA47 +:10079000012000B2684908800846B0F9000001F065 +:1007A000FFFCCDE9040162A00CC8049801F0AAFA8C +:1007B000CDE9020101F0A6FC00B25F4908802221C8 +:1007C000D020FFF773FE584908712121D020FFF790 +:1007D0006DFE5549487108460079497940EA012083 +:1007E00000B2564908800846B0F9000001F0D8FC74 +:1007F000CDE904014EA00CC8049801F083FACDE9BC +:10080000020101F07FFC00B24C4908801C21D0207D +:10081000FFF74CFE444988711B21D020FFF746FEAC +:100820004149C87108468079C97940EA012000B27F +:10083000434908800846B0F9000043F2903108446B +:1008400001F0AEFCCDE904013EA00CC8049801F013 +:1008500059FACDE902013DA00CC8029801F066F9F1 +:10086000CDE9000101F04EFC00B23549088007B027 +:1008700000BD70B505462846FFF72CFF3A20FFF76C +:1008800029FF002405E03349085DFFF723FF601CC2 +:10089000C4B2042CF7DB2020FFF71CFF2020FFF759 +:1008A00019FF70BD10B5FFF72CFEFFF772FEFFF7C2 +:1008B0008FFEFFF7B7FC0A20FFF7F9FEFFF714FFE2 +:1008C0002EE0FFF72CFF1948B0F900102148FFF780 +:1008D0007DFC5820FFF7CDFF1748B0F900101D48E8 +:1008E000FFF774FC5920FFF7C4FF1448B0F900105B +:1008F0001848FFF76BFC5A20FFF7BBFF1048B0F910 +:1009000000101448FFF762FC5420FFF7B2FF0D20DF +:10091000FFF7E0FE0A20FFF7DDFE0520FFF7C7FE28 +:10092000CFE7000000380140280000200C00002024 +:100930000000000000C02C400E000020100000202D +:100940001200002000000000008071400000000044 +:100950000080414007000020704700BFFEE700BF55 +:10096000FEE700BFFEE700BFFEE770477047704735 +:1009700070470000DB48006840F00100D94908607A +:1009800008464068D8490840D6494860084600688B +:10099000D6490840D34908600846006820F4802002 +:1009A00008600846406820F4FE0048604FF41F00CD +:1009B00088607047CB49096821F48031C94A1160C9 +:1009C0001146096821F480211160B0F5803F03D001 +:1009D000B0F5802F0ED106E0C249096841F480319C +:1009E000C04A116007E0BF49096841F4A021BD4A2F +:1009F000116000E000BF00BF704710B50146002243 +:100A0000002300204A11012A02D1B64C236806E0D7 +:100A1000022A02D1B34C236A01E0B24C636A01F0AE +:100A20001F02012494401C4201D0012000E000205C +:100A300010BD70B500240025002600BF3120FFF74F +:100A4000DCFF0646641CB4F5A06F01D0002EF5D083 +:100A50003120FFF7D2FF08B1012500E0002528462C +:100A600070BD00219F4A116821F0F80141EAC001E0 +:100A7000116070479E49086070470022994B5A6880 +:100A800022F47C1240EA01031A43964B5A607047E5 +:100A90009749086670470021924A516821F0030186 +:100AA0000143516070478F48406800F00C00704768 +:100AB00000218C4A516821F0F001014351607047D8 +:100AC0000021884A516821F4E06101435160704778 +:100AD0000021844A516821F4605141EAC00151600B +:100AE000704729B17F4A527A02437E4B5A7206E020 +:100AF0007C4A527AC343DBB21A407A4B5A7270472F +:100B00007B49D831086070470021764A516821F44A +:100B100040410143516070470021724A20321170F8 +:100B2000704A82F82010012802D004280AD104E07B +:100B300001216C4A2032117005E00521694A2032FA +:100B4000117000E000BF00BF70476A49086070473D +:100B50006449096A0143634A11627047654944392F +:100B60000860704730B500210022002300245D4D4D +:100B70006D6805F00C0121B1042905D0082923D1A5 +:100B800005E05D4D056022E05B4D05601FE0554DC1 +:100B90006D6805F47012534D6D6805F480330225BD +:100BA00005EB92421BB9554D554305600BE04D4D89 +:100BB0006D6815F4003F03D0504D5543056002E0C9 +:100BC0004D4D5543056002E04B4D056000BF00BF31 +:100BD000444D6D6805F0F0010909494D6C5C0568EC +:100BE000E54045603F4D6D6805F4E061090A444DFC +:100BF0006C5C4568E54085603A4D6D6805F4605170 +:100C0000C90A3F4D6C5C4568E540C560354D6D686F +:100C100005F44041890B3A4D10356C5CC568B5FB55 +:100C2000F4F5056130BD29B12E4A526902432D4BBE +:100C30005A6104E02B4A526982432A4B5A61704739 +:100C400029B1284A92690243264B9A6104E0254A59 +:100C500092698243234B9A61704729B1214AD26934 +:100C60000243204BDA6104E01E4AD26982431D4BE5 +:100C7000DA61704729B11B4AD2680243194BDA6026 +:100C800004E0184AD2688243164BDA60704729B1F3 +:100C9000144A12690243134B1A6104E0114A1269A3 +:100CA0008243104B1A6170471249403908607047FF +:100CB0000F49C86470470B49C87170470948406ABA +:100CC00040F0807007494862704701460020054A9D +:100CD00092680A4201D0012000E0002070470149DB +:100CE00088727047001002400000FFF8FFFFF6FE18 +:100CF000000042428004424200127A0000093D0096 +:100D00001400002010B50446E248844209D10121B4 +:100D10008803FFF7AFFF00214FF48040FFF7AAFFE1 +:100D200032E0DD48844209D101214804FFF7AFFFDA +:100D300000214FF40030FFF7AAFF25E0D748844296 +:100D400009D101218804FFF7A2FF00214FF4802080 +:100D5000FFF79DFF18E0D248844209D10121C80461 +:100D6000FFF795FF00214FF40020FFF790FF0BE005 +:100D7000CC48844208D101210805FFF788FF0021F3 +:100D80004FF48010FFF783FF10BD2DE9F04786B0C8 +:100D900004460D460026002700BF00BFB246A889C2 +:100DA00000B100BFA246268A4CF6FF700640E888D4 +:100DB00006432682A6894EF6F3100640A8882989A4 +:100DC0000843698908430643A681A68A4FF6FF4077 +:100DD0000640A8890643A68201A8FFF7C3FE544631 +:100DE000AC48824501D1049F00E0039F07EBC70098 +:100DF00000EB071029688900B0FBF1F86420B8FB0C +:100E0000F0F006013009642101FB1089322101EB69 +:100E100009106421B0FBF1F000F00F0006432681B9 +:100E200006B0BDE8F0874FF41651016000218180C3 +:100E3000C18001810C21418100218181704710B561 +:100E40000022028A4FF2FF031A400B884C8823438A +:100E50008C882343CC8823431A43028210BD00218F +:100E6000018041808180C180704721B1828942F434 +:100E70000052828104E082894DF6FF731A4082811C +:100E80007047F0B50024002500260023A1F5106767 +:100E90006A3F00D100BF0346C1F3421401F01F05B1 +:100EA000012707FA05F6012C01D10C3304E0022CCE +:100EB00001D1103300E014331AB11F6837431F60AB +:100EC00002E01F68B7431F60F0BD10B51AB1838AF6 +:100ED0000B43838204E0838ACC43A4B22340838201 +:100EE00010BD028A4FF6F0731A400282028A0A434A +:100EF0000282704782894FF2FF731A408281828991 +:100F00000A438281704721B1828942F002028281C4 +:100F100004E082894FF6FD731A4082817047028A8D +:100F20004FF6DF731A400282028A0A430282704738 +:100F300021B1028A42F48042028204E0028A4BF626 +:100F4000FF731A4002827047C1F308028280704723 +:100F500001468888C0F308007047818941F001018B +:100F600081817047028BD2B20283028B42EA012256 +:100F700002837047028B02F47F420283028B0A4392 +:100F80000283704721B1828A42F02002828204E00B +:100F9000828A4FF6DF731A408282704721B1828ABB +:100FA00042F01002828204E0828A4FF6EF731A4008 +:100FB0008282704721B1828A42F00802828204E074 +:100FC000828A4FF6F7731A4082827047828A4FF600 +:100FD000FB731A408282828A0A438282704721B15F +:100FE000828A42F00202828204E0828A4FF6FD7316 +:100FF0001A408282704702460020B1F5007F00D17E +:1010000000BF13880B4201D0012000E00020704790 +:1010100001F40072B2F5007F00D100BFCA43028024 +:10102000704770B502460023002400250020A1F57A +:1010300010666A3E00D100BFC1F3421501F01F04E3 +:10104000012606FA04F4012D02D19689344006E007 +:10105000022D02D1168A344001E0968A34400B12E8 +:10106000012606FA03F31688334014B10BB10120B0 +:1010700000E0002070BD10B500220023A1F510642F +:101080006A3C00D100BF0A1201249440A3B2DC43A1 +:10109000048010BD0038014000440040004800407A +:1010A000004C00400050004010B50121C802FFF77D +:1010B000EEFD00214FF40060FFF7E9FD10BD0021B7 +:1010C000174A126822F4C0710143164AC2F8041C80 +:1010D00070470021124A126822F07F0100F07F025F +:1010E0001143104AC2F8041C704701200E490860E1 +:1010F000704700F07F010A4A121F1160704740F0EC +:101100008001074A121F116070470548001D0068E2 +:10111000C0B2704700200249091D086070470000F6 +:10112000042C004000200040A480054232490143C5 +:10113000324A1160704770B5002100230F22C47835 +:101140000CB32E4C246804F4E064C4F5E064210A76 +:10115000C1F10403CA40447804FA03F184781440CE +:1011600021430901264C0678A155047804F01F0597 +:101170000124AC4005786D114FF0E02606EB8505A3 +:10118000C5F8004109E0047804F01F040125A540DA +:101190001C4C0678761144F8265070BD1A4A0A4055 +:1011A0000243164B1B1F1A60704741B1134A121DB0 +:1011B000126802434FF0E023C3F8102D07E00F4AF6 +:1011C000121D126882434FF0E023C3F8102D7047C0 +:1011D000042808D14FF0E021096941F004014FF0E3 +:1011E000E022116107E04FF0E021096921F00401DC +:1011F0004FF0E022116170470000FA050CED00E0AD +:1012000000E400E080E100E080FFFF1F10B504462D +:10121000BF48844208D101210420FFF72BFD0021A3 +:101220000420FFF727FD46E0BA48844208D1012197 +:101230000820FFF71FFD00210820FFF71BFD3AE003 +:10124000B548844208D101211020FFF713FD002189 +:101250001020FFF70FFD2EE0B048844208D1012195 +:101260002020FFF707FD00212020FFF703FD22E0EB +:10127000AB48844208D101214020FFF7FBFC00214C +:101280004020FFF7F7FC16E0A648844208D1012170 +:101290008020FFF7EFFC00218020FFF7EBFC0AE045 +:1012A000A148844207D101218015FFF7E3FC00210A +:1012B000A015FFF7DFFC10BD10B501210846FFF7B0 +:1012C000D9FC00210120FFF7D5FC10BDF0B50022AC +:1012D0000023002400250026002791F803C00CF00D +:1012E0000F0291F803C01CF0100F03D091F802C058 +:1012F0004CEA0202B1F800C01CF0FF0F31D00668C2 +:1013000000242BE04FF0010C0CFA04F5B1F800C0FA +:101310000CEA0503AB4220D1A5004FF00F0C0CFAEC +:1013200005F7BE4302FA05FC4CEA060691F803C035 +:10133000BCF1280F06D14FF0010C0CFA04FCC0F8E8 +:1013400014C00AE091F803C0BCF1480F05D14FF07A +:10135000010C0CFA04FCC0F810C0641C082CD1D39A +:101360000660B1F800C0BCF1FF0F34DD4668002410 +:101370002EE004F1080C4FF0010E0EFA0CF5B1F856 +:1013800000C00CEA0503AB4221D1A5004FF00F0CC1 +:101390000CFA05F7BE4302FA05FC4CEA060691F882 +:1013A00003C0BCF1280F05D104F1080C0EFA0CFEA5 +:1013B000C0F814E091F803C0BCF1480F07D104F164 +:1013C000080C4FF0010E0EFA0CFEC0F810E0641C81 +:1013D000082CCED34660F0BD4FF6FF71018002218C +:1013E00081700421C17070470246002093680B424F +:1013F00001D0012000E0002070470146886880B2DB +:10140000704702460020D3680B4201D0012000E063 +:10141000002070470146C86880B27047016170477C +:10142000416170470AB1016100E041617047C160EC +:1014300070474FF480320A43826181618261826920 +:10144000826970470022394B1A684FF680731A4040 +:1014500042EA00120A43354B1A6070473449C861AA +:101460007047F0B500220023002500242F4E756838 +:10147000C0F3034482B200F44016B6F5401F08D111 +:1014800025F07065294E766826F07066274F7E60DD +:1014900012E000F48016B6F5801F06D1032606FA86 +:1014A00004F39D4345F0706506E0460D360102FAEF +:1014B00006F6B54345F0706521B1460D360102FAD6 +:1014C00006F63543194E7560F0BD30B500228B0726 +:1014D0001C0F0F2303FA04F2144B08338C1053F83B +:1014E000244094438D1043F825408C1053F8243049 +:1014F0008C07240F00FA04F423430C4C08348D109D +:1015000044F8253030BD0A49DC31086070470000DE +:1015100000080140000C014000100140001401408F +:1015200000180140001C0140002001400000014063 +:10153000000020420021FC4A116801F038010143FB +:1015400011607047F849096821F00801F64A1160F6 +:1015500011460968014311607047F349096821F099 +:101560001001F14A1160114609680143116070478A +:10157000EE48ED494860EE4848607047EA48006927 +:1015800040F08000E849086170470420E649C968D6 +:1015900001F00101012901D101200EE0E249C968F1 +:1015A00011F0040F01D0022007E0DF49C96811F0F3 +:1015B000100F01D0032000E0042070470020FF201E +:1015C00000E0401E0028FCD1704770B50446042599 +:1015D000FFF7DBFF054605E0FFF7F0FFFFF7D5FF5C +:1015E0000546641E012D01D1002CF5D104B9052555 +:1015F000284670BD70B50446042540F6FF70FFF71D +:10160000E4FF0546042D19D1C748006940F00200E7 +:10161000C549086108464461006940F0400008611E +:1016200040F6FF70FFF7D1FF0546052D06D0BE48F6 +:10163000006941F6FD710840BB490861284670BD4C +:1016400010B5042440F6FF70FFF7BFFF0446042CDA +:1016500018D1B548006940F00400B3490861084654 +:10166000006940F04000086140F6FF70FFF7ADFFF1 +:101670000446052C06D0AC48006941F6FB710840D1 +:10168000A9490861204610BD10B5042440F6FF703A +:10169000FFF79BFF0446042C3BD1A448A249886075 +:1016A000A34888600846006940F0200008610846A9 +:1016B000006940F04000086140F6FF70FFF785FFC9 +:1016C0000446042C1CD19848006941F6DF7108409B +:1016D000954908610846006940F010000861A5209E +:1016E000944908800F20FFF770FF0446052C10D0A6 +:1016F0008D48006941F6EF7108408B49086108E0A8 +:10170000052C06D08848006941F6EF7108408649EB +:101710000861204610BD2DE9F04104460D4604261F +:1017200000270F20FFF751FF0646042E26D17E48E2 +:10173000006940F001007C49086125800F20FFF717 +:1017400044FF0646042E10D1A71C280C38800F2019 +:10175000FFF73BFF0646052E10D07348006941F69F +:10176000FE7108407049086108E0052E06D06E48F9 +:10177000006941F6FE7108406B4908613046BDE8DA +:10178000F08170B504460D4604260F20FFF71DFFBB +:101790000646042E13D16448006940F001006249F6 +:1017A000086125800F20FFF710FF0646052E06D0A2 +:1017B0005D48006941F6FE7108405B4908613046AA +:1017C00070BD70B504460D4604260F20FFF7FDFEE0 +:1017D0000646042E17D155485349886054488860FE +:1017E0000846006940F01000086125800F20FFF7CF +:1017F000ECFE0646052E06D04B48006941F6EF7117 +:10180000084049490861304670BD2DE9F04704465B +:101810004FF6FF752E462F46A8464FF00409E443C5 +:10182000E5B2C4F30726C4F307474FEA14680F2054 +:10183000FFF7CBFE8146B9F1040F41D13B483A494D +:1018400088603B4888600846006940F010000861E5 +:10185000FF2D06D03748083005800F20FFF7B5FE72 +:101860008146B9F1040F08D1FF2E06D031480A3065 +:1018700006800F20FFF7A9FE8146B9F1040F08D1B9 +:10188000FF2F06D02B480C3007800F20FFF79DFE5E +:101890008146B9F1040F09D1B8F1FF0F06D02648EF +:1018A000A0F80E880F20FFF790FE8146B9F1050FD2 +:1018B00006D01D48006941F6EF7108401A490861D9 +:1018C0004846BDE8F08770B50446042540F6FF7031 +:1018D000FFF77BFE0546042D4BD114481249886062 +:1018E000134888600846006940F0200008610846F7 +:1018F000006940F04000086140F6FF70FFF765FEA8 +:101900000546042D2CD10848006941F6DF710840D6 +:10191000054908610846006940F0100008616CB193 +:101920000020044908800CE00020024023016745A4 +:10193000AB89EFCD00F8FF1F00F0FF1FA520454940 +:10194000088040F6FF70FFF740FE0546052D10D0D9 +:101950004148006941F6EF7108403F49086108E0DD +:10196000052D06D03C48006941F6DF7108403A4930 +:101970000861284670BD2DE9F04104460D46164623 +:101980000427364834498860354888600F20FFF7BF +:101990001CFE0746042F19D12F48006940F01000A3 +:1019A0002D49086146F0F800284320432949891C45 +:1019B00008800F20FFF709FE0746052F06D02648AE +:1019C000006941F6EF710840234908613846BDE8D7 +:1019D000F0812148C069800870471F48006A70473D +:1019E00000201D49C96911F0020F01D0012000E05B +:1019F0000020704700201849096811F0200F01D01D +:101A0000012000E00020704729B1134A1269024307 +:101A1000114B1A6104E0104A126982430E4B1A619D +:101A2000704701460020012908D10B4AD26912F003 +:101A3000010F01D0012008E0002006E0064AD2682C +:101A40000A4201D0012000E0002070470249C8602E +:101A50007047000000F8FF1F002002402301674587 +:101A6000AB89EFCD70470B4880470B4981F308885D +:101A70000A480047FEE7FEE7FEE7FEE7FEE7FEE76F +:101A8000FEE7FEE7FEE7FEE705480649064A074B84 +:101A900070470000651A0008980600203101000810 +:101AA000980000209806002098020020980200204C +:101AB000704770477047754600F028F8AE4605003D +:101AC0006946534620F00700854618B020B5FFF759 +:101AD000DBFFBDE820404FF000064FF000074FF05D +:101AE00000084FF0000B21F00701AC46ACE8C0093C +:101AF000ACE8C009ACE8C009ACE8C0098D46704745 +:101B00000446AFF300802046FEF75BFB00487047B9 +:101B10003400002003494FF01800ABBE70470000AE +:101B200009000000260002007047000010B591EA8D +:101B3000030F48BF83F0004300F15083841A71EB18 +:101B4000030E05D2121943EB0E03001B61EB0E01CD +:101B5000DFF880C14FEA1154A4EB135E1CEA430F77 +:101B600018BF9CEA445F7DD023EA0C0321EA0451AC +:101B700043F48013DEF1200C38D322FA0EFC10EB74 +:101B80000C0023FA0EFC41EB0C01CEF1200C03FA01 +:101B90000CFC10EB0C0051F10001B1F5801FCEF1EF +:101BA000200C38D201EB0451BDE8104012FA0CF2BF +:101BB00058BF7047401C38BF5FEA420218BF7047E9 +:101BC000002814BF20F0010041F100014FEA410359 +:101BD00013F5001F38BF704728BFB1F1C0413E491F +:101BE0004FF0000048BF41F000417047012A43EB2D +:101BF0000302AEF1200EDEF11F0C32BF4FF0000CDD +:101C000023FA0EF310EB030041EB0451B4EB115F28 +:101C1000CAD0A1EB045101F58011490801EB045130 +:101C2000BDE810405FEA30000CD350F1000038BF2F +:101C300012FA0CFC06D1C3E7401C38BF5FEA42022F +:101C4000C4D1BDE74FEA410313F5001F38BF704709 +:101C500028BFB1F1C04120494FF0000048BF41F01A +:101C6000004170479CEA445F08D0BDE8104011EA8B +:101C70005C0F04BF01F0004100207047012841EBD8 +:101C80000104012A43EB030E644598BFE645DFF8E3 +:101C90004CC0BDE8104000F22580AFF30080012861 +:101CA00041EB0100012A43EB0302904208D010F5FA +:101CB000001F04BF0020704719464FF00000704716 +:101CC00091EA030F4FF0000058BF704704494FF0EE +:101CD000000070470000E0FF0000F07F11000004EA +:101CE0000000F87F02494FF0000000F009BC00003E +:101CF0000000F87F02494FF0000000F001BC000036 +:101D00000000F87F70B5DFF8ECC33CEA111418BF8F +:101D10003CEA131400F09B8081EA03050CEA1114DD +:101D200044EAD5741CEA131518BF11EA0C1F00F021 +:101D300074804FEAC1214FEAC32341EA505143EA7C +:101D40005253A4EB050404F17F7441F0004143F0C9 +:101D500000434FEAC0204FEAC22200F0A9F846052E +:101D60004FEAD02003EB244340EA41504FEAD1210F +:101D700001EB035282EAC47116D05FEA460E38BF07 +:101D80004FF0404610D314BF00234FF0004350F1F2 +:101D9000000041F1000110EAD37F4FF0804620EAB5 +:101DA000D37018BF4FF0404691EAC47FDFF848E394 +:101DB00016D412EA0E0F18BF3EEA010E10D070BD05 +:101DC000E50754BF1EF4000F1EF4800F0ABF4FF04A +:101DD00080464FF0404610F1010041F10001E3E779 +:101DE000B4F1806FDEBF01F1C04101F0004100207D +:101DF00000DC70BDA8BFA1F1C04146F0140CA8BF23 +:101E00004CF0805CBDE870406FF0000041EA50018A +:101E100081EA10314FF00000704711EA0C1F00D02A +:101E20000AE013EA0C1F00F03D804FF0000081EA49 +:101E3000030101F0004170BD6FF0000081EA030171 +:101E400041EA500181EA10314FF0000070BD4FEAC5 +:101E5000410EBEEB4C1F4FEA430508BF002898BF58 +:101E6000B5EB4C1F08BF002ABDE87040DFF88CC2FC +:101E70003FF638AFAFF300804FF4001C1CEB410F6E +:101E800009D11CEB430F0FD04B4021F0004148BF5C +:101E900041F0004170474FF0000081EA030303F076 +:101EA00000417047BDE870404FF000009449704712 +:101EB000E0B5054610B40C460FF238114FEA430C5A +:101EC0004FF0010E4FEA9C6C51F82CC04FF000010E +:101ED000ACFB02604FF00006ECFB0301001841EB85 +:101EE0000101301A66EB0101E1FB0C6C4FF00001BF +:101EF000ACFB02604FF00006ECFB0301001841EB65 +:101F00000101301A66EB0101E1FB0C6C4FF000019E +:101F1000ACFB0560ECFB0401A2FB0167E3FB006E78 +:101F200017EB0E074FF0000EE3FB017E4EF1000EA3 +:101F3000B6197F414EEB0E0E764275EB070764EB48 +:101F40000E0EECFB0E01ACFB07E64FF0000E801905 +:101F500041F10001A2FB0067B619E2FB017EE3FB41 +:101F6000007E7F4103FB01EE4EEB0E0E76424FF0FA +:101F7000000676EB070765EB0E0EACFB0E674FF025 +:101F8000000E4FEA857C4FEA9505C01941F100012A +:101F900045EA847549084FEA3000A2FB00677642A3 +:101FA000E2FB017EE3FB007E7CEB070703FB01EE17 +:101FB00065EB0E0EB51A77EB03047EF1000E24BF1D +:101FC0002E46274650F1000041F10001012E38BF96 +:101FD000012F404141EB010111F0004F18BF0223D6 +:101FE00001D0F0BC00BDF0BC4FF00103001841EB84 +:101FF000010100BDFCC00FFC830F3EF85F8D89F42A +:10200000F0F0F0F0B50373EDEAA00EEA48B4C2E6D2 +:10201000E3388EE31C3870E0A6C867DDA70D74DADC +:10202000E53594D7037BC7D4D2200DD2A87464CFF2 +:10203000CCCCCCCCE68745CA7C0CCEC77BC865C56A +:10204000C3300CC3C0C0C0C00BFA82BE0B6452BC0C +:10205000A28B2EBAE00217B8B6600BB6B4400BB430 +:10206000C84216B2020B2CB05C414CAE849176ACE7 +:10207000AAAAAAAA573FE8A839052FA702B57EA5A4 +:102080003D0AD7A32BC337A2A0A0A0A0E765119F4C +:102090009DD8899D9CC0099CD9E7909A511A1F9997 +:1020A000ED25B4976CDA4F964F09F294C4859A9354 +:1020B0009224499209BCFD90EE23B88F6D35788E3D +:1020C00008CB3D8D8CC0088CFBF2D88A8940AE8944 +:1020D000888888885FAB67877D8A4B8653083485FC +:1020E00042082184976E12838220088208040281AC +:1020F000000000800000FF070000F07F14000004D3 +:102100000000F87F4FEAC12303B40A1543EA505395 +:1021100018BF43F000430DD4A2F56072D2F19E02C5 +:1021200040F32180FF2ACCBF002123FA02F10846A8 +:1021300002B070474FEA4252520D08BF23F00043ED +:102140004FF00001A2F56072D2F19E020BDBFF2A74 +:10215000DCBF23FA02FCA1EB0C010029DEBF02B0B8 +:1021600008467047FFE703BCDFF830C0012841EBA9 +:10217000010313F5001F88BF4CF4803C3FF6BAAD55 +:102180003EBF6FEAE17080F000407047AFF300801F +:102190006FEAE17080F0004070470000C800020460 +:1021A00010F0004314BF4142014643F08043B1FAAE +:1021B00081FC03F1F87311FA0CF1A3EB0C534FEA15 +:1021C000415008BF704703EBE121704710B591EA19 +:1021D000030F48BF83F000433FF5B0AC841A71EBA6 +:1021E000030E07D212198EF0004E43EB0E03001BB4 +:1021F00061EB0E01DFF810C24FEA1154A4EB135E3D +:102200001CEA430F18BF9CEA445F00F0C58023EA34 +:102210006C03524221EA0451C3EB6C0338BF5B1ECE +:10222000DEF1200C29D322FA0EFC10EB0C0043FA4D +:102230000EFC41EB0C01CEF1200C03FA0CFC10EB70 +:102240000C0051F10001CEF1200C2DD401EB045112 +:10225000BDE8104012FA0CF24FF0120C4CF0804C1A +:1022600058BF7047401C1CBFB2F1004F7047002898 +:102270000CBF491C20F00100704712EB020C43EB2D +:10228000030218BF4FF0010C4CEA4202AEF1200EDF +:10229000DEF11E0C63D943FA0EFC10EB0C0051F179 +:1022A000FF31CEF11E0CD1D50CF1010C12FA0CFC51 +:1022B000404141EB010101EB445E5FEA5E5E10D9F3 +:1022C00001EB0451BDE8104010EBDC7038BFBCF1ED +:1022D000004F18BF704700280CBF491C20F00100B8 +:1022E00070473FD211F5001108BF002801D1BDE8A9 +:1022F00010403FD04FEAD42E24F40064B1FA81F2AA +:10230000202AA4F1020404BFB0FA80F3D218A2F18B +:102310000B02B2F12003A4EB02040CD2C2F12003A1 +:1023200001FA02F120FA03F341EA030100FA02F094 +:10233000C2F1200303E000FA03F14FF0000001EBCB +:10234000CE71002C01EB0451BDE81040A8BF7047CE +:1023500001F1C0414FF0000001F00041704701EB76 +:10236000045110BD491001EB0451BDE810404FEA83 +:10237000300002E04FF0000170474FF0120C4A00AD +:1023800008BF0042F6D0B2F5001F28BF704701F029 +:1023900000414FF0000070479CEA445F07D0BDE861 +:1023A000104011EA5C0F04BF002100207047012893 +:1023B00041EB0104012A43EB030E644598BFE64557 +:1023C000DFF848C0BDE810403FF68CACAFF30080AA +:1023D000012841EB0100012A43EB0302904209D09E +:1023E00010F5001F04BF0020704783F000414FF03C +:1023F0000000704791EA030F4FF0000048BF70479C +:1024000003494FF0000070470000E0FF1200000495 +:102410000000F87F094248BF4CF4803C4FF4C06391 +:102420004FEA115203F1010321EA025122F4006242 +:102430009A1A48BF6FF0FE0241F48011352A3CD849 +:1024400030D0152A1ED3203A0CD90028C2F120031F +:1024500021FA02F001FA03F218BF42F001024FF034 +:10246000000130E0C2F1000302F1200201FA03F1A1 +:1024700020FA02F241EA020100FA03F208464FF0A4 +:10248000000120E0C2F1200310B400FA03F401FAC5 +:1024900003F320FA02F021FA02F1224610BC43EACB +:1024A000000010E050EA01324FF000004FF0000150 +:1024B0004FF0004218BF521C05E04FF001024FF0F0 +:1024C00000014FF000001CF4803F2CF4803C18BF4A +:1024D00041F00041124208BF7047520003D303D0BD +:1024E000401C41F1000170475FEAAC72F8D4FAD1A8 +:1024F000401C41F1000120F00100F4E770477047F3 +:102500000CF00F03092B08BF082000F02B800A2BCA +:102510000BD0082B18BF704708BF1CF0400F0AD023 +:102520004FF000004FF0000170471CF0400F18BF43 +:102530004FF0004070471CF0100F08D020F070439F +:1025400000F07F4242EAD3014FEA4370704700F047 +:10255000604021F07F4242EA000201F07F4040EA01 +:10256000727070471CF4801F11D01CF4E02F03D050 +:102570006FEACC31490070474FF04050EFF30082D2 +:1025800022F0704242EA000282F3008870474FF066 +:1025900000007047B425000800000020280000005B +:1025A0006C010008DC2500082800002070060000EF +:1025B000880100080000000000000000000000008A +:1025C0000000000000000000000000000102030401 +:0C25D000010203040607080902040608C3 +:0400000508000131BD +:00000001FF diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.htm b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.htm new file mode 100644 index 0000000..0341623 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.htm @@ -0,0 +1,1190 @@ + + +Static Call Graph - [D:\MCU_Project\MCU_STM32\´®¿ÚÊä³öMPU-3050\´®¿Ú\lunzhou.axf] +
+

Static Call Graph for image D:\MCU_Project\MCU_STM32\´®¿ÚÊä³öMPU-3050\´®¿Ú\lunzhou.axf


+

#<CALLGRAPH># ARM Linker, RVCT4.0 [Build 524]: Last Updated: Wed Oct 12 09:55:49 2011 +

+

Maximum Stack Usage = 108 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)

+Call chain for Maximum Stack Depth:

+__rt_entry_main ⇒ main ⇒ USART1_Configuration ⇒ USART_Init ⇒ RCC_GetClocksFreq +

+

+Functions with no stack information +

+ +

+

+Mutually Recursive functions +

  • ADC1_2_IRQHandler   ⇒   ADC1_2_IRQHandler
    + +

    +

    +Function Pointers +

    +

    +

    +Global Symbols +

    +

    __main (Thumb, 8 bytes, Stack size 0 bytes, __main.o(!!!main)) +

    [Calls]

    • >>   __rt_entry +
    • >>   __scatterload +
    + +

    __scatterload (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter)) +

    [Called By]

    • >>   __main +
    + +

    __scatterload_rt2 (Thumb, 44 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED) +

    [Calls]

    • >>   __rt_entry +
    + +

    __scatterload_rt2_thumb_only (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED) + +

    __scatterload_null (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED) + +

    __scatterload_copy (Thumb, 26 bytes, Stack size unknown bytes, __scatter_copy.o(!!handler_copy), UNUSED) +

    [Calls]

    • >>   __scatterload_copy +
    +
    [Called By]
    • >>   __scatterload_copy +
    + +

    __scatterload_zeroinit (Thumb, 28 bytes, Stack size unknown bytes, __scatter_zi.o(!!handler_zi), UNUSED) + +

    __rt_lib_init (Thumb, 0 bytes, Stack size unknown bytes, libinit.o(.ARM.Collect$$libinit$$00000000)) +

    [Called By]

    • >>   __rt_entry_li +
    + +

    __rt_lib_init_alloca_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002A)) + +

    __rt_lib_init_argv_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000028)) + +

    __rt_lib_init_atexit_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000017)) + +

    __rt_lib_init_clock_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001D)) + +

    __rt_lib_init_cpp_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002E)) + +

    __rt_lib_init_exceptions_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002C)) + +

    __rt_lib_init_fp_trap_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001B)) + +

    __rt_lib_init_getenv_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001F)) + +

    __rt_lib_init_heap_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000006)) + +

    __rt_lib_init_lc_collate_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000D)) + +

    __rt_lib_init_lc_ctype_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000F)) + +

    __rt_lib_init_lc_monetary_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000011)) + +

    __rt_lib_init_lc_numeric_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000013)) + +

    __rt_lib_init_lc_time_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000015)) + +

    __rt_lib_init_rand_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000A)) + +

    __rt_lib_init_return (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002F)) + +

    __rt_lib_init_signal_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000019)) + +

    __rt_lib_init_stdio_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000021)) + +

    __rt_lib_init_user_alloc_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000008)) + +

    __rt_lib_shutdown (Thumb, 0 bytes, Stack size unknown bytes, libshutdown.o(.ARM.Collect$$libshutdown$$00000000)) +

    [Called By]

    • >>   __rt_exit_ls +
    + +

    __rt_lib_shutdown_fp_trap_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000006)) + +

    __rt_lib_shutdown_heap_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000E)) + +

    __rt_lib_shutdown_return (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F)) + +

    __rt_lib_shutdown_signal_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000009)) + +

    __rt_lib_shutdown_stdio_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000003)) + +

    __rt_lib_shutdown_user_alloc_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000B)) + +

    __rt_entry (Thumb, 0 bytes, Stack size unknown bytes, rtentry.o(.ARM.Collect$$rtentry$$00000000)) +

    [Called By]

    • >>   __main +
    • >>   __scatterload_rt2 +
    + +

    __rt_entry_presh_1 (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$00000002)) + +

    __rt_entry_sh (Thumb, 0 bytes, Stack size unknown bytes, rtentry4.o(.ARM.Collect$$rtentry$$00000004)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = __rt_entry_sh ⇒ __user_setup_stackheap +
    +
    [Calls]
    • >>   __user_setup_stackheap +
    + +

    __rt_entry_li (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$0000000A)) +

    [Calls]

    • >>   __rt_lib_init +
    + +

    __rt_entry_postsh_1 (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$00000009)) + +

    __rt_entry_main (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$0000000D)) +

    [Stack]

    • Max Depth = 108 + Unknown Stack Size +
    • Call Chain = __rt_entry_main ⇒ main ⇒ USART1_Configuration ⇒ USART_Init ⇒ RCC_GetClocksFreq +
    +
    [Calls]
    • >>   exit +
    • >>   main +
    + +

    __rt_entry_postli_1 (Thumb, 0 bytes, Stack size unknown bytes, rtentry2.o(.ARM.Collect$$rtentry$$0000000C)) + +

    __rt_exit (Thumb, 0 bytes, Stack size unknown bytes, rtexit.o(.ARM.Collect$$rtexit$$00000000)) +

    [Called By]

    • >>   exit +
    + +

    __rt_exit_ls (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000003)) +

    [Calls]

    • >>   __rt_lib_shutdown +
    + +

    __rt_exit_prels_1 (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000002)) + +

    __rt_exit_exit (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000004)) +

    [Calls]

    • >>   _sys_exit +
    + +

    DATA_printf (Thumb, 88 bytes, Stack size 0 bytes, main.o(.text)) +

    [Called By]

    • >>   main +
    + +

    I2C_GPIO_Config (Thumb, 56 bytes, Stack size 8 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 28
    • Call Chain = I2C_GPIO_Config ⇒ GPIO_Init +
    +
    [Calls]
    • >>   GPIO_Init +
    +
    [Called By]
    • >>   main +
    + +

    I2C_delay (Thumb, 14 bytes, Stack size 0 bytes, main.o(.text)) +

    [Called By]

    • >>   I2C_RadeByte +
    • >>   I2C_SendByte +
    • >>   I2C_WaitAck +
    • >>   I2C_NoAck +
    • >>   I2C_Ack +
    • >>   I2C_Stop +
    • >>   I2C_Start +
    + +

    delay5ms (Thumb, 14 bytes, Stack size 0 bytes, main.o(.text)) +

    [Called By]

    • >>   Single_Write +
    + +

    I2C_Start (Thumb, 90 bytes, Stack size 4 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = I2C_Start +
    +
    [Calls]
    • >>   I2C_delay +
    +
    [Called By]
    • >>   Single_Read +
    • >>   Single_Write +
    + +

    I2C_Stop (Thumb, 52 bytes, Stack size 4 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = I2C_Stop +
    +
    [Calls]
    • >>   I2C_delay +
    +
    [Called By]
    • >>   Single_Read +
    • >>   Single_Write +
    + +

    I2C_Ack (Thumb, 52 bytes, Stack size 4 bytes, main.o(.text), UNUSED) +

    [Calls]

    • >>   I2C_delay +
    + +

    I2C_NoAck (Thumb, 52 bytes, Stack size 4 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = I2C_NoAck +
    +
    [Calls]
    • >>   I2C_delay +
    +
    [Called By]
    • >>   Single_Read +
    + +

    I2C_WaitAck (Thumb, 82 bytes, Stack size 4 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = I2C_WaitAck +
    +
    [Calls]
    • >>   I2C_delay +
    +
    [Called By]
    • >>   Single_Read +
    • >>   Single_Write +
    + +

    I2C_SendByte (Thumb, 84 bytes, Stack size 4 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = I2C_SendByte +
    +
    [Calls]
    • >>   I2C_delay +
    +
    [Called By]
    • >>   Single_Read +
    • >>   Single_Write +
    + +

    I2C_RadeByte (Thumb, 82 bytes, Stack size 4 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = I2C_RadeByte +
    +
    [Calls]
    • >>   I2C_delay +
    +
    [Called By]
    • >>   Single_Read +
    + +

    Single_Write (Thumb, 70 bytes, Stack size 16 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = Single_Write ⇒ I2C_SendByte +
    +
    [Calls]
    • >>   I2C_SendByte +
    • >>   I2C_WaitAck +
    • >>   I2C_Stop +
    • >>   I2C_Start +
    • >>   delay5ms +
    +
    [Called By]
    • >>   Init_MPU3050 +
    + +

    Single_Read (Thumb, 86 bytes, Stack size 16 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = Single_Read ⇒ I2C_RadeByte +
    +
    [Calls]
    • >>   I2C_RadeByte +
    • >>   I2C_SendByte +
    • >>   I2C_WaitAck +
    • >>   I2C_NoAck +
    • >>   I2C_Stop +
    • >>   I2C_Start +
    +
    [Called By]
    • >>   READ_MPU3050 +
    + +

    RCC_Configuration (Thumb, 144 bytes, Stack size 8 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = RCC_Configuration ⇒ RCC_WaitForHSEStartUp ⇒ RCC_GetFlagStatus +
    +
    [Calls]
    • >>   RCC_WaitForHSEStartUp +
    • >>   RCC_SYSCLKConfig +
    • >>   RCC_PLLConfig +
    • >>   RCC_PLLCmd +
    • >>   RCC_PCLK2Config +
    • >>   RCC_PCLK1Config +
    • >>   RCC_HSEConfig +
    • >>   RCC_HCLKConfig +
    • >>   RCC_GetSYSCLKSource +
    • >>   RCC_GetFlagStatus +
    • >>   RCC_DeInit +
    • >>   RCC_APB2PeriphClockCmd +
    • >>   FLASH_SetLatency +
    • >>   FLASH_PrefetchBufferCmd +
    +
    [Called By]
    • >>   main +
    + +

    GPIO_Configuration (Thumb, 62 bytes, Stack size 8 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 28
    • Call Chain = GPIO_Configuration ⇒ GPIO_Init +
    +
    [Calls]
    • >>   RCC_APB2PeriphClockCmd +
    • >>   GPIO_Init +
    +
    [Called By]
    • >>   main +
    + +

    USART1_Configuration (Thumb, 144 bytes, Stack size 32 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 100
    • Call Chain = USART1_Configuration ⇒ USART_Init ⇒ RCC_GetClocksFreq +
    +
    [Calls]
    • >>   USART_Init +
    • >>   USART_ITConfig +
    • >>   USART_Cmd +
    • >>   USART_ClockInit +
    • >>   USART_ClearFlag +
    • >>   RCC_APB2PeriphClockCmd +
    +
    [Called By]
    • >>   main +
    + +

    NVIC_Configuration (Thumb, 28 bytes, Stack size 8 bytes, main.o(.text), UNUSED) +

    [Calls]

    • >>   NVIC_PriorityGroupConfig +
    • >>   NVIC_Init +
    + +

    WWDG_Configuration (Thumb, 40 bytes, Stack size 8 bytes, main.o(.text), UNUSED) +

    [Calls]

    • >>   WWDG_SetWindowValue +
    • >>   WWDG_SetPrescaler +
    • >>   WWDG_EnableIT +
    • >>   WWDG_Enable +
    • >>   WWDG_ClearFlag +
    • >>   RCC_APB1PeriphClockCmd +
    + +

    Delay (Thumb, 10 bytes, Stack size 0 bytes, main.o(.text), UNUSED) + +

    Delayms (Thumb, 24 bytes, Stack size 0 bytes, main.o(.text)) +

    [Called By]

    • >>   main +
    • >>   USART1_SendData +
    + +

    WWDG_IRQHandler (Thumb, 14 bytes, Stack size 8 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = WWDG_IRQHandler +
    +
    [Calls]
    • >>   WWDG_SetCounter +
    • >>   WWDG_ClearFlag +
    +
    [Address Reference Count : 1]
    • startup_stm32f10x_hd.o(RESET) +
    +

    USART1_SendData (Thumb, 20 bytes, Stack size 8 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = USART1_SendData +
    +
    [Calls]
    • >>   USART_SendData +
    • >>   Delayms +
    +
    [Called By]
    • >>   main +
    • >>   Send_data +
    + +

    Init_MPU3050 (Thumb, 54 bytes, Stack size 4 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = Init_MPU3050 ⇒ Single_Write ⇒ I2C_SendByte +
    +
    [Calls]
    • >>   Single_Write +
    +
    [Called By]
    • >>   main +
    + +

    READ_MPU3050 (Thumb, 340 bytes, Stack size 32 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 52
    • Call Chain = READ_MPU3050 ⇒ Single_Read ⇒ I2C_RadeByte +
    +
    [Calls]
    • >>   __aeabi_i2d +
    • >>   __aeabi_d2iz +
    • >>   __aeabi_ddiv +
    • >>   __aeabi_dadd +
    • >>   Single_Read +
    +
    [Called By]
    • >>   main +
    + +

    Send_data (Thumb, 50 bytes, Stack size 16 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = Send_data ⇒ USART1_SendData +
    +
    [Calls]
    • >>   USART1_SendData +
    +
    [Called By]
    • >>   main +
    + +

    main (Thumb, 126 bytes, Stack size 8 bytes, main.o(.text)) +

    [Stack]

    • Max Depth = 108
    • Call Chain = main ⇒ USART1_Configuration ⇒ USART_Init ⇒ RCC_GetClocksFreq +
    +
    [Calls]
    • >>   Send_data +
    • >>   READ_MPU3050 +
    • >>   Init_MPU3050 +
    • >>   USART1_SendData +
    • >>   Delayms +
    • >>   USART1_Configuration +
    • >>   GPIO_Configuration +
    • >>   RCC_Configuration +
    • >>   I2C_GPIO_Config +
    • >>   DATA_printf +
    +
    [Called By]
    • >>   __rt_entry_main +
    + +

    NMI_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f10x_it.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    HardFault_Handler (Thumb, 4 bytes, Stack size 0 bytes, stm32f10x_it.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    MemManage_Handler (Thumb, 4 bytes, Stack size 0 bytes, stm32f10x_it.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    BusFault_Handler (Thumb, 4 bytes, Stack size 0 bytes, stm32f10x_it.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    UsageFault_Handler (Thumb, 4 bytes, Stack size 0 bytes, stm32f10x_it.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    SVC_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f10x_it.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DebugMon_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f10x_it.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    PendSV_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f10x_it.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    SysTick_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f10x_it.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    RCC_DeInit (Thumb, 64 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    RCC_HSEConfig (Thumb, 70 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    RCC_GetFlagStatus (Thumb, 56 bytes, Stack size 8 bytes, stm32f10x_rcc.o(.text)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = RCC_GetFlagStatus +
    +
    [Called By]
    • >>   RCC_WaitForHSEStartUp +
    • >>   RCC_Configuration +
    + +

    RCC_WaitForHSEStartUp (Thumb, 48 bytes, Stack size 16 bytes, stm32f10x_rcc.o(.text)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = RCC_WaitForHSEStartUp ⇒ RCC_GetFlagStatus +
    +
    [Calls]
    • >>   RCC_GetFlagStatus +
    +
    [Called By]
    • >>   RCC_Configuration +
    + +

    RCC_AdjustHSICalibrationValue (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_HSICmd (Thumb, 6 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_PLLConfig (Thumb, 22 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    RCC_PLLCmd (Thumb, 6 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    RCC_SYSCLKConfig (Thumb, 16 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    RCC_GetSYSCLKSource (Thumb, 10 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    RCC_HCLKConfig (Thumb, 16 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    RCC_PCLK1Config (Thumb, 16 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    RCC_PCLK2Config (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    RCC_ITConfig (Thumb, 30 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_USBCLKConfig (Thumb, 8 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_ADCCLKConfig (Thumb, 16 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_LSEConfig (Thumb, 50 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_LSICmd (Thumb, 6 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_RTCCLKConfig (Thumb, 12 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_RTCCLKCmd (Thumb, 8 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_GetClocksFreq (Thumb, 194 bytes, Stack size 12 bytes, stm32f10x_rcc.o(.text)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = RCC_GetClocksFreq +
    +
    [Called By]
    • >>   USART_Init +
    + +

    RCC_AHBPeriphClockCmd (Thumb, 26 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_APB2PeriphClockCmd (Thumb, 26 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text)) +

    [Called By]

    • >>   USART1_Configuration +
    • >>   GPIO_Configuration +
    • >>   RCC_Configuration +
    + +

    RCC_APB1PeriphClockCmd (Thumb, 26 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) +

    [Called By]

    • >>   WWDG_Configuration +
    + +

    RCC_APB2PeriphResetCmd (Thumb, 26 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) +

    [Called By]

    • >>   GPIO_AFIODeInit +
    • >>   GPIO_DeInit +
    • >>   USART_DeInit +
    + +

    RCC_APB1PeriphResetCmd (Thumb, 26 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) +

    [Called By]

    • >>   WWDG_DeInit +
    • >>   USART_DeInit +
    + +

    RCC_BackupResetCmd (Thumb, 8 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_ClockSecuritySystemCmd (Thumb, 6 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_MCOConfig (Thumb, 6 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_ClearFlag (Thumb, 14 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_GetITStatus (Thumb, 20 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    RCC_ClearITPendingBit (Thumb, 6 bytes, Stack size 0 bytes, stm32f10x_rcc.o(.text), UNUSED) + +

    USART_DeInit (Thumb, 134 bytes, Stack size 8 bytes, stm32f10x_usart.o(.text), UNUSED) +

    [Calls]

    • >>   RCC_APB1PeriphResetCmd +
    • >>   RCC_APB2PeriphResetCmd +
    + +

    USART_Init (Thumb, 156 bytes, Stack size 56 bytes, stm32f10x_usart.o(.text)) +

    [Stack]

    • Max Depth = 68
    • Call Chain = USART_Init ⇒ RCC_GetClocksFreq +
    +
    [Calls]
    • >>   RCC_GetClocksFreq +
    +
    [Called By]
    • >>   USART1_Configuration +
    + +

    USART_StructInit (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_ClockInit (Thumb, 32 bytes, Stack size 8 bytes, stm32f10x_usart.o(.text)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = USART_ClockInit +
    +
    [Called By]
    • >>   USART1_Configuration +
    + +

    USART_ClockStructInit (Thumb, 12 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_Cmd (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text)) +

    [Called By]

    • >>   USART1_Configuration +
    + +

    USART_ITConfig (Thumb, 72 bytes, Stack size 20 bytes, stm32f10x_usart.o(.text)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = USART_ITConfig +
    +
    [Called By]
    • >>   USART1_Configuration +
    + +

    USART_DMACmd (Thumb, 24 bytes, Stack size 8 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_SetAddress (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_WakeUpConfig (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_ReceiverWakeUpCmd (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_LINBreakDetectLengthConfig (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_LINCmd (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_SendData (Thumb, 8 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text)) +

    [Called By]

    • >>   USART1_SendData +
    + +

    USART_ReceiveData (Thumb, 10 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_SendBreak (Thumb, 10 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_SetGuardTime (Thumb, 16 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_SetPrescaler (Thumb, 16 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_SmartCardCmd (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_SmartCardNACKCmd (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_HalfDuplexCmd (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_IrDAConfig (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_IrDACmd (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_GetFlagStatus (Thumb, 26 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_ClearFlag (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_usart.o(.text)) +

    [Called By]

    • >>   USART1_Configuration +
    + +

    USART_GetITStatus (Thumb, 84 bytes, Stack size 16 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    USART_ClearITPendingBit (Thumb, 30 bytes, Stack size 8 bytes, stm32f10x_usart.o(.text), UNUSED) + +

    WWDG_DeInit (Thumb, 22 bytes, Stack size 8 bytes, stm32f10x_wwdg.o(.text), UNUSED) +

    [Calls]

    • >>   RCC_APB1PeriphResetCmd +
    + +

    WWDG_SetPrescaler (Thumb, 20 bytes, Stack size 0 bytes, stm32f10x_wwdg.o(.text), UNUSED) +

    [Called By]

    • >>   WWDG_Configuration +
    + +

    WWDG_SetWindowValue (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_wwdg.o(.text), UNUSED) +

    [Called By]

    • >>   WWDG_Configuration +
    + +

    WWDG_EnableIT (Thumb, 8 bytes, Stack size 0 bytes, stm32f10x_wwdg.o(.text), UNUSED) +

    [Called By]

    • >>   WWDG_Configuration +
    + +

    WWDG_SetCounter (Thumb, 12 bytes, Stack size 0 bytes, stm32f10x_wwdg.o(.text)) +

    [Called By]

    • >>   WWDG_IRQHandler +
    + +

    WWDG_Enable (Thumb, 12 bytes, Stack size 0 bytes, stm32f10x_wwdg.o(.text), UNUSED) +

    [Called By]

    • >>   WWDG_Configuration +
    + +

    WWDG_GetFlagStatus (Thumb, 10 bytes, Stack size 0 bytes, stm32f10x_wwdg.o(.text), UNUSED) + +

    WWDG_ClearFlag (Thumb, 10 bytes, Stack size 0 bytes, stm32f10x_wwdg.o(.text)) +

    [Called By]

    • >>   WWDG_IRQHandler +
    • >>   WWDG_Configuration +
    + +

    NVIC_PriorityGroupConfig (Thumb, 10 bytes, Stack size 0 bytes, misc.o(.text), UNUSED) +

    [Called By]

    • >>   NVIC_Configuration +
    + +

    NVIC_Init (Thumb, 102 bytes, Stack size 16 bytes, misc.o(.text), UNUSED) +

    [Called By]

    • >>   NVIC_Configuration +
    + +

    NVIC_SetVectorTable (Thumb, 14 bytes, Stack size 0 bytes, misc.o(.text), UNUSED) + +

    NVIC_SystemLPConfig (Thumb, 38 bytes, Stack size 0 bytes, misc.o(.text), UNUSED) + +

    SysTick_CLKSourceConfig (Thumb, 40 bytes, Stack size 0 bytes, misc.o(.text), UNUSED) + +

    GPIO_DeInit (Thumb, 172 bytes, Stack size 8 bytes, stm32f10x_gpio.o(.text), UNUSED) +

    [Calls]

    • >>   RCC_APB2PeriphResetCmd +
    + +

    GPIO_AFIODeInit (Thumb, 20 bytes, Stack size 8 bytes, stm32f10x_gpio.o(.text), UNUSED) +

    [Calls]

    • >>   RCC_APB2PeriphResetCmd +
    + +

    GPIO_Init (Thumb, 268 bytes, Stack size 20 bytes, stm32f10x_gpio.o(.text)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = GPIO_Init +
    +
    [Called By]
    • >>   GPIO_Configuration +
    • >>   I2C_GPIO_Config +
    + +

    GPIO_StructInit (Thumb, 16 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_ReadInputDataBit (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_ReadInputData (Thumb, 8 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_ReadOutputDataBit (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_ReadOutputData (Thumb, 8 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_SetBits (Thumb, 4 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_ResetBits (Thumb, 4 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_WriteBit (Thumb, 10 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_Write (Thumb, 4 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_PinLockConfig (Thumb, 18 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_EventOutputConfig (Thumb, 24 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_EventOutputCmd (Thumb, 6 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_PinRemapConfig (Thumb, 104 bytes, Stack size 20 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_EXTILineConfig (Thumb, 60 bytes, Stack size 12 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    GPIO_ETH_MediaInterfaceConfig (Thumb, 8 bytes, Stack size 0 bytes, stm32f10x_gpio.o(.text), UNUSED) + +

    FLASH_SetLatency (Thumb, 16 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    FLASH_HalfCycleAccessCmd (Thumb, 22 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    FLASH_PrefetchBufferCmd (Thumb, 22 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text)) +

    [Called By]

    • >>   RCC_Configuration +
    + +

    FLASH_Unlock (Thumb, 12 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    FLASH_Lock (Thumb, 14 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    FLASH_GetStatus (Thumb, 50 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Called By]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_WaitForLastOperation (Thumb, 42 bytes, Stack size 16 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_GetStatus +
    • >>   delay +
    +
    [Called By]
    • >>   FLASH_UserOptionByteConfig +
    • >>   FLASH_ReadOutProtection +
    • >>   FLASH_EnableWriteProtection +
    • >>   FLASH_ProgramOptionByteData +
    • >>   FLASH_ProgramHalfWord +
    • >>   FLASH_ProgramWord +
    • >>   FLASH_EraseOptionBytes +
    • >>   FLASH_EraseAllPages +
    • >>   FLASH_ErasePage +
    + +

    FLASH_ErasePage (Thumb, 76 bytes, Stack size 16 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_EraseAllPages (Thumb, 72 bytes, Stack size 8 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_EraseOptionBytes (Thumb, 142 bytes, Stack size 8 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_ProgramWord (Thumb, 108 bytes, Stack size 24 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_ProgramHalfWord (Thumb, 64 bytes, Stack size 16 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_ProgramOptionByteData (Thumb, 72 bytes, Stack size 16 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_EnableWriteProtection (Thumb, 188 bytes, Stack size 32 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_ReadOutProtection (Thumb, 176 bytes, Stack size 16 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_UserOptionByteConfig (Thumb, 92 bytes, Stack size 24 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Calls]

    • >>   FLASH_WaitForLastOperation +
    + +

    FLASH_GetUserOptionByte (Thumb, 8 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    FLASH_GetWriteProtectionOptionByte (Thumb, 6 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    FLASH_GetReadOutProtectionStatus (Thumb, 20 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    FLASH_GetPrefetchBufferStatus (Thumb, 20 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    FLASH_ITConfig (Thumb, 26 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    FLASH_GetFlagStatus (Thumb, 42 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    FLASH_ClearFlag (Thumb, 6 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) + +

    SystemInit_ExtMemCtl (Thumb, 2 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(.text) +
    +

    Reset_Handler (Thumb, 14 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    ADC1_2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +

    [Calls]

    • >>   ADC1_2_IRQHandler +
    +
    [Called By]
    • >>   ADC1_2_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f10x_hd.o(RESET) +
    +

    ADC3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    CAN1_RX1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    CAN1_SCE_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA1_Channel1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA1_Channel2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA1_Channel3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA1_Channel4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA1_Channel5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA1_Channel6_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA1_Channel7_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA2_Channel1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA2_Channel2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA2_Channel3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    DMA2_Channel4_5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    EXTI0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    EXTI15_10_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    EXTI1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    EXTI2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    EXTI3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    EXTI4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    EXTI9_5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    FLASH_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    FSMC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    I2C1_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    I2C1_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    I2C2_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    I2C2_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    PVD_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    RCC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    RTCAlarm_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    RTC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    SDIO_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    SPI1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    SPI2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    SPI3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TAMPER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM1_BRK_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM1_CC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM1_TRG_COM_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM1_UP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM6_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM7_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM8_BRK_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM8_CC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM8_TRG_COM_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    TIM8_UP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    UART4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    UART5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    USART1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    USART2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    USART3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    USBWakeUp_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    USB_HP_CAN1_TX_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    USB_LP_CAN1_RX0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f10x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f10x_hd.o(RESET) +
    +

    __user_initial_stackheap (Thumb, 0 bytes, Stack size unknown bytes, startup_stm32f10x_hd.o(.text)) +

    [Called By]

    • >>   __user_setup_stackheap +
    + +

    __use_two_region_memory (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED) + +

    __rt_heap_escrow$2region (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED) + +

    __rt_heap_expand$2region (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED) + +

    __user_setup_stackheap (Thumb, 74 bytes, Stack size 8 bytes, sys_stackheap_outer.o(.text)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = __user_setup_stackheap +
    +
    [Calls]
    • >>   __user_perproc_libspace +
    • >>   __user_initial_stackheap +
    +
    [Called By]
    • >>   __rt_entry_sh +
    + +

    exit (Thumb, 12 bytes, Stack size 0 bytes, exit.o(.text)) +

    [Calls]

    • >>   __rt_exit +
    +
    [Called By]
    • >>   __rt_entry_main +
    + +

    __user_libspace (Thumb, 8 bytes, Stack size 0 bytes, libspace.o(.text), UNUSED) + +

    __user_perproc_libspace (Thumb, 0 bytes, Stack size 0 bytes, libspace.o(.text)) +

    [Called By]

    • >>   __user_setup_stackheap +
    + +

    __user_perthread_libspace (Thumb, 0 bytes, Stack size 0 bytes, libspace.o(.text), UNUSED) + +

    _sys_exit (Thumb, 16 bytes, Stack size 0 bytes, sys_exit.o(.text)) +

    [Called By]

    • >>   __rt_exit_exit +
    + +

    __I$use$semihosting (Thumb, 0 bytes, Stack size 0 bytes, use_no_semi.o(.text)) +
    [Address Reference Count : 1]

    • sys_exit.o(.text) +
    +

    __use_no_semihosting_swi (Thumb, 2 bytes, Stack size 0 bytes, use_no_semi.o(.text), UNUSED) + +

    __aeabi_dadd (Thumb, 0 bytes, Stack size 8 bytes, daddsub_clz.o(x$fpl$dadd)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = __aeabi_dadd +
    +
    [Called By]
    • >>   READ_MPU3050 +
    + +

    _dadd (Thumb, 424 bytes, Stack size 8 bytes, daddsub_clz.o(x$fpl$dadd), UNUSED) +

    [Calls]

    • >>   __fpl_dcheck_NaN2 +
    • >>   _dsub1 +
    + +

    __fpl_inf_dadd (Thumb, 0 bytes, Stack size unknown bytes, daddsub_clz.o(x$fpl$dadd), UNUSED) + +

    __fpl_dcheck_NaN2 (Thumb, 10 bytes, Stack size 0 bytes, dcheck.o(x$fpl$dcheck), UNUSED) +

    [Calls]

    • >>   __fpl_return_NaN +
    +
    [Called By]
    • >>   _ddiv +
    • >>   _dsub +
    • >>   _dadd +
    + +

    __fpl_dcheck_NaN1 (Thumb, 10 bytes, Stack size 0 bytes, dcheck1.o(x$fpl$dcheck1), UNUSED) +

    [Calls]

    • >>   __fpl_return_NaN +
    +
    [Called By]
    • >>   _dfix +
    + +

    __aeabi_ddiv (Thumb, 0 bytes, Stack size 16 bytes, ddiv.o(x$fpl$ddiv)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = __aeabi_ddiv +
    +
    [Called By]
    • >>   READ_MPU3050 +
    + +

    _ddiv (Thumb, 428 bytes, Stack size 16 bytes, ddiv.o(x$fpl$ddiv), UNUSED) +

    [Calls]

    • >>   __fpl_dcheck_NaN2 +
    • >>   _ddiv_mantissas +
    + +

    __fpl_inf_ddiv (Thumb, 0 bytes, Stack size unknown bytes, ddiv.o(x$fpl$ddiv), UNUSED) + +

    _ddiv_mantissas (Thumb, 324 bytes, Stack size 20 bytes, ddiv.o(x$fpl$ddiv), UNUSED) +

    [Called By]

    • >>   _ddiv +
    + +

    __aeabi_d2iz (Thumb, 0 bytes, Stack size 8 bytes, dfix.o(x$fpl$dfix)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = __aeabi_d2iz +
    +
    [Called By]
    • >>   READ_MPU3050 +
    + +

    _dfix (Thumb, 150 bytes, Stack size 8 bytes, dfix.o(x$fpl$dfix), UNUSED) +

    [Calls]

    • >>   __fpl_dcheck_NaN1 +
    + +

    __fpl_inf_dfix (Thumb, 0 bytes, Stack size unknown bytes, dfix.o(x$fpl$dfix), UNUSED) + +

    __aeabi_i2d (Thumb, 0 bytes, Stack size 0 bytes, dflt_clz.o(x$fpl$dflt)) +

    [Called By]

    • >>   READ_MPU3050 +
    + +

    _dflt (Thumb, 44 bytes, Stack size 0 bytes, dflt_clz.o(x$fpl$dflt), UNUSED) + +

    __dflt_normalise (Thumb, 0 bytes, Stack size unknown bytes, dflt_clz.o(x$fpl$dflt), UNUSED) + +

    __aeabi_dsub (Thumb, 0 bytes, Stack size 8 bytes, daddsub_clz.o(x$fpl$dsub), UNUSED) + +

    _dsub (Thumb, 572 bytes, Stack size 8 bytes, daddsub_clz.o(x$fpl$dsub), UNUSED) +

    [Calls]

    • >>   __fpl_dcheck_NaN2 +
    • >>   _dadd1 +
    + +

    __fpl_inf_dsub (Thumb, 0 bytes, Stack size unknown bytes, daddsub_clz.o(x$fpl$dsub), UNUSED) + +

    __dunder (Thumb, 234 bytes, Stack size 4 bytes, dunder.o(x$fpl$dunder), UNUSED) + +

    __dunder_d (Thumb, 2 bytes, Stack size 0 bytes, dunder.o(x$fpl$dunder), UNUSED) + +

    __fpl_return_NaN (Thumb, 100 bytes, Stack size 0 bytes, retnan.o(x$fpl$retnan), UNUSED) +

    [Calls]

    • >>   __fpl_cmpreturn +
    +
    [Called By]
    • >>   __fpl_dcheck_NaN1 +
    • >>   __fpl_dcheck_NaN2 +
    + +

    __fpl_cmpreturn (Thumb, 48 bytes, Stack size 0 bytes, trapv.o(x$fpl$trapveneer), UNUSED) +

    [Called By]

    • >>   __fpl_return_NaN +
    + +

    __I$use$fp (Thumb, 0 bytes, Stack size unknown bytes, usenofp.o(x$fpl$usenofp), UNUSED) +

    +

    +Local Symbols +

    +

    delay (Thumb, 14 bytes, Stack size 0 bytes, stm32f10x_flash.o(.text), UNUSED) +

    [Called By]

    • >>   FLASH_WaitForLastOperation +
    + +

    _dadd1 (Thumb, 0 bytes, Stack size unknown bytes, daddsub_clz.o(x$fpl$dadd), UNUSED) +

    [Called By]

    • >>   _dsub +
    + +

    _dsub1 (Thumb, 0 bytes, Stack size unknown bytes, daddsub_clz.o(x$fpl$dsub), UNUSED) +

    [Called By]

    • >>   _dadd +
    +

    +

    +Undefined Global Symbols +


    diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.lnp b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.lnp new file mode 100644 index 0000000..ac6acf6 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.lnp @@ -0,0 +1,4 @@ +--device DARMSTM "main.o" "stm32f10x_it.o" "stm32f10x_rcc.o" "stm32f10x_tim.o" "stm32f10x_usart.o" "stm32f10x_wwdg.o" "misc.o" "stm32f10x_gpio.o" "stm32f10x_flash.o" "startup_stm32f10x_hd.o" "core_cm3.o" "system_stm32f10x.o" --strict --scatter "lunzhou.sct" +--autoat --summary_stderr --info summarysizes --map --xref --callgraph --symbols +--info sizes --info totals --info unused --info veneers + --list ".\lunzhou.map" -o "lunzhou.axf" \ No newline at end of file diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.map b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.map new file mode 100644 index 0000000..9f49360 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.map @@ -0,0 +1,879 @@ +ARM Linker, RVCT4.0 [Build 524] for uVision [Standard] + +============================================================================== + +Section Cross References + + main.o(.text) refers to stm32f10x_gpio.o(.text) for GPIO_Init + main.o(.text) refers to stm32f10x_rcc.o(.text) for RCC_DeInit + main.o(.text) refers to stm32f10x_flash.o(.text) for FLASH_SetLatency + main.o(.text) refers to stm32f10x_usart.o(.text) for USART_ClockInit + main.o(.text) refers to main.o(.data) for test + main.o(.text) refers to misc.o(.text) for NVIC_PriorityGroupConfig + main.o(.text) refers to stm32f10x_wwdg.o(.text) for WWDG_SetPrescaler + main.o(.text) refers to dflt_clz.o(x$fpl$dflt) for __aeabi_i2d + main.o(.text) refers to ddiv.o(x$fpl$ddiv) for __aeabi_ddiv + main.o(.text) refers to dfix.o(x$fpl$dfix) for __aeabi_d2iz + main.o(.text) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + main.o(.text) refers to main.o(.bss) for BUF + stm32f10x_rcc.o(.text) refers to stm32f10x_rcc.o(.data) for .data + stm32f10x_tim.o(.text) refers to stm32f10x_rcc.o(.text) for RCC_APB2PeriphResetCmd + stm32f10x_usart.o(.text) refers to stm32f10x_rcc.o(.text) for RCC_APB2PeriphResetCmd + stm32f10x_wwdg.o(.text) refers to stm32f10x_rcc.o(.text) for RCC_APB1PeriphResetCmd + stm32f10x_gpio.o(.text) refers to stm32f10x_rcc.o(.text) for RCC_APB2PeriphResetCmd + startup_stm32f10x_hd.o(STACK) refers (Special) to heapauxi.o(.text) for __use_two_region_memory + startup_stm32f10x_hd.o(HEAP) refers (Special) to heapauxi.o(.text) for __use_two_region_memory + startup_stm32f10x_hd.o(RESET) refers (Special) to heapauxi.o(.text) for __use_two_region_memory + startup_stm32f10x_hd.o(RESET) refers to startup_stm32f10x_hd.o(.text) for Reset_Handler + startup_stm32f10x_hd.o(RESET) refers to stm32f10x_it.o(.text) for NMI_Handler + startup_stm32f10x_hd.o(RESET) refers to main.o(.text) for WWDG_IRQHandler + startup_stm32f10x_hd.o(.text) refers (Special) to heapauxi.o(.text) for __use_two_region_memory + startup_stm32f10x_hd.o(.text) refers to startup_stm32f10x_hd.o(STACK) for __initial_sp + startup_stm32f10x_hd.o(.text) refers to __main.o(!!!main) for __main + startup_stm32f10x_hd.o(.text) refers to startup_stm32f10x_hd.o(HEAP) for Heap_Mem + __main.o(!!!main) refers to rtentry.o(.ARM.Collect$$rtentry$$00000000) for __rt_entry + daddsub_clz.o(x$fpl$dadd) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + daddsub_clz.o(x$fpl$dadd) refers (Special) to dunder.o(x$fpl$dunder) for __dunder + daddsub_clz.o(x$fpl$dadd) refers to daddsub_clz.o(x$fpl$dsub) for _dsub1 + daddsub_clz.o(x$fpl$dadd) refers to dcheck.o(x$fpl$dcheck) for __fpl_dcheck_NaN2 + daddsub_clz.o(x$fpl$drsb) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + daddsub_clz.o(x$fpl$drsb) refers (Special) to dunder.o(x$fpl$dunder) for __dunder + daddsub_clz.o(x$fpl$drsb) refers to daddsub_clz.o(x$fpl$dadd) for _dadd1 + daddsub_clz.o(x$fpl$drsb) refers to daddsub_clz.o(x$fpl$dsub) for _dsub1 + daddsub_clz.o(x$fpl$dsub) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + daddsub_clz.o(x$fpl$dsub) refers (Special) to dunder.o(x$fpl$dunder) for __dunder + daddsub_clz.o(x$fpl$dsub) refers to daddsub_clz.o(x$fpl$dadd) for _dadd1 + daddsub_clz.o(x$fpl$dsub) refers to dcheck.o(x$fpl$dcheck) for __fpl_dcheck_NaN2 + ddiv.o(x$fpl$drdiv) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + ddiv.o(x$fpl$drdiv) refers (Special) to dunder.o(x$fpl$dunder) for __dunder + ddiv.o(x$fpl$drdiv) refers to ddiv.o(x$fpl$ddiv) for ddiv_entry + ddiv.o(x$fpl$ddiv) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + ddiv.o(x$fpl$ddiv) refers (Special) to dunder.o(x$fpl$dunder) for __dunder + ddiv.o(x$fpl$ddiv) refers to dcheck.o(x$fpl$dcheck) for __fpl_dcheck_NaN2 + dfix.o(x$fpl$dfix) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dfix.o(x$fpl$dfix) refers to dcheck1.o(x$fpl$dcheck1) for __fpl_dcheck_NaN1 + dfix.o(x$fpl$dfixr) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dfix.o(x$fpl$dfixr) refers to dcheck1.o(x$fpl$dcheck1) for __fpl_dcheck_NaN1 + dflt_clz.o(x$fpl$dfltu) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dflt_clz.o(x$fpl$dfltu) refers to dflt_clz.o(x$fpl$dflt) for __dflt_normalise + dflt_clz.o(x$fpl$dflt) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$0000000A) for __rt_entry_li + rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$0000000D) for __rt_entry_main + rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$0000000C) for __rt_entry_postli_1 + rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$00000009) for __rt_entry_postsh_1 + rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$00000002) for __rt_entry_presh_1 + rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to rtentry4.o(.ARM.Collect$$rtentry$$00000004) for __rt_entry_sh + rtentry.o(.ARM.exidx) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$0000000A) for __rt_entry_li + rtentry.o(.ARM.exidx) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$0000000D) for __rt_entry_main + rtentry.o(.ARM.exidx) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$0000000C) for __rt_entry_postli_1 + rtentry.o(.ARM.exidx) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$00000009) for __rt_entry_postsh_1 + rtentry.o(.ARM.exidx) refers (Special) to rtentry2.o(.ARM.Collect$$rtentry$$00000002) for __rt_entry_presh_1 + rtentry.o(.ARM.exidx) refers (Special) to rtentry4.o(.ARM.Collect$$rtentry$$00000004) for __rt_entry_sh + rtentry.o(.ARM.exidx) refers to rtentry.o(.ARM.Collect$$rtentry$$00000000) for .ARM.Collect$$rtentry$$00000000 + dcheck.o(x$fpl$dcheck) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dcheck.o(x$fpl$dcheck) refers to retnan.o(x$fpl$retnan) for __fpl_return_NaN + dcheck1.o(x$fpl$dcheck1) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dcheck1.o(x$fpl$dcheck1) refers to retnan.o(x$fpl$retnan) for __fpl_return_NaN + dunder.o(x$fpl$dunder) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + rtentry2.o(.ARM.Collect$$rtentry$$00000008) refers to boardinit2.o(.text) for _platform_post_stackheap_init + rtentry2.o(.ARM.Collect$$rtentry$$0000000A) refers to libinit.o(.ARM.Collect$$libinit$$00000000) for __rt_lib_init + rtentry2.o(.ARM.Collect$$rtentry$$0000000B) refers to boardinit3.o(.text) for _platform_post_lib_init + rtentry2.o(.ARM.Collect$$rtentry$$0000000D) refers to main.o(.text) for main + rtentry2.o(.ARM.Collect$$rtentry$$0000000D) refers to exit.o(.text) for exit + rtentry2.o(.ARM.exidx) refers to rtentry2.o(.ARM.Collect$$rtentry$$00000001) for .ARM.Collect$$rtentry$$00000001 + rtentry2.o(.ARM.exidx) refers to rtentry2.o(.ARM.Collect$$rtentry$$00000002) for .ARM.Collect$$rtentry$$00000002 + rtentry2.o(.ARM.exidx) refers to rtentry2.o(.ARM.Collect$$rtentry$$00000008) for .ARM.Collect$$rtentry$$00000008 + rtentry2.o(.ARM.exidx) refers to rtentry2.o(.ARM.Collect$$rtentry$$00000009) for .ARM.Collect$$rtentry$$00000009 + rtentry2.o(.ARM.exidx) refers to rtentry2.o(.ARM.Collect$$rtentry$$0000000A) for .ARM.Collect$$rtentry$$0000000A + rtentry2.o(.ARM.exidx) refers to rtentry2.o(.ARM.Collect$$rtentry$$0000000B) for .ARM.Collect$$rtentry$$0000000B + rtentry2.o(.ARM.exidx) refers to rtentry2.o(.ARM.Collect$$rtentry$$0000000C) for .ARM.Collect$$rtentry$$0000000C + rtentry2.o(.ARM.exidx) refers to rtentry2.o(.ARM.Collect$$rtentry$$0000000D) for .ARM.Collect$$rtentry$$0000000D + rtentry4.o(.ARM.Collect$$rtentry$$00000004) refers to sys_stackheap_outer.o(.text) for __user_setup_stackheap + rtentry4.o(.ARM.exidx) refers to rtentry4.o(.ARM.Collect$$rtentry$$00000004) for .ARM.Collect$$rtentry$$00000004 + retnan.o(x$fpl$retnan) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + retnan.o(x$fpl$retnan) refers to trapv.o(x$fpl$trapveneer) for __fpl_cmpreturn + sys_stackheap_outer.o(.text) refers to libspace.o(.text) for __user_perproc_libspace + sys_stackheap_outer.o(.text) refers to startup_stm32f10x_hd.o(.text) for __user_initial_stackheap + exit.o(.text) refers to rtexit.o(.ARM.Collect$$rtexit$$00000000) for __rt_exit + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000002A) for __rt_lib_init_alloca_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000028) for __rt_lib_init_argv_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000017) for __rt_lib_init_atexit_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000001D) for __rt_lib_init_clock_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000002E) for __rt_lib_init_cpp_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000002C) for __rt_lib_init_exceptions_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000001B) for __rt_lib_init_fp_trap_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000001F) for __rt_lib_init_getenv_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000006) for __rt_lib_init_heap_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000000D) for __rt_lib_init_lc_collate_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000000F) for __rt_lib_init_lc_ctype_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000011) for __rt_lib_init_lc_monetary_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000013) for __rt_lib_init_lc_numeric_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000015) for __rt_lib_init_lc_time_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000000A) for __rt_lib_init_rand_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000002F) for __rt_lib_init_return + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000019) for __rt_lib_init_signal_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000021) for __rt_lib_init_stdio_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000008) for __rt_lib_init_user_alloc_1 + trapv.o(x$fpl$trapveneer) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + libspace.o(.text) refers to libspace.o(.bss) for __libspace_start + rtexit.o(.ARM.Collect$$rtexit$$00000000) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000004) for __rt_exit_exit + rtexit.o(.ARM.Collect$$rtexit$$00000000) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000003) for __rt_exit_ls + rtexit.o(.ARM.Collect$$rtexit$$00000000) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000002) for __rt_exit_prels_1 + rtexit.o(.ARM.exidx) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000004) for __rt_exit_exit + rtexit.o(.ARM.exidx) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000003) for __rt_exit_ls + rtexit.o(.ARM.exidx) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000002) for __rt_exit_prels_1 + rtexit.o(.ARM.exidx) refers to rtexit.o(.ARM.Collect$$rtexit$$00000000) for .ARM.Collect$$rtexit$$00000000 + libinit2.o(.ARM.Collect$$libinit$$0000000C) refers to libinit2.o(.ARM.Collect$$libinit$$0000000B) for .ARM.Collect$$libinit$$0000000B + libinit2.o(.ARM.Collect$$libinit$$0000000E) refers to libinit2.o(.ARM.Collect$$libinit$$0000000B) for .ARM.Collect$$libinit$$0000000B + libinit2.o(.ARM.Collect$$libinit$$00000010) refers to libinit2.o(.ARM.Collect$$libinit$$0000000B) for .ARM.Collect$$libinit$$0000000B + libinit2.o(.ARM.Collect$$libinit$$00000012) refers to libinit2.o(.ARM.Collect$$libinit$$0000000B) for .ARM.Collect$$libinit$$0000000B + libinit2.o(.ARM.Collect$$libinit$$00000014) refers to libinit2.o(.ARM.Collect$$libinit$$0000000B) for .ARM.Collect$$libinit$$0000000B + libinit2.o(.ARM.Collect$$libinit$$00000022) refers to argv_veneer.o(.emb_text) for __ARM_argv_veneer + libinit2.o(.ARM.Collect$$libinit$$00000023) refers to argv_veneer.o(.emb_text) for __ARM_argv_veneer + rtexit2.o(.ARM.Collect$$rtexit$$00000003) refers to libshutdown.o(.ARM.Collect$$libshutdown$$00000000) for __rt_lib_shutdown + rtexit2.o(.ARM.Collect$$rtexit$$00000004) refers to sys_exit.o(.text) for _sys_exit + rtexit2.o(.ARM.exidx) refers to rtexit2.o(.ARM.Collect$$rtexit$$00000001) for .ARM.Collect$$rtexit$$00000001 + rtexit2.o(.ARM.exidx) refers to rtexit2.o(.ARM.Collect$$rtexit$$00000002) for .ARM.Collect$$rtexit$$00000002 + rtexit2.o(.ARM.exidx) refers to rtexit2.o(.ARM.Collect$$rtexit$$00000003) for .ARM.Collect$$rtexit$$00000003 + rtexit2.o(.ARM.exidx) refers to rtexit2.o(.ARM.Collect$$rtexit$$00000004) for .ARM.Collect$$rtexit$$00000004 + argv_veneer.o(.emb_text) refers to no_argv.o(.text) for __ARM_get_argv + sys_exit.o(.text) refers to use_no_semi.o(.text) for __I$use$semihosting + _get_argv_nomalloc.o(.text) refers (Special) to hrguard.o(.text) for __heap_region$guard + _get_argv_nomalloc.o(.text) refers to defsig_rtmem_outer.o(.text) for __rt_SIGRTMEM + _get_argv_nomalloc.o(.text) refers to sys_command.o(.text) for _sys_command_string + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$00000006) for __rt_lib_shutdown_fp_trap_1 + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$0000000E) for __rt_lib_shutdown_heap_1 + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F) for __rt_lib_shutdown_return + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$00000009) for __rt_lib_shutdown_signal_1 + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$00000003) for __rt_lib_shutdown_stdio_1 + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$0000000B) for __rt_lib_shutdown_user_alloc_1 + sys_command.o(.text) refers (Special) to use_no_semi.o(.text) for __I$use$semihosting + defsig_rtmem_outer.o(.text) refers to defsig_rtmem_inner.o(.text) for __rt_SIGRTMEM_inner + defsig_rtmem_outer.o(.text) refers to defsig_exit.o(.text) for __sig_exit + defsig_rtmem_formal.o(.text) refers to rt_raise.o(.text) for __rt_raise + rt_raise.o(.text) refers to __raise.o(.text) for __raise + rt_raise.o(.text) refers to sys_exit.o(.text) for _sys_exit + defsig_exit.o(.text) refers to sys_exit.o(.text) for _sys_exit + defsig_rtmem_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + __raise.o(.text) refers to defsig.o(CL$$defsig) for __default_signal_handler + defsig_general.o(.text) refers to sys_wrch.o(.text) for _ttywrch + sys_wrch.o(.text) refers (Special) to use_no_semi.o(.text) for __I$use$semihosting + defsig.o(CL$$defsig) refers to defsig_rtmem_inner.o(.text) for __rt_SIGRTMEM_inner + defsig_abrt_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_fpe_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_rtred_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_stak_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_pvfn_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_cppl_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_segv_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_other.o(.text) refers to defsig_general.o(.text) for __default_signal_display + + +============================================================================== + +Removing Unused input sections from the image. + + Removing stm32f10x_tim.o(.text), (2786 bytes). + Removing core_cm3.o(.emb_text), (32 bytes). + Removing system_stm32f10x.o(.text), (292 bytes). + Removing system_stm32f10x.o(.constdata), (20 bytes). + +4 unused section(s) (total 3130 bytes) removed from the image. + +============================================================================== + +Image Symbol Table + + Local Symbols + + Symbol Name Value Ov Type Size Object(Section) + + ../../angel/boardlib.s 0x00000000 Number 0 boardshut.o ABSOLUTE + ../../angel/boardlib.s 0x00000000 Number 0 boardinit3.o ABSOLUTE + ../../angel/boardlib.s 0x00000000 Number 0 boardinit1.o ABSOLUTE + ../../angel/boardlib.s 0x00000000 Number 0 boardinit2.o ABSOLUTE + ../../angel/handlers.s 0x00000000 Number 0 __scatter_copy.o ABSOLUTE + ../../angel/handlers.s 0x00000000 Number 0 __scatter_zi.o ABSOLUTE + ../../angel/kernel.s 0x00000000 Number 0 rtentry.o ABSOLUTE + ../../angel/kernel.s 0x00000000 Number 0 rtentry2.o ABSOLUTE + ../../angel/kernel.s 0x00000000 Number 0 rtexit2.o ABSOLUTE + ../../angel/kernel.s 0x00000000 Number 0 rtentry4.o ABSOLUTE + ../../angel/kernel.s 0x00000000 Number 0 rtexit.o ABSOLUTE + ../../angel/rt.s 0x00000000 Number 0 rt_raise.o ABSOLUTE + ../../angel/scatter.s 0x00000000 Number 0 __scatter.o ABSOLUTE + ../../angel/startup.s 0x00000000 Number 0 __main.o ABSOLUTE + ../../angel/sys.s 0x00000000 Number 0 sys_exit.o ABSOLUTE + ../../angel/sys.s 0x00000000 Number 0 sys_stackheap_outer.o ABSOLUTE + ../../angel/sys.s 0x00000000 Number 0 use_no_semi.o ABSOLUTE + ../../angel/sys.s 0x00000000 Number 0 libspace.o ABSOLUTE + ../../angel/sysapp.c 0x00000000 Number 0 sys_wrch.o ABSOLUTE + ../../angel/sysapp.c 0x00000000 Number 0 sys_command.o ABSOLUTE + ../../armsys.c 0x00000000 Number 0 _get_argv_nomalloc.o ABSOLUTE + ../../armsys.c 0x00000000 Number 0 argv_veneer.o ABSOLUTE + ../../armsys.c 0x00000000 Number 0 no_argv.o ABSOLUTE + ../../armsys.c 0x00000000 Number 0 argv_veneer.o ABSOLUTE + ../../daddsub.s 0x00000000 Number 0 daddsub_clz.o ABSOLUTE + ../../dcheck.s 0x00000000 Number 0 dcheck.o ABSOLUTE + ../../dcheck1.s 0x00000000 Number 0 dcheck1.o ABSOLUTE + ../../ddiv.s 0x00000000 Number 0 ddiv.o ABSOLUTE + ../../dfix.s 0x00000000 Number 0 dfix.o ABSOLUTE + ../../dflt.s 0x00000000 Number 0 dflt_clz.o ABSOLUTE + ../../dunder.s 0x00000000 Number 0 dunder.o ABSOLUTE + ../../fpinit.s 0x00000000 Number 0 fpinit.o ABSOLUTE + ../../heapalloc.c 0x00000000 Number 0 hrguard.o ABSOLUTE + ../../heapaux.c 0x00000000 Number 0 heapauxi.o ABSOLUTE + ../../libinit.s 0x00000000 Number 0 libinit.o ABSOLUTE + ../../libinit.s 0x00000000 Number 0 libshutdown2.o ABSOLUTE + ../../libinit.s 0x00000000 Number 0 libinit2.o ABSOLUTE + ../../libinit.s 0x00000000 Number 0 libshutdown.o ABSOLUTE + ../../retnan.s 0x00000000 Number 0 retnan.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_rtmem_outer.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_other.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_segv_inner.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_cppl_inner.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_exit.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_pvfn_inner.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_stak_inner.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_rtred_inner.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_fpe_inner.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_abrt_inner.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_general.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 __raise.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_rtmem_inner.o ABSOLUTE + ../../signal.c 0x00000000 Number 0 defsig_rtmem_formal.o ABSOLUTE + ../../signal.s 0x00000000 Number 0 defsig.o ABSOLUTE + ../../stdlib.c 0x00000000 Number 0 exit.o ABSOLUTE + ../../trapv.s 0x00000000 Number 0 trapv.o ABSOLUTE + ../../usenofp.s 0x00000000 Number 0 usenofp.o ABSOLUTE + Libraries\CMSIS\Core\CM3\core_cm3.c 0x00000000 Number 0 core_cm3.o ABSOLUTE + Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s 0x00000000 Number 0 startup_stm32f10x_hd.o ABSOLUTE + Libraries\CMSIS\Core\CM3\system_stm32f10x.c 0x00000000 Number 0 system_stm32f10x.o ABSOLUTE + Libraries\STM32F10x_StdPeriph_Driver\src\misc.c 0x00000000 Number 0 misc.o ABSOLUTE + Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c 0x00000000 Number 0 stm32f10x_flash.o ABSOLUTE + Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c 0x00000000 Number 0 stm32f10x_gpio.o ABSOLUTE + Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c 0x00000000 Number 0 stm32f10x_rcc.o ABSOLUTE + Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c 0x00000000 Number 0 stm32f10x_tim.o ABSOLUTE + Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c 0x00000000 Number 0 stm32f10x_usart.o ABSOLUTE + Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c 0x00000000 Number 0 stm32f10x_wwdg.o ABSOLUTE + Libraries\\CMSIS\\Core\\CM3\\core_cm3.c 0x00000000 Number 0 core_cm3.o ABSOLUTE + SRC\main.c 0x00000000 Number 0 main.o ABSOLUTE + SRC\stm32f10x_it.c 0x00000000 Number 0 stm32f10x_it.o ABSOLUTE + dc.s 0x00000000 Number 0 dc.o ABSOLUTE + RESET 0x08000000 Section 304 startup_stm32f10x_hd.o(RESET) + !!!main 0x08000130 Section 8 __main.o(!!!main) + !!!scatter 0x08000138 Section 52 __scatter.o(!!!scatter) + !!handler_copy 0x0800016c Section 26 __scatter_copy.o(!!handler_copy) + !!handler_zi 0x08000188 Section 28 __scatter_zi.o(!!handler_zi) + .ARM.Collect$$libinit$$00000000 0x080001a4 Section 6 libinit.o(.ARM.Collect$$libinit$$00000000) + .ARM.Collect$$libinit$$00000006 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$00000006) + .ARM.Collect$$libinit$$00000008 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$00000008) + .ARM.Collect$$libinit$$0000000A 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$0000000A) + .ARM.Collect$$libinit$$0000000D 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$0000000D) + .ARM.Collect$$libinit$$0000000F 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$0000000F) + .ARM.Collect$$libinit$$00000011 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$00000011) + .ARM.Collect$$libinit$$00000013 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$00000013) + .ARM.Collect$$libinit$$00000015 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$00000015) + .ARM.Collect$$libinit$$00000017 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$00000017) + .ARM.Collect$$libinit$$00000019 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$00000019) + .ARM.Collect$$libinit$$0000001B 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$0000001B) + .ARM.Collect$$libinit$$0000001D 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$0000001D) + .ARM.Collect$$libinit$$0000001F 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$0000001F) + .ARM.Collect$$libinit$$00000021 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$00000021) + .ARM.Collect$$libinit$$00000028 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$00000028) + .ARM.Collect$$libinit$$0000002A 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$0000002A) + .ARM.Collect$$libinit$$0000002C 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$0000002C) + .ARM.Collect$$libinit$$0000002E 0x080001aa Section 0 libinit2.o(.ARM.Collect$$libinit$$0000002E) + .ARM.Collect$$libinit$$0000002F 0x080001aa Section 2 libinit2.o(.ARM.Collect$$libinit$$0000002F) + .ARM.Collect$$libshutdown$$00000000 0x080001ac Section 2 libshutdown.o(.ARM.Collect$$libshutdown$$00000000) + .ARM.Collect$$libshutdown$$00000003 0x080001ae Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000003) + .ARM.Collect$$libshutdown$$00000006 0x080001ae Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000006) + .ARM.Collect$$libshutdown$$00000009 0x080001ae Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000009) + .ARM.Collect$$libshutdown$$0000000B 0x080001ae Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000B) + .ARM.Collect$$libshutdown$$0000000E 0x080001ae Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000E) + .ARM.Collect$$libshutdown$$0000000F 0x080001ae Section 2 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F) + .ARM.Collect$$rtentry$$00000000 0x080001b0 Section 0 rtentry.o(.ARM.Collect$$rtentry$$00000000) + .ARM.Collect$$rtentry$$00000002 0x080001b0 Section 0 rtentry2.o(.ARM.Collect$$rtentry$$00000002) + .ARM.Collect$$rtentry$$00000004 0x080001b0 Section 6 rtentry4.o(.ARM.Collect$$rtentry$$00000004) + .ARM.Collect$$rtentry$$00000009 0x080001b6 Section 0 rtentry2.o(.ARM.Collect$$rtentry$$00000009) + .ARM.Collect$$rtentry$$0000000A 0x080001b6 Section 4 rtentry2.o(.ARM.Collect$$rtentry$$0000000A) + .ARM.Collect$$rtentry$$0000000C 0x080001ba Section 0 rtentry2.o(.ARM.Collect$$rtentry$$0000000C) + .ARM.Collect$$rtentry$$0000000D 0x080001ba Section 8 rtentry2.o(.ARM.Collect$$rtentry$$0000000D) + .ARM.Collect$$rtexit$$00000000 0x080001c2 Section 0 rtexit.o(.ARM.Collect$$rtexit$$00000000) + .ARM.Collect$$rtexit$$00000002 0x080001c2 Section 0 rtexit2.o(.ARM.Collect$$rtexit$$00000002) + .ARM.Collect$$rtexit$$00000003 0x080001c2 Section 4 rtexit2.o(.ARM.Collect$$rtexit$$00000003) + .ARM.Collect$$rtexit$$00000004 0x080001c6 Section 4 rtexit2.o(.ARM.Collect$$rtexit$$00000004) + .text 0x080001cc Section 1932 main.o(.text) + .text 0x08000958 Section 26 stm32f10x_it.o(.text) + .text 0x08000974 Section 912 stm32f10x_rcc.o(.text) + .text 0x08000d04 Section 932 stm32f10x_usart.o(.text) + .text 0x080010a8 Section 132 stm32f10x_wwdg.o(.text) + .text 0x0800112c Section 224 misc.o(.text) + .text 0x0800120c Section 808 stm32f10x_gpio.o(.text) + .text 0x08001534 Section 1328 stm32f10x_flash.o(.text) + delay 0x080015bd Thumb Code 14 stm32f10x_flash.o(.text) + .text 0x08001a64 Section 76 startup_stm32f10x_hd.o(.text) + .text 0x08001ab0 Section 6 heapauxi.o(.text) + .text 0x08001ab6 Section 74 sys_stackheap_outer.o(.text) + .text 0x08001b00 Section 12 exit.o(.text) + .text 0x08001b0c Section 8 libspace.o(.text) + .text 0x08001b14 Section 20 sys_exit.o(.text) + .text 0x08001b28 Section 2 use_no_semi.o(.text) + x$fpl$dadd 0x08001b2c Section 440 daddsub_clz.o(x$fpl$dadd) + _dadd1 0x08001b3d Thumb Code 0 daddsub_clz.o(x$fpl$dadd) + x$fpl$dcheck 0x08001ce4 Section 16 dcheck.o(x$fpl$dcheck) + x$fpl$dcheck1 0x08001cf4 Section 16 dcheck1.o(x$fpl$dcheck1) + x$fpl$ddiv 0x08001d04 Section 1024 ddiv.o(x$fpl$ddiv) + ddiv_entry 0x08001d07 Thumb Code 0 ddiv.o(x$fpl$ddiv) + x$fpl$dfix 0x08002104 Section 156 dfix.o(x$fpl$dfix) + x$fpl$dflt 0x080021a0 Section 44 dflt_clz.o(x$fpl$dflt) + x$fpl$dsub 0x080021cc Section 584 daddsub_clz.o(x$fpl$dsub) + _dsub1 0x080021dd Thumb Code 0 daddsub_clz.o(x$fpl$dsub) + x$fpl$dunder 0x08002414 Section 236 dunder.o(x$fpl$dunder) + x$fpl$retnan 0x08002500 Section 100 retnan.o(x$fpl$retnan) + x$fpl$trapveneer 0x08002564 Section 48 trapv.o(x$fpl$trapveneer) + x$fpl$usenofp 0x08002594 Section 0 usenofp.o(x$fpl$usenofp) + .data 0x20000000 Section 20 main.o(.data) + .data 0x20000014 Section 20 stm32f10x_rcc.o(.data) + APBAHBPrescTable 0x20000014 Data 16 stm32f10x_rcc.o(.data) + ADCPrescTable 0x20000024 Data 4 stm32f10x_rcc.o(.data) + .bss 0x20000028 Section 10 main.o(.bss) + .bss 0x20000034 Section 96 libspace.o(.bss) + HEAP 0x20000098 Section 512 startup_stm32f10x_hd.o(HEAP) + Heap_Mem 0x20000098 Data 512 startup_stm32f10x_hd.o(HEAP) + STACK 0x20000298 Section 1024 startup_stm32f10x_hd.o(STACK) + Stack_Mem 0x20000298 Data 1024 startup_stm32f10x_hd.o(STACK) + __initial_sp 0x20000698 Data 0 startup_stm32f10x_hd.o(STACK) + + Global Symbols + + Symbol Name Value Ov Type Size Object(Section) + + BuildAttributes$$THM_ISAv4$P$D$K$B$S$PE$A:L22UL41UL21$X:L11$S22US41US21$IEEE1$IW$USESV6$~STKCKD$USESV7$~SHL$OSPACE$ROPI$EBA8$UX$STANDARDLIB$REQ8$PRES8$EABIv2 0x00000000 Number 0 anon$$obj.o ABSOLUTE + __ARM_use_no_argv 0x00000000 Number 0 main.o ABSOLUTE + __ARM_exceptions_init - Undefined Weak Reference + __alloca_initialize - Undefined Weak Reference + __cpp_initialize__aeabi_ - Undefined Weak Reference + __cxa_finalize - Undefined Weak Reference + __fpl_infinity - Undefined Weak Reference + __rt_locale - Undefined Weak Reference + __sigvec_lookup - Undefined Weak Reference + _atexit_init - Undefined Weak Reference + _call_atexit_fns - Undefined Weak Reference + _clock_init - Undefined Weak Reference + _fp_trap_init - Undefined Weak Reference + _fp_trap_shutdown - Undefined Weak Reference + _get_lc_collate - Undefined Weak Reference + _get_lc_ctype - Undefined Weak Reference + _get_lc_monetary - Undefined Weak Reference + _get_lc_numeric - Undefined Weak Reference + _get_lc_time - Undefined Weak Reference + _getenv_init - Undefined Weak Reference + _handle_redirection - Undefined Weak Reference + _init_alloc - Undefined Weak Reference + _init_user_alloc - Undefined Weak Reference + _initio - Undefined Weak Reference + _rand_init - Undefined Weak Reference + _signal_finish - Undefined Weak Reference + _signal_init - Undefined Weak Reference + _terminate_alloc - Undefined Weak Reference + _terminate_user_alloc - Undefined Weak Reference + _terminateio - Undefined Weak Reference + __Vectors_Size 0x00000130 Number 0 startup_stm32f10x_hd.o ABSOLUTE + __Vectors 0x08000000 Data 4 startup_stm32f10x_hd.o(RESET) + __Vectors_End 0x08000130 Data 0 startup_stm32f10x_hd.o(RESET) + __main 0x08000131 Thumb Code 8 __main.o(!!!main) + __scatterload 0x08000139 Thumb Code 0 __scatter.o(!!!scatter) + __scatterload_rt2 0x08000139 Thumb Code 44 __scatter.o(!!!scatter) + __scatterload_rt2_thumb_only 0x08000139 Thumb Code 0 __scatter.o(!!!scatter) + __scatterload_null 0x08000147 Thumb Code 0 __scatter.o(!!!scatter) + __scatterload_copy 0x0800016d Thumb Code 26 __scatter_copy.o(!!handler_copy) + __scatterload_zeroinit 0x08000189 Thumb Code 28 __scatter_zi.o(!!handler_zi) + __rt_lib_init 0x080001a5 Thumb Code 0 libinit.o(.ARM.Collect$$libinit$$00000000) + __rt_lib_init_alloca_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000002A) + __rt_lib_init_argv_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000028) + __rt_lib_init_atexit_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000017) + __rt_lib_init_clock_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000001D) + __rt_lib_init_cpp_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000002E) + __rt_lib_init_exceptions_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000002C) + __rt_lib_init_fp_trap_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000001B) + __rt_lib_init_getenv_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000001F) + __rt_lib_init_heap_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000006) + __rt_lib_init_lc_collate_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000000D) + __rt_lib_init_lc_ctype_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000000F) + __rt_lib_init_lc_monetary_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000011) + __rt_lib_init_lc_numeric_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000013) + __rt_lib_init_lc_time_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000015) + __rt_lib_init_rand_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000000A) + __rt_lib_init_return 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000002F) + __rt_lib_init_signal_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000019) + __rt_lib_init_stdio_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000021) + __rt_lib_init_user_alloc_1 0x080001ab Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000008) + __rt_lib_shutdown 0x080001ad Thumb Code 0 libshutdown.o(.ARM.Collect$$libshutdown$$00000000) + __rt_lib_shutdown_fp_trap_1 0x080001af Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000006) + __rt_lib_shutdown_heap_1 0x080001af Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000E) + __rt_lib_shutdown_return 0x080001af Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F) + __rt_lib_shutdown_signal_1 0x080001af Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000009) + __rt_lib_shutdown_stdio_1 0x080001af Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000003) + __rt_lib_shutdown_user_alloc_1 0x080001af Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000B) + __rt_entry 0x080001b1 Thumb Code 0 rtentry.o(.ARM.Collect$$rtentry$$00000000) + __rt_entry_presh_1 0x080001b1 Thumb Code 0 rtentry2.o(.ARM.Collect$$rtentry$$00000002) + __rt_entry_sh 0x080001b1 Thumb Code 0 rtentry4.o(.ARM.Collect$$rtentry$$00000004) + __rt_entry_li 0x080001b7 Thumb Code 0 rtentry2.o(.ARM.Collect$$rtentry$$0000000A) + __rt_entry_postsh_1 0x080001b7 Thumb Code 0 rtentry2.o(.ARM.Collect$$rtentry$$00000009) + __rt_entry_main 0x080001bb Thumb Code 0 rtentry2.o(.ARM.Collect$$rtentry$$0000000D) + __rt_entry_postli_1 0x080001bb Thumb Code 0 rtentry2.o(.ARM.Collect$$rtentry$$0000000C) + __rt_exit 0x080001c3 Thumb Code 0 rtexit.o(.ARM.Collect$$rtexit$$00000000) + __rt_exit_ls 0x080001c3 Thumb Code 0 rtexit2.o(.ARM.Collect$$rtexit$$00000003) + __rt_exit_prels_1 0x080001c3 Thumb Code 0 rtexit2.o(.ARM.Collect$$rtexit$$00000002) + __rt_exit_exit 0x080001c7 Thumb Code 0 rtexit2.o(.ARM.Collect$$rtexit$$00000004) + DATA_printf 0x080001cd Thumb Code 88 main.o(.text) + I2C_GPIO_Config 0x08000225 Thumb Code 56 main.o(.text) + I2C_delay 0x0800025d Thumb Code 14 main.o(.text) + delay5ms 0x0800026b Thumb Code 14 main.o(.text) + I2C_Start 0x08000279 Thumb Code 90 main.o(.text) + I2C_Stop 0x080002d3 Thumb Code 52 main.o(.text) + I2C_Ack 0x08000307 Thumb Code 52 main.o(.text) + I2C_NoAck 0x0800033b Thumb Code 52 main.o(.text) + I2C_WaitAck 0x0800036f Thumb Code 82 main.o(.text) + I2C_SendByte 0x080003c1 Thumb Code 84 main.o(.text) + I2C_RadeByte 0x08000415 Thumb Code 82 main.o(.text) + Single_Write 0x08000467 Thumb Code 70 main.o(.text) + Single_Read 0x080004ad Thumb Code 86 main.o(.text) + RCC_Configuration 0x08000503 Thumb Code 144 main.o(.text) + GPIO_Configuration 0x08000593 Thumb Code 62 main.o(.text) + USART1_Configuration 0x080005d1 Thumb Code 144 main.o(.text) + NVIC_Configuration 0x08000661 Thumb Code 28 main.o(.text) + WWDG_Configuration 0x0800067d Thumb Code 40 main.o(.text) + Delay 0x080006a5 Thumb Code 10 main.o(.text) + Delayms 0x080006af Thumb Code 24 main.o(.text) + WWDG_IRQHandler 0x080006c7 Thumb Code 14 main.o(.text) + USART1_SendData 0x080006d5 Thumb Code 20 main.o(.text) + Init_MPU3050 0x080006e9 Thumb Code 54 main.o(.text) + READ_MPU3050 0x0800071f Thumb Code 340 main.o(.text) + Send_data 0x08000873 Thumb Code 50 main.o(.text) + main 0x080008a5 Thumb Code 126 main.o(.text) + NMI_Handler 0x08000959 Thumb Code 2 stm32f10x_it.o(.text) + HardFault_Handler 0x0800095b Thumb Code 4 stm32f10x_it.o(.text) + MemManage_Handler 0x0800095f Thumb Code 4 stm32f10x_it.o(.text) + BusFault_Handler 0x08000963 Thumb Code 4 stm32f10x_it.o(.text) + UsageFault_Handler 0x08000967 Thumb Code 4 stm32f10x_it.o(.text) + SVC_Handler 0x0800096b Thumb Code 2 stm32f10x_it.o(.text) + DebugMon_Handler 0x0800096d Thumb Code 2 stm32f10x_it.o(.text) + PendSV_Handler 0x0800096f Thumb Code 2 stm32f10x_it.o(.text) + SysTick_Handler 0x08000971 Thumb Code 2 stm32f10x_it.o(.text) + RCC_DeInit 0x08000975 Thumb Code 64 stm32f10x_rcc.o(.text) + RCC_HSEConfig 0x080009b5 Thumb Code 70 stm32f10x_rcc.o(.text) + RCC_GetFlagStatus 0x080009fb Thumb Code 56 stm32f10x_rcc.o(.text) + RCC_WaitForHSEStartUp 0x08000a33 Thumb Code 48 stm32f10x_rcc.o(.text) + RCC_AdjustHSICalibrationValue 0x08000a63 Thumb Code 18 stm32f10x_rcc.o(.text) + RCC_HSICmd 0x08000a75 Thumb Code 6 stm32f10x_rcc.o(.text) + RCC_PLLConfig 0x08000a7b Thumb Code 22 stm32f10x_rcc.o(.text) + RCC_PLLCmd 0x08000a91 Thumb Code 6 stm32f10x_rcc.o(.text) + RCC_SYSCLKConfig 0x08000a97 Thumb Code 16 stm32f10x_rcc.o(.text) + RCC_GetSYSCLKSource 0x08000aa7 Thumb Code 10 stm32f10x_rcc.o(.text) + RCC_HCLKConfig 0x08000ab1 Thumb Code 16 stm32f10x_rcc.o(.text) + RCC_PCLK1Config 0x08000ac1 Thumb Code 16 stm32f10x_rcc.o(.text) + RCC_PCLK2Config 0x08000ad1 Thumb Code 18 stm32f10x_rcc.o(.text) + RCC_ITConfig 0x08000ae3 Thumb Code 30 stm32f10x_rcc.o(.text) + RCC_USBCLKConfig 0x08000b01 Thumb Code 8 stm32f10x_rcc.o(.text) + RCC_ADCCLKConfig 0x08000b09 Thumb Code 16 stm32f10x_rcc.o(.text) + RCC_LSEConfig 0x08000b19 Thumb Code 50 stm32f10x_rcc.o(.text) + RCC_LSICmd 0x08000b4b Thumb Code 6 stm32f10x_rcc.o(.text) + RCC_RTCCLKConfig 0x08000b51 Thumb Code 12 stm32f10x_rcc.o(.text) + RCC_RTCCLKCmd 0x08000b5d Thumb Code 8 stm32f10x_rcc.o(.text) + RCC_GetClocksFreq 0x08000b65 Thumb Code 194 stm32f10x_rcc.o(.text) + RCC_AHBPeriphClockCmd 0x08000c27 Thumb Code 26 stm32f10x_rcc.o(.text) + RCC_APB2PeriphClockCmd 0x08000c41 Thumb Code 26 stm32f10x_rcc.o(.text) + RCC_APB1PeriphClockCmd 0x08000c5b Thumb Code 26 stm32f10x_rcc.o(.text) + RCC_APB2PeriphResetCmd 0x08000c75 Thumb Code 26 stm32f10x_rcc.o(.text) + RCC_APB1PeriphResetCmd 0x08000c8f Thumb Code 26 stm32f10x_rcc.o(.text) + RCC_BackupResetCmd 0x08000ca9 Thumb Code 8 stm32f10x_rcc.o(.text) + RCC_ClockSecuritySystemCmd 0x08000cb1 Thumb Code 6 stm32f10x_rcc.o(.text) + RCC_MCOConfig 0x08000cb7 Thumb Code 6 stm32f10x_rcc.o(.text) + RCC_ClearFlag 0x08000cbd Thumb Code 14 stm32f10x_rcc.o(.text) + RCC_GetITStatus 0x08000ccb Thumb Code 20 stm32f10x_rcc.o(.text) + RCC_ClearITPendingBit 0x08000cdf Thumb Code 6 stm32f10x_rcc.o(.text) + USART_DeInit 0x08000d05 Thumb Code 134 stm32f10x_usart.o(.text) + USART_Init 0x08000d8b Thumb Code 156 stm32f10x_usart.o(.text) + USART_StructInit 0x08000e27 Thumb Code 24 stm32f10x_usart.o(.text) + USART_ClockInit 0x08000e3f Thumb Code 32 stm32f10x_usart.o(.text) + USART_ClockStructInit 0x08000e5f Thumb Code 12 stm32f10x_usart.o(.text) + USART_Cmd 0x08000e6b Thumb Code 24 stm32f10x_usart.o(.text) + USART_ITConfig 0x08000e83 Thumb Code 72 stm32f10x_usart.o(.text) + USART_DMACmd 0x08000ecb Thumb Code 24 stm32f10x_usart.o(.text) + USART_SetAddress 0x08000ee3 Thumb Code 18 stm32f10x_usart.o(.text) + USART_WakeUpConfig 0x08000ef5 Thumb Code 18 stm32f10x_usart.o(.text) + USART_ReceiverWakeUpCmd 0x08000f07 Thumb Code 24 stm32f10x_usart.o(.text) + USART_LINBreakDetectLengthConfig 0x08000f1f Thumb Code 18 stm32f10x_usart.o(.text) + USART_LINCmd 0x08000f31 Thumb Code 24 stm32f10x_usart.o(.text) + USART_SendData 0x08000f49 Thumb Code 8 stm32f10x_usart.o(.text) + USART_ReceiveData 0x08000f51 Thumb Code 10 stm32f10x_usart.o(.text) + USART_SendBreak 0x08000f5b Thumb Code 10 stm32f10x_usart.o(.text) + USART_SetGuardTime 0x08000f65 Thumb Code 16 stm32f10x_usart.o(.text) + USART_SetPrescaler 0x08000f75 Thumb Code 16 stm32f10x_usart.o(.text) + USART_SmartCardCmd 0x08000f85 Thumb Code 24 stm32f10x_usart.o(.text) + USART_SmartCardNACKCmd 0x08000f9d Thumb Code 24 stm32f10x_usart.o(.text) + USART_HalfDuplexCmd 0x08000fb5 Thumb Code 24 stm32f10x_usart.o(.text) + USART_IrDAConfig 0x08000fcd Thumb Code 18 stm32f10x_usart.o(.text) + USART_IrDACmd 0x08000fdf Thumb Code 24 stm32f10x_usart.o(.text) + USART_GetFlagStatus 0x08000ff7 Thumb Code 26 stm32f10x_usart.o(.text) + USART_ClearFlag 0x08001011 Thumb Code 18 stm32f10x_usart.o(.text) + USART_GetITStatus 0x08001023 Thumb Code 84 stm32f10x_usart.o(.text) + USART_ClearITPendingBit 0x08001077 Thumb Code 30 stm32f10x_usart.o(.text) + WWDG_DeInit 0x080010a9 Thumb Code 22 stm32f10x_wwdg.o(.text) + WWDG_SetPrescaler 0x080010bf Thumb Code 20 stm32f10x_wwdg.o(.text) + WWDG_SetWindowValue 0x080010d3 Thumb Code 24 stm32f10x_wwdg.o(.text) + WWDG_EnableIT 0x080010eb Thumb Code 8 stm32f10x_wwdg.o(.text) + WWDG_SetCounter 0x080010f3 Thumb Code 12 stm32f10x_wwdg.o(.text) + WWDG_Enable 0x080010ff Thumb Code 12 stm32f10x_wwdg.o(.text) + WWDG_GetFlagStatus 0x0800110b Thumb Code 10 stm32f10x_wwdg.o(.text) + WWDG_ClearFlag 0x08001115 Thumb Code 10 stm32f10x_wwdg.o(.text) + NVIC_PriorityGroupConfig 0x0800112d Thumb Code 10 misc.o(.text) + NVIC_Init 0x08001137 Thumb Code 102 misc.o(.text) + NVIC_SetVectorTable 0x0800119d Thumb Code 14 misc.o(.text) + NVIC_SystemLPConfig 0x080011ab Thumb Code 38 misc.o(.text) + SysTick_CLKSourceConfig 0x080011d1 Thumb Code 40 misc.o(.text) + GPIO_DeInit 0x0800120d Thumb Code 172 stm32f10x_gpio.o(.text) + GPIO_AFIODeInit 0x080012b9 Thumb Code 20 stm32f10x_gpio.o(.text) + GPIO_Init 0x080012cd Thumb Code 268 stm32f10x_gpio.o(.text) + GPIO_StructInit 0x080013d9 Thumb Code 16 stm32f10x_gpio.o(.text) + GPIO_ReadInputDataBit 0x080013e9 Thumb Code 18 stm32f10x_gpio.o(.text) + GPIO_ReadInputData 0x080013fb Thumb Code 8 stm32f10x_gpio.o(.text) + GPIO_ReadOutputDataBit 0x08001403 Thumb Code 18 stm32f10x_gpio.o(.text) + GPIO_ReadOutputData 0x08001415 Thumb Code 8 stm32f10x_gpio.o(.text) + GPIO_SetBits 0x0800141d Thumb Code 4 stm32f10x_gpio.o(.text) + GPIO_ResetBits 0x08001421 Thumb Code 4 stm32f10x_gpio.o(.text) + GPIO_WriteBit 0x08001425 Thumb Code 10 stm32f10x_gpio.o(.text) + GPIO_Write 0x0800142f Thumb Code 4 stm32f10x_gpio.o(.text) + GPIO_PinLockConfig 0x08001433 Thumb Code 18 stm32f10x_gpio.o(.text) + GPIO_EventOutputConfig 0x08001445 Thumb Code 24 stm32f10x_gpio.o(.text) + GPIO_EventOutputCmd 0x0800145d Thumb Code 6 stm32f10x_gpio.o(.text) + GPIO_PinRemapConfig 0x08001463 Thumb Code 104 stm32f10x_gpio.o(.text) + GPIO_EXTILineConfig 0x080014cb Thumb Code 60 stm32f10x_gpio.o(.text) + GPIO_ETH_MediaInterfaceConfig 0x08001507 Thumb Code 8 stm32f10x_gpio.o(.text) + FLASH_SetLatency 0x08001535 Thumb Code 16 stm32f10x_flash.o(.text) + FLASH_HalfCycleAccessCmd 0x08001545 Thumb Code 22 stm32f10x_flash.o(.text) + FLASH_PrefetchBufferCmd 0x0800155b Thumb Code 22 stm32f10x_flash.o(.text) + FLASH_Unlock 0x08001571 Thumb Code 12 stm32f10x_flash.o(.text) + FLASH_Lock 0x0800157d Thumb Code 14 stm32f10x_flash.o(.text) + FLASH_GetStatus 0x0800158b Thumb Code 50 stm32f10x_flash.o(.text) + FLASH_WaitForLastOperation 0x080015cb Thumb Code 42 stm32f10x_flash.o(.text) + FLASH_ErasePage 0x080015f5 Thumb Code 76 stm32f10x_flash.o(.text) + FLASH_EraseAllPages 0x08001641 Thumb Code 72 stm32f10x_flash.o(.text) + FLASH_EraseOptionBytes 0x08001689 Thumb Code 142 stm32f10x_flash.o(.text) + FLASH_ProgramWord 0x08001717 Thumb Code 108 stm32f10x_flash.o(.text) + FLASH_ProgramHalfWord 0x08001783 Thumb Code 64 stm32f10x_flash.o(.text) + FLASH_ProgramOptionByteData 0x080017c3 Thumb Code 72 stm32f10x_flash.o(.text) + FLASH_EnableWriteProtection 0x0800180b Thumb Code 188 stm32f10x_flash.o(.text) + FLASH_ReadOutProtection 0x080018c7 Thumb Code 176 stm32f10x_flash.o(.text) + FLASH_UserOptionByteConfig 0x08001977 Thumb Code 92 stm32f10x_flash.o(.text) + FLASH_GetUserOptionByte 0x080019d3 Thumb Code 8 stm32f10x_flash.o(.text) + FLASH_GetWriteProtectionOptionByte 0x080019db Thumb Code 6 stm32f10x_flash.o(.text) + FLASH_GetReadOutProtectionStatus 0x080019e1 Thumb Code 20 stm32f10x_flash.o(.text) + FLASH_GetPrefetchBufferStatus 0x080019f5 Thumb Code 20 stm32f10x_flash.o(.text) + FLASH_ITConfig 0x08001a09 Thumb Code 26 stm32f10x_flash.o(.text) + FLASH_GetFlagStatus 0x08001a23 Thumb Code 42 stm32f10x_flash.o(.text) + FLASH_ClearFlag 0x08001a4d Thumb Code 6 stm32f10x_flash.o(.text) + SystemInit_ExtMemCtl 0x08001a65 Thumb Code 2 startup_stm32f10x_hd.o(.text) + Reset_Handler 0x08001a67 Thumb Code 14 startup_stm32f10x_hd.o(.text) + ADC1_2_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + ADC3_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + CAN1_RX1_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + CAN1_SCE_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA1_Channel1_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA1_Channel2_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA1_Channel3_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA1_Channel4_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA1_Channel5_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA1_Channel6_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA1_Channel7_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA2_Channel1_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA2_Channel2_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA2_Channel3_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + DMA2_Channel4_5_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + EXTI0_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + EXTI15_10_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + EXTI1_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + EXTI2_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + EXTI3_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + EXTI4_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + EXTI9_5_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + FLASH_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + FSMC_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + I2C1_ER_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + I2C1_EV_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + I2C2_ER_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + I2C2_EV_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + PVD_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + RCC_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + RTCAlarm_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + RTC_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + SDIO_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + SPI1_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + SPI2_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + SPI3_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TAMPER_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM1_BRK_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM1_CC_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM1_TRG_COM_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM1_UP_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM2_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM3_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM4_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM5_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM6_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM7_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM8_BRK_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM8_CC_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM8_TRG_COM_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + TIM8_UP_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + UART4_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + UART5_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + USART1_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + USART2_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + USART3_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + USBWakeUp_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + USB_HP_CAN1_TX_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + USB_LP_CAN1_RX0_IRQHandler 0x08001a87 Thumb Code 0 startup_stm32f10x_hd.o(.text) + __user_initial_stackheap 0x08001a89 Thumb Code 0 startup_stm32f10x_hd.o(.text) + __use_two_region_memory 0x08001ab1 Thumb Code 2 heapauxi.o(.text) + __rt_heap_escrow$2region 0x08001ab3 Thumb Code 2 heapauxi.o(.text) + __rt_heap_expand$2region 0x08001ab5 Thumb Code 2 heapauxi.o(.text) + __user_setup_stackheap 0x08001ab7 Thumb Code 74 sys_stackheap_outer.o(.text) + exit 0x08001b01 Thumb Code 12 exit.o(.text) + __user_libspace 0x08001b0d Thumb Code 8 libspace.o(.text) + __user_perproc_libspace 0x08001b0d Thumb Code 0 libspace.o(.text) + __user_perthread_libspace 0x08001b0d Thumb Code 0 libspace.o(.text) + _sys_exit 0x08001b15 Thumb Code 16 sys_exit.o(.text) + __I$use$semihosting 0x08001b29 Thumb Code 0 use_no_semi.o(.text) + __use_no_semihosting_swi 0x08001b29 Thumb Code 2 use_no_semi.o(.text) + __aeabi_dadd 0x08001b2d Thumb Code 0 daddsub_clz.o(x$fpl$dadd) + _dadd 0x08001b2d Thumb Code 424 daddsub_clz.o(x$fpl$dadd) + __fpl_inf_dadd 0x08001c9f Thumb Code 0 daddsub_clz.o(x$fpl$dadd) + __fpl_dcheck_NaN2 0x08001ce5 Thumb Code 10 dcheck.o(x$fpl$dcheck) + __fpl_dcheck_NaN1 0x08001cf5 Thumb Code 10 dcheck1.o(x$fpl$dcheck1) + __aeabi_ddiv 0x08001d05 Thumb Code 0 ddiv.o(x$fpl$ddiv) + _ddiv 0x08001d05 Thumb Code 428 ddiv.o(x$fpl$ddiv) + __fpl_inf_ddiv 0x08001e79 Thumb Code 0 ddiv.o(x$fpl$ddiv) + _ddiv_mantissas 0x08001eb1 Thumb Code 324 ddiv.o(x$fpl$ddiv) + __aeabi_d2iz 0x08002105 Thumb Code 0 dfix.o(x$fpl$dfix) + _dfix 0x08002105 Thumb Code 150 dfix.o(x$fpl$dfix) + __fpl_inf_dfix 0x08002191 Thumb Code 0 dfix.o(x$fpl$dfix) + __aeabi_i2d 0x080021a1 Thumb Code 0 dflt_clz.o(x$fpl$dflt) + _dflt 0x080021a1 Thumb Code 44 dflt_clz.o(x$fpl$dflt) + __dflt_normalise 0x080021af Thumb Code 0 dflt_clz.o(x$fpl$dflt) + __aeabi_dsub 0x080021cd Thumb Code 0 daddsub_clz.o(x$fpl$dsub) + _dsub 0x080021cd Thumb Code 572 daddsub_clz.o(x$fpl$dsub) + __fpl_inf_dsub 0x080023d1 Thumb Code 0 daddsub_clz.o(x$fpl$dsub) + __dunder 0x08002415 Thumb Code 234 dunder.o(x$fpl$dunder) + __dunder_d 0x080024ff Thumb Code 2 dunder.o(x$fpl$dunder) + __fpl_return_NaN 0x08002501 Thumb Code 100 retnan.o(x$fpl$retnan) + __fpl_cmpreturn 0x08002565 Thumb Code 48 trapv.o(x$fpl$trapveneer) + Region$$Table$$Base 0x08002594 Number 0 anon$$obj.o(Region$$Table) + __I$use$fp 0x08002595 Thumb Code 0 usenofp.o(x$fpl$usenofp) + Region$$Table$$Limit 0x080025b4 Number 0 anon$$obj.o(Region$$Table) + test 0x20000000 Data 1 main.o(.data) + GPIO_InitStructure 0x20000002 Data 4 main.o(.data) + HSEStartUpStatus 0x20000006 Data 1 main.o(.data) + TX_DATA 0x20000007 Data 4 main.o(.data) + T_X 0x2000000c Data 2 main.o(.data) + T_Y 0x2000000e Data 2 main.o(.data) + T_Z 0x20000010 Data 2 main.o(.data) + T_T 0x20000012 Data 2 main.o(.data) + BUF 0x20000028 Data 10 main.o(.bss) + __libspace_start 0x20000034 Data 96 libspace.o(.bss) + __temporary_stack_top$libspace 0x20000094 Data 0 libspace.o(.bss) + + + +============================================================================== + +Memory Map of the image + + Image Entry point : 0x08000131 + + Load Region LR_IROM1 (Base: 0x08000000, Size: 0x000025dc, Max: 0x00020000, ABSOLUTE) + + Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x000025b4, Max: 0x00020000, ABSOLUTE) + + Base Addr Size Type Attr Idx E Section Name Object + + 0x08000000 0x00000130 Data RO 247 RESET startup_stm32f10x_hd.o + 0x08000130 0x00000008 Code RO 294 * !!!main __main.o(c_w.l) + 0x08000138 0x00000034 Code RO 480 !!!scatter __scatter.o(c_w.l) + 0x0800016c 0x0000001a Code RO 482 !!handler_copy __scatter_copy.o(c_w.l) + 0x08000186 0x00000002 PAD + 0x08000188 0x0000001c Code RO 484 !!handler_zi __scatter_zi.o(c_w.l) + 0x080001a4 0x00000006 Code RO 353 .ARM.Collect$$libinit$$00000000 libinit.o(c_w.l) + 0x080001aa 0x00000000 Code RO 363 .ARM.Collect$$libinit$$00000006 libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 365 .ARM.Collect$$libinit$$00000008 libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 367 .ARM.Collect$$libinit$$0000000A libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 370 .ARM.Collect$$libinit$$0000000D libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 372 .ARM.Collect$$libinit$$0000000F libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 374 .ARM.Collect$$libinit$$00000011 libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 376 .ARM.Collect$$libinit$$00000013 libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 378 .ARM.Collect$$libinit$$00000015 libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 380 .ARM.Collect$$libinit$$00000017 libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 382 .ARM.Collect$$libinit$$00000019 libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 384 .ARM.Collect$$libinit$$0000001B libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 386 .ARM.Collect$$libinit$$0000001D libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 388 .ARM.Collect$$libinit$$0000001F libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 390 .ARM.Collect$$libinit$$00000021 libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 394 .ARM.Collect$$libinit$$00000028 libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 396 .ARM.Collect$$libinit$$0000002A libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 398 .ARM.Collect$$libinit$$0000002C libinit2.o(c_w.l) + 0x080001aa 0x00000000 Code RO 400 .ARM.Collect$$libinit$$0000002E libinit2.o(c_w.l) + 0x080001aa 0x00000002 Code RO 401 .ARM.Collect$$libinit$$0000002F libinit2.o(c_w.l) + 0x080001ac 0x00000002 Code RO 422 .ARM.Collect$$libshutdown$$00000000 libshutdown.o(c_w.l) + 0x080001ae 0x00000000 Code RO 435 .ARM.Collect$$libshutdown$$00000003 libshutdown2.o(c_w.l) + 0x080001ae 0x00000000 Code RO 438 .ARM.Collect$$libshutdown$$00000006 libshutdown2.o(c_w.l) + 0x080001ae 0x00000000 Code RO 441 .ARM.Collect$$libshutdown$$00000009 libshutdown2.o(c_w.l) + 0x080001ae 0x00000000 Code RO 443 .ARM.Collect$$libshutdown$$0000000B libshutdown2.o(c_w.l) + 0x080001ae 0x00000000 Code RO 446 .ARM.Collect$$libshutdown$$0000000E libshutdown2.o(c_w.l) + 0x080001ae 0x00000002 Code RO 447 .ARM.Collect$$libshutdown$$0000000F libshutdown2.o(c_w.l) + 0x080001b0 0x00000000 Code RO 314 .ARM.Collect$$rtentry$$00000000 rtentry.o(c_w.l) + 0x080001b0 0x00000000 Code RO 324 .ARM.Collect$$rtentry$$00000002 rtentry2.o(c_w.l) + 0x080001b0 0x00000006 Code RO 339 .ARM.Collect$$rtentry$$00000004 rtentry4.o(c_w.l) + 0x080001b6 0x00000000 Code RO 326 .ARM.Collect$$rtentry$$00000009 rtentry2.o(c_w.l) + 0x080001b6 0x00000004 Code RO 327 .ARM.Collect$$rtentry$$0000000A rtentry2.o(c_w.l) + 0x080001ba 0x00000000 Code RO 329 .ARM.Collect$$rtentry$$0000000C rtentry2.o(c_w.l) + 0x080001ba 0x00000008 Code RO 330 .ARM.Collect$$rtentry$$0000000D rtentry2.o(c_w.l) + 0x080001c2 0x00000000 Code RO 359 .ARM.Collect$$rtexit$$00000000 rtexit.o(c_w.l) + 0x080001c2 0x00000000 Code RO 405 .ARM.Collect$$rtexit$$00000002 rtexit2.o(c_w.l) + 0x080001c2 0x00000004 Code RO 406 .ARM.Collect$$rtexit$$00000003 rtexit2.o(c_w.l) + 0x080001c6 0x00000004 Code RO 407 .ARM.Collect$$rtexit$$00000004 rtexit2.o(c_w.l) + 0x080001ca 0x00000002 PAD + 0x080001cc 0x0000078c Code RO 1 .text main.o + 0x08000958 0x0000001a Code RO 107 .text stm32f10x_it.o + 0x08000972 0x00000002 PAD + 0x08000974 0x00000390 Code RO 156 .text stm32f10x_rcc.o + 0x08000d04 0x000003a4 Code RO 182 .text stm32f10x_usart.o + 0x080010a8 0x00000084 Code RO 194 .text stm32f10x_wwdg.o + 0x0800112c 0x000000e0 Code RO 206 .text misc.o + 0x0800120c 0x00000328 Code RO 218 .text stm32f10x_gpio.o + 0x08001534 0x00000530 Code RO 230 .text stm32f10x_flash.o + 0x08001a64 0x0000004c Code RO 248 .text startup_stm32f10x_hd.o + 0x08001ab0 0x00000006 Code RO 292 .text heapauxi.o(c_w.l) + 0x08001ab6 0x0000004a Code RO 343 .text sys_stackheap_outer.o(c_w.l) + 0x08001b00 0x0000000c Code RO 345 .text exit.o(c_w.l) + 0x08001b0c 0x00000008 Code RO 356 .text libspace.o(c_w.l) + 0x08001b14 0x00000014 Code RO 414 .text sys_exit.o(c_w.l) + 0x08001b28 0x00000002 Code RO 425 .text use_no_semi.o(c_w.l) + 0x08001b2a 0x00000002 PAD + 0x08001b2c 0x000001b8 Code RO 296 x$fpl$dadd daddsub_clz.o(fz_ws.l) + 0x08001ce4 0x00000010 Code RO 316 x$fpl$dcheck dcheck.o(fz_ws.l) + 0x08001cf4 0x00000010 Code RO 318 x$fpl$dcheck1 dcheck1.o(fz_ws.l) + 0x08001d04 0x00000400 Code RO 303 x$fpl$ddiv ddiv.o(fz_ws.l) + 0x08002104 0x0000009c Code RO 306 x$fpl$dfix dfix.o(fz_ws.l) + 0x080021a0 0x0000002c Code RO 311 x$fpl$dflt dflt_clz.o(fz_ws.l) + 0x080021cc 0x00000248 Code RO 298 x$fpl$dsub daddsub_clz.o(fz_ws.l) + 0x08002414 0x000000ec Code RO 320 x$fpl$dunder dunder.o(fz_ws.l) + 0x08002500 0x00000064 Code RO 341 x$fpl$retnan retnan.o(fz_ws.l) + 0x08002564 0x00000030 Code RO 354 x$fpl$trapveneer trapv.o(fz_ws.l) + 0x08002594 0x00000000 Code RO 322 x$fpl$usenofp usenofp.o(fz_ws.l) + 0x08002594 0x00000020 Data RO 478 Region$$Table anon$$obj.o + + + Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00000698, Max: 0x00005000, ABSOLUTE) + + Base Addr Size Type Attr Idx E Section Name Object + + 0x20000000 0x00000014 Data RW 3 .data main.o + 0x20000014 0x00000014 Data RW 157 .data stm32f10x_rcc.o + 0x20000028 0x0000000a Zero RW 2 .bss main.o + 0x20000032 0x00000002 PAD + 0x20000034 0x00000060 Zero RW 357 .bss libspace.o(c_w.l) + 0x20000094 0x00000004 PAD + 0x20000098 0x00000200 Zero RW 246 HEAP startup_stm32f10x_hd.o + 0x20000298 0x00000400 Zero RW 245 STACK startup_stm32f10x_hd.o + + +============================================================================== + +Image component sizes + + + Code (inc. data) RO Data RW Data ZI Data Debug Object Name + + 1932 78 0 20 10 29483 main.o + 224 20 0 0 0 1829 misc.o + 76 30 304 0 1536 572 startup_stm32f10x_hd.o + 1328 38 0 0 0 13238 stm32f10x_flash.o + 808 38 0 0 0 5621 stm32f10x_gpio.o + 26 0 0 0 0 227446 stm32f10x_it.o + 912 32 0 20 0 8836 stm32f10x_rcc.o + 932 20 0 0 0 7955 stm32f10x_usart.o + 132 14 0 0 0 2296 stm32f10x_wwdg.o + + ---------------------------------------------------------------------- + 6372 270 336 40 1548 297276 Object Totals + 0 0 32 0 0 0 (incl. Generated) + 2 0 0 0 2 0 (incl. Padding) + + ---------------------------------------------------------------------- + + Code (inc. data) RO Data RW Data ZI Data Debug Library Member Name + + 8 0 0 0 0 68 __main.o + 52 8 0 0 0 0 __scatter.o + 26 0 0 0 0 0 __scatter_copy.o + 28 0 0 0 0 0 __scatter_zi.o + 1024 28 0 0 0 244 daddsub_clz.o + 16 6 0 0 0 68 dcheck.o + 16 6 0 0 0 68 dcheck1.o + 1024 272 0 0 0 160 ddiv.o + 156 6 0 0 0 76 dfix.o + 44 0 0 0 0 68 dflt_clz.o + 236 0 0 0 0 92 dunder.o + 12 0 0 0 0 68 exit.o + 6 0 0 0 0 148 heapauxi.o + 6 0 0 0 0 0 libinit.o + 2 0 0 0 0 0 libinit2.o + 2 0 0 0 0 0 libshutdown.o + 2 0 0 0 0 0 libshutdown2.o + 8 4 0 0 96 68 libspace.o + 100 0 0 0 0 68 retnan.o + 0 0 0 0 0 0 rtentry.o + 12 0 0 0 0 0 rtentry2.o + 6 0 0 0 0 0 rtentry4.o + 0 0 0 0 0 0 rtexit.o + 8 0 0 0 0 0 rtexit2.o + 20 10 0 0 0 68 sys_exit.o + 74 0 0 0 0 80 sys_stackheap_outer.o + 48 0 0 0 0 68 trapv.o + 2 0 0 0 0 68 use_no_semi.o + 0 0 0 0 0 0 usenofp.o + + ---------------------------------------------------------------------- + 2944 340 0 0 100 1480 Library Totals + 6 0 0 0 4 0 (incl. Padding) + + ---------------------------------------------------------------------- + + Code (inc. data) RO Data RW Data ZI Data Debug Library Name + + 274 22 0 0 96 568 c_w.l + 2664 318 0 0 0 912 fz_ws.l + + ---------------------------------------------------------------------- + 2944 340 0 0 100 1480 Library Totals + + ---------------------------------------------------------------------- + +============================================================================== + + + Code (inc. data) RO Data RW Data ZI Data Debug + + 9316 610 336 40 1648 296956 Grand Totals + 9316 610 336 40 1648 296956 ELF Image Totals + 9316 610 336 40 0 0 ROM Totals + +============================================================================== + + Total RO Size (Code + RO Data) 9652 ( 9.43kB) + Total RW Size (RW Data + ZI Data) 1688 ( 1.65kB) + Total ROM Size (Code + RO Data + RW Data) 9692 ( 9.46kB) + +============================================================================== + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.opt.bak b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.opt.bak new file mode 100644 index 0000000..d898c97 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.opt.bak @@ -0,0 +1,60 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + + cExt (*.c) + aExt (*.s*; *.src; *.a*) + oExt (*.obj) + lExt (*.lib) + tExt (*.txt; *.h; *.inc) + pExt (*.plm) + CppX (*.cpp) + DaveTm { 0,0,0,0,0,0,0,0 } + +Target (Target 1), 0x0004 // Tools: 'ARM-ADS' +GRPOPT 1,(SRC),1,0,0 +GRPOPT 2,(LIB),1,0,0 +GRPOPT 3,(STARTUP),1,0,0 +GRPOPT 4,(CM3),1,0,0 + +OPTFFF 1,1,1,1090519042,0,1,24,0,<.\SRC\main.c> { 44,0,0,0,2,0,0,0,3,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,226,255,255,255,134,0,0,0,253,255,255,255,83,4,0,0,22,2,0,0 } +OPTFFF 1,2,1,0,0,0,0,0,<.\SRC\stm32f10x_it.c> +OPTFFF 2,3,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c> +OPTFFF 2,4,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c> +OPTFFF 2,5,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c> +OPTFFF 2,6,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c> +OPTFFF 2,7,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c> +OPTFFF 2,8,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c> +OPTFFF 2,9,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c> +OPTFFF 3,10,2,0,0,0,0,0,<.\Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s> +OPTFFF 4,11,1,1,0,0,0,0,<.\Libraries\CMSIS\Core\CM3\core_cm3.c> +OPTFFF 4,12,1,234881024,0,0,0,0,<.\Libraries\CMSIS\Core\CM3\system_stm32f10x.c> + + +TARGOPT 1, (Target 1) + ADSCLK=8000000 + OPTTT 1,1,1,0 + OPTHX 1,65535,0,0,0 + OPTLX 79,66,8,<.\> + OPTOX 16 + OPTLT 1,1,1,0,1,1,0,1,0,0,0,0 + OPTXL 1,1,1,1,1,1,1,0,0 + OPTFL 1,0,1 + OPTAX 0 + OPTBL 0,(Reference Manual) + OPTDL (SARMCM3.DLL)()(DARMSTM.DLL)(-pSTM32F103RB)(SARMCM3.DLL)()(TARMSTM.DLL)(-pSTM32F103RB) + OPTDBG 180221,8,()()()()()()()()()() (Segger\JL2CM3.dll)()()() + OPTKEY 0,(DLGTARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)) + OPTKEY 0,(DLGUARM)((105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)) + OPTKEY 0,(JL2CM3)(-U68000019 -O47 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -N01("ST TMC") -D01(16410041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TRE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000) + OPTKEY 0,(DLGDARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)) + OPTKEY 0,(ARMDBGFLAGS)(-T0) + OPTKEY 0,(UL2CM3)(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL040000) + OPTBB 0,0,764,1,0,0,0,0,0,0,()() + OPTBB 1,0,627,1,0,0,0,0,0,0,()() + OPTBB 2,0,621,1,0,0,0,0,0,0,()() + OPTWA 0,1,(angle) + OPTDF 0x82 + OPTLE <> + OPTLC <> +EndOpt + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.plg b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.plg new file mode 100644 index 0000000..c823905 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.plg @@ -0,0 +1,96 @@ + + +
    +

    µVision Build Log

    +

    Project:

    +D:\MCU_Project\MCU_STM32\´®¿ÚÊä³öMPU-3050\´®¿Ú\lunzhou.uvproj +Project File Date: 10/09/2011 + +

    Output:

    +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=6632 RO-data=336 RW-data=48 ZI-data=1632 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +SRC\main.c(600): error: #165: too few arguments in function call +SRC\main.c(601): error: #165: too few arguments in function call +SRC\main.c(602): error: #165: too few arguments in function call +SRC\main.c(603): error: #165: too few arguments in function call +SRC\main.c(604): error: #165: too few arguments in function call +SRC\main.c(655): warning: #223-D: function "Init_MPU3050" declared implicitly +Target not created +Build target 'Target 1' +compiling main.c... +SRC\main.c(655): warning: #223-D: function "Init_MPU3050" declared implicitly +linking... +lunzhou.axf: Error: L6218E: Undefined symbol Init_MPU3050 (referred from main.o). +Target not created +Build target 'Target 1' +compiling main.c... +SRC\main.c(650): warning: #223-D: function "Init_MPU3050" declared implicitly +linking... +lunzhou.axf: Error: L6218E: Undefined symbol Init_MPU3050 (referred from main.o). +Target not created +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9512 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9512 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9512 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9512 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9512 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9512 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9512 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9316 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9316 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). +Build target 'Target 1' +compiling main.c... +linking... +Program Size: Code=9316 RO-data=336 RW-data=40 ZI-data=1648 +FromELF: creating hex file... +"lunzhou.axf" - 0 Error(s), 0 Warning(s). diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.sct b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.sct new file mode 100644 index 0000000..f67cd68 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00020000 { ; load region size_region + ER_IROM1 0x08000000 0x00020000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00005000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.tra b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.tra new file mode 100644 index 0000000..f84d2d4 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.tra @@ -0,0 +1,30 @@ +*** Creating Trace Output File 'lunzhou.tra' Ok. +### Preparing for ADS-LD. +### Creating ADS-LD Command Line +### List of Objects: adding '"main.o"' +### List of Objects: adding '"stm32f10x_it.o"' +### List of Objects: adding '"stm32f10x_rcc.o"' +### List of Objects: adding '"stm32f10x_tim.o"' +### List of Objects: adding '"stm32f10x_usart.o"' +### List of Objects: adding '"stm32f10x_wwdg.o"' +### List of Objects: adding '"misc.o"' +### List of Objects: adding '"stm32f10x_gpio.o"' +### List of Objects: adding '"stm32f10x_flash.o"' +### List of Objects: adding '"startup_stm32f10x_hd.o"' +### List of Objects: adding '"core_cm3.o"' +### List of Objects: adding '"system_stm32f10x.o"' +### ADS-LD Command completed: +--device DARMSTM "main.o" "stm32f10x_it.o" "stm32f10x_rcc.o" "stm32f10x_tim.o" "stm32f10x_usart.o" "stm32f10x_wwdg.o" "misc.o" "stm32f10x_gpio.o" "stm32f10x_flash.o" "startup_stm32f10x_hd.o" "core_cm3.o" "system_stm32f10x.o" --strict --scatter "lunzhou.sct" +--autoat --summary_stderr --info summarysizes --map --xref --callgraph --symbols +--info sizes --info totals --info unused --info veneers + --list ".\lunzhou.map" -o "lunzhou.axf"### Preparing Environment (PrepEnvAds) +### ADS-LD Output File: 'lunzhou.axf' +### ADS-LD Command File: 'lunzhou.lnp' +### Checking for dirty Components... +### Creating CmdFile 'lunzhou.lnp', Handle=0x00000328 +### Writing '.lnp' file +### ADS-LD Command file 'lunzhou.lnp' is ready. +### ADS-LD: About to start ADS-LD Thread. +### ADS-LD: executed with 0 errors +### Updating obj list +### LDADS_file() completed. diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.uvopt b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.uvopt new file mode 100644 index 0000000..64dd40f --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.uvopt @@ -0,0 +1,1766 @@ + + + + 1.0 + +
    ### uVision Project, (C) Keil Software
    + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 0 + + + 0 + Reference Manual + DATASHTS\ST\STM32F10xxx.PDF + + + + SARMCM3.DLL + + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TARMSTM.DLL + -pSTM32F103RB + + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 8 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0) + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0) + + + 0 + JL2CM3 + -U68000019 -O47 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -N01("ST TMC") -D01(16410041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TRE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + 0 + UL2CM3 + -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL040000 + + + + + 0 + 1 + angle + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + SRC + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 587 + 587 + 0 + .\SRC\main.c + main.c + + 44 + 2 + 3 + + -1 + -1 + + + -4 + -30 + + + -3 + 134 + 1107 + 534 + + + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 13 + 13 + 0 + .\SRC\stm32f10x_it.c + stm32f10x_it.c + + + + + LIB + 0 + 0 + 0 + + 2 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c + stm32f10x_rcc.c + + + 2 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c + stm32f10x_tim.c + + + 2 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c + stm32f10x_usart.c + + + 2 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c + stm32f10x_wwdg.c + + + 2 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c + misc.c + + + 2 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c + stm32f10x_gpio.c + + + 2 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c + stm32f10x_flash.c + + + + + STARTUP + 0 + 0 + 0 + + 3 + 10 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s + startup_stm32f10x_hd.s + + + + + CM3 + 0 + 0 + 0 + + 4 + 11 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\CMSIS\Core\CM3\core_cm3.c + core_cm3.c + + + 4 + 12 + 1 + 0 + 0 + 14 + 0 + 0 + 0 + 0 + .\Libraries\CMSIS\Core\CM3\system_stm32f10x.c + system_stm32f10x.c + + + + + Default + 1 + Build + 0 + + Default + 1 + + 59392 + 1 + File + 0 + + 0 + + 1 + 2 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 100 + 0 + 1 + 0 + + + 59398 + 2 + Build + 0 + + 0 + + 1 + 2 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 100 + 0 + 0 + 0 + + + 59399 + 3 + Debug + 0 + + 0 + + 1 + 2 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 100 + 0 + 1 + 0 + + + 197 + 4 + Build Output + 0 + + 0 + + 1 + 2 + 4 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 1 + 0 + 0 + + + 198 + 5 + Command + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 1 + 1 + 0 + + + 199 + 6 + Find in Files + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 38007 + 7 + Browse + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1939 + 8 + UART #1 + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1940 + 9 + UART #2 + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1941 + 10 + UART #3 + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1942 + 11 + UART #4 + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1944 + 12 + Call Stack + 197 + + 197 + + 1 + 2 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 50 + 0 + 1 + 0 + + + 1507 + 13 + Call Stack + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 50 + 0 + 1 + 0 + + + 1935 + 14 + Locals + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1936 + 15 + Watch 1 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1937 + 16 + Watch 2 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1465 + 17 + Memory 1 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1466 + 18 + Memory 2 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1467 + 19 + Memory 3 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1468 + 20 + Memory 4 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1506 + 21 + Symbols + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1005 + 22 + Project + 0 + + 0 + + 1 + 2 + 1 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 1 + 0 + + + 109 + 23 + Books + 1005 + + 1005 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 195 + 24 + Functions + 1005 + + 1005 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 196 + 25 + Templates + 1005 + + 1005 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 38003 + 26 + Registers + 1005 + + 1005 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 1 + 1 + 0 + + + 35885 + 27 + not set + 0 + + 0 + + 1 + 2 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35886 + 28 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35887 + 29 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35888 + 30 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35889 + 31 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35890 + 32 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35891 + 33 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35892 + 34 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35893 + 35 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35894 + 36 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35895 + 37 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35896 + 38 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35897 + 39 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35898 + 40 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35899 + 41 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35900 + 42 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35901 + 43 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35902 + 44 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35903 + 45 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35904 + 46 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35905 + 47 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 203 + 48 + Disassembly + 0 + + 0 + + 1 + 2 + 3 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1913 + 49 + Instruction Trace + 203 + + 203 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35824 + 50 + Logic Analyzer + 0 + + 0 + + 1 + 6 + 0 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 1 + 0 + 0 + 0 + + + 343 + 51 + Performance Analyzer + 203 + + 203 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 204 + 52 + Performance Analyzer + 203 + + 203 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 346 + 53 + Code Coverage + 203 + + 203 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + + + + 1 + 0 + + 100 + 0 + + + .\SRC\main.c + 0 + 587 + 587 + + + + + +
    diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.uvproj b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.uvproj new file mode 100644 index 0000000..b2467ca --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou.uvproj @@ -0,0 +1,469 @@ + + + + 1.0 + +
    ### uVision Project, (C) Keil Software
    + + + + Target 1 + 0x4 + ARM-ADS + + + STM32F103RB + STMicroelectronics + IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + "STARTUP\ST\STM32F10x.s" ("STM32 Startup Code") + UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000) + + stm32f10x_lib.h + + + + + + + + + + 0 + + + + ST\STM32F10x\ + ST\STM32F10x\ + + 0 + 0 + 0 + 0 + 1 + + .\ + lunzhou + 1 + 0 + 1 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TARMSTM.DLL + -pSTM32F103RB + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + 0 + 8 + + + + + + + + + + + + + + Segger\JL2CM3.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4102 + + Segger\JL2CM3.dll + "" () + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 5 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + .\SRC;.\Libraries\STM32F10x_StdPeriph_Driver\inc;.\Libraries\CMSIS\Core\CM3 + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + SRC + + + main.c + 1 + .\SRC\main.c + + + stm32f10x_it.c + 1 + .\SRC\stm32f10x_it.c + + + + + LIB + + + stm32f10x_rcc.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c + + + stm32f10x_tim.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c + + + stm32f10x_usart.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c + + + stm32f10x_wwdg.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c + + + misc.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c + + + stm32f10x_gpio.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c + + + stm32f10x_flash.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c + + + + + STARTUP + + + startup_stm32f10x_hd.s + 2 + .\Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s + + + + + CM3 + + + core_cm3.c + 1 + .\Libraries\CMSIS\Core\CM3\core_cm3.c + + + system_stm32f10x.c + 1 + .\Libraries\CMSIS\Core\CM3\system_stm32f10x.c + + + + + + + +
    diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_Opt.Bak b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_Opt.Bak new file mode 100644 index 0000000..eec9e58 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_Opt.Bak @@ -0,0 +1,59 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + + cExt (*.c) + aExt (*.s*; *.src; *.a*) + oExt (*.obj) + lExt (*.lib) + tExt (*.txt; *.h; *.inc) + pExt (*.plm) + CppX (*.cpp) + DaveTm { 0,0,0,0,0,0,0,0 } + +Target (Target 1), 0x0004 // Tools: 'ARM-ADS' +GRPOPT 1,(SRC),1,0,0 +GRPOPT 2,(LIB),1,0,0 +GRPOPT 3,(STARTUP),1,0,0 +GRPOPT 4,(CM3),1,0,0 + +OPTFFF 1,1,1,1325400066,0,1,18,0,<.\SRC\main.c> { 44,0,0,0,2,0,0,0,3,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,226,255,255,255,134,0,0,0,253,255,255,255,83,4,0,0,22,2,0,0 } +OPTFFF 1,2,1,0,0,0,0,0,<.\SRC\stm32f10x_it.c> +OPTFFF 2,3,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c> +OPTFFF 2,4,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c> +OPTFFF 2,5,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c> +OPTFFF 2,6,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c> +OPTFFF 2,7,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c> +OPTFFF 2,8,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c> +OPTFFF 2,9,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c> +OPTFFF 3,10,2,0,0,0,0,0,<.\Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s> +OPTFFF 4,11,1,1,0,0,0,0,<.\Libraries\CMSIS\Core\CM3\core_cm3.c> +OPTFFF 4,12,1,234881024,0,0,0,0,<.\Libraries\CMSIS\Core\CM3\system_stm32f10x.c> + + +TARGOPT 1, (Target 1) + ADSCLK=8000000 + OPTTT 1,1,1,0 + OPTHX 1,65535,0,0,0 + OPTLX 79,66,8,<.\> + OPTOX 16 + OPTLT 1,1,1,0,1,1,0,1,0,0,0,0 + OPTXL 1,1,1,1,1,1,1,0,0 + OPTFL 1,0,1 + OPTAX 0 + OPTBL 0,(Reference Manual) + OPTDL (SARMCM3.DLL)()(DARMSTM.DLL)(-pSTM32F103RB)(SARMCM3.DLL)()(TARMSTM.DLL)(-pSTM32F103RB) + OPTDBG 180221,8,()()()()()()()()()() (Segger\JL2CM3.dll)()()() + OPTKEY 0,(DLGTARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)) + OPTKEY 0,(DLGUARM)((105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)) + OPTKEY 0,(JL2CM3)(-U68000019 -O47 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -N01("ST TMC") -D01(16410041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TRE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000) + OPTKEY 0,(DLGDARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)) + OPTKEY 0,(ARMDBGFLAGS)(-T0) + OPTKEY 0,(UL2CM3)(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL040000) + OPTBB 0,0,627,1,0,0,0,0,0,0,()() + OPTBB 1,0,621,1,0,0,0,0,0,0,()() + OPTWA 0,1,(angle) + OPTDF 0x82 + OPTLE <> + OPTLC <> +EndOpt + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_Target 1.dep b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_Target 1.dep new file mode 100644 index 0000000..5cd8976 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_Target 1.dep @@ -0,0 +1,145 @@ +Dependencies for Project 'lunzhou', Target 'Target 1': (DO NOT MODIFY !) +F (.\SRC\main.c)(0x4E94F3A6)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "main.o" --omf_browse "main.crf" --depend "main.d") +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_lib.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_map.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_conf.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_type.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\cortexm3_macro.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_adc.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_bkp.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_can.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_crc.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_dac.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_dbgmcu.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_dma.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_exti.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_flash.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_fsmc.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_gpio.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_i2c.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_iwdg.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_nvic.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_pwr.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_rcc.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_rtc.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_sdio.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_spi.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_systick.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_tim.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_usart.h)(0x4A0282C6) +I (C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_wwdg.h)(0x4A0282C6) +I (C:\Keil\ARM\RV31\INC\math.h)(0x4A02846A) +F (.\SRC\stm32f10x_it.c)(0x4E4DB75E)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "stm32f10x_it.o" --omf_browse "stm32f10x_it.crf" --depend "stm32f10x_it.d") +I (SRC\stm32f10x_it.h)(0x4E4DB75E) +I (.\Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (.\Libraries\CMSIS\Core\CM3\core_cm3.h)(0x4E4DB75A) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +I (.\Libraries\CMSIS\Core\CM3\system_stm32f10x.h)(0x4E4DB75A) +I (.\SRC\stm32f10x_conf.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h)(0x4E4DB75E) +F (.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c)(0x4E4DB75E)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "stm32f10x_rcc.o" --omf_browse "stm32f10x_rcc.crf" --depend "stm32f10x_rcc.d") +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h)(0x4E4DB75E) +I (.\Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (.\Libraries\CMSIS\Core\CM3\core_cm3.h)(0x4E4DB75A) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +I (.\Libraries\CMSIS\Core\CM3\system_stm32f10x.h)(0x4E4DB75A) +I (.\SRC\stm32f10x_conf.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h)(0x4E4DB75E) +F (.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c)(0x4E4DB75E)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "stm32f10x_tim.o" --omf_browse "stm32f10x_tim.crf" --depend "stm32f10x_tim.d") +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h)(0x4E4DB75E) +I (.\Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (.\Libraries\CMSIS\Core\CM3\core_cm3.h)(0x4E4DB75A) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +I (.\Libraries\CMSIS\Core\CM3\system_stm32f10x.h)(0x4E4DB75A) +I (.\SRC\stm32f10x_conf.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h)(0x4E4DB75E) +F (.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c)(0x4E4DB75E)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "stm32f10x_usart.o" --omf_browse "stm32f10x_usart.crf" --depend "stm32f10x_usart.d") +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h)(0x4E4DB75E) +I (.\Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (.\Libraries\CMSIS\Core\CM3\core_cm3.h)(0x4E4DB75A) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +I (.\Libraries\CMSIS\Core\CM3\system_stm32f10x.h)(0x4E4DB75A) +I (.\SRC\stm32f10x_conf.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h)(0x4E4DB75E) +F (.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c)(0x4E4DB75E)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "stm32f10x_wwdg.o" --omf_browse "stm32f10x_wwdg.crf" --depend "stm32f10x_wwdg.d") +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h)(0x4E4DB75E) +I (.\Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (.\Libraries\CMSIS\Core\CM3\core_cm3.h)(0x4E4DB75A) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +I (.\Libraries\CMSIS\Core\CM3\system_stm32f10x.h)(0x4E4DB75A) +I (.\SRC\stm32f10x_conf.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h)(0x4E4DB75E) +F (.\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c)(0x4E4DB75E)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "misc.o" --omf_browse "misc.crf" --depend "misc.d") +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h)(0x4E4DB75E) +I (.\Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (.\Libraries\CMSIS\Core\CM3\core_cm3.h)(0x4E4DB75A) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +I (.\Libraries\CMSIS\Core\CM3\system_stm32f10x.h)(0x4E4DB75A) +I (.\SRC\stm32f10x_conf.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h)(0x4E4DB75E) +F (.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c)(0x4E4DB75E)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "stm32f10x_gpio.o" --omf_browse "stm32f10x_gpio.crf" --depend "stm32f10x_gpio.d") +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h)(0x4E4DB75E) +I (.\Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (.\Libraries\CMSIS\Core\CM3\core_cm3.h)(0x4E4DB75A) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +I (.\Libraries\CMSIS\Core\CM3\system_stm32f10x.h)(0x4E4DB75A) +I (.\SRC\stm32f10x_conf.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h)(0x4E4DB75E) +F (.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c)(0x4E4DB75E)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "stm32f10x_flash.o" --omf_browse "stm32f10x_flash.crf" --depend "stm32f10x_flash.d") +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_flash.h)(0x4E4DB75E) +I (.\Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (.\Libraries\CMSIS\Core\CM3\core_cm3.h)(0x4E4DB75A) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +I (.\Libraries\CMSIS\Core\CM3\system_stm32f10x.h)(0x4E4DB75A) +I (.\SRC\stm32f10x_conf.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h)(0x4E4DB75E) +F (.\Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s)(0x4E4DB75E)(--device DARMSTM -g --apcs=interwork -I "C:\Keil\ARM\INC\ST\STM32F10x" --list ".\startup_stm32f10x_hd.lst" --xref -o "startup_stm32f10x_hd.o") +F (.\Libraries\CMSIS\Core\CM3\core_cm3.c)(0x4E4DB75A)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "core_cm3.o" --omf_browse "core_cm3.crf" --depend "core_cm3.d") +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +F (.\Libraries\CMSIS\Core\CM3\system_stm32f10x.c)(0x4E4DB75A)(-c --device DARMSTM -g -O0 --apcs=interwork -I.\SRC -I.\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\Libraries\CMSIS\Core\CM3 -I "C:\Keil\ARM\INC\ST\STM32F10x" -o "system_stm32f10x.o" --omf_browse "system_stm32f10x.crf" --depend "system_stm32f10x.d") +I (Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (Libraries\CMSIS\Core\CM3\core_cm3.h)(0x4E4DB75A) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4A02846A) +I (Libraries\CMSIS\Core\CM3\system_stm32f10x.h)(0x4E4DB75A) +I (.\SRC\stm32f10x_conf.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h)(0x4E4DB75E) +I (.\Libraries\CMSIS\Core\CM3\stm32f10x.h)(0x4E4DB75A) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h)(0x4E4DB75E) +I (.\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h)(0x4E4DB75E) diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_Uv2.Bak b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_Uv2.Bak new file mode 100644 index 0000000..a847af0 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_Uv2.Bak @@ -0,0 +1,114 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + +Target (Target 1), 0x0004 // Tools: 'ARM-ADS' + +Group (SRC) +Group (LIB) +Group (STARTUP) +Group (CM3) + +File 1,1,<.\SRC\main.c> +File 1,1,<.\SRC\stm32f10x_it.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c> +File 2,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c> +File 3,2,<.\Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s> +File 4,1,<.\Libraries\CMSIS\Core\CM3\core_cm3.c> +File 4,1,<.\Libraries\CMSIS\Core\CM3\system_stm32f10x.c> + + +Options 1,0,0 // Target 'Target 1' + Device (STM32F103RB) + Vendor (STMicroelectronics) + Cpu (IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3")) + FlashUt () + StupF ("STARTUP\ST\STM32F10x.s" ("STM32 Startup Code")) + FlashDR (UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000)) + DevID () + Rgf (stm32f10x_lib.h) + Mem () + C () + A () + RL () + OH () + DBC_IFX () + DBC_CMS () + DBC_AMS () + DBC_LMS () + UseEnv=0 + EnvBin () + EnvInc () + EnvLib () + EnvReg (ST\STM32F10x\) + OrgReg (ST\STM32F10x\) + TgStat=16 + OutDir (.\) + OutName (lunzhou) + GenApp=1 + GenLib=0 + GenHex=1 + Debug=1 + Browse=1 + LstDir (.\) + HexSel=1 + MG32K=0 + TGMORE=0 + RunUsr 0 0 <> + RunUsr 1 0 <> + BrunUsr 0 0 <> + BrunUsr 1 0 <> + CrunUsr 0 0 <> + CrunUsr 1 0 <> + SVCSID <> + GLFLAGS=1790 + ADSFLGA { 243,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ACPUTYP ("Cortex-M3") + RVDEV () + ADSTFLGA { 0,12,0,2,163,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSIRAM { 0,0,0,0,32,0,80,0,0 } + OCMADSIROM { 1,0,0,0,8,0,0,2,0 } + OCMADSXRAM { 0,0,0,0,0,0,0,0,0 } + OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,80,0,0,0,0,0,0,0,0,0,0,0 } + RV_STAVEC () + ADSCCFLG { 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSCMISC () + ADSCDEFN () + ADSCUDEF () + ADSCINCD (.\SRC;.\Libraries\STM32F10x_StdPeriph_Driver\inc;.\Libraries\CMSIS\Core\CM3) + ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSAMISC () + ADSADEFN () + ADSAUDEF () + ADSAINCD () + PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + IncBld=1 + AlwaysBuild=0 + GenAsm=0 + AsmAsm=0 + PublicsOnly=0 + StopCode=3 + CustArgs () + LibMods () + ADSLDFG { 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSLDTA (0x08000000) + ADSLDDA (0x20000000) + ADSLDSC () + ADSLDIB () + ADSLDIC () + ADSLDMC () + ADSLDIF () + ADSLDDW () + OPTDL (SARMCM3.DLL)()(DARMSTM.DLL)(-pSTM32F103RB)(SARMCM3.DLL)()(TARMSTM.DLL)(-pSTM32F103RB) + OPTDBG 49138,8,()()()()()()()()()() (Segger\JL2CM3.dll)()()() + FLASH1 { 9,0,0,0,1,0,0,0,6,16,0,0,0,0,0,0,0,0,0,0 } + FLASH2 (Segger\JL2CM3.dll) + FLASH3 ("" ()) + FLASH4 () +EndOpt + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_sct.Bak b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_sct.Bak new file mode 100644 index 0000000..99f1f72 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_sct.Bak @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00040000 { ; load region size_region + ER_IROM1 0x08000000 0x00040000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x0000C000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_uvopt.bak b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_uvopt.bak new file mode 100644 index 0000000..77b17d4 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_uvopt.bak @@ -0,0 +1,1766 @@ + + + + 1.0 + +
    ### uVision Project, (C) Keil Software
    + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 0 + + + 0 + Reference Manual + DATASHTS\ST\STM32F10xxx.PDF + + + + SARMCM3.DLL + + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TARMSTM.DLL + -pSTM32F103RB + + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 8 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0) + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0) + + + 0 + JL2CM3 + -U68000019 -O47 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -N01("ST TMC") -D01(16410041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TRE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + 0 + UL2CM3 + -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL040000 + + + + + 0 + 1 + angle + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + SRC + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 1 + 56 + 0 + 25 + 25 + 0 + .\SRC\main.c + main.c + + 44 + 2 + 3 + + -1 + -1 + + + -4 + -30 + + + -3 + 134 + 1107 + 534 + + + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 13 + 13 + 0 + .\SRC\stm32f10x_it.c + stm32f10x_it.c + + + + + LIB + 0 + 0 + 0 + + 2 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c + stm32f10x_rcc.c + + + 2 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c + stm32f10x_tim.c + + + 2 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c + stm32f10x_usart.c + + + 2 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c + stm32f10x_wwdg.c + + + 2 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c + misc.c + + + 2 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c + stm32f10x_gpio.c + + + 2 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c + stm32f10x_flash.c + + + + + STARTUP + 0 + 0 + 0 + + 3 + 10 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s + startup_stm32f10x_hd.s + + + + + CM3 + 0 + 0 + 0 + + 4 + 11 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + .\Libraries\CMSIS\Core\CM3\core_cm3.c + core_cm3.c + + + 4 + 12 + 1 + 0 + 0 + 14 + 0 + 0 + 0 + 0 + .\Libraries\CMSIS\Core\CM3\system_stm32f10x.c + system_stm32f10x.c + + + + + Default + 1 + Build + 0 + + Default + 1 + + 59392 + 1 + File + 0 + + 0 + + 1 + 2 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 100 + 0 + 1 + 0 + + + 59398 + 2 + Build + 0 + + 0 + + 1 + 2 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 100 + 0 + 0 + 0 + + + 59399 + 3 + Debug + 0 + + 0 + + 1 + 2 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 100 + 0 + 1 + 0 + + + 197 + 4 + Build Output + 0 + + 0 + + 1 + 2 + 4 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 1 + 0 + 0 + + + 198 + 5 + Command + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 1 + 1 + 0 + + + 199 + 6 + Find in Files + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 38007 + 7 + Browse + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1939 + 8 + UART #1 + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1940 + 9 + UART #2 + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1941 + 10 + UART #3 + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1942 + 11 + UART #4 + 197 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1944 + 12 + Call Stack + 197 + + 197 + + 1 + 2 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 50 + 0 + 1 + 0 + + + 1507 + 13 + Call Stack + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 50 + 0 + 1 + 0 + + + 1935 + 14 + Locals + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1936 + 15 + Watch 1 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1937 + 16 + Watch 2 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1465 + 17 + Memory 1 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1466 + 18 + Memory 2 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1467 + 19 + Memory 3 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1468 + 20 + Memory 4 + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 1506 + 21 + Symbols + 1944 + + 197 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1005 + 22 + Project + 0 + + 0 + + 1 + 2 + 1 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 1 + 0 + + + 109 + 23 + Books + 1005 + + 1005 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 195 + 24 + Functions + 1005 + + 1005 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 196 + 25 + Templates + 1005 + + 1005 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 38003 + 26 + Registers + 1005 + + 1005 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 1 + 1 + 0 + + + 35885 + 27 + not set + 0 + + 0 + + 1 + 2 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35886 + 28 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35887 + 29 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35888 + 30 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35889 + 31 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35890 + 32 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35891 + 33 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35892 + 34 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35893 + 35 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35894 + 36 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35895 + 37 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35896 + 38 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35897 + 39 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35898 + 40 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35899 + 41 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35900 + 42 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35901 + 43 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35902 + 44 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35903 + 45 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35904 + 46 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35905 + 47 + not set + 35885 + + 35885 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 203 + 48 + Disassembly + 0 + + 0 + + 1 + 2 + 3 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 1 + 0 + + + 1913 + 49 + Instruction Trace + 203 + + 203 + + 1 + 4 + 2 + 0 + 0 + 0 + 600 + 210 + 0 + 0 + 600 + 250 + 100 + 0 + 0 + 0 + + + 35824 + 50 + Logic Analyzer + 0 + + 0 + + 1 + 6 + 0 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 1 + 0 + 0 + 0 + + + 343 + 51 + Performance Analyzer + 203 + + 203 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 204 + 52 + Performance Analyzer + 203 + + 203 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + 346 + 53 + Code Coverage + 203 + + 203 + + 1 + 4 + 2 + 0 + 0 + 0 + 210 + 600 + 0 + 0 + 250 + 600 + 100 + 0 + 0 + 0 + + + + + + 1 + 0 + + 100 + 0 + + + .\SRC\main.c + 56 + 25 + 25 + + + + + +
    diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_uvproj.bak b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_uvproj.bak new file mode 100644 index 0000000..e6f39fa --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/lunzhou_uvproj.bak @@ -0,0 +1,469 @@ + + + + 1.0 + +
    ### uVision Project, (C) Keil Software
    + + + + Target 1 + 0x4 + ARM-ADS + + + STM32F103RB + STMicroelectronics + IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + "STARTUP\ST\STM32F10x.s" ("STM32 Startup Code") + UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000) + 4231 + stm32f10x_lib.h + + + + + + + + + + 0 + + + + ST\STM32F10x\ + ST\STM32F10x\ + + 0 + 0 + 0 + 0 + 1 + + .\ + lunzhou + 1 + 0 + 1 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + + DARMSTM.DLL + -pSTM32F103RB + SARMCM3.DLL + + TARMSTM.DLL + -pSTM32F103RB + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + 0 + 8 + + + + + + + + + + + + + + Segger\JL2CM3.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4102 + + Segger\JL2CM3.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + .\SRC;.\Libraries\STM32F10x_StdPeriph_Driver\inc;.\Libraries\CMSIS\Core\CM3 + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + SRC + + + main.c + 1 + .\SRC\main.c + + + stm32f10x_it.c + 1 + .\SRC\stm32f10x_it.c + + + + + LIB + + + stm32f10x_rcc.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c + + + stm32f10x_tim.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c + + + stm32f10x_usart.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c + + + stm32f10x_wwdg.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c + + + misc.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c + + + stm32f10x_gpio.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c + + + stm32f10x_flash.c + 1 + .\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c + + + + + STARTUP + + + startup_stm32f10x_hd.s + 2 + .\Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s + + + + + CM3 + + + core_cm3.c + 1 + .\Libraries\CMSIS\Core\CM3\core_cm3.c + + + system_stm32f10x.c + 1 + .\Libraries\CMSIS\Core\CM3\system_stm32f10x.c + + + + + + + +
    diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/main.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/main.crf new file mode 100644 index 0000000..096b215 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/main.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/main.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/main.d new file mode 100644 index 0000000..03da1a1 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/main.d @@ -0,0 +1,30 @@ +main.o: SRC\main.c +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_lib.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_map.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_conf.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_type.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\cortexm3_macro.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_adc.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_bkp.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_can.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_crc.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_dac.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_dbgmcu.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_dma.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_exti.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_flash.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_fsmc.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_gpio.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_i2c.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_iwdg.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_nvic.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_pwr.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_rcc.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_rtc.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_sdio.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_spi.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_systick.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_tim.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_usart.h +main.o: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_wwdg.h +main.o: C:\Keil\ARM\RV31\INC\math.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/main.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/main.o new file mode 100644 index 0000000..baa76e7 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/main.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/misc.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/misc.crf new file mode 100644 index 0000000..dc5c1d8 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/misc.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/misc.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/misc.d new file mode 100644 index 0000000..b21c8d9 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/misc.d @@ -0,0 +1,14 @@ +misc.o: Libraries\STM32F10x_StdPeriph_Driver\src\misc.c +misc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h +misc.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +misc.o: .\Libraries\CMSIS\Core\CM3\core_cm3.h +misc.o: C:\Keil\ARM\RV31\INC\stdint.h +misc.o: .\Libraries\CMSIS\Core\CM3\system_stm32f10x.h +misc.o: .\SRC\stm32f10x_conf.h +misc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +misc.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +misc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +misc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +misc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +misc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +misc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/misc.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/misc.o new file mode 100644 index 0000000..b2f0f01 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/misc.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/startup_stm32f10x_hd.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/startup_stm32f10x_hd.d new file mode 100644 index 0000000..9b1f973 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/startup_stm32f10x_hd.d @@ -0,0 +1 @@ +startup_stm32f10x_hd.o: Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/startup_stm32f10x_hd.lst b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/startup_stm32f10x_hd.lst new file mode 100644 index 0000000..8f3f49b --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/startup_stm32f10x_hd.lst @@ -0,0 +1,1768 @@ + + + +ARM Macro Assembler Page 1 + + + 1 00000000 ;******************** (C) COPYRIGHT 2009 STMicroelectron + ics ******************** + 2 00000000 ;* File Name : startup_stm32f10x_hd.s + 3 00000000 ;* Author : MCD Application Team + 4 00000000 ;* Version : V3.1.2 + 5 00000000 ;* Date : 09/28/2009 + 6 00000000 ;* Description : STM32F10x High Density Devices v + ector table for RVMDK + 7 00000000 ;* toolchain. + 8 00000000 ;* This module performs: + 9 00000000 ;* - Set the initial SP + 10 00000000 ;* - Set the initial PC == Reset_Ha + ndler + 11 00000000 ;* - Set the vector table entries w + ith the exceptions ISR address + 12 00000000 ;* - Configure external SRAM mounte + d on STM3210E-EVAL board + 13 00000000 ;* to be used as data memory (opt + ional, to be enabled by user) + 14 00000000 ;* - Branches to __main in the C li + brary (which eventually + 15 00000000 ;* calls main()). + 16 00000000 ;* After Reset the CortexM3 process + or is in Thread mode, + 17 00000000 ;* priority is Privileged, and the + Stack is set to Main. + 18 00000000 ;* <<< Use Configuration Wizard in Context Menu >>> + 19 00000000 ;******************************************************* + ************************ + 20 00000000 ; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS A + T PROVIDING CUSTOMERS + 21 00000000 ; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN OR + DER FOR THEM TO SAVE TIME. + 22 00000000 ; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIAB + LE FOR ANY DIRECT, + 23 00000000 ; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY + CLAIMS ARISING FROM THE + 24 00000000 ; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOM + ERS OF THE CODING + 25 00000000 ; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR + PRODUCTS. + 26 00000000 ;******************************************************* + ************************ + 27 00000000 + 28 00000000 ; Amount of memory (in bytes) allocated for Stack + 29 00000000 ; Tailor this value to your application needs + 30 00000000 ; Stack Configuration + 31 00000000 ; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> + 32 00000000 ; + 33 00000000 + 34 00000000 00000400 + Stack_Size + EQU 0x00000400 + 35 00000000 + 36 00000000 AREA STACK, NOINIT, READWRITE, ALIGN +=3 + 37 00000000 Stack_Mem + SPACE Stack_Size + 38 00000400 __initial_sp + + + +ARM Macro Assembler Page 2 + + + 39 00000400 + 40 00000400 20000400 + __initial_spTop + EQU 0x20000400 ; stack used for Sy + stemInit_ExtMemCtl + 41 00000400 ; always internal RAM used + 42 00000400 + 43 00000400 ; Heap Configuration + 44 00000400 ; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> + 45 00000400 ; + 46 00000400 + 47 00000400 00000200 + Heap_Size + EQU 0x00000200 + 48 00000400 + 49 00000400 AREA HEAP, NOINIT, READWRITE, ALIGN= +3 + 50 00000000 __heap_base + 51 00000000 Heap_Mem + SPACE Heap_Size + 52 00000200 __heap_limit + 53 00000200 + 54 00000200 PRESERVE8 + 55 00000200 THUMB + 56 00000200 + 57 00000200 + 58 00000200 ; Vector Table Mapped to Address 0 at Reset + 59 00000200 AREA RESET, DATA, READONLY + 60 00000000 EXPORT __Vectors + 61 00000000 EXPORT __Vectors_End + 62 00000000 EXPORT __Vectors_Size + 63 00000000 + 64 00000000 20000400 + __Vectors + DCD __initial_spTop ; Top of Stack + 65 00000004 00000000 DCD Reset_Handler ; Reset Handler + 66 00000008 00000000 DCD NMI_Handler ; NMI Handler + 67 0000000C 00000000 DCD HardFault_Handler ; Hard Fault + Handler + 68 00000010 00000000 DCD MemManage_Handler + ; MPU Fault Handler + + 69 00000014 00000000 DCD BusFault_Handler + ; Bus Fault Handler + + 70 00000018 00000000 DCD UsageFault_Handler ; Usage Faul + t Handler + 71 0000001C 00000000 DCD 0 ; Reserved + 72 00000020 00000000 DCD 0 ; Reserved + 73 00000024 00000000 DCD 0 ; Reserved + 74 00000028 00000000 DCD 0 ; Reserved + 75 0000002C 00000000 DCD SVC_Handler ; SVCall Handler + 76 00000030 00000000 DCD DebugMon_Handler ; Debug Monito + r Handler + 77 00000034 00000000 DCD 0 ; Reserved + 78 00000038 00000000 DCD PendSV_Handler ; PendSV Handler + + 79 0000003C 00000000 DCD SysTick_Handler + ; SysTick Handler + + + +ARM Macro Assembler Page 3 + + + 80 00000040 + 81 00000040 ; External Interrupts + 82 00000040 00000000 DCD WWDG_IRQHandler + ; Window Watchdog + 83 00000044 00000000 DCD PVD_IRQHandler ; PVD through EX + TI Line detect + 84 00000048 00000000 DCD TAMPER_IRQHandler ; Tamper + 85 0000004C 00000000 DCD RTC_IRQHandler ; RTC + 86 00000050 00000000 DCD FLASH_IRQHandler ; Flash + 87 00000054 00000000 DCD RCC_IRQHandler ; RCC + 88 00000058 00000000 DCD EXTI0_IRQHandler ; EXTI Line 0 + 89 0000005C 00000000 DCD EXTI1_IRQHandler ; EXTI Line 1 + 90 00000060 00000000 DCD EXTI2_IRQHandler ; EXTI Line 2 + 91 00000064 00000000 DCD EXTI3_IRQHandler ; EXTI Line 3 + 92 00000068 00000000 DCD EXTI4_IRQHandler ; EXTI Line 4 + 93 0000006C 00000000 DCD DMA1_Channel1_IRQHandler + ; DMA1 Channel 1 + 94 00000070 00000000 DCD DMA1_Channel2_IRQHandler + ; DMA1 Channel 2 + 95 00000074 00000000 DCD DMA1_Channel3_IRQHandler + ; DMA1 Channel 3 + 96 00000078 00000000 DCD DMA1_Channel4_IRQHandler + ; DMA1 Channel 4 + 97 0000007C 00000000 DCD DMA1_Channel5_IRQHandler + ; DMA1 Channel 5 + 98 00000080 00000000 DCD DMA1_Channel6_IRQHandler + ; DMA1 Channel 6 + 99 00000084 00000000 DCD DMA1_Channel7_IRQHandler + ; DMA1 Channel 7 + 100 00000088 00000000 DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + + 101 0000008C 00000000 DCD USB_HP_CAN1_TX_IRQHandler ; USB + High Priority or C + AN1 TX + 102 00000090 00000000 DCD USB_LP_CAN1_RX0_IRQHandler ; US + B Low Priority or + CAN1 RX0 + 103 00000094 00000000 DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + 104 00000098 00000000 DCD CAN1_SCE_IRQHandler ; CAN1 SCE + 105 0000009C 00000000 DCD EXTI9_5_IRQHandler + ; EXTI Line 9..5 + 106 000000A0 00000000 DCD TIM1_BRK_IRQHandler + ; TIM1 Break + 107 000000A4 00000000 DCD TIM1_UP_IRQHandler + ; TIM1 Update + 108 000000A8 00000000 DCD TIM1_TRG_COM_IRQHandler ; TIM1 + Trigger and Commuta + tion + 109 000000AC 00000000 DCD TIM1_CC_IRQHandler ; TIM1 Captu + re Compare + 110 000000B0 00000000 DCD TIM2_IRQHandler ; TIM2 + 111 000000B4 00000000 DCD TIM3_IRQHandler ; TIM3 + 112 000000B8 00000000 DCD TIM4_IRQHandler ; TIM4 + 113 000000BC 00000000 DCD I2C1_EV_IRQHandler ; I2C1 Event + + 114 000000C0 00000000 DCD I2C1_ER_IRQHandler ; I2C1 Error + + 115 000000C4 00000000 DCD I2C2_EV_IRQHandler ; I2C2 Event + + + + +ARM Macro Assembler Page 4 + + + 116 000000C8 00000000 DCD I2C2_ER_IRQHandler ; I2C2 Error + + 117 000000CC 00000000 DCD SPI1_IRQHandler ; SPI1 + 118 000000D0 00000000 DCD SPI2_IRQHandler ; SPI2 + 119 000000D4 00000000 DCD USART1_IRQHandler ; USART1 + 120 000000D8 00000000 DCD USART2_IRQHandler ; USART2 + 121 000000DC 00000000 DCD USART3_IRQHandler ; USART3 + 122 000000E0 00000000 DCD EXTI15_10_IRQHandler + ; EXTI Line 15..10 + 123 000000E4 00000000 DCD RTCAlarm_IRQHandler ; RTC Alarm + through EXTI Line + 124 000000E8 00000000 DCD USBWakeUp_IRQHandler ; USB Wake + up from suspend + 125 000000EC 00000000 DCD TIM8_BRK_IRQHandler + ; TIM8 Break + 126 000000F0 00000000 DCD TIM8_UP_IRQHandler + ; TIM8 Update + 127 000000F4 00000000 DCD TIM8_TRG_COM_IRQHandler ; TIM8 + Trigger and Commuta + tion + 128 000000F8 00000000 DCD TIM8_CC_IRQHandler ; TIM8 Captu + re Compare + 129 000000FC 00000000 DCD ADC3_IRQHandler ; ADC3 + 130 00000100 00000000 DCD FSMC_IRQHandler ; FSMC + 131 00000104 00000000 DCD SDIO_IRQHandler ; SDIO + 132 00000108 00000000 DCD TIM5_IRQHandler ; TIM5 + 133 0000010C 00000000 DCD SPI3_IRQHandler ; SPI3 + 134 00000110 00000000 DCD UART4_IRQHandler ; UART4 + 135 00000114 00000000 DCD UART5_IRQHandler ; UART5 + 136 00000118 00000000 DCD TIM6_IRQHandler ; TIM6 + 137 0000011C 00000000 DCD TIM7_IRQHandler ; TIM7 + 138 00000120 00000000 DCD DMA2_Channel1_IRQHandler + ; DMA2 Channel1 + 139 00000124 00000000 DCD DMA2_Channel2_IRQHandler + ; DMA2 Channel2 + 140 00000128 00000000 DCD DMA2_Channel3_IRQHandler + ; DMA2 Channel3 + 141 0000012C 00000000 DCD DMA2_Channel4_5_IRQHandler ; DM + A2 Channel4 & Chann + el5 + 142 00000130 __Vectors_End + 143 00000130 + 144 00000130 00000130 + __Vectors_Size + EQU __Vectors_End - __Vectors + 145 00000130 + 146 00000130 AREA |.text|, CODE, READONLY + 147 00000000 + 148 00000000 ; Dummy SystemInit_ExtMemCtl function + 149 00000000 SystemInit_ExtMemCtl + PROC + 150 00000000 EXPORT SystemInit_ExtMemCtl [WEAK +] + 151 00000000 4770 BX LR + 152 00000002 ENDP + 153 00000002 + 154 00000002 ; Reset handler routine + 155 00000002 Reset_Handler + PROC + + + +ARM Macro Assembler Page 5 + + + 156 00000002 EXPORT Reset_Handler [WEAK +] + 157 00000002 IMPORT __main + 158 00000002 + 159 00000002 480B LDR R0, = SystemInit_ExtMemCtl ; in + itialize external m + emory controller + 160 00000004 4780 BLX R0 + 161 00000006 + 162 00000006 490B LDR R1, = __initial_sp ; restore or + iginal stack pointe + r + 163 00000008 F381 8808 MSR MSP, R1 + 164 0000000C + 165 0000000C 480A LDR R0, =__main + 166 0000000E 4700 BX R0 + 167 00000010 ENDP + 168 00000010 + 169 00000010 ; Dummy Exception Handlers (infinite loops which can be + modified) + 170 00000010 + 171 00000010 NMI_Handler + PROC + 172 00000010 EXPORT NMI_Handler [WEA +K] + 173 00000010 E7FE B . + 174 00000012 ENDP + 176 00000012 HardFault_Handler + PROC + 177 00000012 EXPORT HardFault_Handler [WEA +K] + 178 00000012 E7FE B . + 179 00000014 ENDP + 181 00000014 MemManage_Handler + PROC + 182 00000014 EXPORT MemManage_Handler [WEA +K] + 183 00000014 E7FE B . + 184 00000016 ENDP + 186 00000016 BusFault_Handler + PROC + 187 00000016 EXPORT BusFault_Handler [WEA +K] + 188 00000016 E7FE B . + 189 00000018 ENDP + 191 00000018 UsageFault_Handler + PROC + 192 00000018 EXPORT UsageFault_Handler [WEA +K] + 193 00000018 E7FE B . + 194 0000001A ENDP + 195 0000001A SVC_Handler + PROC + 196 0000001A EXPORT SVC_Handler [WEA +K] + 197 0000001A E7FE B . + 198 0000001C ENDP + 200 0000001C DebugMon_Handler + PROC + + + +ARM Macro Assembler Page 6 + + + 201 0000001C EXPORT DebugMon_Handler [WEA +K] + 202 0000001C E7FE B . + 203 0000001E ENDP + 204 0000001E PendSV_Handler + PROC + 205 0000001E EXPORT PendSV_Handler [WEA +K] + 206 0000001E E7FE B . + 207 00000020 ENDP + 208 00000020 SysTick_Handler + PROC + 209 00000020 EXPORT SysTick_Handler [WEA +K] + 210 00000020 E7FE B . + 211 00000022 ENDP + 212 00000022 + 213 00000022 Default_Handler + PROC + 214 00000022 + 215 00000022 EXPORT WWDG_IRQHandler [WEA +K] + 216 00000022 EXPORT PVD_IRQHandler [WEA +K] + 217 00000022 EXPORT TAMPER_IRQHandler [WEA +K] + 218 00000022 EXPORT RTC_IRQHandler [WEA +K] + 219 00000022 EXPORT FLASH_IRQHandler [WEA +K] + 220 00000022 EXPORT RCC_IRQHandler [WEA +K] + 221 00000022 EXPORT EXTI0_IRQHandler [WEA +K] + 222 00000022 EXPORT EXTI1_IRQHandler [WEA +K] + 223 00000022 EXPORT EXTI2_IRQHandler [WEA +K] + 224 00000022 EXPORT EXTI3_IRQHandler [WEA +K] + 225 00000022 EXPORT EXTI4_IRQHandler [WEA +K] + 226 00000022 EXPORT DMA1_Channel1_IRQHandler [WEA +K] + 227 00000022 EXPORT DMA1_Channel2_IRQHandler [WEA +K] + 228 00000022 EXPORT DMA1_Channel3_IRQHandler [WEA +K] + 229 00000022 EXPORT DMA1_Channel4_IRQHandler [WEA +K] + 230 00000022 EXPORT DMA1_Channel5_IRQHandler [WEA +K] + 231 00000022 EXPORT DMA1_Channel6_IRQHandler [WEA +K] + 232 00000022 EXPORT DMA1_Channel7_IRQHandler [WEA +K] + 233 00000022 EXPORT ADC1_2_IRQHandler [WEA +K] + 234 00000022 EXPORT USB_HP_CAN1_TX_IRQHandler [WEA + + + +ARM Macro Assembler Page 7 + + +K] + 235 00000022 EXPORT USB_LP_CAN1_RX0_IRQHandler [WEA +K] + 236 00000022 EXPORT CAN1_RX1_IRQHandler [WEA +K] + 237 00000022 EXPORT CAN1_SCE_IRQHandler [WEA +K] + 238 00000022 EXPORT EXTI9_5_IRQHandler [WEA +K] + 239 00000022 EXPORT TIM1_BRK_IRQHandler [WEA +K] + 240 00000022 EXPORT TIM1_UP_IRQHandler [WEA +K] + 241 00000022 EXPORT TIM1_TRG_COM_IRQHandler [WEA +K] + 242 00000022 EXPORT TIM1_CC_IRQHandler [WEA +K] + 243 00000022 EXPORT TIM2_IRQHandler [WEA +K] + 244 00000022 EXPORT TIM3_IRQHandler [WEA +K] + 245 00000022 EXPORT TIM4_IRQHandler [WEA +K] + 246 00000022 EXPORT I2C1_EV_IRQHandler [WEA +K] + 247 00000022 EXPORT I2C1_ER_IRQHandler [WEA +K] + 248 00000022 EXPORT I2C2_EV_IRQHandler [WEA +K] + 249 00000022 EXPORT I2C2_ER_IRQHandler [WEA +K] + 250 00000022 EXPORT SPI1_IRQHandler [WEA +K] + 251 00000022 EXPORT SPI2_IRQHandler [WEA +K] + 252 00000022 EXPORT USART1_IRQHandler [WEA +K] + 253 00000022 EXPORT USART2_IRQHandler [WEA +K] + 254 00000022 EXPORT USART3_IRQHandler [WEA +K] + 255 00000022 EXPORT EXTI15_10_IRQHandler [WEA +K] + 256 00000022 EXPORT RTCAlarm_IRQHandler [WEA +K] + 257 00000022 EXPORT USBWakeUp_IRQHandler [WEA +K] + 258 00000022 EXPORT TIM8_BRK_IRQHandler [WEA +K] + 259 00000022 EXPORT TIM8_UP_IRQHandler [WEA +K] + 260 00000022 EXPORT TIM8_TRG_COM_IRQHandler [WEA +K] + 261 00000022 EXPORT TIM8_CC_IRQHandler [WEA +K] + 262 00000022 EXPORT ADC3_IRQHandler [WEA +K] + 263 00000022 EXPORT FSMC_IRQHandler [WEA +K] + + + +ARM Macro Assembler Page 8 + + + 264 00000022 EXPORT SDIO_IRQHandler [WEA +K] + 265 00000022 EXPORT TIM5_IRQHandler [WEA +K] + 266 00000022 EXPORT SPI3_IRQHandler [WEA +K] + 267 00000022 EXPORT UART4_IRQHandler [WEA +K] + 268 00000022 EXPORT UART5_IRQHandler [WEA +K] + 269 00000022 EXPORT TIM6_IRQHandler [WEA +K] + 270 00000022 EXPORT TIM7_IRQHandler [WEA +K] + 271 00000022 EXPORT DMA2_Channel1_IRQHandler [WEA +K] + 272 00000022 EXPORT DMA2_Channel2_IRQHandler [WEA +K] + 273 00000022 EXPORT DMA2_Channel3_IRQHandler [WEA +K] + 274 00000022 EXPORT DMA2_Channel4_5_IRQHandler [WEA +K] + 275 00000022 + 276 00000022 WWDG_IRQHandler + 277 00000022 PVD_IRQHandler + 278 00000022 TAMPER_IRQHandler + 279 00000022 RTC_IRQHandler + 280 00000022 FLASH_IRQHandler + 281 00000022 RCC_IRQHandler + 282 00000022 EXTI0_IRQHandler + 283 00000022 EXTI1_IRQHandler + 284 00000022 EXTI2_IRQHandler + 285 00000022 EXTI3_IRQHandler + 286 00000022 EXTI4_IRQHandler + 287 00000022 DMA1_Channel1_IRQHandler + 288 00000022 DMA1_Channel2_IRQHandler + 289 00000022 DMA1_Channel3_IRQHandler + 290 00000022 DMA1_Channel4_IRQHandler + 291 00000022 DMA1_Channel5_IRQHandler + 292 00000022 DMA1_Channel6_IRQHandler + 293 00000022 DMA1_Channel7_IRQHandler + 294 00000022 ADC1_2_IRQHandler + 295 00000022 USB_HP_CAN1_TX_IRQHandler + 296 00000022 USB_LP_CAN1_RX0_IRQHandler + 297 00000022 CAN1_RX1_IRQHandler + 298 00000022 CAN1_SCE_IRQHandler + 299 00000022 EXTI9_5_IRQHandler + 300 00000022 TIM1_BRK_IRQHandler + 301 00000022 TIM1_UP_IRQHandler + 302 00000022 TIM1_TRG_COM_IRQHandler + 303 00000022 TIM1_CC_IRQHandler + 304 00000022 TIM2_IRQHandler + 305 00000022 TIM3_IRQHandler + 306 00000022 TIM4_IRQHandler + 307 00000022 I2C1_EV_IRQHandler + 308 00000022 I2C1_ER_IRQHandler + 309 00000022 I2C2_EV_IRQHandler + 310 00000022 I2C2_ER_IRQHandler + 311 00000022 SPI1_IRQHandler + + + +ARM Macro Assembler Page 9 + + + 312 00000022 SPI2_IRQHandler + 313 00000022 USART1_IRQHandler + 314 00000022 USART2_IRQHandler + 315 00000022 USART3_IRQHandler + 316 00000022 EXTI15_10_IRQHandler + 317 00000022 RTCAlarm_IRQHandler + 318 00000022 USBWakeUp_IRQHandler + 319 00000022 TIM8_BRK_IRQHandler + 320 00000022 TIM8_UP_IRQHandler + 321 00000022 TIM8_TRG_COM_IRQHandler + 322 00000022 TIM8_CC_IRQHandler + 323 00000022 ADC3_IRQHandler + 324 00000022 FSMC_IRQHandler + 325 00000022 SDIO_IRQHandler + 326 00000022 TIM5_IRQHandler + 327 00000022 SPI3_IRQHandler + 328 00000022 UART4_IRQHandler + 329 00000022 UART5_IRQHandler + 330 00000022 TIM6_IRQHandler + 331 00000022 TIM7_IRQHandler + 332 00000022 DMA2_Channel1_IRQHandler + 333 00000022 DMA2_Channel2_IRQHandler + 334 00000022 DMA2_Channel3_IRQHandler + 335 00000022 DMA2_Channel4_5_IRQHandler + 336 00000022 E7FE B . + 337 00000024 + 338 00000024 ENDP + 339 00000024 + 340 00000024 ALIGN + 341 00000024 + 342 00000024 ;******************************************************* + ************************ + 343 00000024 ; User Stack and Heap initialization + 344 00000024 ;******************************************************* + ************************ + 345 00000024 IF :DEF:__MICROLIB + 352 00000024 + 353 00000024 IMPORT __use_two_region_memory + 354 00000024 EXPORT __user_initial_stackheap + 355 00000024 + 356 00000024 __user_initial_stackheap + 357 00000024 + 358 00000024 4805 LDR R0, = Heap_Mem + 359 00000026 4906 LDR R1, =(Stack_Mem + Stack_Size) + 360 00000028 4A06 LDR R2, = (Heap_Mem + Heap_Size) + 361 0000002A 4B07 LDR R3, = Stack_Mem + 362 0000002C 4770 BX LR + 363 0000002E + 364 0000002E 00 00 ALIGN + 365 00000030 + 366 00000030 ENDIF + 367 00000030 + 368 00000030 END + 00000000 + 00000000 + 00000000 + 00000000 + 00000400 + 00000200 + + + +ARM Macro Assembler Page 10 + + + 00000000 +Command Line: --debug --xref --device=DARMSTM --apcs=interwork -ostartup_stm32f +10x_hd.o -IC:\Keil\ARM\INC\ST\STM32F10x --list=.\startup_stm32f10x_hd.lst Libra +ries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Relocatable symbols + +STACK 00000000 + +Symbol: STACK + Definitions + At line 36 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + None +Comment: STACK unused +Stack_Mem 00000000 + +Symbol: Stack_Mem + Definitions + At line 37 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + At line 359 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 361 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +__initial_sp 00000400 + +Symbol: __initial_sp + Definitions + At line 38 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + At line 162 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s +Comment: __initial_sp used once +3 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Relocatable symbols + +HEAP 00000000 + +Symbol: HEAP + Definitions + At line 49 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + None +Comment: HEAP unused +Heap_Mem 00000000 + +Symbol: Heap_Mem + Definitions + At line 51 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + At line 358 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 360 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +__heap_base 00000000 + +Symbol: __heap_base + Definitions + At line 50 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + None +Comment: __heap_base unused +__heap_limit 00000200 + +Symbol: __heap_limit + Definitions + At line 52 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + None +Comment: __heap_limit unused +4 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Relocatable symbols + +RESET 00000000 + +Symbol: RESET + Definitions + At line 59 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + None +Comment: RESET unused +__Vectors 00000000 + +Symbol: __Vectors + Definitions + At line 64 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + At line 60 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 144 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +__Vectors_End 00000130 + +Symbol: __Vectors_End + Definitions + At line 142 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 61 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 144 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +3 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Relocatable symbols + +.text 00000000 + +Symbol: .text + Definitions + At line 146 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + None +Comment: .text unused +ADC1_2_IRQHandler 00000022 + +Symbol: ADC1_2_IRQHandler + Definitions + At line 294 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 100 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 233 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +ADC3_IRQHandler 00000022 + +Symbol: ADC3_IRQHandler + Definitions + At line 323 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 129 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 262 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +BusFault_Handler 00000016 + +Symbol: BusFault_Handler + Definitions + At line 186 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 69 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 187 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +CAN1_RX1_IRQHandler 00000022 + +Symbol: CAN1_RX1_IRQHandler + Definitions + At line 297 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 103 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 236 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +CAN1_SCE_IRQHandler 00000022 + + + + +ARM Macro Assembler Page 2 Alphabetic symbol ordering +Relocatable symbols + +Symbol: CAN1_SCE_IRQHandler + Definitions + At line 298 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 104 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 237 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA1_Channel1_IRQHandler 00000022 + +Symbol: DMA1_Channel1_IRQHandler + Definitions + At line 287 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 93 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 226 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA1_Channel2_IRQHandler 00000022 + +Symbol: DMA1_Channel2_IRQHandler + Definitions + At line 288 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 94 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 227 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA1_Channel3_IRQHandler 00000022 + +Symbol: DMA1_Channel3_IRQHandler + Definitions + At line 289 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 95 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 228 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA1_Channel4_IRQHandler 00000022 + +Symbol: DMA1_Channel4_IRQHandler + Definitions + At line 290 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 96 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 229 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA1_Channel5_IRQHandler 00000022 + + + +ARM Macro Assembler Page 3 Alphabetic symbol ordering +Relocatable symbols + + +Symbol: DMA1_Channel5_IRQHandler + Definitions + At line 291 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 97 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 230 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA1_Channel6_IRQHandler 00000022 + +Symbol: DMA1_Channel6_IRQHandler + Definitions + At line 292 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 98 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 231 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA1_Channel7_IRQHandler 00000022 + +Symbol: DMA1_Channel7_IRQHandler + Definitions + At line 293 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 99 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 232 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA2_Channel1_IRQHandler 00000022 + +Symbol: DMA2_Channel1_IRQHandler + Definitions + At line 332 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 138 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 271 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA2_Channel2_IRQHandler 00000022 + +Symbol: DMA2_Channel2_IRQHandler + Definitions + At line 333 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 139 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 272 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + + + + +ARM Macro Assembler Page 4 Alphabetic symbol ordering +Relocatable symbols + +DMA2_Channel3_IRQHandler 00000022 + +Symbol: DMA2_Channel3_IRQHandler + Definitions + At line 334 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 140 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 273 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DMA2_Channel4_5_IRQHandler 00000022 + +Symbol: DMA2_Channel4_5_IRQHandler + Definitions + At line 335 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 141 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 274 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +DebugMon_Handler 0000001C + +Symbol: DebugMon_Handler + Definitions + At line 200 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 76 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 201 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +Default_Handler 00000022 + +Symbol: Default_Handler + Definitions + At line 213 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + None +Comment: Default_Handler unused +EXTI0_IRQHandler 00000022 + +Symbol: EXTI0_IRQHandler + Definitions + At line 282 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 88 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 221 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +EXTI15_10_IRQHandler 00000022 + + + + +ARM Macro Assembler Page 5 Alphabetic symbol ordering +Relocatable symbols + +Symbol: EXTI15_10_IRQHandler + Definitions + At line 316 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 122 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 255 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +EXTI1_IRQHandler 00000022 + +Symbol: EXTI1_IRQHandler + Definitions + At line 283 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 89 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 222 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +EXTI2_IRQHandler 00000022 + +Symbol: EXTI2_IRQHandler + Definitions + At line 284 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 90 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 223 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +EXTI3_IRQHandler 00000022 + +Symbol: EXTI3_IRQHandler + Definitions + At line 285 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 91 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 224 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +EXTI4_IRQHandler 00000022 + +Symbol: EXTI4_IRQHandler + Definitions + At line 286 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 92 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 225 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +EXTI9_5_IRQHandler 00000022 + + + +ARM Macro Assembler Page 6 Alphabetic symbol ordering +Relocatable symbols + + +Symbol: EXTI9_5_IRQHandler + Definitions + At line 299 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 105 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 238 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +FLASH_IRQHandler 00000022 + +Symbol: FLASH_IRQHandler + Definitions + At line 280 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 86 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 219 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +FSMC_IRQHandler 00000022 + +Symbol: FSMC_IRQHandler + Definitions + At line 324 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 130 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 263 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +HardFault_Handler 00000012 + +Symbol: HardFault_Handler + Definitions + At line 176 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 67 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 177 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +I2C1_ER_IRQHandler 00000022 + +Symbol: I2C1_ER_IRQHandler + Definitions + At line 308 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 114 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 247 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + + + + +ARM Macro Assembler Page 7 Alphabetic symbol ordering +Relocatable symbols + +I2C1_EV_IRQHandler 00000022 + +Symbol: I2C1_EV_IRQHandler + Definitions + At line 307 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 113 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 246 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +I2C2_ER_IRQHandler 00000022 + +Symbol: I2C2_ER_IRQHandler + Definitions + At line 310 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 116 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 249 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +I2C2_EV_IRQHandler 00000022 + +Symbol: I2C2_EV_IRQHandler + Definitions + At line 309 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 115 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 248 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +MemManage_Handler 00000014 + +Symbol: MemManage_Handler + Definitions + At line 181 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 68 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 182 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +NMI_Handler 00000010 + +Symbol: NMI_Handler + Definitions + At line 171 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 66 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 172 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + + + +ARM Macro Assembler Page 8 Alphabetic symbol ordering +Relocatable symbols + + +PVD_IRQHandler 00000022 + +Symbol: PVD_IRQHandler + Definitions + At line 277 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 83 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 216 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +PendSV_Handler 0000001E + +Symbol: PendSV_Handler + Definitions + At line 204 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 78 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 205 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +RCC_IRQHandler 00000022 + +Symbol: RCC_IRQHandler + Definitions + At line 281 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 87 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 220 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +RTCAlarm_IRQHandler 00000022 + +Symbol: RTCAlarm_IRQHandler + Definitions + At line 317 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 123 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 256 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +RTC_IRQHandler 00000022 + +Symbol: RTC_IRQHandler + Definitions + At line 279 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 85 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 218 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 + + + +ARM Macro Assembler Page 9 Alphabetic symbol ordering +Relocatable symbols + +x_hd.s + +Reset_Handler 00000002 + +Symbol: Reset_Handler + Definitions + At line 155 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 65 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 156 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +SDIO_IRQHandler 00000022 + +Symbol: SDIO_IRQHandler + Definitions + At line 325 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 131 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 264 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +SPI1_IRQHandler 00000022 + +Symbol: SPI1_IRQHandler + Definitions + At line 311 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 117 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 250 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +SPI2_IRQHandler 00000022 + +Symbol: SPI2_IRQHandler + Definitions + At line 312 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 118 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 251 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +SPI3_IRQHandler 00000022 + +Symbol: SPI3_IRQHandler + Definitions + At line 327 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 133 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + + + +ARM Macro Assembler Page 10 Alphabetic symbol ordering +Relocatable symbols + + At line 266 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +SVC_Handler 0000001A + +Symbol: SVC_Handler + Definitions + At line 195 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 75 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 196 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +SysTick_Handler 00000020 + +Symbol: SysTick_Handler + Definitions + At line 208 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 79 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 209 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +SystemInit_ExtMemCtl 00000000 + +Symbol: SystemInit_ExtMemCtl + Definitions + At line 149 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 150 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 159 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TAMPER_IRQHandler 00000022 + +Symbol: TAMPER_IRQHandler + Definitions + At line 278 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 84 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 217 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM1_BRK_IRQHandler 00000022 + +Symbol: TIM1_BRK_IRQHandler + Definitions + At line 300 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 106 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 + + + +ARM Macro Assembler Page 11 Alphabetic symbol ordering +Relocatable symbols + +x_hd.s + At line 239 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM1_CC_IRQHandler 00000022 + +Symbol: TIM1_CC_IRQHandler + Definitions + At line 303 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 109 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 242 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM1_TRG_COM_IRQHandler 00000022 + +Symbol: TIM1_TRG_COM_IRQHandler + Definitions + At line 302 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 108 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 241 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM1_UP_IRQHandler 00000022 + +Symbol: TIM1_UP_IRQHandler + Definitions + At line 301 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 107 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 240 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM2_IRQHandler 00000022 + +Symbol: TIM2_IRQHandler + Definitions + At line 304 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 110 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 243 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM3_IRQHandler 00000022 + +Symbol: TIM3_IRQHandler + Definitions + At line 305 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + + + +ARM Macro Assembler Page 12 Alphabetic symbol ordering +Relocatable symbols + + At line 111 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 244 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM4_IRQHandler 00000022 + +Symbol: TIM4_IRQHandler + Definitions + At line 306 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 112 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 245 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM5_IRQHandler 00000022 + +Symbol: TIM5_IRQHandler + Definitions + At line 326 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 132 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 265 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM6_IRQHandler 00000022 + +Symbol: TIM6_IRQHandler + Definitions + At line 330 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 136 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 269 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM7_IRQHandler 00000022 + +Symbol: TIM7_IRQHandler + Definitions + At line 331 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 137 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 270 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM8_BRK_IRQHandler 00000022 + +Symbol: TIM8_BRK_IRQHandler + Definitions + At line 319 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + + + +ARM Macro Assembler Page 13 Alphabetic symbol ordering +Relocatable symbols + + Uses + At line 125 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 258 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM8_CC_IRQHandler 00000022 + +Symbol: TIM8_CC_IRQHandler + Definitions + At line 322 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 128 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 261 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM8_TRG_COM_IRQHandler 00000022 + +Symbol: TIM8_TRG_COM_IRQHandler + Definitions + At line 321 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 127 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 260 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +TIM8_UP_IRQHandler 00000022 + +Symbol: TIM8_UP_IRQHandler + Definitions + At line 320 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 126 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 259 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +UART4_IRQHandler 00000022 + +Symbol: UART4_IRQHandler + Definitions + At line 328 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 134 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 267 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +UART5_IRQHandler 00000022 + +Symbol: UART5_IRQHandler + Definitions + At line 329 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 + + + +ARM Macro Assembler Page 14 Alphabetic symbol ordering +Relocatable symbols + +x_hd.s + Uses + At line 135 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 268 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +USART1_IRQHandler 00000022 + +Symbol: USART1_IRQHandler + Definitions + At line 313 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 119 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 252 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +USART2_IRQHandler 00000022 + +Symbol: USART2_IRQHandler + Definitions + At line 314 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 120 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 253 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +USART3_IRQHandler 00000022 + +Symbol: USART3_IRQHandler + Definitions + At line 315 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 121 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 254 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +USBWakeUp_IRQHandler 00000022 + +Symbol: USBWakeUp_IRQHandler + Definitions + At line 318 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 124 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 257 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +USB_HP_CAN1_TX_IRQHandler 00000022 + +Symbol: USB_HP_CAN1_TX_IRQHandler + Definitions + + + +ARM Macro Assembler Page 15 Alphabetic symbol ordering +Relocatable symbols + + At line 295 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 101 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 234 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +USB_LP_CAN1_RX0_IRQHandler 00000022 + +Symbol: USB_LP_CAN1_RX0_IRQHandler + Definitions + At line 296 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 102 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + At line 235 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +UsageFault_Handler 00000018 + +Symbol: UsageFault_Handler + Definitions + At line 191 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 70 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 192 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +WWDG_IRQHandler 00000022 + +Symbol: WWDG_IRQHandler + Definitions + At line 276 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 82 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 215 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +__user_initial_stackheap 00000024 + +Symbol: __user_initial_stackheap + Definitions + At line 356 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 354 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s +Comment: __user_initial_stackheap used once +74 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Absolute symbols + +Heap_Size 00000200 + +Symbol: Heap_Size + Definitions + At line 47 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + At line 51 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 360 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +Stack_Size 00000400 + +Symbol: Stack_Size + Definitions + At line 34 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + At line 37 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + At line 359 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + +__Vectors_Size 00000130 + +Symbol: __Vectors_Size + Definitions + At line 144 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 62 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s +Comment: __Vectors_Size used once +__initial_spTop 20000400 + +Symbol: __initial_spTop + Definitions + At line 40 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s + Uses + At line 64 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x +_hd.s +Comment: __initial_spTop used once +4 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +External symbols + +__main 00000000 + +Symbol: __main + Definitions + At line 157 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + At line 165 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s +Comment: __main used once +__use_two_region_memory 00000000 + +Symbol: __use_two_region_memory + Definitions + At line 353 in file Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10 +x_hd.s + Uses + None +Comment: __use_two_region_memory unused +2 symbols +411 symbols in table diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/startup_stm32f10x_hd.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/startup_stm32f10x_hd.o new file mode 100644 index 0000000..6dfba2d Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/startup_stm32f10x_hd.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_flash.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_flash.crf new file mode 100644 index 0000000..2178846 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_flash.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_flash.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_flash.d new file mode 100644 index 0000000..a47941a --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_flash.d @@ -0,0 +1,14 @@ +stm32f10x_flash.o: Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c +stm32f10x_flash.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_flash.h +stm32f10x_flash.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_flash.o: .\Libraries\CMSIS\Core\CM3\core_cm3.h +stm32f10x_flash.o: C:\Keil\ARM\RV31\INC\stdint.h +stm32f10x_flash.o: .\Libraries\CMSIS\Core\CM3\system_stm32f10x.h +stm32f10x_flash.o: .\SRC\stm32f10x_conf.h +stm32f10x_flash.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +stm32f10x_flash.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_flash.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +stm32f10x_flash.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +stm32f10x_flash.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +stm32f10x_flash.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +stm32f10x_flash.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_flash.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_flash.o new file mode 100644 index 0000000..74dc5b5 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_flash.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_gpio.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_gpio.crf new file mode 100644 index 0000000..36fb012 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_gpio.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_gpio.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_gpio.d new file mode 100644 index 0000000..4907e41 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_gpio.d @@ -0,0 +1,14 @@ +stm32f10x_gpio.o: Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c +stm32f10x_gpio.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +stm32f10x_gpio.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_gpio.o: .\Libraries\CMSIS\Core\CM3\core_cm3.h +stm32f10x_gpio.o: C:\Keil\ARM\RV31\INC\stdint.h +stm32f10x_gpio.o: .\Libraries\CMSIS\Core\CM3\system_stm32f10x.h +stm32f10x_gpio.o: .\SRC\stm32f10x_conf.h +stm32f10x_gpio.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +stm32f10x_gpio.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +stm32f10x_gpio.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_gpio.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +stm32f10x_gpio.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +stm32f10x_gpio.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +stm32f10x_gpio.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_gpio.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_gpio.o new file mode 100644 index 0000000..e0eed36 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_gpio.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_it.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_it.crf new file mode 100644 index 0000000..e4c8981 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_it.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_it.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_it.d new file mode 100644 index 0000000..28d2160 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_it.d @@ -0,0 +1,14 @@ +stm32f10x_it.o: SRC\stm32f10x_it.c +stm32f10x_it.o: SRC\stm32f10x_it.h +stm32f10x_it.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_it.o: .\Libraries\CMSIS\Core\CM3\core_cm3.h +stm32f10x_it.o: C:\Keil\ARM\RV31\INC\stdint.h +stm32f10x_it.o: .\Libraries\CMSIS\Core\CM3\system_stm32f10x.h +stm32f10x_it.o: .\SRC\stm32f10x_conf.h +stm32f10x_it.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +stm32f10x_it.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_it.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +stm32f10x_it.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +stm32f10x_it.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +stm32f10x_it.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +stm32f10x_it.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_it.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_it.o new file mode 100644 index 0000000..bc35b2c Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_it.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_rcc.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_rcc.crf new file mode 100644 index 0000000..2b50ab6 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_rcc.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_rcc.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_rcc.d new file mode 100644 index 0000000..26a1fb9 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_rcc.d @@ -0,0 +1,14 @@ +stm32f10x_rcc.o: Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c +stm32f10x_rcc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +stm32f10x_rcc.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_rcc.o: .\Libraries\CMSIS\Core\CM3\core_cm3.h +stm32f10x_rcc.o: C:\Keil\ARM\RV31\INC\stdint.h +stm32f10x_rcc.o: .\Libraries\CMSIS\Core\CM3\system_stm32f10x.h +stm32f10x_rcc.o: .\SRC\stm32f10x_conf.h +stm32f10x_rcc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +stm32f10x_rcc.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_rcc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +stm32f10x_rcc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +stm32f10x_rcc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +stm32f10x_rcc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +stm32f10x_rcc.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_rcc.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_rcc.o new file mode 100644 index 0000000..a896211 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_rcc.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_tim.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_tim.crf new file mode 100644 index 0000000..9c3d57b Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_tim.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_tim.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_tim.d new file mode 100644 index 0000000..96f4922 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_tim.d @@ -0,0 +1,14 @@ +stm32f10x_tim.o: Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c +stm32f10x_tim.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +stm32f10x_tim.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_tim.o: .\Libraries\CMSIS\Core\CM3\core_cm3.h +stm32f10x_tim.o: C:\Keil\ARM\RV31\INC\stdint.h +stm32f10x_tim.o: .\Libraries\CMSIS\Core\CM3\system_stm32f10x.h +stm32f10x_tim.o: .\SRC\stm32f10x_conf.h +stm32f10x_tim.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +stm32f10x_tim.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_tim.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +stm32f10x_tim.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +stm32f10x_tim.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +stm32f10x_tim.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +stm32f10x_tim.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_tim.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_tim.o new file mode 100644 index 0000000..39112e2 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_tim.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_usart.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_usart.crf new file mode 100644 index 0000000..4a9cae1 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_usart.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_usart.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_usart.d new file mode 100644 index 0000000..8f69a3d --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_usart.d @@ -0,0 +1,14 @@ +stm32f10x_usart.o: Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c +stm32f10x_usart.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +stm32f10x_usart.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_usart.o: .\Libraries\CMSIS\Core\CM3\core_cm3.h +stm32f10x_usart.o: C:\Keil\ARM\RV31\INC\stdint.h +stm32f10x_usart.o: .\Libraries\CMSIS\Core\CM3\system_stm32f10x.h +stm32f10x_usart.o: .\SRC\stm32f10x_conf.h +stm32f10x_usart.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +stm32f10x_usart.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_usart.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +stm32f10x_usart.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +stm32f10x_usart.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +stm32f10x_usart.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +stm32f10x_usart.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_usart.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_usart.o new file mode 100644 index 0000000..38d148b Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_usart.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_wwdg.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_wwdg.crf new file mode 100644 index 0000000..0c1e445 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_wwdg.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_wwdg.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_wwdg.d new file mode 100644 index 0000000..7cb9f95 --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_wwdg.d @@ -0,0 +1,14 @@ +stm32f10x_wwdg.o: Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c +stm32f10x_wwdg.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +stm32f10x_wwdg.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_wwdg.o: .\Libraries\CMSIS\Core\CM3\core_cm3.h +stm32f10x_wwdg.o: C:\Keil\ARM\RV31\INC\stdint.h +stm32f10x_wwdg.o: .\Libraries\CMSIS\Core\CM3\system_stm32f10x.h +stm32f10x_wwdg.o: .\SRC\stm32f10x_conf.h +stm32f10x_wwdg.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +stm32f10x_wwdg.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +stm32f10x_wwdg.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +stm32f10x_wwdg.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +stm32f10x_wwdg.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +stm32f10x_wwdg.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +stm32f10x_wwdg.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_wwdg.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_wwdg.o new file mode 100644 index 0000000..2a04ad1 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/stm32f10x_wwdg.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/system_stm32f10x.crf b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/system_stm32f10x.crf new file mode 100644 index 0000000..3559491 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/system_stm32f10x.crf differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/system_stm32f10x.d b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/system_stm32f10x.d new file mode 100644 index 0000000..243f73b --- /dev/null +++ b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/system_stm32f10x.d @@ -0,0 +1,13 @@ +system_stm32f10x.o: Libraries\CMSIS\Core\CM3\system_stm32f10x.c +system_stm32f10x.o: Libraries\CMSIS\Core\CM3\stm32f10x.h +system_stm32f10x.o: Libraries\CMSIS\Core\CM3\core_cm3.h +system_stm32f10x.o: C:\Keil\ARM\RV31\INC\stdint.h +system_stm32f10x.o: Libraries\CMSIS\Core\CM3\system_stm32f10x.h +system_stm32f10x.o: .\SRC\stm32f10x_conf.h +system_stm32f10x.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h +system_stm32f10x.o: .\Libraries\CMSIS\Core\CM3\stm32f10x.h +system_stm32f10x.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h +system_stm32f10x.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h +system_stm32f10x.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_usart.h +system_stm32f10x.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h +system_stm32f10x.o: .\Libraries\STM32F10x_StdPeriph_Driver\inc\misc.h diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/system_stm32f10x.o b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/system_stm32f10x.o new file mode 100644 index 0000000..eab0459 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/STM32-CODE/serial port output MPU-3050/serial/system_stm32f10x.o differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52-SCH.jpg b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52-SCH.jpg new file mode 100644 index 0000000..d016f07 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52-SCH.jpg differ diff --git a/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Module Size .jpg b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Module Size .jpg new file mode 100644 index 0000000..afc4ad2 Binary files /dev/null and b/sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/Module Size .jpg differ diff --git a/sheets/gyro/MPU6050-V1-SCH.jpg b/sheets/gyro/MPU6050-V1-SCH.jpg new file mode 100644 index 0000000..3406ff2 Binary files /dev/null and b/sheets/gyro/MPU6050-V1-SCH.jpg differ diff --git a/sheets/gyro/MPU6050-V1.jpg b/sheets/gyro/MPU6050-V1.jpg new file mode 100644 index 0000000..767ad11 Binary files /dev/null and b/sheets/gyro/MPU6050-V1.jpg differ diff --git a/sheets/gyro/PS-MPU-6000A.pdf b/sheets/gyro/PS-MPU-6000A.pdf new file mode 100644 index 0000000..0b891ff Binary files /dev/null and b/sheets/gyro/PS-MPU-6000A.pdf differ diff --git a/sheets/gyro/RM-MPU-6000A.pdf b/sheets/gyro/RM-MPU-6000A.pdf new file mode 100644 index 0000000..428baca Binary files /dev/null and b/sheets/gyro/RM-MPU-6000A.pdf differ diff --git a/sheets/gyro/Test program/51-coed/51-lcd-mpu6050.c b/sheets/gyro/Test program/51-coed/51-lcd-mpu6050.c new file mode 100644 index 0000000..a486e75 --- /dev/null +++ b/sheets/gyro/Test program/51-coed/51-lcd-mpu6050.c @@ -0,0 +1,373 @@ +//**************************************** +// Update to MPU6050 by shinetop +// MCU: STC89C52 +// 2012.3.1 +// ¹¦ÄÜ: ÏÔʾ¼ÓËٶȼƺÍÍÓÂÝÒǵÄ10λԭʼÊý¾Ý +//**************************************** +// GY-52 MPU3050 IIC²âÊÔ³ÌÐò +// ʹÓõ¥Æ¬»úSTC89C51 +// ¾§Õñ£º11.0592M +// ÏÔʾ£ºLCD1602 +// ±àÒë»·¾³ Keil uVision2 +// ²Î¿¼ºê¾§ÍøÕ¾24c04ͨÐųÌÐò +// ʱ¼ä£º2011Äê9ÔÂ1ÈÕ +// QQ£º531389319 +//**************************************** +#include +#include //Keil library +#include //Keil library +#include +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; +//**************************************** +// ¶¨Òå51µ¥Æ¬»ú¶Ë¿Ú +//**************************************** +#define DataPort P0 //LCD1602Êý¾Ý¶Ë¿Ú +sbit SCL=P1^0; //IICʱÖÓÒý½Å¶¨Òå +sbit SDA=P1^1; //IICÊý¾ÝÒý½Å¶¨Òå +sbit LCM_RS=P2^0; //LCD1602ÃüÁî¶Ë¿Ú +sbit LCM_RW=P2^1; //LCD1602ÃüÁî¶Ë¿Ú +sbit LCM_EN=P2^2; //LCD1602ÃüÁî¶Ë¿Ú +//**************************************** +// ¶¨ÒåMPU6050ÄÚ²¿µØÖ· +//**************************************** +#define SMPLRT_DIV 0x19 //ÍÓÂÝÒDzÉÑùÂÊ£¬µäÐÍÖµ£º0x07(125Hz) +#define CONFIG 0x1A //µÍͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x06(5Hz) +#define GYRO_CONFIG 0x1B //ÍÓÂÝÒÇ×Լ켰²âÁ¿·¶Î§£¬µäÐÍÖµ£º0x18(²»×Լ죬2000deg/s) +#define ACCEL_CONFIG 0x1C //¼ÓËÙ¼Æ×Լ졢²âÁ¿·¶Î§¼°¸ßͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x01(²»×Լ죬2G£¬5Hz) +#define ACCEL_XOUT_H 0x3B +#define ACCEL_XOUT_L 0x3C +#define ACCEL_YOUT_H 0x3D +#define ACCEL_YOUT_L 0x3E +#define ACCEL_ZOUT_H 0x3F +#define ACCEL_ZOUT_L 0x40 +#define TEMP_OUT_H 0x41 +#define TEMP_OUT_L 0x42 +#define GYRO_XOUT_H 0x43 +#define GYRO_XOUT_L 0x44 +#define GYRO_YOUT_H 0x45 +#define GYRO_YOUT_L 0x46 +#define GYRO_ZOUT_H 0x47 +#define GYRO_ZOUT_L 0x48 +#define PWR_MGMT_1 0x6B //µçÔ´¹ÜÀí£¬µäÐÍÖµ£º0x00(Õý³£ÆôÓÃ) +#define WHO_AM_I 0x75 //IICµØÖ·¼Ä´æÆ÷(ĬÈÏÊýÖµ0x68£¬Ö»¶Á) +#define SlaveAddress 0xD0 //IICдÈëʱµÄµØÖ·×Ö½ÚÊý¾Ý£¬+1Ϊ¶ÁÈ¡ +//**************************************** +//¶¨ÒåÀàÐͼ°±äÁ¿ +//**************************************** +uchar dis[4]; //ÏÔʾÊý×Ö(-511ÖÁ512)µÄ×Ö·ûÊý×é +int dis_data; //±äÁ¿ +//int Temperature,Temp_h,Temp_l; //ζȼ°¸ßµÍλÊý¾Ý +//**************************************** +//º¯ÊýÉùÃ÷ +//**************************************** +void delay(unsigned int k); //ÑÓʱ +//LCDÏà¹Øº¯Êý +void InitLcd(); //³õʼ»¯lcd1602 +void lcd_printf(uchar *s,int temp_data); +void WriteDataLCM(uchar dataW); //LCDÊý¾Ý +void WriteCommandLCM(uchar CMD,uchar Attribc); //LCDÖ¸Áî +void DisplayOneChar(uchar X,uchar Y,uchar DData); //ÏÔʾһ¸ö×Ö·û +void DisplayListChar(uchar X,uchar Y,uchar *DData,L); //ÏÔʾ×Ö·û´® +//MPU6050²Ù×÷º¯Êý +void InitMPU6050(); //³õʼ»¯MPU6050 +void Delay5us(); +void I2C_Start(); +void I2C_Stop(); +void I2C_SendACK(bit ack); +bit I2C_RecvACK(); +void I2C_SendByte(uchar dat); +uchar I2C_RecvByte(); +void I2C_ReadPage(); +void I2C_WritePage(); +void display_ACCEL_x(); +void display_ACCEL_y(); +void display_ACCEL_z(); +uchar Single_ReadI2C(uchar REG_Address); //¶ÁÈ¡I2CÊý¾Ý +void Single_WriteI2C(uchar REG_Address,uchar REG_data); //ÏòI2CдÈëÊý¾Ý +//**************************************** +//ÕûÊýת×Ö·û´® +//**************************************** +void lcd_printf(uchar *s,int temp_data) +{ + if(temp_data<0) + { + temp_data=-temp_data; + *s='-'; + } + else *s=' '; + *++s =temp_data/100+0x30; + temp_data=temp_data%100; //È¡ÓàÔËËã + *++s =temp_data/10+0x30; + temp_data=temp_data%10; //È¡ÓàÔËËã + *++s =temp_data+0x30; +} +//**************************************** +//ÑÓʱ +//**************************************** +void delay(unsigned int k) +{ + unsigned int i,j; + for(i=0;i +#include //Keil library +#include //Keil library +#include +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; +//**************************************** +// ¶¨Òå51µ¥Æ¬»ú¶Ë¿Ú +//**************************************** +#define DataPort P0 //LCD1602Êý¾Ý¶Ë¿Ú +sbit SCL=P1^0; //IICʱÖÓÒý½Å¶¨Òå +sbit SDA=P1^1; //IICÊý¾ÝÒý½Å¶¨Òå +sbit LCM_RS=P2^0; //LCD1602ÃüÁî¶Ë¿Ú +sbit LCM_RW=P2^1; //LCD1602ÃüÁî¶Ë¿Ú +sbit LCM_EN=P2^2; //LCD1602ÃüÁî¶Ë¿Ú +//**************************************** +// ¶¨ÒåMPU6050ÄÚ²¿µØÖ· +//**************************************** +#define SMPLRT_DIV 0x19 //ÍÓÂÝÒDzÉÑùÂÊ£¬µäÐÍÖµ£º0x07(125Hz) +#define CONFIG 0x1A //µÍͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x06(5Hz) +#define GYRO_CONFIG 0x1B //ÍÓÂÝÒÇ×Լ켰²âÁ¿·¶Î§£¬µäÐÍÖµ£º0x18(²»×Լ죬2000deg/s) +#define ACCEL_CONFIG 0x1C //¼ÓËÙ¼Æ×Լ졢²âÁ¿·¶Î§¼°¸ßͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x01(²»×Լ죬2G£¬5Hz) +#define ACCEL_XOUT_H 0x3B +#define ACCEL_XOUT_L 0x3C +#define ACCEL_YOUT_H 0x3D +#define ACCEL_YOUT_L 0x3E +#define ACCEL_ZOUT_H 0x3F +#define ACCEL_ZOUT_L 0x40 +#define TEMP_OUT_H 0x41 +#define TEMP_OUT_L 0x42 +#define GYRO_XOUT_H 0x43 +#define GYRO_XOUT_L 0x44 +#define GYRO_YOUT_H 0x45 +#define GYRO_YOUT_L 0x46 +#define GYRO_ZOUT_H 0x47 +#define GYRO_ZOUT_L 0x48 +#define PWR_MGMT_1 0x6B //µçÔ´¹ÜÀí£¬µäÐÍÖµ£º0x00(Õý³£ÆôÓÃ) +#define WHO_AM_I 0x75 //IICµØÖ·¼Ä´æÆ÷(ĬÈÏÊýÖµ0x68£¬Ö»¶Á) +#define SlaveAddress 0xD0 //IICдÈëʱµÄµØÖ·×Ö½ÚÊý¾Ý£¬+1Ϊ¶ÁÈ¡ +//**************************************** +//¶¨ÒåÀàÐͼ°±äÁ¿ +//**************************************** +uchar dis[6]; //ÏÔʾÊý×Ö(-511ÖÁ512)µÄ×Ö·ûÊý×é +int dis_data; //±äÁ¿ +//int Temperature,Temp_h,Temp_l; //ζȼ°¸ßµÍλÊý¾Ý +//**************************************** +//º¯ÊýÉùÃ÷ +//**************************************** +void delay(unsigned int k); //ÑÓʱ +void lcd_printf(uchar *s,int temp_data); + +//MPU6050²Ù×÷º¯Êý +void InitMPU6050(); //³õʼ»¯MPU6050 +void Delay5us(); +void I2C_Start(); +void I2C_Stop(); +void I2C_SendACK(bit ack); +bit I2C_RecvACK(); +void I2C_SendByte(uchar dat); +uchar I2C_RecvByte(); +void I2C_ReadPage(); +void I2C_WritePage(); +void display_ACCEL_x(); +void display_ACCEL_y(); +void display_ACCEL_z(); +uchar Single_ReadI2C(uchar REG_Address); //¶ÁÈ¡I2CÊý¾Ý +void Single_WriteI2C(uchar REG_Address,uchar REG_data); //ÏòI2CдÈëÊý¾Ý +//**************************************** +//ÕûÊýת×Ö·û´® +//**************************************** +void lcd_printf(uchar *s,int temp_data) +{ + if(temp_data<0) + { + temp_data=-temp_data; + *s='-'; + } + else *s=' '; + + *++s =temp_data/10000+0x30; + temp_data=temp_data%10000; //È¡ÓàÔËËã + + *++s =temp_data/1000+0x30; + temp_data=temp_data%1000; //È¡ÓàÔËËã + + *++s =temp_data/100+0x30; + temp_data=temp_data%100; //È¡ÓàÔËËã + *++s =temp_data/10+0x30; + temp_data=temp_data%10; //È¡ÓàÔËËã + *++s =temp_data+0x30; +} +//**************************************** + +void SeriPushSend(uchar send_data) +{ + SBUF=send_data; + while(!TI);TI=0; +} +//**************************************** +//ÑÓʱ +//**************************************** +void delay(unsigned int k) +{ + unsigned int i,j; + for(i=0;i +// Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib +// +// Changelog: +// 2011-10-07 - initial release + +/* ============================================ +I2Cdev device library code is placed under the MIT license +Copyright (c) 2011 Jeff Rowberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +=============================================== +*/ + +// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation +// is used in I2Cdev.h +#include "Wire.h" + +// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files +// for both classes must be in the include path of your project +#include "I2Cdev.h" +#include "MPU6050.h" + +// class default I2C address is 0x68 +// specific I2C addresses may be passed as a parameter here +// AD0 low = 0x68 (default for InvenSense evaluation board) +// AD0 high = 0x69 +MPU6050 accelgyro; + +int16_t ax, ay, az; +int16_t gx, gy, gz; + +#define LED_PIN 13 +bool blinkState = false; + +void setup() { + // join I2C bus (I2Cdev library doesn't do this automatically) + Wire.begin(); + + // initialize serial communication + // (38400 chosen because it works as well at 8MHz as it does at 16MHz, but + // it's really up to you depending on your project) + Serial.begin(38400); + + // initialize device + Serial.println("Initializing I2C devices..."); + accelgyro.initialize(); + + // verify connection + Serial.println("Testing device connections..."); + Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed"); + + // configure Arduino LED for + pinMode(LED_PIN, OUTPUT); +} + +void loop() { + // read raw accel/gyro measurements from device + accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); + + // these methods (and a few others) are also available + //accelgyro.getAcceleration(&ax, &ay, &az); + //accelgyro.getRotation(&gx, &gy, &gz); + + // display tab-separated accel/gyro x/y/z values + Serial.print("a/g:\t"); + Serial.print(ax); Serial.print("\t"); + Serial.print(ay); Serial.print("\t"); + Serial.print(az); Serial.print("\t"); + Serial.print(gx); Serial.print("\t"); + Serial.print(gy); Serial.print("\t"); + Serial.println(gz); + + // blink LED to indicate activity + blinkState = !blinkState; + digitalWrite(LED_PIN, blinkState); +} diff --git a/sheets/gyro/Test program/Arduino/MPU6050/I2Cdev.cpp b/sheets/gyro/Test program/Arduino/MPU6050/I2Cdev.cpp new file mode 100644 index 0000000..155723f --- /dev/null +++ b/sheets/gyro/Test program/Arduino/MPU6050/I2Cdev.cpp @@ -0,0 +1,1171 @@ +// I2Cdev library collection - Main I2C device class +// Abstracts bit and byte I2C R/W functions into a convenient class +// 11/1/2011 by Jeff Rowberg +// +// Changelog: +// 2011-11-01 - fix write*Bits mask calculation (thanks sasquatch @ Arduino forums) +// 2011-10-03 - added automatic Arduino version detection for ease of use +// 2011-10-02 - added Gene Knight's NBWire TwoWire class implementation with small modifications +// 2011-08-31 - added support for Arduino 1.0 Wire library (methods are different from 0.x) +// 2011-08-03 - added optional timeout parameter to read* methods to easily change from default +// 2011-08-02 - added support for 16-bit registers +// - fixed incorrect Doxygen comments on some methods +// - added timeout value for read operations (thanks mem @ Arduino forums) +// 2011-07-30 - changed read/write function structures to return success or byte counts +// - made all methods static for multi-device memory savings +// 2011-07-28 - initial release + +/* ============================================ +I2Cdev device library code is placed under the MIT license +Copyright (c) 2011 Jeff Rowberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +=============================================== +*/ + +#include "I2Cdev.h" + +#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE + // NBWire implementation based heavily on code by Gene Knight + // Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html + // Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html + TwoWire Wire; +#endif + +/** Default constructor. + */ +I2Cdev::I2Cdev() { +} + +/** Read a single bit from an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param bitNum Bit position to read (0-7) + * @param data Container for single bit value + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout) { + uint8_t b; + uint8_t count = readByte(devAddr, regAddr, &b, timeout); + *data = b & (1 << bitNum); + return count; +} + +/** Read a single bit from a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param bitNum Bit position to read (0-15) + * @param data Container for single bit value + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout) { + uint16_t b; + uint8_t count = readWord(devAddr, regAddr, &b, timeout); + *data = b & (1 << bitNum); + return count; +} + +/** Read multiple bits from an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param bitStart First bit position to read (0-7) + * @param length Number of bits to read (not more than 8) + * @param data Container for right-aligned value (i.e. '101' read from any bitStart position will equal 0x05) + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout) { + // 01101001 read byte + // 76543210 bit numbers + // xxx args: bitStart=4, length=3 + // 010 masked + // -> 010 shifted + uint8_t count, b; + if ((count = readByte(devAddr, regAddr, &b, timeout)) != 0) { + uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); + b &= mask; + b >>= (bitStart - length + 1); + *data = b; + } + return count; +} + +/** Read multiple bits from a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param bitStart First bit position to read (0-15) + * @param length Number of bits to read (not more than 16) + * @param data Container for right-aligned value (i.e. '101' read from any bitStart position will equal 0x05) + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (1 = success, 0 = failure, -1 = timeout) + */ +int8_t I2Cdev::readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout) { + // 1101011001101001 read byte + // fedcba9876543210 bit numbers + // xxx args: bitStart=12, length=3 + // 010 masked + // -> 010 shifted + uint8_t count; + uint16_t w; + if ((count = readWord(devAddr, regAddr, &w, timeout)) != 0) { + uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1); + w &= mask; + w >>= (bitStart - length + 1); + *data = w; + } + return count; +} + +/** Read single byte from an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param data Container for byte value read from device + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint16_t timeout) { + return readBytes(devAddr, regAddr, 1, data, timeout); +} + +/** Read single word from a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param data Container for word value read from device + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout) { + return readWords(devAddr, regAddr, 1, data, timeout); +} + +/** Read multiple bytes from an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr First register regAddr to read from + * @param length Number of bytes to read + * @param data Buffer to store read data in + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Number of bytes read (0 indicates failure) + */ +int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print("I2C (0x"); + Serial.print(devAddr, HEX); + Serial.print(") reading "); + Serial.print(length, DEC); + Serial.print(" bytes from 0x"); + Serial.print(regAddr, HEX); + Serial.print("..."); + #endif + + int8_t count = 0; + + Wire.beginTransmission(devAddr); + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.send(regAddr); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.write(regAddr); + #endif + Wire.endTransmission(); + + Wire.beginTransmission(devAddr); + Wire.requestFrom(devAddr, length); + + uint32_t t1 = millis(); + for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + data[count] = Wire.receive(); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + data[count] = Wire.read(); + #endif + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[count], HEX); + if (count + 1 < length) Serial.print(" "); + #endif + } + if (timeout > 0 && millis() - t1 >= timeout && count < length) count = -1; // timeout + + Wire.endTransmission(); + + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(". Done ("); + Serial.print(count, DEC); + Serial.println(" read)."); + #endif + + return count; +} + +/** Read multiple words from a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr First register regAddr to read from + * @param length Number of words to read + * @param data Buffer to store read data in + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Number of words read (0 indicates failure) + */ +int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print("I2C (0x"); + Serial.print(devAddr, HEX); + Serial.print(") reading "); + Serial.print(length, DEC); + Serial.print(" words from 0x"); + Serial.print(regAddr, HEX); + Serial.print("..."); + #endif + + int8_t count = 0; + + Wire.beginTransmission(devAddr); + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.send(regAddr); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.write(regAddr); + #endif + Wire.endTransmission(); + + Wire.beginTransmission(devAddr); + Wire.requestFrom(devAddr, (uint8_t)(length * 2)); // length=words, this wants bytes + + uint32_t t1 = millis(); + bool msb = true; // starts with MSB, then LSB + for (; Wire.available() && count < length && (timeout == 0 || millis() - t1 < timeout);) { + if (msb) { + // first byte is bits 15-8 (MSb=15) + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + data[count] = Wire.receive() << 8; + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + data[count] = Wire.read() << 8; + #endif + } else { + // second byte is bits 7-0 (LSb=0) + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + data[count] |= Wire.receive(); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + data[count] |= Wire.read(); + #endif + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[count], HEX); + if (count + 1 < length) Serial.print(" "); + #endif + count++; + } + msb = !msb; + } + if (timeout > 0 && millis() - t1 >= timeout && count < length) count = -1; // timeout + + Wire.endTransmission(); + + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(". Done ("); + Serial.print(count, DEC); + Serial.println(" read)."); + #endif + + return count; +} + +/** write a single bit in an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to write to + * @param bitNum Bit position to write (0-7) + * @param value New bit value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data) { + uint8_t b; + readByte(devAddr, regAddr, &b); + b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum)); + return writeByte(devAddr, regAddr, b); +} + +/** write a single bit in a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to write to + * @param bitNum Bit position to write (0-15) + * @param value New bit value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data) { + uint16_t w; + readWord(devAddr, regAddr, &w); + w = (data != 0) ? (w | (1 << bitNum)) : (w & ~(1 << bitNum)); + return writeWord(devAddr, regAddr, w); +} + +/** Write multiple bits in an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to write to + * @param bitStart First bit position to write (0-7) + * @param length Number of bits to write (not more than 8) + * @param data Right-aligned value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data) { + // 010 value to write + // 76543210 bit numbers + // xxx args: bitStart=4, length=3 + // 00011100 mask byte + // 10101111 original value (sample) + // 10100011 original & ~mask + // 10101011 masked | value + uint8_t b; + if (readByte(devAddr, regAddr, &b) != 0) { + uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); + data <<= (bitStart - length + 1); // shift data into correct position + data &= mask; // zero all non-important bits in data + b &= ~(mask); // zero all important bits in existing byte + b |= data; // combine data with existing byte + return writeByte(devAddr, regAddr, b); + } else { + return false; + } +} + +/** Write multiple bits in a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to write to + * @param bitStart First bit position to write (0-15) + * @param length Number of bits to write (not more than 16) + * @param data Right-aligned value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data) { + // 010 value to write + // fedcba9876543210 bit numbers + // xxx args: bitStart=12, length=3 + // 0001110000000000 mask byte + // 1010111110010110 original value (sample) + // 1010001110010110 original & ~mask + // 1010101110010110 masked | value + uint16_t w; + if (readWord(devAddr, regAddr, &w) != 0) { + uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); + data <<= (bitStart - length + 1); // shift data into correct position + data &= mask; // zero all non-important bits in data + w &= ~(mask); // zero all important bits in existing word + w |= data; // combine data with existing word + return writeWord(devAddr, regAddr, w); + } else { + return false; + } +} + +/** Write single byte to an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register address to write to + * @param data New byte value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) { + return writeBytes(devAddr, regAddr, 1, &data); +} + +/** Write single word to a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register address to write to + * @param data New word value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data) { + return writeWords(devAddr, regAddr, 1, &data); +} + +/** Write multiple bytes to an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr First register address to write to + * @param length Number of bytes to write + * @param data Buffer to copy new data from + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print("I2C (0x"); + Serial.print(devAddr, HEX); + Serial.print(") writing "); + Serial.print(length, DEC); + Serial.print(" bytes to 0x"); + Serial.print(regAddr, HEX); + Serial.print("..."); + #endif + uint8_t status = 0; + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.beginTransmission(devAddr); + Wire.send((uint8_t) regAddr); // send address + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.beginTransmission(devAddr); + Wire.write((uint8_t) regAddr); // send address + #endif + for (uint8_t i = 0; i < length; i++) { + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.send((uint8_t) data[i]); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.write((uint8_t) data[i]); + #endif + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[i], HEX); + if (i + 1 < length) Serial.print(" "); + #endif + } + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.endTransmission(); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + status = Wire.endTransmission(); + #endif + #ifdef I2CDEV_SERIAL_DEBUG + Serial.println(". Done."); + #endif + return status == 0; +} + +/** Write multiple words to a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr First register address to write to + * @param length Number of words to write + * @param data Buffer to copy new data from + * @return Status of operation (true = success) + */ +bool I2Cdev::writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print("I2C (0x"); + Serial.print(devAddr, HEX); + Serial.print(") writing "); + Serial.print(length, DEC); + Serial.print(" words to 0x"); + Serial.print(regAddr, HEX); + Serial.print("..."); + #endif + uint8_t status = 0; + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.beginTransmission(devAddr); + Wire.send(regAddr); // send address + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.beginTransmission(devAddr); + Wire.write(regAddr); // send address + #endif + for (uint8_t i = 0; i < length * 2; i++) { + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.send((uint8_t)(data[i++] >> 8)); // send MSB + Wire.send((uint8_t)data[i]); // send LSB + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.write((uint8_t)(data[i++] >> 8)); // send MSB + Wire.write((uint8_t)data[i]); // send LSB + #endif + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[i], HEX); + if (i + 1 < length) Serial.print(" "); + #endif + } + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.endTransmission(); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + status = Wire.endTransmission(); + #endif + #ifdef I2CDEV_SERIAL_DEBUG + Serial.println(". Done."); + #endif + return status == 0; +} + +/** Default timeout value for read operations. + * Set this to 0 to disable timeout detection. + */ +uint16_t I2Cdev::readTimeout = I2CDEV_DEFAULT_READ_TIMEOUT; + +#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE + /* + FastWire 0.1 + This is a library to help faster programs to read I2C devices. + Copyright(C) 2011 Francesco Ferrara + occhiobello at gmail dot com + */ + + boolean Fastwire::waitInt() { + int l = 250; + while (!(TWCR & (1 << TWINT)) && l-- > 0); + return l > 0; + } + + void Fastwire::setup(int khz, boolean pullup) { + TWCR = 0; + // TODO: add support for other MCUs, this is ATmega328+compatible only + if (pullup) + PORTC |= ((1 << 4) | (1 << 5)); + else + PORTC &= ~((1 << 4) | (1 << 5)); + + TWSR = 0; // no prescaler => prescaler = 1 + TWBR = ((16000L / khz) - 16) / 2; // change the I2C clock rate + TWCR = 1 << TWEN; // enable twi module, no interrupt + } + + byte Fastwire::write(byte device, byte address, byte value) { + byte twst, retry; + retry = 2; + do { + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); + if (!waitInt()) return 1; + twst = TWSR & 0xF8; + if (twst != TW_START && twst != TW_REP_START) return 2; + + TWDR = device & 0xFE; // send device address without read bit (1) + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 3; + twst = TWSR & 0xF8; + } + while (twst == TW_MT_SLA_NACK && retry-- > 0); + if (twst != TW_MT_SLA_ACK) return 4; + + TWDR = address; // send data to the previously addressed device + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 5; + twst = TWSR & 0xF8; + if (twst != TW_MT_DATA_ACK) return 6; + + TWDR = value; // send data to the previously addressed device + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 7; + twst = TWSR & 0xF8; + if (twst != TW_MT_DATA_ACK) return 8; + + return 0; + } + + byte Fastwire::readBuf(byte device, byte address, byte *data, byte num) { + byte twst, retry; + + retry = 2; + do { + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); + if (!waitInt()) return 16; + twst = TWSR & 0xF8; + if (twst != TW_START && twst != TW_REP_START) return 17; + + TWDR = device & 0xFE; // send device address to write + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 18; + twst = TWSR & 0xF8; + } + while (twst == TW_MT_SLA_NACK && retry-- > 0); + if (twst != TW_MT_SLA_ACK) return 19; + + TWDR = address; // send data to the previously addressed device + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 20; + twst = TWSR & 0xF8; + if (twst != TW_MT_DATA_ACK) return 21; + + retry = 2; + do { + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); + if (!waitInt()) return 22; + twst = TWSR & 0xF8; + if (twst != TW_START && twst != TW_REP_START) return 23; + + TWDR = device | 0x01; // send device address with the read bit (1) + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 24; + twst = TWSR & 0xF8; + } + while (twst == TW_MR_SLA_NACK && retry-- > 0); + if (twst != TW_MR_SLA_ACK) return 25; + + for (uint8_t i = 0; i < num; i++) { + if (i == num - 1) + TWCR = (1 << TWINT) | (1 << TWEN); + else + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA); + if (!waitInt()) return 26; + twst = TWSR & 0xF8; + if (twst != TW_MR_DATA_ACK && twst != TW_MR_DATA_NACK) return twst; + data[i] = TWDR; + } + + return 0; + } +#endif + +#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE + // NBWire implementation based heavily on code by Gene Knight + // Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html + // Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html + + /* + call this version 1.0 + + Offhand, the only funky part that I can think of is in nbrequestFrom, where the buffer + length and index are set *before* the data is actually read. The problem is that these + are variables local to the TwoWire object, and by the time we actually have read the + data, and know what the length actually is, we have no simple access to the object's + variables. The actual bytes read *is* given to the callback function, though. + + The ISR code for a slave receiver is commented out. I don't have that setup, and can't + verify it at this time. Save it for 2.0! + + The handling of the read and write processes here is much like in the demo sketch code: + the process is broken down into sequential functions, where each registers the next as a + callback, essentially. + + For example, for the Read process, twi_read00 just returns if TWI is not yet in a + ready state. When there's another interrupt, and the interface *is* ready, then it + sets up the read, starts it, and registers twi_read01 as the function to call after + the *next* interrupt. twi_read01, then, just returns if the interface is still in a + "reading" state. When the reading is done, it copies the information to the buffer, + cleans up, and calls the user-requested callback function with the actual number of + bytes read. + + The writing is similar. + + Questions, comments and problems can go to Gene@Telobot.com. + + Thumbs Up! + Gene Knight + + */ + + uint8_t TwoWire::rxBuffer[NBWIRE_BUFFER_LENGTH]; + uint8_t TwoWire::rxBufferIndex = 0; + uint8_t TwoWire::rxBufferLength = 0; + + uint8_t TwoWire::txAddress = 0; + uint8_t TwoWire::txBuffer[NBWIRE_BUFFER_LENGTH]; + uint8_t TwoWire::txBufferIndex = 0; + uint8_t TwoWire::txBufferLength = 0; + + //uint8_t TwoWire::transmitting = 0; + void (*TwoWire::user_onRequest)(void); + void (*TwoWire::user_onReceive)(int); + + static volatile uint8_t twi_transmitting; + static volatile uint8_t twi_state; + static uint8_t twi_slarw; + static volatile uint8_t twi_error; + static uint8_t twi_masterBuffer[TWI_BUFFER_LENGTH]; + static volatile uint8_t twi_masterBufferIndex; + static uint8_t twi_masterBufferLength; + static uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH]; + static volatile uint8_t twi_rxBufferIndex; + //static volatile uint8_t twi_Interrupt_Continue_Command; + static volatile uint8_t twi_Return_Value; + static volatile uint8_t twi_Done; + void (*twi_cbendTransmissionDone)(int); + void (*twi_cbreadFromDone)(int); + + void twi_init() { + // initialize state + twi_state = TWI_READY; + + // activate internal pull-ups for twi + // as per note from atmega8 manual pg167 + sbi(PORTC, 4); + sbi(PORTC, 5); + + // initialize twi prescaler and bit rate + cbi(TWSR, TWPS0); // TWI Status Register - Prescaler bits + cbi(TWSR, TWPS1); + + /* twi bit rate formula from atmega128 manual pg 204 + SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR)) + note: TWBR should be 10 or higher for master mode + It is 72 for a 16mhz Wiring board with 100kHz TWI */ + + TWBR = ((CPU_FREQ / TWI_FREQ) - 16) / 2; // bitrate register + // enable twi module, acks, and twi interrupt + + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA); + + /* TWEN - TWI Enable Bit + TWIE - TWI Interrupt Enable + TWEA - TWI Enable Acknowledge Bit + TWINT - TWI Interrupt Flag + TWSTA - TWI Start Condition + */ + } + + typedef struct { + uint8_t address; + uint8_t* data; + uint8_t length; + uint8_t wait; + uint8_t i; + } twi_Write_Vars; + + twi_Write_Vars *ptwv = 0; + static void (*fNextInterruptFunction)(void) = 0; + + void twi_Finish(byte bRetVal) { + if (ptwv) { + free(ptwv); + ptwv = 0; + } + twi_Done = 0xFF; + twi_Return_Value = bRetVal; + fNextInterruptFunction = 0; + } + + uint8_t twii_WaitForDone(uint16_t timeout) { + uint32_t endMillis = millis() + timeout; + while (!twi_Done && (timeout == 0 || millis() < endMillis)) continue; + return twi_Return_Value; + } + + void twii_SetState(uint8_t ucState) { + twi_state = ucState; + } + + void twii_SetError(uint8_t ucError) { + twi_error = ucError ; + } + + void twii_InitBuffer(uint8_t ucPos, uint8_t ucLength) { + twi_masterBufferIndex = 0; + twi_masterBufferLength = ucLength; + } + + void twii_CopyToBuf(uint8_t* pData, uint8_t ucLength) { + uint8_t i; + for (i = 0; i < ucLength; ++i) { + twi_masterBuffer[i] = pData[i]; + } + } + + void twii_CopyFromBuf(uint8_t *pData, uint8_t ucLength) { + uint8_t i; + for (i = 0; i < ucLength; ++i) { + pData[i] = twi_masterBuffer[i]; + } + } + + void twii_SetSlaRW(uint8_t ucSlaRW) { + twi_slarw = ucSlaRW; + } + + void twii_SetStart() { + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA); + } + + void twi_write01() { + if (TWI_MTX == twi_state) return; // blocking test + twi_transmitting = 0 ; + if (twi_error == 0xFF) + twi_Finish (0); // success + else if (twi_error == TW_MT_SLA_NACK) + twi_Finish (2); // error: address send, nack received + else if (twi_error == TW_MT_DATA_NACK) + twi_Finish (3); // error: data send, nack received + else + twi_Finish (4); // other twi error + if (twi_cbendTransmissionDone) return twi_cbendTransmissionDone(twi_Return_Value); + return; + } + + + void twi_write00() { + if (TWI_READY != twi_state) return; // blocking test + if (TWI_BUFFER_LENGTH < ptwv -> length) { + twi_Finish(1); // end write with error 1 + return; + } + twi_Done = 0x00; // show as working + twii_SetState(TWI_MTX); // to transmitting + twii_SetError(0xFF); // to No Error + twii_InitBuffer(0, ptwv -> length); // pointer and length + twii_CopyToBuf(ptwv -> data, ptwv -> length); // get the data + twii_SetSlaRW((ptwv -> address << 1) | TW_WRITE); // write command + twii_SetStart(); // start the cycle + fNextInterruptFunction = twi_write01; // next routine + return twi_write01(); + } + + void twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait) { + uint8_t i; + ptwv = (twi_Write_Vars *)malloc(sizeof(twi_Write_Vars)); + ptwv -> address = address; + ptwv -> data = data; + ptwv -> length = length; + ptwv -> wait = wait; + fNextInterruptFunction = twi_write00; + return twi_write00(); + } + + void twi_read01() { + if (TWI_MRX == twi_state) return; // blocking test + if (twi_masterBufferIndex < ptwv -> length) ptwv -> length = twi_masterBufferIndex; + twii_CopyFromBuf(ptwv -> data, ptwv -> length); + twi_Finish(ptwv -> length); + if (twi_cbreadFromDone) return twi_cbreadFromDone(twi_Return_Value); + return; + } + + void twi_read00() { + if (TWI_READY != twi_state) return; // blocking test + if (TWI_BUFFER_LENGTH < ptwv -> length) twi_Finish(0); // error return + twi_Done = 0x00; // show as working + twii_SetState(TWI_MRX); // reading + twii_SetError(0xFF); // reset error + twii_InitBuffer(0, ptwv -> length - 1); // init to one less than length + twii_SetSlaRW((ptwv -> address << 1) | TW_READ); // read command + twii_SetStart(); // start cycle + fNextInterruptFunction = twi_read01; + return twi_read01(); + } + + void twi_readFrom(uint8_t address, uint8_t* data, uint8_t length) { + uint8_t i; + + ptwv = (twi_Write_Vars *)malloc(sizeof(twi_Write_Vars)); + ptwv -> address = address; + ptwv -> data = data; + ptwv -> length = length; + fNextInterruptFunction = twi_read00; + return twi_read00(); + } + + void twi_reply(uint8_t ack) { + // transmit master read ready signal, with or without ack + if (ack){ + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA); + } else { + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT); + } + } + + void twi_stop(void) { + // send stop condition + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO); + + // wait for stop condition to be exectued on bus + // TWINT is not set after a stop condition! + while (TWCR & _BV(TWSTO)) { + continue; + } + + // update twi state + twi_state = TWI_READY; + } + + void twi_releaseBus(void) { + // release bus + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT); + + // update twi state + twi_state = TWI_READY; + } + + SIGNAL(TWI_vect) { + switch (TW_STATUS) { + // All Master + case TW_START: // sent start condition + case TW_REP_START: // sent repeated start condition + // copy device address and r/w bit to output register and ack + TWDR = twi_slarw; + twi_reply(1); + break; + + // Master Transmitter + case TW_MT_SLA_ACK: // slave receiver acked address + case TW_MT_DATA_ACK: // slave receiver acked data + // if there is data to send, send it, otherwise stop + if (twi_masterBufferIndex < twi_masterBufferLength) { + // copy data to output register and ack + TWDR = twi_masterBuffer[twi_masterBufferIndex++]; + twi_reply(1); + } else { + twi_stop(); + } + break; + + case TW_MT_SLA_NACK: // address sent, nack received + twi_error = TW_MT_SLA_NACK; + twi_stop(); + break; + + case TW_MT_DATA_NACK: // data sent, nack received + twi_error = TW_MT_DATA_NACK; + twi_stop(); + break; + + case TW_MT_ARB_LOST: // lost bus arbitration + twi_error = TW_MT_ARB_LOST; + twi_releaseBus(); + break; + + // Master Receiver + case TW_MR_DATA_ACK: // data received, ack sent + // put byte into buffer + twi_masterBuffer[twi_masterBufferIndex++] = TWDR; + + case TW_MR_SLA_ACK: // address sent, ack received + // ack if more bytes are expected, otherwise nack + if (twi_masterBufferIndex < twi_masterBufferLength) { + twi_reply(1); + } else { + twi_reply(0); + } + break; + + case TW_MR_DATA_NACK: // data received, nack sent + // put final byte into buffer + twi_masterBuffer[twi_masterBufferIndex++] = TWDR; + + case TW_MR_SLA_NACK: // address sent, nack received + twi_stop(); + break; + + // TW_MR_ARB_LOST handled by TW_MT_ARB_LOST case + + // Slave Receiver (NOT IMPLEMENTED YET) + /* + case TW_SR_SLA_ACK: // addressed, returned ack + case TW_SR_GCALL_ACK: // addressed generally, returned ack + case TW_SR_ARB_LOST_SLA_ACK: // lost arbitration, returned ack + case TW_SR_ARB_LOST_GCALL_ACK: // lost arbitration, returned ack + // enter slave receiver mode + twi_state = TWI_SRX; + + // indicate that rx buffer can be overwritten and ack + twi_rxBufferIndex = 0; + twi_reply(1); + break; + + case TW_SR_DATA_ACK: // data received, returned ack + case TW_SR_GCALL_DATA_ACK: // data received generally, returned ack + // if there is still room in the rx buffer + if (twi_rxBufferIndex < TWI_BUFFER_LENGTH) { + // put byte in buffer and ack + twi_rxBuffer[twi_rxBufferIndex++] = TWDR; + twi_reply(1); + } else { + // otherwise nack + twi_reply(0); + } + break; + + case TW_SR_STOP: // stop or repeated start condition received + // put a null char after data if there's room + if (twi_rxBufferIndex < TWI_BUFFER_LENGTH) { + twi_rxBuffer[twi_rxBufferIndex] = 0; + } + + // sends ack and stops interface for clock stretching + twi_stop(); + + // callback to user defined callback + twi_onSlaveReceive(twi_rxBuffer, twi_rxBufferIndex); + + // since we submit rx buffer to "wire" library, we can reset it + twi_rxBufferIndex = 0; + + // ack future responses and leave slave receiver state + twi_releaseBus(); + break; + + case TW_SR_DATA_NACK: // data received, returned nack + case TW_SR_GCALL_DATA_NACK: // data received generally, returned nack + // nack back at master + twi_reply(0); + break; + + // Slave Transmitter + case TW_ST_SLA_ACK: // addressed, returned ack + case TW_ST_ARB_LOST_SLA_ACK: // arbitration lost, returned ack + // enter slave transmitter mode + twi_state = TWI_STX; + + // ready the tx buffer index for iteration + twi_txBufferIndex = 0; + + // set tx buffer length to be zero, to verify if user changes it + twi_txBufferLength = 0; + + // request for txBuffer to be filled and length to be set + // note: user must call twi_transmit(bytes, length) to do this + twi_onSlaveTransmit(); + + // if they didn't change buffer & length, initialize it + if (0 == twi_txBufferLength) { + twi_txBufferLength = 1; + twi_txBuffer[0] = 0x00; + } + + // transmit first byte from buffer, fall through + + case TW_ST_DATA_ACK: // byte sent, ack returned + // copy data to output register + TWDR = twi_txBuffer[twi_txBufferIndex++]; + + // if there is more to send, ack, otherwise nack + if (twi_txBufferIndex < twi_txBufferLength) { + twi_reply(1); + } else { + twi_reply(0); + } + break; + + case TW_ST_DATA_NACK: // received nack, we are done + case TW_ST_LAST_DATA: // received ack, but we are done already! + // ack future responses + twi_reply(1); + // leave slave receiver state + twi_state = TWI_READY; + break; + */ + + // all + case TW_NO_INFO: // no state information + break; + + case TW_BUS_ERROR: // bus error, illegal stop/start + twi_error = TW_BUS_ERROR; + twi_stop(); + break; + } + + if (fNextInterruptFunction) return fNextInterruptFunction(); + } + + TwoWire::TwoWire() { } + + void TwoWire::begin(void) { + rxBufferIndex = 0; + rxBufferLength = 0; + + txBufferIndex = 0; + txBufferLength = 0; + + twi_init(); + } + + void TwoWire::beginTransmission(uint8_t address) { + //beginTransmission((uint8_t)address); + + // indicate that we are transmitting + twi_transmitting = 1; + + // set address of targeted slave + txAddress = address; + + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; + } + + uint8_t TwoWire::endTransmission(uint16_t timeout) { + // transmit buffer (blocking) + //int8_t ret = + twi_cbendTransmissionDone = NULL; + twi_writeTo(txAddress, txBuffer, txBufferLength, 1); + int8_t ret = twii_WaitForDone(timeout); + + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; + + // indicate that we are done transmitting + // twi_transmitting = 0; + return ret; + } + + void TwoWire::nbendTransmission(void (*function)(int)) { + twi_cbendTransmissionDone = function; + twi_writeTo(txAddress, txBuffer, txBufferLength, 1); + return; + } + + void TwoWire::send(uint8_t data) { + if (twi_transmitting) { + // in master transmitter mode + // don't bother if buffer is full + if (txBufferLength >= NBWIRE_BUFFER_LENGTH) { + return; + } + + // put byte in tx buffer + txBuffer[txBufferIndex] = data; + ++txBufferIndex; + + // update amount in buffer + txBufferLength = txBufferIndex; + } else { + // in slave send mode + // reply to master + //twi_transmit(&data, 1); + } + } + + uint8_t TwoWire::receive(void) { + // default to returning null char + // for people using with char strings + uint8_t value = 0; + + // get each successive byte on each call + if (rxBufferIndex < rxBufferLength) { + value = rxBuffer[rxBufferIndex]; + ++rxBufferIndex; + } + + return value; + } + + uint8_t TwoWire::requestFrom(uint8_t address, int quantity, uint16_t timeout) { + // clamp to buffer length + if (quantity > NBWIRE_BUFFER_LENGTH) { + quantity = NBWIRE_BUFFER_LENGTH; + } + + // perform blocking read into buffer + twi_cbreadFromDone = NULL; + twi_readFrom(address, rxBuffer, quantity); + uint8_t read = twii_WaitForDone(timeout); + + // set rx buffer iterator vars + rxBufferIndex = 0; + rxBufferLength = read; + + return read; + } + + void TwoWire::nbrequestFrom(uint8_t address, int quantity, void (*function)(int)) { + // clamp to buffer length + if (quantity > NBWIRE_BUFFER_LENGTH) { + quantity = NBWIRE_BUFFER_LENGTH; + } + + // perform blocking read into buffer + twi_cbreadFromDone = function; + twi_readFrom(address, rxBuffer, quantity); + //uint8_t read = twii_WaitForDone(); + + // set rx buffer iterator vars + //rxBufferIndex = 0; + //rxBufferLength = read; + + rxBufferIndex = 0; + rxBufferLength = quantity; // this is a hack + + return; //read; + } + + uint8_t TwoWire::available(void) { + return rxBufferLength - rxBufferIndex; + } + +#endif \ No newline at end of file diff --git a/sheets/gyro/Test program/Arduino/MPU6050/I2Cdev.h b/sheets/gyro/Test program/Arduino/MPU6050/I2Cdev.h new file mode 100644 index 0000000..e812b0e --- /dev/null +++ b/sheets/gyro/Test program/Arduino/MPU6050/I2Cdev.h @@ -0,0 +1,253 @@ +// I2Cdev library collection - Main I2C device class header file +// Abstracts bit and byte I2C R/W functions into a convenient class +// 11/1/2011 by Jeff Rowberg +// +// Changelog: +// 2011-11-01 - fix write*Bits mask calculation (thanks sasquatch @ Arduino forums) +// 2011-10-03 - added automatic Arduino version detection for ease of use +// 2011-10-02 - added Gene Knight's NBWire TwoWire class implementation with small modifications +// 2011-08-31 - added support for Arduino 1.0 Wire library (methods are different from 0.x) +// 2011-08-03 - added optional timeout parameter to read* methods to easily change from default +// 2011-08-02 - added support for 16-bit registers +// - fixed incorrect Doxygen comments on some methods +// - added timeout value for read operations (thanks mem @ Arduino forums) +// 2011-07-30 - changed read/write function structures to return success or byte counts +// - made all methods static for multi-device memory savings +// 2011-07-28 - initial release + +/* ============================================ +I2Cdev device library code is placed under the MIT license +Copyright (c) 2011 Jeff Rowberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +=============================================== +*/ + +#ifndef _I2CDEV_H_ +#define _I2CDEV_H_ + +// ----------------------------------------------------------------------------- +// I2C interface implementation setting +// ----------------------------------------------------------------------------- +#define I2CDEV_IMPLEMENTATION I2CDEV_ARDUINO_WIRE + +// ----------------------------------------------------------------------------- +// I2C interface implementation options +// ----------------------------------------------------------------------------- +#define I2CDEV_ARDUINO_WIRE 1 // Wire object from Arduino +#define I2CDEV_BUILTIN_NBWIRE 2 // Tweaked Wire object from Gene Knight's NBWire project + // ^^^ NBWire implementation is still buggy w/some interrupts! +#define I2CDEV_BUILTIN_FASTWIRE 3 // FastWire object from Francesco Ferrara's project + +// ----------------------------------------------------------------------------- +// Arduino-style "Serial.print" debug constant (uncomment to enable) +// ----------------------------------------------------------------------------- +//#define I2CDEV_SERIAL_DEBUG + +#ifdef ARDUINO + #if ARDUINO < 100 + #include "WProgram.h" + #else + #include "Arduino.h" + #endif + #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE + #include + #endif +#else + #include "ArduinoWrapper.h" +#endif + +// 1000ms default read timeout (modify with "I2Cdev::readTimeout = [ms];") +#define I2CDEV_DEFAULT_READ_TIMEOUT 1000 + +class I2Cdev { + public: + I2Cdev(); + + static int8_t readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); + + static bool writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data); + static bool writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data); + static bool writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data); + static bool writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data); + static bool writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data); + static bool writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data); + static bool writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data); + static bool writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data); + + static uint16_t readTimeout; +}; + +#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE + // I2C library + ////////////////////// + // Copyright(C) 2011 + // Francesco Ferrara + ////////////////////// + + /* Master */ + #define TW_START 0x08 + #define TW_REP_START 0x10 + + /* Master Transmitter */ + #define TW_MT_SLA_ACK 0x18 + #define TW_MT_SLA_NACK 0x20 + #define TW_MT_DATA_ACK 0x28 + #define TW_MT_DATA_NACK 0x30 + #define TW_MT_ARB_LOST 0x38 + + /* Master Receiver */ + #define TW_MR_ARB_LOST 0x38 + #define TW_MR_SLA_ACK 0x40 + #define TW_MR_SLA_NACK 0x48 + #define TW_MR_DATA_ACK 0x50 + #define TW_MR_DATA_NACK 0x58 + + #define TW_OK 0 + #define TW_ERROR 1 + + class Fastwire { + private: + static boolean waitInt(); + + public: + static void setup(int khz, boolean pullup); + static byte write(byte device, byte address, byte value); + static byte readBuf(byte device, byte address, byte *data, byte num); + }; +#endif + +#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE + // NBWire implementation based heavily on code by Gene Knight + // Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html + // Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html + + #define NBWIRE_BUFFER_LENGTH 32 + + class TwoWire { + private: + static uint8_t rxBuffer[]; + static uint8_t rxBufferIndex; + static uint8_t rxBufferLength; + + static uint8_t txAddress; + static uint8_t txBuffer[]; + static uint8_t txBufferIndex; + static uint8_t txBufferLength; + + // static uint8_t transmitting; + static void (*user_onRequest)(void); + static void (*user_onReceive)(int); + static void onRequestService(void); + static void onReceiveService(uint8_t*, int); + + public: + TwoWire(); + void begin(); + void begin(uint8_t); + void begin(int); + void beginTransmission(uint8_t); + //void beginTransmission(int); + uint8_t endTransmission(uint16_t timeout=0); + void nbendTransmission(void (*function)(int)) ; + uint8_t requestFrom(uint8_t, int, uint16_t timeout=0); + //uint8_t requestFrom(int, int); + void nbrequestFrom(uint8_t, int, void (*function)(int)); + void send(uint8_t); + void send(uint8_t*, uint8_t); + //void send(int); + void send(char*); + uint8_t available(void); + uint8_t receive(void); + void onReceive(void (*)(int)); + void onRequest(void (*)(void)); + }; + + #define TWI_READY 0 + #define TWI_MRX 1 + #define TWI_MTX 2 + #define TWI_SRX 3 + #define TWI_STX 4 + + #define TW_WRITE 0 + #define TW_READ 1 + + #define TW_MT_SLA_NACK 0x20 + #define TW_MT_DATA_NACK 0x30 + + #define CPU_FREQ 16000000L + #define TWI_FREQ 100000L + #define TWI_BUFFER_LENGTH 32 + + /* TWI Status is in TWSR, in the top 5 bits: TWS7 - TWS3 */ + + #define TW_STATUS_MASK (_BV(TWS7)|_BV(TWS6)|_BV(TWS5)|_BV(TWS4)|_BV(TWS3)) + #define TW_STATUS (TWSR & TW_STATUS_MASK) + #define TW_START 0x08 + #define TW_REP_START 0x10 + #define TW_MT_SLA_ACK 0x18 + #define TW_MT_SLA_NACK 0x20 + #define TW_MT_DATA_ACK 0x28 + #define TW_MT_DATA_NACK 0x30 + #define TW_MT_ARB_LOST 0x38 + #define TW_MR_ARB_LOST 0x38 + #define TW_MR_SLA_ACK 0x40 + #define TW_MR_SLA_NACK 0x48 + #define TW_MR_DATA_ACK 0x50 + #define TW_MR_DATA_NACK 0x58 + #define TW_ST_SLA_ACK 0xA8 + #define TW_ST_ARB_LOST_SLA_ACK 0xB0 + #define TW_ST_DATA_ACK 0xB8 + #define TW_ST_DATA_NACK 0xC0 + #define TW_ST_LAST_DATA 0xC8 + #define TW_SR_SLA_ACK 0x60 + #define TW_SR_ARB_LOST_SLA_ACK 0x68 + #define TW_SR_GCALL_ACK 0x70 + #define TW_SR_ARB_LOST_GCALL_ACK 0x78 + #define TW_SR_DATA_ACK 0x80 + #define TW_SR_DATA_NACK 0x88 + #define TW_SR_GCALL_DATA_ACK 0x90 + #define TW_SR_GCALL_DATA_NACK 0x98 + #define TW_SR_STOP 0xA0 + #define TW_NO_INFO 0xF8 + #define TW_BUS_ERROR 0x00 + + //#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) + //#define _SFR_BYTE(sfr) _MMIO_BYTE(_SFR_ADDR(sfr)) + + #ifndef sbi // set bit + #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) + #endif // sbi + + #ifndef cbi // clear bit + #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) + #endif // cbi + + extern TwoWire Wire; + +#endif // I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE + +#endif /* _I2CDEV_H_ */ \ No newline at end of file diff --git a/sheets/gyro/Test program/Arduino/MPU6050/MPU6050.cpp b/sheets/gyro/Test program/Arduino/MPU6050/MPU6050.cpp new file mode 100644 index 0000000..fceae10 --- /dev/null +++ b/sheets/gyro/Test program/Arduino/MPU6050/MPU6050.cpp @@ -0,0 +1,3025 @@ +// I2Cdev library collection - MPU6050 I2C device class +// Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00) +// 8/24/2011 by Jeff Rowberg +// Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib +// +// Changelog: +// ... - ongoing debug release + +// NOTE: THIS IS ONLY A PARIAL RELEASE. THIS DEVICE CLASS IS CURRENTLY UNDERGOING ACTIVE +// DEVELOPMENT AND IS STILL MISSING SOME IMPORTANT FEATURES. PLEASE KEEP THIS IN MIND IF +// YOU DECIDE TO USE THIS PARTICULAR CODE FOR ANYTHING. + +/* ============================================ +I2Cdev device library code is placed under the MIT license +Copyright (c) 2011 Jeff Rowberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +=============================================== +*/ + +#include "MPU6050.h" + +/** Default constructor, uses default I2C address. + * @see MPU6050_DEFAULT_ADDRESS + */ +MPU6050::MPU6050() { + devAddr = MPU6050_DEFAULT_ADDRESS; +} + +/** Specific address constructor. + * @param address I2C address + * @see MPU6050_DEFAULT_ADDRESS + * @see MPU6050_ADDRESS_AD0_LOW + * @see MPU6050_ADDRESS_AD0_HIGH + */ +MPU6050::MPU6050(uint8_t address) { + devAddr = address; +} + +/** Power on and prepare for general usage. + * This will activate the device and take it out of sleep mode (which must be done + * after start-up). This function also sets both the accelerometer and the gyroscope + * to their most sensitive settings, namely +/- 2g and +/- 250 degrees/sec, and sets + * the clock source to use the X Gyro for reference, which is slightly better than + * the default internal clock source. + */ +void MPU6050::initialize() { + setClockSource(MPU6050_CLOCK_PLL_XGYRO); + setFullScaleGyroRange(MPU6050_GYRO_FS_250); + setFullScaleAccelRange(MPU6050_ACCEL_FS_2); + setSleepEnabled(false); // thanks to Jack Elston for pointing this one out! +} + +/** Verify the I2C connection. + * Make sure the device is connected and responds as expected. + * @return True if connection is valid, false otherwise + */ +bool MPU6050::testConnection() { + return getDeviceID() == 0b110100; +} + +// AUX_VDDIO register (InvenSense demo code calls this RA_*G_OFFS_TC) + +/** Get the auxiliary I2C supply voltage level. + * When set to 1, the auxiliary I2C bus high logic level is VDD. When cleared to + * 0, the auxiliary I2C bus high logic level is VLOGIC. This does not apply to + * the MPU-6000, which does not have a VLOGIC pin. + * @return I2C supply voltage level (0=VLOGIC, 1=VDD) + */ +uint8_t MPU6050::getAuxVDDIOLevel() { + I2Cdev::readBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, buffer); + return buffer[0]; +} +/** Set the auxiliary I2C supply voltage level. + * When set to 1, the auxiliary I2C bus high logic level is VDD. When cleared to + * 0, the auxiliary I2C bus high logic level is VLOGIC. This does not apply to + * the MPU-6000, which does not have a VLOGIC pin. + * @param level I2C supply voltage level (0=VLOGIC, 1=VDD) + */ +void MPU6050::setAuxVDDIOLevel(uint8_t level) { + I2Cdev::writeBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, level); +} + +// SMPLRT_DIV register + +/** Get gyroscope output rate divider. + * The sensor register output, FIFO output, DMP sampling, Motion detection, Zero + * Motion detection, and Free Fall detection are all based on the Sample Rate. + * The Sample Rate is generated by dividing the gyroscope output rate by + * SMPLRT_DIV: + * + * Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV) + * + * where Gyroscope Output Rate = 8kHz when the DLPF is disabled (DLPF_CFG = 0 or + * 7), and 1kHz when the DLPF is enabled (see Register 26). + * + * Note: The accelerometer output rate is 1kHz. This means that for a Sample + * Rate greater than 1kHz, the same accelerometer sample may be output to the + * FIFO, DMP, and sensor registers more than once. + * + * For a diagram of the gyroscope and accelerometer signal paths, see Section 8 + * of the MPU-6000/MPU-6050 Product Specification document. + * + * @return Current sample rate + * @see MPU6050_RA_SMPLRT_DIV + */ +uint8_t MPU6050::getRate() { + return I2Cdev::readByte(devAddr, MPU6050_RA_SMPLRT_DIV, buffer); + return buffer[0]; +} +/** Set gyroscope sample rate divider. + * @param rate New sample rate divider + * @see getRate() + * @see MPU6050_RA_SMPLRT_DIV + */ +void MPU6050::setRate(uint8_t rate) { + I2Cdev::writeByte(devAddr, MPU6050_RA_SMPLRT_DIV, rate); +} + +// CONFIG register + +/** Get external FSYNC configuration. + * Configures the external Frame Synchronization (FSYNC) pin sampling. An + * external signal connected to the FSYNC pin can be sampled by configuring + * EXT_SYNC_SET. Signal changes to the FSYNC pin are latched so that short + * strobes may be captured. The latched FSYNC signal will be sampled at the + * Sampling Rate, as defined in register 25. After sampling, the latch will + * reset to the current FSYNC signal state. + * + * The sampled value will be reported in place of the least significant bit in + * a sensor data register determined by the value of EXT_SYNC_SET according to + * the following table. + * + *
    + * EXT_SYNC_SET | FSYNC Bit Location
    + * -------------+-------------------
    + * 0            | Input disabled
    + * 1            | TEMP_OUT_L[0]
    + * 2            | GYRO_XOUT_L[0]
    + * 3            | GYRO_YOUT_L[0]
    + * 4            | GYRO_ZOUT_L[0]
    + * 5            | ACCEL_XOUT_L[0]
    + * 6            | ACCEL_YOUT_L[0]
    + * 7            | ACCEL_ZOUT_L[0]
    + * 
    + * + * @return FSYNC configuration value + */ +uint8_t MPU6050::getExternalFrameSync() { + I2Cdev::readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, buffer); + return buffer[0]; +} +/** Set external FSYNC configuration. + * @see getExternalFrameSync() + * @see MPU6050_RA_CONFIG + * @param sync New FSYNC configuration value + */ +void MPU6050::setExternalFrameSync(uint8_t sync) { + I2Cdev::writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, sync); +} +/** Get digital low-pass filter configuration. + * The DLPF_CFG parameter sets the digital low pass filter configuration. It + * also determines the internal sampling rate used by the device as shown in + * the table below. + * + * Note: The accelerometer output rate is 1kHz. This means that for a Sample + * Rate greater than 1kHz, the same accelerometer sample may be output to the + * FIFO, DMP, and sensor registers more than once. + * + *
    + *          |   ACCELEROMETER    |           GYROSCOPE
    + * DLPF_CFG | Bandwidth | Delay  | Bandwidth | Delay  | Sample Rate
    + * ---------+-----------+--------+-----------+--------+-------------
    + * 0        | 260Hz     | 0ms    | 256Hz     | 0.98ms | 8kHz
    + * 1        | 184Hz     | 2.0ms  | 188Hz     | 1.9ms  | 1kHz
    + * 2        | 94Hz      | 3.0ms  | 98Hz      | 2.8ms  | 1kHz
    + * 3        | 44Hz      | 4.9ms  | 42Hz      | 4.8ms  | 1kHz
    + * 4        | 21Hz      | 8.5ms  | 20Hz      | 8.3ms  | 1kHz
    + * 5        | 10Hz      | 13.8ms | 10Hz      | 13.4ms | 1kHz
    + * 6        | 5Hz       | 19.0ms | 5Hz       | 18.6ms | 1kHz
    + * 7        |   -- Reserved --   |   -- Reserved --   | Reserved
    + * 
    + * + * @return DLFP configuration + * @see MPU6050_RA_CONFIG + * @see MPU6050_CFG_DLPF_CFG_BIT + * @see MPU6050_CFG_DLPF_CFG_LENGTH + */ +uint8_t MPU6050::getDLPFMode() { + I2Cdev::readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, buffer); + return buffer[0]; +} +/** Set digital low-pass filter configuration. + * @param mode New DLFP configuration setting + * @see getDLPFBandwidth() + * @see MPU6050_DLPF_BW_256 + * @see MPU6050_RA_CONFIG + * @see MPU6050_CFG_DLPF_CFG_BIT + * @see MPU6050_CFG_DLPF_CFG_LENGTH + */ +void MPU6050::setDLPFMode(uint8_t mode) { + I2Cdev::writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, mode); +} + +// GYRO_CONFIG register + +/** Get full-scale gyroscope range. + * The FS_SEL parameter allows setting the full-scale range of the gyro sensors, + * as described in the table below. + * + *
    + * 0 = +/- 250 degrees/sec
    + * 1 = +/- 500 degrees/sec
    + * 2 = +/- 1000 degrees/sec
    + * 3 = +/- 2000 degrees/sec
    + * 
    + * + * @return Current full-scale gyroscope range setting + * @see MPU6050_GYRO_FS_250 + * @see MPU6050_RA_GYRO_CONFIG + * @see MPU6050_GCONFIG_FS_SEL_BIT + * @see MPU6050_GCONFIG_FS_SEL_LENGTH + */ +uint8_t MPU6050::getFullScaleGyroRange() { + I2Cdev::readBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, buffer); + return buffer[0]; +} +/** Set full-scale gyroscope range. + * @param range New full-scale gyroscope range value + * @see getFullScaleRange() + * @see MPU6050_GYRO_FS_250 + * @see MPU6050_RA_GYRO_CONFIG + * @see MPU6050_GCONFIG_FS_SEL_BIT + * @see MPU6050_GCONFIG_FS_SEL_LENGTH + */ +void MPU6050::setFullScaleGyroRange(uint8_t range) { + I2Cdev::writeBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range); +} + +// ACCEL_CONFIG register + +/** Get self-test enabled setting for accelerometer X axis. + * @return Self-test enabled value + * @see MPU6050_RA_ACCEL_CONFIG + */ +bool MPU6050::getAccelXSelfTest() { + I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, buffer); + return buffer[0]; +} +/** Get self-test enabled setting for accelerometer X axis. + * @param enabled Self-test enabled value + * @see MPU6050_RA_ACCEL_CONFIG + */ +void MPU6050::setAccelXSelfTest(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, enabled); +} +/** Get self-test enabled value for accelerometer Y axis. + * @return Self-test enabled value + * @see MPU6050_RA_ACCEL_CONFIG + */ +bool MPU6050::getAccelYSelfTest() { + I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, buffer); + return buffer[0]; +} +/** Get self-test enabled value for accelerometer Y axis. + * @param enabled Self-test enabled value + * @see MPU6050_RA_ACCEL_CONFIG + */ +void MPU6050::setAccelYSelfTest(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, enabled); +} +/** Get self-test enabled value for accelerometer Z axis. + * @return Self-test enabled value + * @see MPU6050_RA_ACCEL_CONFIG + */ +bool MPU6050::getAccelZSelfTest() { + I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, buffer); + return buffer[0]; +} +/** Set self-test enabled value for accelerometer Z axis. + * @param enabled Self-test enabled value + * @see MPU6050_RA_ACCEL_CONFIG + */ +void MPU6050::setAccelZSelfTest(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, enabled); +} +/** Get full-scale accelerometer range. + * The FS_SEL parameter allows setting the full-scale range of the accelerometer + * sensors, as described in the table below. + * + *
    + * 0 = +/- 2g
    + * 1 = +/- 4g
    + * 2 = +/- 8g
    + * 3 = +/- 16g
    + * 
    + * + * @return Current full-scale accelerometer range setting + * @see MPU6050_ACCEL_FS_2 + * @see MPU6050_RA_ACCEL_CONFIG + * @see MPU6050_ACONFIG_AFS_SEL_BIT + * @see MPU6050_ACONFIG_AFS_SEL_LENGTH + */ +uint8_t MPU6050::getFullScaleAccelRange() { + I2Cdev::readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, buffer); + return buffer[0]; +} +/** Set full-scale accelerometer range. + * @param range New full-scale accelerometer range setting + * @see getFullScaleAccelRange() + */ +void MPU6050::setFullScaleAccelRange(uint8_t range) { + I2Cdev::writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range); +} +/** Get the high-pass filter configuration. + * The DHPF is a filter module in the path leading to motion detectors (Free + * Fall, Motion threshold, and Zero Motion). The high pass filter output is not + * available to the data registers (see Figure in Section 8 of the MPU-6000/ + * MPU-6050 Product Specification document). + * + * The high pass filter has three modes: + * + *
    + *    Reset: The filter output settles to zero within one sample. This
    + *           effectively disables the high pass filter. This mode may be toggled
    + *           to quickly settle the filter.
    + *
    + *    On:    The high pass filter will pass signals above the cut off frequency.
    + *
    + *    Hold:  When triggered, the filter holds the present sample. The filter
    + *           output will be the difference between the input sample and the held
    + *           sample.
    + * 
    + * + *
    + * ACCEL_HPF | Filter Mode | Cut-off Frequency
    + * ----------+-------------+------------------
    + * 0         | Reset       | None
    + * 1         | On          | 5Hz
    + * 2         | On          | 2.5Hz
    + * 3         | On          | 1.25Hz
    + * 4         | On          | 0.63Hz
    + * 7         | Hold        | None
    + * 
    + * + * @return Current high-pass filter configuration + * @see MPU6050_DHPF_RESET + * @see MPU6050_RA_ACCEL_CONFIG + */ +uint8_t MPU6050::getDHPFMode() { + I2Cdev::readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, buffer); + return buffer[0]; +} +/** Set the high-pass filter configuration. + * @param bandwidth New high-pass filter configuration + * @see setDHPFMode() + * @see MPU6050_DHPF_RESET + * @see MPU6050_RA_ACCEL_CONFIG + */ +void MPU6050::setDHPFMode(uint8_t bandwidth) { + I2Cdev::writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, bandwidth); +} + +// FF_THR register + +/** Get free-fall event acceleration threshold. + * This register configures the detection threshold for Free Fall event + * detection. The unit of FF_THR is 1LSB = 2mg. Free Fall is detected when the + * absolute value of the accelerometer measurements for the three axes are each + * less than the detection threshold. This condition increments the Free Fall + * duration counter (Register 30). The Free Fall interrupt is triggered when the + * Free Fall duration counter reaches the time specified in FF_DUR. + * + * For more details on the Free Fall detection interrupt, see Section 8.2 of the + * MPU-6000/MPU-6050 Product Specification document as well as Registers 56 and + * 58 of this document. + * + * @return Current free-fall acceleration threshold value (LSB = 2mg) + * @see MPU6050_RA_FF_THR + */ +uint8_t MPU6050::getFreefallDetectionThreshold() { + I2Cdev::readByte(devAddr, MPU6050_RA_FF_THR, buffer); + return buffer[0]; +} +/** Get free-fall event acceleration threshold. + * @param threshold New free-fall acceleration threshold value (LSB = 2mg) + * @see getFreefallDetectionThreshold() + * @see MPU6050_RA_FF_THR + */ +void MPU6050::setFreefallDetectionThreshold(uint8_t threshold) { + I2Cdev::writeByte(devAddr, MPU6050_RA_FF_THR, threshold); +} + +// FF_DUR register + +/** Get free-fall event duration threshold. + * This register configures the duration counter threshold for Free Fall event + * detection. The duration counter ticks at 1kHz, therefore FF_DUR has a unit + * of 1 LSB = 1 ms. + * + * The Free Fall duration counter increments while the absolute value of the + * accelerometer measurements are each less than the detection threshold + * (Register 29). The Free Fall interrupt is triggered when the Free Fall + * duration counter reaches the time specified in this register. + * + * For more details on the Free Fall detection interrupt, see Section 8.2 of + * the MPU-6000/MPU-6050 Product Specification document as well as Registers 56 + * and 58 of this document. + * + * @return Current free-fall duration threshold value (LSB = 1ms) + * @see MPU6050_RA_FF_DUR + */ +uint8_t MPU6050::getFreefallDetectionDuration() { + I2Cdev::readByte(devAddr, MPU6050_RA_FF_DUR, buffer); + return buffer[0]; +} +/** Get free-fall event duration threshold. + * @param duration New free-fall duration threshold value (LSB = 1ms) + * @see getFreefallDetectionDuration() + * @see MPU6050_RA_FF_DUR + */ +void MPU6050::setFreefallDetectionDuration(uint8_t duration) { + I2Cdev::writeByte(devAddr, MPU6050_RA_FF_DUR, duration); +} + +// MOT_THR register + +/** Get motion detection event acceleration threshold. + * This register configures the detection threshold for Motion interrupt + * generation. The unit of MOT_THR is 1LSB = 2mg. Motion is detected when the + * absolute value of any of the accelerometer measurements exceeds this Motion + * detection threshold. This condition increments the Motion detection duration + * counter (Register 32). The Motion detection interrupt is triggered when the + * Motion Detection counter reaches the time count specified in MOT_DUR + * (Register 32). + * + * The Motion interrupt will indicate the axis and polarity of detected motion + * in MOT_DETECT_STATUS (Register 97). + * + * For more details on the Motion detection interrupt, see Section 8.3 of the + * MPU-6000/MPU-6050 Product Specification document as well as Registers 56 and + * 58 of this document. + * + * @return Current motion detection acceleration threshold value (LSB = 2mg) + * @see MPU6050_RA_MOT_THR + */ +uint8_t MPU6050::getMotionDetectionThreshold() { + I2Cdev::readByte(devAddr, MPU6050_RA_MOT_THR, buffer); + return buffer[0]; +} +/** Set free-fall event acceleration threshold. + * @param threshold New motion detection acceleration threshold value (LSB = 2mg) + * @see getMotionDetectionThreshold() + * @see MPU6050_RA_MOT_THR + */ +void MPU6050::setMotionDetectionThreshold(uint8_t threshold) { + I2Cdev::writeByte(devAddr, MPU6050_RA_MOT_THR, threshold); +} + +// MOT_DUR register + +/** Get motion detection event duration threshold. + * This register configures the duration counter threshold for Motion interrupt + * generation. The duration counter ticks at 1 kHz, therefore MOT_DUR has a unit + * of 1LSB = 1ms. The Motion detection duration counter increments when the + * absolute value of any of the accelerometer measurements exceeds the Motion + * detection threshold (Register 31). The Motion detection interrupt is + * triggered when the Motion detection counter reaches the time count specified + * in this register. + * + * For more details on the Motion detection interrupt, see Section 8.3 of the + * MPU-6000/MPU-6050 Product Specification document. + * + * @return Current motion detection duration threshold value (LSB = 1ms) + * @see MPU6050_RA_MOT_DUR + */ +uint8_t MPU6050::getMotionDetectionDuration() { + I2Cdev::readByte(devAddr, MPU6050_RA_MOT_DUR, buffer); + return buffer[0]; +} +/** Set motion detection event duration threshold. + * @param duration New motion detection duration threshold value (LSB = 1ms) + * @see getMotionDetectionDuration() + * @see MPU6050_RA_MOT_DUR + */ +void MPU6050::setMotionDetectionDuration(uint8_t duration) { + I2Cdev::writeByte(devAddr, MPU6050_RA_MOT_DUR, duration); +} + +// ZRMOT_THR register + +/** Get zero motion detection event acceleration threshold. + * This register configures the detection threshold for Zero Motion interrupt + * generation. The unit of ZRMOT_THR is 1LSB = 2mg. Zero Motion is detected when + * the absolute value of the accelerometer measurements for the 3 axes are each + * less than the detection threshold. This condition increments the Zero Motion + * duration counter (Register 34). The Zero Motion interrupt is triggered when + * the Zero Motion duration counter reaches the time count specified in + * ZRMOT_DUR (Register 34). + * + * Unlike Free Fall or Motion detection, Zero Motion detection triggers an + * interrupt both when Zero Motion is first detected and when Zero Motion is no + * longer detected. + * + * When a zero motion event is detected, a Zero Motion Status will be indicated + * in the MOT_DETECT_STATUS register (Register 97). When a motion-to-zero-motion + * condition is detected, the status bit is set to 1. When a zero-motion-to- + * motion condition is detected, the status bit is set to 0. + * + * For more details on the Zero Motion detection interrupt, see Section 8.4 of + * the MPU-6000/MPU-6050 Product Specification document as well as Registers 56 + * and 58 of this document. + * + * @return Current zero motion detection acceleration threshold value (LSB = 2mg) + * @see MPU6050_RA_ZRMOT_THR + */ +uint8_t MPU6050::getZeroMotionDetectionThreshold() { + I2Cdev::readByte(devAddr, MPU6050_RA_ZRMOT_THR, buffer); + return buffer[0]; +} +/** Set zero motion detection event acceleration threshold. + * @param threshold New zero motion detection acceleration threshold value (LSB = 2mg) + * @see getZeroMotionDetectionThreshold() + * @see MPU6050_RA_ZRMOT_THR + */ +void MPU6050::setZeroMotionDetectionThreshold(uint8_t threshold) { + I2Cdev::writeByte(devAddr, MPU6050_RA_ZRMOT_THR, threshold); +} + +// ZRMOT_DUR register + +/** Get zero motion detection event duration threshold. + * This register configures the duration counter threshold for Zero Motion + * interrupt generation. The duration counter ticks at 16 Hz, therefore + * ZRMOT_DUR has a unit of 1 LSB = 64 ms. The Zero Motion duration counter + * increments while the absolute value of the accelerometer measurements are + * each less than the detection threshold (Register 33). The Zero Motion + * interrupt is triggered when the Zero Motion duration counter reaches the time + * count specified in this register. + * + * For more details on the Zero Motion detection interrupt, see Section 8.4 of + * the MPU-6000/MPU-6050 Product Specification document, as well as Registers 56 + * and 58 of this document. + * + * @return Current zero motion detection duration threshold value (LSB = 64ms) + * @see MPU6050_RA_ZRMOT_DUR + */ +uint8_t MPU6050::getZeroMotionDetectionDuration() { + I2Cdev::readByte(devAddr, MPU6050_RA_ZRMOT_DUR, buffer); + return buffer[0]; +} +/** Set zero motion detection event duration threshold. + * @param duration New zero motion detection duration threshold value (LSB = 1ms) + * @see getZeroMotionDetectionDuration() + * @see MPU6050_RA_ZRMOT_DUR + */ +void MPU6050::setZeroMotionDetectionDuration(uint8_t duration) { + I2Cdev::writeByte(devAddr, MPU6050_RA_ZRMOT_DUR, duration); +} + +// FIFO_EN register + +/** Get temperature FIFO enabled value. + * When set to 1, this bit enables TEMP_OUT_H and TEMP_OUT_L (Registers 65 and + * 66) to be written into the FIFO buffer. + * @return Current temperature FIFO enabled value + * @see MPU6050_RA_FIFO_EN + */ +bool MPU6050::getTempFIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set temperature FIFO enabled value. + * @param enabled New temperature FIFO enabled value + * @see getTempFIFOEnabled() + * @see MPU6050_RA_FIFO_EN + */ +void MPU6050::setTempFIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, enabled); +} +/** Get gyroscope X-axis FIFO enabled value. + * When set to 1, this bit enables GYRO_XOUT_H and GYRO_XOUT_L (Registers 67 and + * 68) to be written into the FIFO buffer. + * @return Current gyroscope X-axis FIFO enabled value + * @see MPU6050_RA_FIFO_EN + */ +bool MPU6050::getXGyroFIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set gyroscope X-axis FIFO enabled value. + * @param enabled New gyroscope X-axis FIFO enabled value + * @see getXGyroFIFOEnabled() + * @see MPU6050_RA_FIFO_EN + */ +void MPU6050::setXGyroFIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, enabled); +} +/** Get gyroscope Y-axis FIFO enabled value. + * When set to 1, this bit enables GYRO_YOUT_H and GYRO_YOUT_L (Registers 69 and + * 70) to be written into the FIFO buffer. + * @return Current gyroscope Y-axis FIFO enabled value + * @see MPU6050_RA_FIFO_EN + */ +bool MPU6050::getYGyroFIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set gyroscope Y-axis FIFO enabled value. + * @param enabled New gyroscope Y-axis FIFO enabled value + * @see getYGyroFIFOEnabled() + * @see MPU6050_RA_FIFO_EN + */ +void MPU6050::setYGyroFIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, enabled); +} +/** Get gyroscope Z-axis FIFO enabled value. + * When set to 1, this bit enables GYRO_ZOUT_H and GYRO_ZOUT_L (Registers 71 and + * 72) to be written into the FIFO buffer. + * @return Current gyroscope Z-axis FIFO enabled value + * @see MPU6050_RA_FIFO_EN + */ +bool MPU6050::getZGyroFIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set gyroscope Z-axis FIFO enabled value. + * @param enabled New gyroscope Z-axis FIFO enabled value + * @see getZGyroFIFOEnabled() + * @see MPU6050_RA_FIFO_EN + */ +void MPU6050::setZGyroFIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, enabled); +} +/** Get accelerometer FIFO enabled value. + * When set to 1, this bit enables ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H, + * ACCEL_YOUT_L, ACCEL_ZOUT_H, and ACCEL_ZOUT_L (Registers 59 to 64) to be + * written into the FIFO buffer. + * @return Current accelerometer FIFO enabled value + * @see MPU6050_RA_FIFO_EN + */ +bool MPU6050::getAccelFIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set accelerometer FIFO enabled value. + * @param enabled New accelerometer FIFO enabled value + * @see getAccelFIFOEnabled() + * @see MPU6050_RA_FIFO_EN + */ +void MPU6050::setAccelFIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, enabled); +} +/** Get Slave 2 FIFO enabled value. + * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) + * associated with Slave 2 to be written into the FIFO buffer. + * @return Current Slave 2 FIFO enabled value + * @see MPU6050_RA_FIFO_EN + */ +bool MPU6050::getSlave2FIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set Slave 2 FIFO enabled value. + * @param enabled New Slave 2 FIFO enabled value + * @see getSlave2FIFOEnabled() + * @see MPU6050_RA_FIFO_EN + */ +void MPU6050::setSlave2FIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, enabled); +} +/** Get Slave 1 FIFO enabled value. + * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) + * associated with Slave 1 to be written into the FIFO buffer. + * @return Current Slave 1 FIFO enabled value + * @see MPU6050_RA_FIFO_EN + */ +bool MPU6050::getSlave1FIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set Slave 1 FIFO enabled value. + * @param enabled New Slave 1 FIFO enabled value + * @see getSlave1FIFOEnabled() + * @see MPU6050_RA_FIFO_EN + */ +void MPU6050::setSlave1FIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, enabled); +} +/** Get Slave 0 FIFO enabled value. + * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) + * associated with Slave 0 to be written into the FIFO buffer. + * @return Current Slave 0 FIFO enabled value + * @see MPU6050_RA_FIFO_EN + */ +bool MPU6050::getSlave0FIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set Slave 0 FIFO enabled value. + * @param enabled New Slave 0 FIFO enabled value + * @see getSlave0FIFOEnabled() + * @see MPU6050_RA_FIFO_EN + */ +void MPU6050::setSlave0FIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, enabled); +} + +// I2C_MST_CTRL register + +/** Get multi-master enabled value. + * Multi-master capability allows multiple I2C masters to operate on the same + * bus. In circuits where multi-master capability is required, set MULT_MST_EN + * to 1. This will increase current drawn by approximately 30uA. + * + * In circuits where multi-master capability is required, the state of the I2C + * bus must always be monitored by each separate I2C Master. Before an I2C + * Master can assume arbitration of the bus, it must first confirm that no other + * I2C Master has arbitration of the bus. When MULT_MST_EN is set to 1, the + * MPU-60X0's bus arbitration detection logic is turned on, enabling it to + * detect when the bus is available. + * + * @return Current multi-master enabled value + * @see MPU6050_RA_I2C_MST_CTRL + */ +bool MPU6050::getMultiMasterEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, buffer); + return buffer[0]; +} +/** Set multi-master enabled value. + * @param enabled New multi-master enabled value + * @see getMultiMasterEnabled() + * @see MPU6050_RA_I2C_MST_CTRL + */ +void MPU6050::setMultiMasterEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, enabled); +} +/** Get wait-for-external-sensor-data enabled value. + * When the WAIT_FOR_ES bit is set to 1, the Data Ready interrupt will be + * delayed until External Sensor data from the Slave Devices are loaded into the + * EXT_SENS_DATA registers. This is used to ensure that both the internal sensor + * data (i.e. from gyro and accel) and external sensor data have been loaded to + * their respective data registers (i.e. the data is synced) when the Data Ready + * interrupt is triggered. + * + * @return Current wait-for-external-sensor-data enabled value + * @see MPU6050_RA_I2C_MST_CTRL + */ +bool MPU6050::getWaitForExternalSensorEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, buffer); + return buffer[0]; +} +/** Set wait-for-external-sensor-data enabled value. + * @param enabled New wait-for-external-sensor-data enabled value + * @see getWaitForExternalSensorEnabled() + * @see MPU6050_RA_I2C_MST_CTRL + */ +void MPU6050::setWaitForExternalSensorEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, enabled); +} +/** Get Slave 3 FIFO enabled value. + * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) + * associated with Slave 3 to be written into the FIFO buffer. + * @return Current Slave 3 FIFO enabled value + * @see MPU6050_RA_MST_CTRL + */ +bool MPU6050::getSlave3FIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set Slave 3 FIFO enabled value. + * @param enabled New Slave 3 FIFO enabled value + * @see getSlave3FIFOEnabled() + * @see MPU6050_RA_MST_CTRL + */ +void MPU6050::setSlave3FIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, enabled); +} +/** Get slave read/write transition enabled value. + * The I2C_MST_P_NSR bit configures the I2C Master's transition from one slave + * read to the next slave read. If the bit equals 0, there will be a restart + * between reads. If the bit equals 1, there will be a stop followed by a start + * of the following read. When a write transaction follows a read transaction, + * the stop followed by a start of the successive write will be always used. + * + * @return Current slave read/write transition enabled value + * @see MPU6050_RA_I2C_MST_CTRL + */ +bool MPU6050::getSlaveReadWriteTransitionEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, buffer); + return buffer[0]; +} +/** Set slave read/write transition enabled value. + * @param enabled New slave read/write transition enabled value + * @see getSlaveReadWriteTransitionEnabled() + * @see MPU6050_RA_I2C_MST_CTRL + */ +void MPU6050::setSlaveReadWriteTransitionEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, enabled); +} +/** Get I2C master clock speed. + * I2C_MST_CLK is a 4 bit unsigned value which configures a divider on the + * MPU-60X0 internal 8MHz clock. It sets the I2C master clock speed according to + * the following table: + * + *
    + * I2C_MST_CLK | I2C Master Clock Speed | 8MHz Clock Divider
    + * ------------+------------------------+-------------------
    + * 0           | 348kHz                 | 23
    + * 1           | 333kHz                 | 24
    + * 2           | 320kHz                 | 25
    + * 3           | 308kHz                 | 26
    + * 4           | 296kHz                 | 27
    + * 5           | 286kHz                 | 28
    + * 6           | 276kHz                 | 29
    + * 7           | 267kHz                 | 30
    + * 8           | 258kHz                 | 31
    + * 9           | 500kHz                 | 16
    + * 10          | 471kHz                 | 17
    + * 11          | 444kHz                 | 18
    + * 12          | 421kHz                 | 19
    + * 13          | 400kHz                 | 20
    + * 14          | 381kHz                 | 21
    + * 15          | 364kHz                 | 22
    + * 
    + * + * @return Current I2C master clock speed + * @see MPU6050_RA_I2C_MST_CTRL + */ +uint8_t MPU6050::getMasterClockSpeed() { + I2Cdev::readBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, buffer); + return buffer[0]; +} +/** Set I2C master clock speed. + * @reparam speed Current I2C master clock speed + * @see MPU6050_RA_I2C_MST_CTRL + */ +void MPU6050::setMasterClockSpeed(uint8_t speed) { + I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, speed); +} + +// I2C_SLV* registers (Slave 0-3) + +/** Get the I2C address of the specified slave (0-3). + * Note that Bit 7 (MSB) controls read/write mode. If Bit 7 is set, it's a read + * operation, and if it is cleared, then it's a write operation. The remaining + * bits (6-0) are the 7-bit device address of the slave device. + * + * In read mode, the result of the read is placed in the lowest available + * EXT_SENS_DATA register. For further information regarding the allocation of + * read results, please refer to the EXT_SENS_DATA register description + * (Registers 73 – 96). + * + * The MPU-6050 supports a total of five slaves, but Slave 4 has unique + * characteristics, and so it has its own functions (getSlave4* and setSlave4*). + * + * I2C data transactions are performed at the Sample Rate, as defined in + * Register 25. The user is responsible for ensuring that I2C data transactions + * to and from each enabled Slave can be completed within a single period of the + * Sample Rate. + * + * The I2C slave access rate can be reduced relative to the Sample Rate. This + * reduced access rate is determined by I2C_MST_DLY (Register 52). Whether a + * slave's access rate is reduced relative to the Sample Rate is determined by + * I2C_MST_DELAY_CTRL (Register 103). + * + * The processing order for the slaves is fixed. The sequence followed for + * processing the slaves is Slave 0, Slave 1, Slave 2, Slave 3 and Slave 4. If a + * particular Slave is disabled it will be skipped. + * + * Each slave can either be accessed at the sample rate or at a reduced sample + * rate. In a case where some slaves are accessed at the Sample Rate and some + * slaves are accessed at the reduced rate, the sequence of accessing the slaves + * (Slave 0 to Slave 4) is still followed. However, the reduced rate slaves will + * be skipped if their access rate dictates that they should not be accessed + * during that particular cycle. For further information regarding the reduced + * access rate, please refer to Register 52. Whether a slave is accessed at the + * Sample Rate or at the reduced rate is determined by the Delay Enable bits in + * Register 103. + * + * @param num Slave number (0-3) + * @return Current address for specified slave + * @see MPU6050_RA_I2C_SLV0_ADDR + */ +uint8_t MPU6050::getSlaveAddress(uint8_t num) { + if (num > 3) return 0; + I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num*3, buffer); + return buffer[0]; +} +/** Set the I2C address of the specified slave (0-3). + * @param num Slave number (0-3) + * @param address New address for specified slave + * @see getSlaveAddress() + * @see MPU6050_RA_I2C_SLV0_ADDR + */ +void MPU6050::setSlaveAddress(uint8_t num, uint8_t address) { + if (num > 3) return; + I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num*3, address); +} +/** Get the active internal register for the specified slave (0-3). + * Read/write operations for this slave will be done to whatever internal + * register address is stored in this MPU register. + * + * The MPU-6050 supports a total of five slaves, but Slave 4 has unique + * characteristics, and so it has its own functions. + * + * @param num Slave number (0-3) + * @return Current active register for specified slave + * @see MPU6050_RA_I2C_SLV0_REG + */ +uint8_t MPU6050::getSlaveRegister(uint8_t num) { + if (num > 3) return 0; + I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num*3, buffer); + return buffer[0]; +} +/** Set the active internal register for the specified slave (0-3). + * @param num Slave number (0-3) + * @param reg New active register for specified slave + * @see getSlaveRegister() + * @see MPU6050_RA_I2C_SLV0_REG + */ +void MPU6050::setSlaveRegister(uint8_t num, uint8_t reg) { + if (num > 3) return; + I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num*3, reg); +} +/** Get the enabled value for the specified slave (0-3). + * When set to 1, this bit enables Slave 0 for data transfer operations. When + * cleared to 0, this bit disables Slave 0 from data transfer operations. + * @param num Slave number (0-3) + * @return Current enabled value for specified slave + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +bool MPU6050::getSlaveEnabled(uint8_t num) { + if (num > 3) return 0; + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_EN_BIT, buffer); + return buffer[0]; +} +/** Set the enabled value for the specified slave (0-3). + * @param num Slave number (0-3) + * @param enabled New enabled value for specified slave + * @see getSlaveEnabled() + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +void MPU6050::setSlaveEnabled(uint8_t num, bool enabled) { + if (num > 3) return; + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_EN_BIT, enabled); +} +/** Get word pair byte-swapping enabled for the specified slave (0-3). + * When set to 1, this bit enables byte swapping. When byte swapping is enabled, + * the high and low bytes of a word pair are swapped. Please refer to + * I2C_SLV0_GRP for the pairing convention of the word pairs. When cleared to 0, + * bytes transferred to and from Slave 0 will be written to EXT_SENS_DATA + * registers in the order they were transferred. + * + * @param num Slave number (0-3) + * @return Current word pair byte-swapping enabled value for specified slave + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +bool MPU6050::getSlaveWordByteSwap(uint8_t num) { + if (num > 3) return 0; + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_BYTE_SW_BIT, buffer); + return buffer[0]; +} +/** Set word pair byte-swapping enabled for the specified slave (0-3). + * @param num Slave number (0-3) + * @param enabled New word pair byte-swapping enabled value for specified slave + * @see getSlaveWordByteSwap() + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +void MPU6050::setSlaveWordByteSwap(uint8_t num, bool enabled) { + if (num > 3) return; + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_BYTE_SW_BIT, enabled); +} +/** Get write mode for the specified slave (0-3). + * When set to 1, the transaction will read or write data only. When cleared to + * 0, the transaction will write a register address prior to reading or writing + * data. This should equal 0 when specifying the register address within the + * Slave device to/from which the ensuing data transaction will take place. + * + * @param num Slave number (0-3) + * @return Current write mode for specified slave (0 = register address + data, 1 = data only) + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +bool MPU6050::getSlaveWriteMode(uint8_t num) { + if (num > 3) return 0; + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_REG_DIS_BIT, buffer); + return buffer[0]; +} +/** Set write mode for the specified slave (0-3). + * @param num Slave number (0-3) + * @param mode New write mode for specified slave (0 = register address + data, 1 = data only) + * @see getSlaveWriteMode() + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +void MPU6050::setSlaveWriteMode(uint8_t num, bool mode) { + if (num > 3) return; + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_REG_DIS_BIT, mode); +} +/** Get word pair grouping order offset for the specified slave (0-3). + * This sets specifies the grouping order of word pairs received from registers. + * When cleared to 0, bytes from register addresses 0 and 1, 2 and 3, etc (even, + * then odd register addresses) are paired to form a word. When set to 1, bytes + * from register addresses are paired 1 and 2, 3 and 4, etc. (odd, then even + * register addresses) are paired to form a word. + * + * @param num Slave number (0-3) + * @return Current word pair grouping order offset for specified slave + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +bool MPU6050::getSlaveWordGroupOffset(uint8_t num) { + if (num > 3) return 0; + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_GRP_BIT, buffer); + return buffer[0]; +} +/** Set word pair grouping order offset for the specified slave (0-3). + * @param num Slave number (0-3) + * @param enabled New word pair grouping order offset for specified slave + * @see getSlaveWordGroupOffset() + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +void MPU6050::setSlaveWordGroupOffset(uint8_t num, bool enabled) { + if (num > 3) return; + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_GRP_BIT, enabled); +} +/** Get number of bytes to read for the specified slave (0-3). + * Specifies the number of bytes transferred to and from Slave 0. Clearing this + * bit to 0 is equivalent to disabling the register by writing 0 to I2C_SLV0_EN. + * @param num Slave number (0-3) + * @return Number of bytes to read for specified slave + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +uint8_t MPU6050::getSlaveDataLength(uint8_t num) { + if (num > 3) return 0; + I2Cdev::readBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, buffer); + return buffer[0]; +} +/** Set number of bytes to read for the specified slave (0-3). + * @param num Slave number (0-3) + * @param length Number of bytes to read for specified slave + * @see getSlaveDataLength() + * @see MPU6050_RA_I2C_SLV0_CTRL + */ +void MPU6050::setSlaveDataLength(uint8_t num, uint8_t length) { + if (num > 3) return; + I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, length); +} + +// I2C_SLV* registers (Slave 4) + +/** Get the I2C address of Slave 4. + * Note that Bit 7 (MSB) controls read/write mode. If Bit 7 is set, it's a read + * operation, and if it is cleared, then it's a write operation. The remaining + * bits (6-0) are the 7-bit device address of the slave device. + * + * @return Current address for Slave 4 + * @see getSlaveAddress() + * @see MPU6050_RA_I2C_SLV4_ADDR + */ +uint8_t MPU6050::getSlave4Address() { + I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, buffer); + return buffer[0]; +} +/** Set the I2C address of Slave 4. + * @param address New address for Slave 4 + * @see getSlave4Address() + * @see MPU6050_RA_I2C_SLV4_ADDR + */ +void MPU6050::setSlave4Address(uint8_t address) { + I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, address); +} +/** Get the active internal register for the Slave 4. + * Read/write operations for this slave will be done to whatever internal + * register address is stored in this MPU register. + * + * @return Current active register for Slave 4 + * @see MPU6050_RA_I2C_SLV4_REG + */ +uint8_t MPU6050::getSlave4Register() { + I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_REG, buffer); + return buffer[0]; +} +/** Set the active internal register for Slave 4. + * @param reg New active register for Slave 4 + * @see getSlave4Register() + * @see MPU6050_RA_I2C_SLV4_REG + */ +void MPU6050::setSlave4Register(uint8_t reg) { + I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_REG, reg); +} +/** Set new byte to write to Slave 4. + * This register stores the data to be written into the Slave 4. If I2C_SLV4_RW + * is set 1 (set to read), this register has no effect. + * @param data New byte to write to Slave 4 + * @see MPU6050_RA_I2C_SLV4_DO + */ +void MPU6050::setSlave4OutputByte(uint8_t data) { + I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_DO, data); +} +/** Get the enabled value for the Slave 4. + * When set to 1, this bit enables Slave 4 for data transfer operations. When + * cleared to 0, this bit disables Slave 4 from data transfer operations. + * @return Current enabled value for Slave 4 + * @see MPU6050_RA_I2C_SLV4_CTRL + */ +bool MPU6050::getSlave4Enabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, buffer); + return buffer[0]; +} +/** Set the enabled value for Slave 4. + * @param enabled New enabled value for Slave 4 + * @see getSlave4Enabled() + * @see MPU6050_RA_I2C_SLV4_CTRL + */ +void MPU6050::setSlave4Enabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, enabled); +} +/** Get the enabled value for Slave 4 transaction interrupts. + * When set to 1, this bit enables the generation of an interrupt signal upon + * completion of a Slave 4 transaction. When cleared to 0, this bit disables the + * generation of an interrupt signal upon completion of a Slave 4 transaction. + * The interrupt status can be observed in Register 54. + * + * @return Current enabled value for Slave 4 transaction interrupts. + * @see MPU6050_RA_I2C_SLV4_CTRL + */ +bool MPU6050::getSlave4InterruptEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, buffer); + return buffer[0]; +} +/** Set the enabled value for Slave 4 transaction interrupts. + * @param enabled New enabled value for Slave 4 transaction interrupts. + * @see getSlave4InterruptEnabled() + * @see MPU6050_RA_I2C_SLV4_CTRL + */ +void MPU6050::setSlave4InterruptEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, enabled); +} +/** Get write mode for Slave 4. + * When set to 1, the transaction will read or write data only. When cleared to + * 0, the transaction will write a register address prior to reading or writing + * data. This should equal 0 when specifying the register address within the + * Slave device to/from which the ensuing data transaction will take place. + * + * @return Current write mode for Slave 4 (0 = register address + data, 1 = data only) + * @see MPU6050_RA_I2C_SLV4_CTRL + */ +bool MPU6050::getSlave4WriteMode() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, buffer); + return buffer[0]; +} +/** Set write mode for the Slave 4. + * @param mode New write mode for Slave 4 (0 = register address + data, 1 = data only) + * @see getSlave4WriteMode() + * @see MPU6050_RA_I2C_SLV4_CTRL + */ +void MPU6050::setSlave4WriteMode(bool mode) { + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, mode); +} +/** Get Slave 4 master delay value. + * This configures the reduced access rate of I2C slaves relative to the Sample + * Rate. When a slave's access rate is decreased relative to the Sample Rate, + * the slave is accessed every: + * + * 1 / (1 + I2C_MST_DLY) samples + * + * This base Sample Rate in turn is determined by SMPLRT_DIV (register 25) and + * DLPF_CFG (register 26). Whether a slave's access rate is reduced relative to + * the Sample Rate is determined by I2C_MST_DELAY_CTRL (register 103). For + * further information regarding the Sample Rate, please refer to register 25. + * + * @return Current Slave 4 master delay value + * @see MPU6050_RA_I2C_SLV4_CTRL + */ +uint8_t MPU6050::getSlave4MasterDelay() { + I2Cdev::readBits(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT, MPU6050_I2C_SLV4_MST_DLY_LENGTH, buffer); + return buffer[0]; +} +/** Set Slave 4 master delay value. + * @param delay New Slave 4 master delay value + * @see getSlave4MasterDelay() + * @see MPU6050_RA_I2C_SLV4_CTRL + */ +void MPU6050::setSlave4MasterDelay(uint8_t delay) { + I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT, MPU6050_I2C_SLV4_MST_DLY_LENGTH, delay); +} +/** Get last available byte read from Slave 4. + * This register stores the data read from Slave 4. This field is populated + * after a read transaction. + * @return Last available byte read from to Slave 4 + * @see MPU6050_RA_I2C_SLV4_DI + */ +uint8_t MPU6050::getSlate4InputByte() { + I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_DI, buffer); + return buffer[0]; +} + +// I2C_MST_STATUS register + +/** Get FSYNC interrupt status. + * This bit reflects the status of the FSYNC interrupt from an external device + * into the MPU-60X0. This is used as a way to pass an external interrupt + * through the MPU-60X0 to the host application processor. When set to 1, this + * bit will cause an interrupt if FSYNC_INT_EN is asserted in INT_PIN_CFG + * (Register 55). + * @return FSYNC interrupt status + * @see MPU6050_RA_I2C_MST_STATUS + */ +bool MPU6050::getPassthroughStatus() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_PASS_THROUGH_BIT, buffer); + return buffer[0]; +} +/** Get Slave 4 transaction done status. + * Automatically sets to 1 when a Slave 4 transaction has completed. This + * triggers an interrupt if the I2C_MST_INT_EN bit in the INT_ENABLE register + * (Register 56) is asserted and if the SLV_4_DONE_INT bit is asserted in the + * I2C_SLV4_CTRL register (Register 52). + * @return Slave 4 transaction done status + * @see MPU6050_RA_I2C_MST_STATUS + */ +bool MPU6050::getSlave4IsDone() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_DONE_BIT, buffer); + return buffer[0]; +} +/** Get master arbitration lost status. + * This bit automatically sets to 1 when the I2C Master has lost arbitration of + * the auxiliary I2C bus (an error condition). This triggers an interrupt if the + * I2C_MST_INT_EN bit in the INT_ENABLE register (Register 56) is asserted. + * @return Master arbitration lost status + * @see MPU6050_RA_I2C_MST_STATUS + */ +bool MPU6050::getLostArbitration() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_LOST_ARB_BIT, buffer); + return buffer[0]; +} +/** Get Slave 4 NACK status. + * This bit automatically sets to 1 when the I2C Master receives a NACK in a + * transaction with Slave 4. This triggers an interrupt if the I2C_MST_INT_EN + * bit in the INT_ENABLE register (Register 56) is asserted. + * @return Slave 4 NACK interrupt status + * @see MPU6050_RA_I2C_MST_STATUS + */ +bool MPU6050::getSlave4Nack() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_NACK_BIT, buffer); + return buffer[0]; +} +/** Get Slave 3 NACK status. + * This bit automatically sets to 1 when the I2C Master receives a NACK in a + * transaction with Slave 3. This triggers an interrupt if the I2C_MST_INT_EN + * bit in the INT_ENABLE register (Register 56) is asserted. + * @return Slave 3 NACK interrupt status + * @see MPU6050_RA_I2C_MST_STATUS + */ +bool MPU6050::getSlave3Nack() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV3_NACK_BIT, buffer); + return buffer[0]; +} +/** Get Slave 2 NACK status. + * This bit automatically sets to 1 when the I2C Master receives a NACK in a + * transaction with Slave 2. This triggers an interrupt if the I2C_MST_INT_EN + * bit in the INT_ENABLE register (Register 56) is asserted. + * @return Slave 2 NACK interrupt status + * @see MPU6050_RA_I2C_MST_STATUS + */ +bool MPU6050::getSlave2Nack() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV2_NACK_BIT, buffer); + return buffer[0]; +} +/** Get Slave 1 NACK status. + * This bit automatically sets to 1 when the I2C Master receives a NACK in a + * transaction with Slave 1. This triggers an interrupt if the I2C_MST_INT_EN + * bit in the INT_ENABLE register (Register 56) is asserted. + * @return Slave 1 NACK interrupt status + * @see MPU6050_RA_I2C_MST_STATUS + */ +bool MPU6050::getSlave1Nack() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV1_NACK_BIT, buffer); + return buffer[0]; +} +/** Get Slave 0 NACK status. + * This bit automatically sets to 1 when the I2C Master receives a NACK in a + * transaction with Slave 0. This triggers an interrupt if the I2C_MST_INT_EN + * bit in the INT_ENABLE register (Register 56) is asserted. + * @return Slave 0 NACK interrupt status + * @see MPU6050_RA_I2C_MST_STATUS + */ +bool MPU6050::getSlave0Nack() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV0_NACK_BIT, buffer); + return buffer[0]; +} + +// INT_PIN_CFG register + +/** Get interrupt logic level mode. + * Will be set 0 for active-high, 1 for active-low. + * @return Current interrupt mode (0=active-high, 1=active-low) + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_INT_LEVEL_BIT + */ +bool MPU6050::getInterruptMode() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, buffer); + return buffer[0]; +} +/** Set interrupt logic level mode. + * @param mode New interrupt mode (0=active-high, 1=active-low) + * @see getInterruptMode() + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_INT_LEVEL_BIT + */ +void MPU6050::setInterruptMode(bool mode) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, mode); +} +/** Get interrupt drive mode. + * Will be set 0 for push-pull, 1 for open-drain. + * @return Current interrupt drive mode (0=push-pull, 1=open-drain) + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_INT_OPEN_BIT + */ +bool MPU6050::getInterruptDrive() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, buffer); + return buffer[0]; +} +/** Set interrupt drive mode. + * @param drive New interrupt drive mode (0=push-pull, 1=open-drain) + * @see getInterruptDrive() + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_INT_OPEN_BIT + */ +void MPU6050::setInterruptDrive(bool drive) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, drive); +} +/** Get interrupt latch mode. + * Will be set 0 for 50us-pulse, 1 for latch-until-int-cleared. + * @return Current latch mode (0=50us-pulse, 1=latch-until-int-cleared) + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_LATCH_INT_EN_BIT + */ +bool MPU6050::getInterruptLatch() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, buffer); + return buffer[0]; +} +/** Set interrupt latch mode. + * @param latch New latch mode (0=50us-pulse, 1=latch-until-int-cleared) + * @see getInterruptLatch() + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_LATCH_INT_EN_BIT + */ +void MPU6050::setInterruptLatch(bool latch) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, latch); +} +/** Get interrupt latch clear mode. + * Will be set 0 for status-read-only, 1 for any-register-read. + * @return Current latch clear mode (0=status-read-only, 1=any-register-read) + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_INT_RD_CLEAR_BIT + */ +bool MPU6050::getInterruptLatchClear() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, buffer); + return buffer[0]; +} +/** Set interrupt latch clear mode. + * @param clear New latch clear mode (0=status-read-only, 1=any-register-read) + * @see getInterruptLatchClear() + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_INT_RD_CLEAR_BIT + */ +void MPU6050::setInterruptLatchClear(bool clear) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, clear); +} +/** Get FSYNC interrupt logic level mode. + * @return Current FSYNC interrupt mode (0=active-high, 1=active-low) + * @see getFSyncInterruptMode() + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT + */ +bool MPU6050::getFSyncInterruptLevel() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, buffer); + return buffer[0]; +} +/** Set FSYNC interrupt logic level mode. + * @param mode New FSYNC interrupt mode (0=active-high, 1=active-low) + * @see getFSyncInterruptMode() + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT + */ +void MPU6050::setFSyncInterruptLevel(bool level) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, level); +} +/** Get FSYNC pin interrupt enabled setting. + * Will be set 0 for disabled, 1 for enabled. + * @return Current interrupt enabled setting + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_FSYNC_INT_EN_BIT + */ +bool MPU6050::getFSyncInterruptEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, buffer); + return buffer[0]; +} +/** Set FSYNC pin interrupt enabled setting. + * @param enabled New FSYNC pin interrupt enabled setting + * @see getFSyncInterruptEnabled() + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_FSYNC_INT_EN_BIT + */ +void MPU6050::setFSyncInterruptEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, enabled); +} +/** Get I2C bypass enabled status. + * When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to + * 0, the host application processor will be able to directly access the + * auxiliary I2C bus of the MPU-60X0. When this bit is equal to 0, the host + * application processor will not be able to directly access the auxiliary I2C + * bus of the MPU-60X0 regardless of the state of I2C_MST_EN (Register 106 + * bit[5]). + * @return Current I2C bypass enabled status + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_I2C_BYPASS_EN_BIT + */ +bool MPU6050::getI2CBypassEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, buffer); + return buffer[0]; +} +/** Set I2C bypass enabled status. + * When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to + * 0, the host application processor will be able to directly access the + * auxiliary I2C bus of the MPU-60X0. When this bit is equal to 0, the host + * application processor will not be able to directly access the auxiliary I2C + * bus of the MPU-60X0 regardless of the state of I2C_MST_EN (Register 106 + * bit[5]). + * @param enabled New I2C bypass enabled status + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_I2C_BYPASS_EN_BIT + */ +void MPU6050::setI2CBypassEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled); +} +/** Get reference clock output enabled status. + * When this bit is equal to 1, a reference clock output is provided at the + * CLKOUT pin. When this bit is equal to 0, the clock output is disabled. For + * further information regarding CLKOUT, please refer to the MPU-60X0 Product + * Specification document. + * @return Current reference clock output enabled status + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_CLKOUT_EN_BIT + */ +bool MPU6050::getClockOutputEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, buffer); + return buffer[0]; +} +/** Set reference clock output enabled status. + * When this bit is equal to 1, a reference clock output is provided at the + * CLKOUT pin. When this bit is equal to 0, the clock output is disabled. For + * further information regarding CLKOUT, please refer to the MPU-60X0 Product + * Specification document. + * @param enabled New reference clock output enabled status + * @see MPU6050_RA_INT_PIN_CFG + * @see MPU6050_INTCFG_CLKOUT_EN_BIT + */ +void MPU6050::setClockOutputEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, enabled); +} + +// INT_ENABLE register + +/** Get Free Fall interrupt enabled status. + * Will be set 0 for disabled, 1 for enabled. + * @return Current interrupt enabled status + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_FF_BIT + **/ +bool MPU6050::getIntFreefallEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, buffer); + return buffer[0]; +} +/** Set Free Fall interrupt enabled status. + * @param enabled New interrupt enabled status + * @see getIntFreefallEnabled() + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_FF_BIT + **/ +void MPU6050::setIntFreefallEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, enabled); +} +/** Get Motion Detection interrupt enabled status. + * Will be set 0 for disabled, 1 for enabled. + * @return Current interrupt enabled status + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_MOT_BIT + **/ +bool MPU6050::getIntMotionEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, buffer); + return buffer[0]; +} +/** Set Motion Detection interrupt enabled status. + * @param enabled New interrupt enabled status + * @see getIntMotionEnabled() + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_MOT_BIT + **/ +void MPU6050::setIntMotionEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, enabled); +} +/** Get Zero Motion Detection interrupt enabled status. + * Will be set 0 for disabled, 1 for enabled. + * @return Current interrupt enabled status + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_ZMOT_BIT + **/ +bool MPU6050::getIntZeroMotionEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, buffer); + return buffer[0]; +} +/** Set Zero Motion Detection interrupt enabled status. + * @param enabled New interrupt enabled status + * @see getIntZeroMotionEnabled() + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_ZMOT_BIT + **/ +void MPU6050::setIntZeroMotionEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, enabled); +} +/** Get FIFO Buffer Overflow interrupt enabled status. + * Will be set 0 for disabled, 1 for enabled. + * @return Current interrupt enabled status + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_FIFO_OFLOW_BIT + **/ +bool MPU6050::getIntFIFOBufferOverflowEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer); + return buffer[0]; +} +/** Set FIFO Buffer Overflow interrupt enabled status. + * @param enabled New interrupt enabled status + * @see getIntFIFOBufferOverflowEnabled() + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_FIFO_OFLOW_BIT + **/ +void MPU6050::setIntFIFOBufferOverflowEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, enabled); +} +/** Get I2C Master interrupt enabled status. + * This enables any of the I2C Master interrupt sources to generate an + * interrupt. Will be set 0 for disabled, 1 for enabled. + * @return Current interrupt enabled status + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_I2C_MST_INT_BIT + **/ +bool MPU6050::getIntI2CMasterEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer); + return buffer[0]; +} +/** Set I2C Master interrupt enabled status. + * @param enabled New interrupt enabled status + * @see getIntI2CMasterEnabled() + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_I2C_MST_INT_BIT + **/ +void MPU6050::setIntI2CMasterEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, enabled); +} +/** Get Data Ready interrupt enabled setting. + * This event occurs each time a write operation to all of the sensor registers + * has been completed. Will be set 0 for disabled, 1 for enabled. + * @return Current interrupt enabled status + * @see MPU6050_RA_INT_ENABLE + * @see MPU6050_INTERRUPT_DATA_RDY_BIT + */ +bool MPU6050::getIntDataReadyEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer); + return buffer[0]; +} +/** Set Data Ready interrupt enabled status. + * @param enabled New interrupt enabled status + * @see getIntDataReadyEnabled() + * @see MPU6050_RA_INT_CFG + * @see MPU6050_INTERRUPT_DATA_RDY_BIT + */ +void MPU6050::setIntDataReadyEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, enabled); +} + +// INT_STATUS register + +/** Get Free Fall interrupt status. + * This bit automatically sets to 1 when a Free Fall interrupt has been + * generated. The bit clears to 0 after the register has been read. + * @return Current interrupt status + * @see MPU6050_RA_INT_STATUS + * @see MPU6050_INTERRUPT_FF_BIT + */ +bool MPU6050::getIntFreefallStatus() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FF_BIT, buffer); + return buffer[0]; +} +/** Get Motion Detection interrupt status. + * This bit automatically sets to 1 when a Motion Detection interrupt has been + * generated. The bit clears to 0 after the register has been read. + * @return Current interrupt status + * @see MPU6050_RA_INT_STATUS + * @see MPU6050_INTERRUPT_MOT_BIT + */ +bool MPU6050::getIntMotionStatus() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_MOT_BIT, buffer); + return buffer[0]; +} +/** Get Zero Motion Detection interrupt status. + * This bit automatically sets to 1 when a Zero Motion Detection interrupt has + * been generated. The bit clears to 0 after the register has been read. + * @return Current interrupt status + * @see MPU6050_RA_INT_STATUS + * @see MPU6050_INTERRUPT_ZMOT_BIT + */ +bool MPU6050::getIntZeroMotionStatus() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_ZMOT_BIT, buffer); + return buffer[0]; +} +/** Get FIFO Buffer Overflow interrupt status. + * This bit automatically sets to 1 when a Free Fall interrupt has been + * generated. The bit clears to 0 after the register has been read. + * @return Current interrupt status + * @see MPU6050_RA_INT_STATUS + * @see MPU6050_INTERRUPT_FIFO_OFLOW_BIT + */ +bool MPU6050::getIntFIFOBufferOverflowStatus() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer); + return buffer[0]; +} +/** Get I2C Master interrupt status. + * This bit automatically sets to 1 when an I2C Master interrupt has been + * generated. For a list of I2C Master interrupts, please refer to Register 54. + * The bit clears to 0 after the register has been read. + * @return Current interrupt status + * @see MPU6050_RA_INT_STATUS + * @see MPU6050_INTERRUPT_I2C_MST_INT_BIT + */ +bool MPU6050::getIntI2CMasterStatus() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer); + return buffer[0]; +} +/** Get Data Ready interrupt status. + * This bit automatically sets to 1 when a Data Ready interrupt has been + * generated. The bit clears to 0 after the register has been read. + * @return Current interrupt status + * @see MPU6050_RA_INT_STATUS + * @see MPU6050_INTERRUPT_DATA_RDY_BIT + */ +bool MPU6050::getIntDataReadyStatus() { + I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer); + return buffer[0]; +} + +// ACCEL_*OUT_* registers + +/** Get raw 9-axis motion sensor readings (accel/gyro/compass). + * FUNCTION NOT FULLY IMPLEMENTED YET. + * @param ax 16-bit signed integer container for accelerometer X-axis value + * @param ay 16-bit signed integer container for accelerometer Y-axis value + * @param az 16-bit signed integer container for accelerometer Z-axis value + * @param gx 16-bit signed integer container for gyroscope X-axis value + * @param gy 16-bit signed integer container for gyroscope Y-axis value + * @param gz 16-bit signed integer container for gyroscope Z-axis value + * @param mx 16-bit signed integer container for magnetometer X-axis value + * @param my 16-bit signed integer container for magnetometer Y-axis value + * @param mz 16-bit signed integer container for magnetometer Z-axis value + * @see getMotion6() + * @see getAcceleration() + * @see getRotation() + * @see MPU6050_RA_ACCEL_XOUT_H + */ +void MPU6050::getMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* mx, int16_t* my, int16_t* mz) { + getMotion6(ax, ay, az, gx, gy, gz); + // TODO: magnetometer integration +} +/** Get raw 6-axis motion sensor readings (accel/gyro). + * Retrieves all currently available motion sensor values. + * @param ax 16-bit signed integer container for accelerometer X-axis value + * @param ay 16-bit signed integer container for accelerometer Y-axis value + * @param az 16-bit signed integer container for accelerometer Z-axis value + * @param gx 16-bit signed integer container for gyroscope X-axis value + * @param gy 16-bit signed integer container for gyroscope Y-axis value + * @param gz 16-bit signed integer container for gyroscope Z-axis value + * @see getAcceleration() + * @see getRotation() + * @see MPU6050_RA_ACCEL_XOUT_H + */ +void MPU6050::getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz) { + I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 14, buffer); + *ax = (((int16_t)buffer[0]) << 8) | buffer[1]; + *ay = (((int16_t)buffer[2]) << 8) | buffer[3]; + *az = (((int16_t)buffer[4]) << 8) | buffer[5]; + *gx = (((int16_t)buffer[8]) << 8) | buffer[9]; + *gy = (((int16_t)buffer[10]) << 8) | buffer[11]; + *gz = (((int16_t)buffer[12]) << 8) | buffer[13]; +} +/** Get 3-axis accelerometer readings. + * These registers store the most recent accelerometer measurements. + * Accelerometer measurements are written to these registers at the Sample Rate + * as defined in Register 25. + * + * The accelerometer measurement registers, along with the temperature + * measurement registers, gyroscope measurement registers, and external sensor + * data registers, are composed of two sets of registers: an internal register + * set and a user-facing read register set. + * + * The data within the accelerometer sensors' internal register set is always + * updated at the Sample Rate. Meanwhile, the user-facing read register set + * duplicates the internal register set's data values whenever the serial + * interface is idle. This guarantees that a burst read of sensor registers will + * read measurements from the same sampling instant. Note that if burst reads + * are not used, the user is responsible for ensuring a set of single byte reads + * correspond to a single sampling instant by checking the Data Ready interrupt. + * + * Each 16-bit accelerometer measurement has a full scale defined in ACCEL_FS + * (Register 28). For each full scale setting, the accelerometers' sensitivity + * per LSB in ACCEL_xOUT is shown in the table below: + * + *
    + * AFS_SEL | Full Scale Range | LSB Sensitivity
    + * --------+------------------+----------------
    + * 0       | +/- 2g           | 8192 LSB/mg
    + * 1       | +/- 4g           | 4096 LSB/mg
    + * 2       | +/- 8g           | 2048 LSB/mg
    + * 3       | +/- 16g          | 1024 LSB/mg
    + * 
    + * + * @param x 16-bit signed integer container for X-axis acceleration + * @param y 16-bit signed integer container for Y-axis acceleration + * @param z 16-bit signed integer container for Z-axis acceleration + * @see MPU6050_RA_GYRO_XOUT_H + */ +void MPU6050::getAcceleration(int16_t* x, int16_t* y, int16_t* z) { + I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 6, buffer); + *x = (((int16_t)buffer[0]) << 8) | buffer[1]; + *y = (((int16_t)buffer[2]) << 8) | buffer[3]; + *z = (((int16_t)buffer[4]) << 8) | buffer[5]; +} +/** Get X-axis accelerometer reading. + * @return X-axis acceleration measurement in 16-bit 2's complement format + * @see getMotion6() + * @see MPU6050_RA_ACCEL_XOUT_H + */ +int16_t MPU6050::getAccelerationX() { + I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 2, buffer); + return (((int16_t)buffer[0]) << 8) | buffer[1]; +} +/** Get Y-axis accelerometer reading. + * @return Y-axis acceleration measurement in 16-bit 2's complement format + * @see getMotion6() + * @see MPU6050_RA_ACCEL_YOUT_H + */ +int16_t MPU6050::getAccelerationY() { + I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_YOUT_H, 2, buffer); + return (((int16_t)buffer[0]) << 8) | buffer[1]; +} +/** Get Z-axis accelerometer reading. + * @return Z-axis acceleration measurement in 16-bit 2's complement format + * @see getMotion6() + * @see MPU6050_RA_ACCEL_ZOUT_H + */ +int16_t MPU6050::getAccelerationZ() { + I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_ZOUT_H, 2, buffer); + return (((int16_t)buffer[0]) << 8) | buffer[1]; +} + +// TEMP_OUT_* registers + +/** Get current internal temperature. + * @return Temperature reading in 16-bit 2's complement format + * @see MPU6050_RA_TEMP_OUT_H + */ +int16_t MPU6050::getTemperature() { + I2Cdev::readBytes(devAddr, MPU6050_RA_TEMP_OUT_H, 2, buffer); + return (((int16_t)buffer[0]) << 8) | buffer[1]; +} + +// GYRO_*OUT_* registers + +/** Get 3-axis gyroscope readings. + * These gyroscope measurement registers, along with the accelerometer + * measurement registers, temperature measurement registers, and external sensor + * data registers, are composed of two sets of registers: an internal register + * set and a user-facing read register set. + * The data within the gyroscope sensors' internal register set is always + * updated at the Sample Rate. Meanwhile, the user-facing read register set + * duplicates the internal register set's data values whenever the serial + * interface is idle. This guarantees that a burst read of sensor registers will + * read measurements from the same sampling instant. Note that if burst reads + * are not used, the user is responsible for ensuring a set of single byte reads + * correspond to a single sampling instant by checking the Data Ready interrupt. + * + * Each 16-bit gyroscope measurement has a full scale defined in FS_SEL + * (Register 27). For each full scale setting, the gyroscopes' sensitivity per + * LSB in GYRO_xOUT is shown in the table below: + * + *
    + * FS_SEL | Full Scale Range   | LSB Sensitivity
    + * -------+--------------------+----------------
    + * 0      | +/- 250 degrees/s  | 131 LSB/deg/s
    + * 1      | +/- 500 degrees/s  | 65.5 LSB/deg/s
    + * 2      | +/- 1000 degrees/s | 32.8 LSB/deg/s
    + * 3      | +/- 2000 degrees/s | 16.4 LSB/deg/s
    + * 
    + * + * @param x 16-bit signed integer container for X-axis rotation + * @param y 16-bit signed integer container for Y-axis rotation + * @param z 16-bit signed integer container for Z-axis rotation + * @see getMotion6() + * @see MPU6050_RA_GYRO_XOUT_H + */ +void MPU6050::getRotation(int16_t* x, int16_t* y, int16_t* z) { + I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_XOUT_H, 6, buffer); + *x = (((int16_t)buffer[0]) << 8) | buffer[1]; + *y = (((int16_t)buffer[2]) << 8) | buffer[3]; + *z = (((int16_t)buffer[4]) << 8) | buffer[5]; +} +/** Get X-axis gyroscope reading. + * @return X-axis rotation measurement in 16-bit 2's complement format + * @see getMotion6() + * @see MPU6050_RA_GYRO_XOUT_H + */ +int16_t MPU6050::getRotationX() { + I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_XOUT_H, 2, buffer); + return (((int16_t)buffer[0]) << 8) | buffer[1]; +} +/** Get Y-axis gyroscope reading. + * @return Y-axis rotation measurement in 16-bit 2's complement format + * @see getMotion6() + * @see MPU6050_RA_GYRO_YOUT_H + */ +int16_t MPU6050::getRotationY() { + I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_YOUT_H, 2, buffer); + return (((int16_t)buffer[0]) << 8) | buffer[1]; +} +/** Get Z-axis gyroscope reading. + * @return Z-axis rotation measurement in 16-bit 2's complement format + * @see getMotion6() + * @see MPU6050_RA_GYRO_ZOUT_H + */ +int16_t MPU6050::getRotationZ() { + I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_ZOUT_H, 2, buffer); + return (((int16_t)buffer[0]) << 8) | buffer[1]; +} + +// EXT_SENS_DATA_* registers + +/** Read single byte from external sensor data register. + * These registers store data read from external sensors by the Slave 0, 1, 2, + * and 3 on the auxiliary I2C interface. Data read by Slave 4 is stored in + * I2C_SLV4_DI (Register 53). + * + * External sensor data is written to these registers at the Sample Rate as + * defined in Register 25. This access rate can be reduced by using the Slave + * Delay Enable registers (Register 103). + * + * External sensor data registers, along with the gyroscope measurement + * registers, accelerometer measurement registers, and temperature measurement + * registers, are composed of two sets of registers: an internal register set + * and a user-facing read register set. + * + * The data within the external sensors' internal register set is always updated + * at the Sample Rate (or the reduced access rate) whenever the serial interface + * is idle. This guarantees that a burst read of sensor registers will read + * measurements from the same sampling instant. Note that if burst reads are not + * used, the user is responsible for ensuring a set of single byte reads + * correspond to a single sampling instant by checking the Data Ready interrupt. + * + * Data is placed in these external sensor data registers according to + * I2C_SLV0_CTRL, I2C_SLV1_CTRL, I2C_SLV2_CTRL, and I2C_SLV3_CTRL (Registers 39, + * 42, 45, and 48). When more than zero bytes are read (I2C_SLVx_LEN > 0) from + * an enabled slave (I2C_SLVx_EN = 1), the slave is read at the Sample Rate (as + * defined in Register 25) or delayed rate (if specified in Register 52 and + * 103). During each Sample cycle, slave reads are performed in order of Slave + * number. If all slaves are enabled with more than zero bytes to be read, the + * order will be Slave 0, followed by Slave 1, Slave 2, and Slave 3. + * + * Each enabled slave will have EXT_SENS_DATA registers associated with it by + * number of bytes read (I2C_SLVx_LEN) in order of slave number, starting from + * EXT_SENS_DATA_00. Note that this means enabling or disabling a slave may + * change the higher numbered slaves' associated registers. Furthermore, if + * fewer total bytes are being read from the external sensors as a result of + * such a change, then the data remaining in the registers which no longer have + * an associated slave device (i.e. high numbered registers) will remain in + * these previously allocated registers unless reset. + * + * If the sum of the read lengths of all SLVx transactions exceed the number of + * available EXT_SENS_DATA registers, the excess bytes will be dropped. There + * are 24 EXT_SENS_DATA registers and hence the total read lengths between all + * the slaves cannot be greater than 24 or some bytes will be lost. + * + * Note: Slave 4's behavior is distinct from that of Slaves 0-3. For further + * information regarding the characteristics of Slave 4, please refer to + * Registers 49 to 53. + * + * EXAMPLE: + * Suppose that Slave 0 is enabled with 4 bytes to be read (I2C_SLV0_EN = 1 and + * I2C_SLV0_LEN = 4) while Slave 1 is enabled with 2 bytes to be read so that + * I2C_SLV1_EN = 1 and I2C_SLV1_LEN = 2. In such a situation, EXT_SENS_DATA _00 + * through _03 will be associated with Slave 0, while EXT_SENS_DATA _04 and 05 + * will be associated with Slave 1. If Slave 2 is enabled as well, registers + * starting from EXT_SENS_DATA_06 will be allocated to Slave 2. + * + * If Slave 2 is disabled while Slave 3 is enabled in this same situation, then + * registers starting from EXT_SENS_DATA_06 will be allocated to Slave 3 + * instead. + * + * REGISTER ALLOCATION FOR DYNAMIC DISABLE VS. NORMAL DISABLE: + * If a slave is disabled at any time, the space initially allocated to the + * slave in the EXT_SENS_DATA register, will remain associated with that slave. + * This is to avoid dynamic adjustment of the register allocation. + * + * The allocation of the EXT_SENS_DATA registers is recomputed only when (1) all + * slaves are disabled, or (2) the I2C_MST_RST bit is set (Register 106). + * + * This above is also true if one of the slaves gets NACKed and stops + * functioning. + * + * @param position Starting position (0-23) + * @return Byte read from register + */ +uint8_t MPU6050::getExternalSensorByte(int position) { + I2Cdev::readByte(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, buffer); + return buffer[0]; +} +/** Read word (2 bytes) from external sensor data registers. + * @param position Starting position (0-21) + * @return Word read from register + * @see getExternalSensorByte() + */ +uint16_t MPU6050::getExternalSensorWord(int position) { + I2Cdev::readBytes(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 2, buffer); + return (((uint16_t)buffer[0]) << 8) | buffer[1]; +} +/** Read double word (4 bytes) from external sensor data registers. + * @param position Starting position (0-20) + * @return Double word read from registers + * @see getExternalSensorByte() + */ +uint32_t MPU6050::getExternalSensorDWord(int position) { + I2Cdev::readBytes(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 4, buffer); + return (((uint32_t)buffer[0]) << 24) | (((uint32_t)buffer[1]) << 16) | (((uint16_t)buffer[2]) << 8) | buffer[3]; +} + +// MOT_DETECT_STATUS register + +/** Get X-axis negative motion detection interrupt status. + * @return Motion detection status + * @see MPU6050_RA_MOT_DETECT_STATUS + * @see MPU6050_MOTION_MOT_XNEG_BIT + */ +bool MPU6050::getXNegMotionDetected() { + I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XNEG_BIT, buffer); + return buffer[0]; +} +/** Get X-axis positive motion detection interrupt status. + * @return Motion detection status + * @see MPU6050_RA_MOT_DETECT_STATUS + * @see MPU6050_MOTION_MOT_XPOS_BIT + */ +bool MPU6050::getXPosMotionDetected() { + I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XPOS_BIT, buffer); + return buffer[0]; +} +/** Get Y-axis negative motion detection interrupt status. + * @return Motion detection status + * @see MPU6050_RA_MOT_DETECT_STATUS + * @see MPU6050_MOTION_MOT_YNEG_BIT + */ +bool MPU6050::getYNegMotionDetected() { + I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YNEG_BIT, buffer); + return buffer[0]; +} +/** Get Y-axis positive motion detection interrupt status. + * @return Motion detection status + * @see MPU6050_RA_MOT_DETECT_STATUS + * @see MPU6050_MOTION_MOT_YPOS_BIT + */ +bool MPU6050::getYPosMotionDetected() { + I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YPOS_BIT, buffer); + return buffer[0]; +} +/** Get Z-axis negative motion detection interrupt status. + * @return Motion detection status + * @see MPU6050_RA_MOT_DETECT_STATUS + * @see MPU6050_MOTION_MOT_ZNEG_BIT + */ +bool MPU6050::getZNegMotionDetected() { + I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZNEG_BIT, buffer); + return buffer[0]; +} +/** Get Z-axis positive motion detection interrupt status. + * @return Motion detection status + * @see MPU6050_RA_MOT_DETECT_STATUS + * @see MPU6050_MOTION_MOT_ZPOS_BIT + */ +bool MPU6050::getZPosMotionDetected() { + I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZPOS_BIT, buffer); + return buffer[0]; +} +/** Get zero motion detection interrupt status. + * @return Motion detection status + * @see MPU6050_RA_MOT_DETECT_STATUS + * @see MPU6050_MOTION_MOT_ZRMOT_BIT + */ +bool MPU6050::getZeroMotionDetected() { + I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZRMOT_BIT, buffer); + return buffer[0]; +} + +// I2C_SLV*_DO register + +/** Write byte to Data Output container for specified slave. + * This register holds the output data written into Slave when Slave is set to + * write mode. For further information regarding Slave control, please + * refer to Registers 37 to 39 and immediately following. + * @param num Slave number (0-3) + * @param data Byte to write + * @see MPU6050_RA_I2C_SLV0_DO + */ +void MPU6050::setSlaveOutputByte(uint8_t num, uint8_t data) { + if (num > 3) return; + I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_DO + num, data); +} + +// I2C_MST_DELAY_CTRL register + +/** Get external data shadow delay enabled status. + * This register is used to specify the timing of external sensor data + * shadowing. When DELAY_ES_SHADOW is set to 1, shadowing of external + * sensor data is delayed until all data has been received. + * @return Current external data shadow delay enabled status. + * @see MPU6050_RA_I2C_MST_DELAY_CTRL + * @see MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT + */ +bool MPU6050::getExternalShadowDelayEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, buffer); + return buffer[0]; +} +/** Set external data shadow delay enabled status. + * @param enabled New external data shadow delay enabled status. + * @see getExternalShadowDelayEnabled() + * @see MPU6050_RA_I2C_MST_DELAY_CTRL + * @see MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT + */ +void MPU6050::setExternalShadowDelayEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, enabled); +} +/** Get slave delay enabled status. + * When a particular slave delay is enabled, the rate of access for the that + * slave device is reduced. When a slave's access rate is decreased relative to + * the Sample Rate, the slave is accessed every: + * + * 1 / (1 + I2C_MST_DLY) Samples + * + * This base Sample Rate in turn is determined by SMPLRT_DIV (register * 25) + * and DLPF_CFG (register 26). + * + * For further information regarding I2C_MST_DLY, please refer to register 52. + * For further information regarding the Sample Rate, please refer to register 25. + * + * @param num Slave number (0-4) + * @return Current slave delay enabled status. + * @see MPU6050_RA_I2C_MST_DELAY_CTRL + * @see MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT + */ +bool MPU6050::getSlaveDelayEnabled(uint8_t num) { + // MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT is 4, SLV3 is 3, etc. + if (num > 4) return 0; + I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, buffer); + return buffer[0]; +} +/** Set slave delay enabled status. + * @param num Slave number (0-4) + * @param enabled New slave delay enabled status. + * @see MPU6050_RA_I2C_MST_DELAY_CTRL + * @see MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT + */ +void MPU6050::setSlaveDelayEnabled(uint8_t num, bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, enabled); +} + +// SIGNAL_PATH_RESET register + +/** Reset gyroscope signal path. + * The reset will revert the signal path analog to digital converters and + * filters to their power up configurations. + * @see MPU6050_RA_SIGNAL_PATH_RESET + * @see MPU6050_PATHRESET_GYRO_RESET_BIT + */ +void MPU6050::resetGyroscopePath() { + I2Cdev::writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_GYRO_RESET_BIT, true); +} +/** Reset accelerometer signal path. + * The reset will revert the signal path analog to digital converters and + * filters to their power up configurations. + * @see MPU6050_RA_SIGNAL_PATH_RESET + * @see MPU6050_PATHRESET_ACCEL_RESET_BIT + */ +void MPU6050::resetAccelerometerPath() { + I2Cdev::writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_ACCEL_RESET_BIT, true); +} +/** Reset temperature sensor signal path. + * The reset will revert the signal path analog to digital converters and + * filters to their power up configurations. + * @see MPU6050_RA_SIGNAL_PATH_RESET + * @see MPU6050_PATHRESET_TEMP_RESET_BIT + */ +void MPU6050::resetTemperaturePath() { + I2Cdev::writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_TEMP_RESET_BIT, true); +} + +// MOT_DETECT_CTRL register + +/** Get accelerometer power-on delay. + * The accelerometer data path provides samples to the sensor registers, Motion + * detection, Zero Motion detection, and Free Fall detection modules. The + * signal path contains filters which must be flushed on wake-up with new + * samples before the detection modules begin operations. The default wake-up + * delay, of 4ms can be lengthened by up to 3ms. This additional delay is + * specified in ACCEL_ON_DELAY in units of 1 LSB = 1 ms. The user may select + * any value above zero unless instructed otherwise by InvenSense. Please refer + * to Section 8 of the MPU-6000/MPU-6050 Product Specification document for + * further information regarding the detection modules. + * @return Current accelerometer power-on delay + * @see MPU6050_RA_MOT_DETECT_CTRL + * @see MPU6050_DETECT_ACCEL_ON_DELAY_BIT + */ +uint8_t MPU6050::getAccelerometerPowerOnDelay() { + I2Cdev::readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT, MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, buffer); + return buffer[0]; +} +/** Set accelerometer power-on delay. + * @param delay New accelerometer power-on delay (0-3) + * @see getAccelerometerPowerOnDelay() + * @see MPU6050_RA_MOT_DETECT_CTRL + * @see MPU6050_DETECT_ACCEL_ON_DELAY_BIT + */ +void MPU6050::setAccelerometerPowerOnDelay(uint8_t delay) { + I2Cdev::writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT, MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, delay); +} +/** Get Free Fall detection counter decrement configuration. + * Detection is registered by the Free Fall detection module after accelerometer + * measurements meet their respective threshold conditions over a specified + * number of samples. When the threshold conditions are met, the corresponding + * detection counter increments by 1. The user may control the rate at which the + * detection counter decrements when the threshold condition is not met by + * configuring FF_COUNT. The decrement rate can be set according to the + * following table: + * + *
    + * FF_COUNT | Counter Decrement
    + * ---------+------------------
    + * 0        | Reset
    + * 1        | 1
    + * 2        | 2
    + * 3        | 4
    + * 
    + * + * When FF_COUNT is configured to 0 (reset), any non-qualifying sample will + * reset the counter to 0. For further information on Free Fall detection, + * please refer to Registers 29 to 32. + * + * @return Current decrement configuration + * @see MPU6050_RA_MOT_DETECT_CTRL + * @see MPU6050_DETECT_FF_COUNT_BIT + */ +uint8_t MPU6050::getFreefallDetectionCounterDecrement() { + I2Cdev::readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT, MPU6050_DETECT_FF_COUNT_LENGTH, buffer); + return buffer[0]; +} +/** Set Free Fall detection counter decrement configuration. + * @param decrement New decrement configuration value + * @see getFreefallDetectionCounterDecrement() + * @see MPU6050_RA_MOT_DETECT_CTRL + * @see MPU6050_DETECT_FF_COUNT_BIT + */ +void MPU6050::setFreefallDetectionCounterDecrement(uint8_t decrement) { + I2Cdev::writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT, MPU6050_DETECT_FF_COUNT_LENGTH, decrement); +} +/** Get Motion detection counter decrement configuration. + * Detection is registered by the Motion detection module after accelerometer + * measurements meet their respective threshold conditions over a specified + * number of samples. When the threshold conditions are met, the corresponding + * detection counter increments by 1. The user may control the rate at which the + * detection counter decrements when the threshold condition is not met by + * configuring MOT_COUNT. The decrement rate can be set according to the + * following table: + * + *
    + * MOT_COUNT | Counter Decrement
    + * ----------+------------------
    + * 0         | Reset
    + * 1         | 1
    + * 2         | 2
    + * 3         | 4
    + * 
    + * + * When MOT_COUNT is configured to 0 (reset), any non-qualifying sample will + * reset the counter to 0. For further information on Motion detection, + * please refer to Registers 29 to 32. + * + */ +uint8_t MPU6050::getMotionDetectionCounterDecrement() { + I2Cdev::readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT, MPU6050_DETECT_MOT_COUNT_LENGTH, buffer); + return buffer[0]; +} +/** Set Motion detection counter decrement configuration. + * @param decrement New decrement configuration value + * @see getMotionDetectionCounterDecrement() + * @see MPU6050_RA_MOT_DETECT_CTRL + * @see MPU6050_DETECT_MOT_COUNT_BIT + */ +void MPU6050::setMotionDetectionCounterDecrement(uint8_t decrement) { + I2Cdev::writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT, MPU6050_DETECT_MOT_COUNT_LENGTH, decrement); +} + +// USER_CTRL register + +/** Get FIFO enabled status. + * When this bit is set to 0, the FIFO buffer is disabled. The FIFO buffer + * cannot be written to or read from while disabled. The FIFO buffer's state + * does not change unless the MPU-60X0 is power cycled. + * @return Current FIFO enabled status + * @see MPU6050_RA_USER_CTRL + * @see MPU6050_USERCTRL_FIFO_EN_BIT + */ +bool MPU6050::getFIFOEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, buffer); + return buffer[0]; +} +/** Set FIFO enabled status. + * @param enabled New FIFO enabled status + * @see getFIFOEnabled() + * @see MPU6050_RA_USER_CTRL + * @see MPU6050_USERCTRL_FIFO_EN_BIT + */ +void MPU6050::setFIFOEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, enabled); +} +/** Get I2C Master Mode enabled status. + * When this mode is enabled, the MPU-60X0 acts as the I2C Master to the + * external sensor slave devices on the auxiliary I2C bus. When this bit is + * cleared to 0, the auxiliary I2C bus lines (AUX_DA and AUX_CL) are logically + * driven by the primary I2C bus (SDA and SCL). This is a precondition to + * enabling Bypass Mode. For further information regarding Bypass Mode, please + * refer to Register 55. + * @return Current I2C Master Mode enabled status + * @see MPU6050_RA_USER_CTRL + * @see MPU6050_USERCTRL_I2C_MST_EN_BIT + */ +bool MPU6050::getI2CMasterModeEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, buffer); + return buffer[0]; +} +/** Set I2C Master Mode enabled status. + * @param enabled New I2C Master Mode enabled status + * @see getI2CMasterModeEnabled() + * @see MPU6050_RA_USER_CTRL + * @see MPU6050_USERCTRL_I2C_MST_EN_BIT + */ +void MPU6050::setI2CMasterModeEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled); +} +/** Switch from I2C to SPI mode (MPU-6000 only) + * If this is set, the primary SPI interface will be enabled in place of the + * disabled primary I2C interface. + */ +void MPU6050::switchSPIEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_IF_DIS_BIT, enabled); +} +/** Reset the FIFO. + * This bit resets the FIFO buffer when set to 1 while FIFO_EN equals 0. This + * bit automatically clears to 0 after the reset has been triggered. + * @see MPU6050_RA_USER_CTRL + * @see MPU6050_USERCTRL_FIFO_RESET_BIT + */ +void MPU6050::resetFIFO() { + I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_RESET_BIT, true); +} +/** Reset the I2C Master. + * This bit resets the I2C Master when set to 1 while I2C_MST_EN equals 0. + * This bit automatically clears to 0 after the reset has been triggered. + * @see MPU6050_RA_USER_CTRL + * @see MPU6050_USERCTRL_I2C_MST_RESET_BIT + */ +void MPU6050::resetI2CMaster() { + I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_RESET_BIT, true); +} +/** Reset all sensor registers and signal paths. + * When set to 1, this bit resets the signal paths for all sensors (gyroscopes, + * accelerometers, and temperature sensor). This operation will also clear the + * sensor registers. This bit automatically clears to 0 after the reset has been + * triggered. + * + * When resetting only the signal path (and not the sensor registers), please + * use Register 104, SIGNAL_PATH_RESET. + * + * @see MPU6050_RA_USER_CTRL + * @see MPU6050_USERCTRL_SIG_COND_RESET_BIT + */ +void MPU6050::resetSensors() { + I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_SIG_COND_RESET_BIT, true); +} + +// PWR_MGMT_1 register + +/** Trigger a full device reset. + * A small delay of ~50ms may be desirable after triggering a reset. + * @see MPU6050_RA_PWR_MGMT_1 + * @see MPU6050_PWR1_DEVICE_RESET_BIT + */ +void MPU6050::reset() { + I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_DEVICE_RESET_BIT, true); +} +/** Get sleep mode status. + * Setting the SLEEP bit in the register puts the device into very low power + * sleep mode. In this mode, only the serial interface and internal registers + * remain active, allowing for a very low standby current. Clearing this bit + * puts the device back into normal mode. To save power, the individual standby + * selections for each of the gyros should be used if any gyro axis is not used + * by the application. + * @return Current sleep mode enabled status + * @see MPU6050_RA_PWR_MGMT_1 + * @see MPU6050_PWR1_SLEEP_BIT + */ +bool MPU6050::getSleepEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, buffer); + return buffer[0]; +} +/** Set sleep mode status. + * @param enabled New sleep mode enabled status + * @see getSleepEnabled() + * @see MPU6050_RA_PWR_MGMT_1 + * @see MPU6050_PWR1_SLEEP_BIT + */ +void MPU6050::setSleepEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled); +} +/** Get wake cycle enabled status. + * When this bit is set to 1 and SLEEP is disabled, the MPU-60X0 will cycle + * between sleep mode and waking up to take a single sample of data from active + * sensors at a rate determined by LP_WAKE_CTRL (register 108). + * @return Current sleep mode enabled status + * @see MPU6050_RA_PWR_MGMT_1 + * @see MPU6050_PWR1_CYCLE_BIT + */ +bool MPU6050::getWakeCycleEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, buffer); + return buffer[0]; +} +/** Set wake cycle enabled status. + * @param enabled New sleep mode enabled status + * @see getWakeCycleEnabled() + * @see MPU6050_RA_PWR_MGMT_1 + * @see MPU6050_PWR1_CYCLE_BIT + */ +void MPU6050::setWakeCycleEnabled(bool enabled) { + I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, enabled); +} +/** Get temperature sensor enabled status. + * Control the usage of the internal temperature sensor. + * + * Note: this register stores the *disabled* value, but for consistency with the + * rest of the code, the function is named and used with standard true/false + * values to indicate whether the sensor is enabled or disabled, respectively. + * + * @return Current temperature sensor enabled status + * @see MPU6050_RA_PWR_MGMT_1 + * @see MPU6050_PWR1_TEMP_DIS_BIT + */ +bool MPU6050::getTempSensorEnabled() { + I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, buffer); + return buffer[0] == 0; // 1 is actually disabled here +} +/** Set temperature sensor enabled status. + * Note: this register stores the *disabled* value, but for consistency with the + * rest of the code, the function is named and used with standard true/false + * values to indicate whether the sensor is enabled or disabled, respectively. + * + * @param enabled New temperature sensor enabled status + * @see getTempSensorEnabled() + * @see MPU6050_RA_PWR_MGMT_1 + * @see MPU6050_PWR1_TEMP_DIS_BIT + */ +void MPU6050::setTempSensorEnabled(bool enabled) { + // 1 is actually disabled here + I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, !enabled); +} +/** Get clock source setting. + * @return Current clock source setting + * @see MPU6050_RA_PWR_MGMT_1 + * @see MPU6050_PWR1_CLKSEL_BIT + * @see MPU6050_PWR1_CLKSEL_LENGTH + */ +uint8_t MPU6050::getClockSource() { + I2Cdev::readBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, buffer); + return buffer[0]; +} +/** Set clock source setting. + * An internal 8MHz oscillator, gyroscope based clock, or external sources can + * be selected as the MPU-60X0 clock source. When the internal 8 MHz oscillator + * or an external source is chosen as the clock source, the MPU-60X0 can operate + * in low power modes with the gyroscopes disabled. + * + * Upon power up, the MPU-60X0 clock source defaults to the internal oscillator. + * However, it is highly recommended that the device be configured to use one of + * the gyroscopes (or an external clock source) as the clock reference for + * improved stability. The clock source can be selected according to the following table: + * + *
    + * CLK_SEL | Clock Source
    + * --------+--------------------------------------
    + * 0       | Internal oscillator
    + * 1       | PLL with X Gyro reference
    + * 2       | PLL with Y Gyro reference
    + * 3       | PLL with Z Gyro reference
    + * 4       | PLL with external 32.768kHz reference
    + * 5       | PLL with external 19.2MHz reference
    + * 6       | Reserved
    + * 7       | Stops the clock and keeps the timing generator in reset
    + * 
    + * + * @param source New clock source setting + * @see getClockSource() + * @see MPU6050_RA_PWR_MGMT_1 + * @see MPU6050_PWR1_CLKSEL_BIT + * @see MPU6050_PWR1_CLKSEL_LENGTH + */ +void MPU6050::setClockSource(uint8_t source) { + I2Cdev::writeBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source); +} + +// PWR_MGMT_2 register + +/** Get wake frequency in Accel-Only Low Power Mode. + * The MPU-60X0 can be put into Accerlerometer Only Low Power Mode by setting + * PWRSEL to 1 in the Power Management 1 register (Register 107). In this mode, + * the device will power off all devices except for the primary I2C interface, + * waking only the accelerometer at fixed intervals to take a single + * measurement. The frequency of wake-ups can be configured with LP_WAKE_CTRL + * as shown below: + * + *
    + * LP_WAKE_CTRL | Wake-up Frequency
    + * -------------+------------------
    + * 0            | 1.25 Hz
    + * 1            | 2.5 Hz
    + * 2            | 5 Hz
    + * 3            | 10 Hz
    + * 
    + *
    + * For further information regarding the MPU-60X0's power modes, please refer to
    + * Register 107.
    + *
    + * @return Current wake frequency
    + * @see MPU6050_RA_PWR_MGMT_2
    + */
    +uint8_t MPU6050::getWakeFrequency() {
    +    I2Cdev::readBits(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT, MPU6050_PWR2_LP_WAKE_CTRL_LENGTH, buffer);
    +    return buffer[0];
    +}
    +/** Set wake frequency in Accel-Only Low Power Mode.
    + * @param frequency New wake frequency
    + * @see MPU6050_RA_PWR_MGMT_2
    + */
    +void MPU6050::setWakeFrequency(uint8_t frequency) {
    +    I2Cdev::writeBits(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT, MPU6050_PWR2_LP_WAKE_CTRL_LENGTH, frequency);
    +}
    +
    +/** Get X-axis accelerometer standby enabled status.
    + * If enabled, the X-axis will not gather or report data (or use power).
    + * @return Current X-axis standby enabled status
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_XA_BIT
    + */
    +bool MPU6050::getStandbyXAccelEnabled() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, buffer);
    +    return buffer[0];
    +}
    +/** Set X-axis accelerometer standby enabled status.
    + * @param New X-axis standby enabled status
    + * @see getStandbyXAccelEnabled()
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_XA_BIT
    + */
    +void MPU6050::setStandbyXAccelEnabled(bool enabled) {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, enabled);
    +}
    +/** Get Y-axis accelerometer standby enabled status.
    + * If enabled, the Y-axis will not gather or report data (or use power).
    + * @return Current Y-axis standby enabled status
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_YA_BIT
    + */
    +bool MPU6050::getStandbyYAccelEnabled() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, buffer);
    +    return buffer[0];
    +}
    +/** Set Y-axis accelerometer standby enabled status.
    + * @param New Y-axis standby enabled status
    + * @see getStandbyYAccelEnabled()
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_YA_BIT
    + */
    +void MPU6050::setStandbyYAccelEnabled(bool enabled) {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, enabled);
    +}
    +/** Get Z-axis accelerometer standby enabled status.
    + * If enabled, the Z-axis will not gather or report data (or use power).
    + * @return Current Z-axis standby enabled status
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_ZA_BIT
    + */
    +bool MPU6050::getStandbyZAccelEnabled() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, buffer);
    +    return buffer[0];
    +}
    +/** Set Z-axis accelerometer standby enabled status.
    + * @param New Z-axis standby enabled status
    + * @see getStandbyZAccelEnabled()
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_ZA_BIT
    + */
    +void MPU6050::setStandbyZAccelEnabled(bool enabled) {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, enabled);
    +}
    +/** Get X-axis gyroscope standby enabled status.
    + * If enabled, the X-axis will not gather or report data (or use power).
    + * @return Current X-axis standby enabled status
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_XG_BIT
    + */
    +bool MPU6050::getStandbyXGyroEnabled() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, buffer);
    +    return buffer[0];
    +}
    +/** Set X-axis gyroscope standby enabled status.
    + * @param New X-axis standby enabled status
    + * @see getStandbyXGyroEnabled()
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_XG_BIT
    + */
    +void MPU6050::setStandbyXGyroEnabled(bool enabled) {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, enabled);
    +}
    +/** Get Y-axis gyroscope standby enabled status.
    + * If enabled, the Y-axis will not gather or report data (or use power).
    + * @return Current Y-axis standby enabled status
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_YG_BIT
    + */
    +bool MPU6050::getStandbyYGyroEnabled() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, buffer);
    +    return buffer[0];
    +}
    +/** Set Y-axis gyroscope standby enabled status.
    + * @param New Y-axis standby enabled status
    + * @see getStandbyYGyroEnabled()
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_YG_BIT
    + */
    +void MPU6050::setStandbyYGyroEnabled(bool enabled) {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, enabled);
    +}
    +/** Get Z-axis gyroscope standby enabled status.
    + * If enabled, the Z-axis will not gather or report data (or use power).
    + * @return Current Z-axis standby enabled status
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_ZG_BIT
    + */
    +bool MPU6050::getStandbyZGyroEnabled() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, buffer);
    +    return buffer[0];
    +}
    +/** Set Z-axis gyroscope standby enabled status.
    + * @param New Z-axis standby enabled status
    + * @see getStandbyZGyroEnabled()
    + * @see MPU6050_RA_PWR_MGMT_2
    + * @see MPU6050_PWR2_STBY_ZG_BIT
    + */
    +void MPU6050::setStandbyZGyroEnabled(bool enabled) {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, enabled);
    +}
    +
    +// FIFO_COUNT* registers
    +
    +/** Get current FIFO buffer size.
    + * This value indicates the number of bytes stored in the FIFO buffer. This
    + * number is in turn the number of bytes that can be read from the FIFO buffer
    + * and it is directly proportional to the number of samples available given the
    + * set of sensor data bound to be stored in the FIFO (register 35 and 36).
    + * @return Current FIFO buffer size
    + */
    +uint16_t MPU6050::getFIFOCount() {
    +    I2Cdev::readBytes(devAddr, MPU6050_RA_FIFO_COUNTH, 2, buffer);
    +    return (((uint16_t)buffer[0]) << 8) | buffer[1];
    +}
    +
    +// FIFO_R_W register
    +
    +/** Get byte from FIFO buffer.
    + * This register is used to read and write data from the FIFO buffer. Data is
    + * written to the FIFO in order of register number (from lowest to highest). If
    + * all the FIFO enable flags (see below) are enabled and all External Sensor
    + * Data registers (Registers 73 to 96) are associated with a Slave device, the
    + * contents of registers 59 through 96 will be written in order at the Sample
    + * Rate.
    + *
    + * The contents of the sensor data registers (Registers 59 to 96) are written
    + * into the FIFO buffer when their corresponding FIFO enable flags are set to 1
    + * in FIFO_EN (Register 35). An additional flag for the sensor data registers
    + * associated with I2C Slave 3 can be found in I2C_MST_CTRL (Register 36).
    + *
    + * If the FIFO buffer has overflowed, the status bit FIFO_OFLOW_INT is
    + * automatically set to 1. This bit is located in INT_STATUS (Register 58).
    + * When the FIFO buffer has overflowed, the oldest data will be lost and new
    + * data will be written to the FIFO.
    + *
    + * If the FIFO buffer is empty, reading this register will return the last byte
    + * that was previously read from the FIFO until new data is available. The user
    + * should check FIFO_COUNT to ensure that the FIFO buffer is not read when
    + * empty.
    + *
    + * @return Byte from FIFO buffer
    + */
    +uint8_t MPU6050::getFIFOByte() {
    +    I2Cdev::readByte(devAddr, MPU6050_RA_FIFO_R_W, buffer);
    +    return buffer[0];
    +}
    +/** Write byte to FIFO buffer.
    + * @see getFIFOByte()
    + * @see MPU6050_RA_FIFO_R_W
    + */
    +void MPU6050::setFIFOByte(uint8_t data) {
    +    I2Cdev::writeByte(devAddr, MPU6050_RA_FIFO_R_W, data);
    +}
    +
    +// WHO_AM_I register
    +
    +/** Get Device ID.
    + * This register is used to verify the identity of the device (0b110100).
    + * @return Device ID (should be 0x68, 104 dec, 150 oct)
    + * @see MPU6050_RA_WHO_AM_I
    + * @see MPU6050_WHO_AM_I_BIT
    + * @see MPU6050_WHO_AM_I_LENGTH
    + */
    +uint8_t MPU6050::getDeviceID() {
    +    I2Cdev::readBits(devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH, buffer);
    +    return buffer[0];
    +}
    +/** Set Device ID.
    + * Write a new ID into the WHO_AM_I register (no idea why this should ever be
    + * necessary though).
    + * @param id New device ID to set.
    + * @see getDeviceID()
    + * @see MPU6050_RA_WHO_AM_I
    + * @see MPU6050_WHO_AM_I_BIT
    + * @see MPU6050_WHO_AM_I_LENGTH
    + */
    +void MPU6050::setDeviceID(uint8_t id) {
    +    I2Cdev::writeBits(devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH, id);
    +}
    +
    +// ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
    +
    +// XG_OFFS_TC register
    +
    +int8_t MPU6050::getXGyroOffset() {
    +    I2Cdev::readBits(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setXGyroOffset(int8_t offset) {
    +    I2Cdev::writeBits(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, offset);
    +}
    +
    +// YG_OFFS_TC register
    +
    +int8_t MPU6050::getYGyroOffset() {
    +    I2Cdev::readBits(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setYGyroOffset(int8_t offset) {
    +    I2Cdev::writeBits(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, offset);
    +}
    +
    +// ZG_OFFS_TC register
    +
    +int8_t MPU6050::getZGyroOffset() {
    +    I2Cdev::readBits(devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setZGyroOffset(int8_t offset) {
    +    I2Cdev::writeBits(devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, offset);
    +}
    +
    +// X_FINE_GAIN register
    +
    +int8_t MPU6050::getXFineGain() {
    +    I2Cdev::readByte(devAddr, MPU6050_RA_X_FINE_GAIN, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setXFineGain(int8_t gain) {
    +    I2Cdev::writeByte(devAddr, MPU6050_RA_X_FINE_GAIN, gain);
    +}
    +
    +// Y_FINE_GAIN register
    +
    +int8_t MPU6050::getYFineGain() {
    +    I2Cdev::readByte(devAddr, MPU6050_RA_Y_FINE_GAIN, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setYFineGain(int8_t gain) {
    +    I2Cdev::writeByte(devAddr, MPU6050_RA_Y_FINE_GAIN, gain);
    +}
    +
    +// Z_FINE_GAIN register
    +
    +int8_t MPU6050::getZFineGain() {
    +    I2Cdev::readByte(devAddr, MPU6050_RA_Z_FINE_GAIN, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setZFineGain(int8_t gain) {
    +    I2Cdev::writeByte(devAddr, MPU6050_RA_Z_FINE_GAIN, gain);
    +}
    +
    +// XA_OFFS_* registers
    +
    +int16_t MPU6050::getXAccelOffset() {
    +    I2Cdev::readBytes(devAddr, MPU6050_RA_XA_OFFS_H, 2, buffer);
    +    return (((int16_t)buffer[0]) << 8) | buffer[1];
    +}
    +void MPU6050::setXAccelOffset(int16_t offset) {
    +    I2Cdev::writeWord(devAddr, MPU6050_RA_XA_OFFS_H, offset);
    +}
    +
    +// YA_OFFS_* register
    +
    +int16_t MPU6050::getYAccelOffset() {
    +    I2Cdev::readBytes(devAddr, MPU6050_RA_YA_OFFS_H, 2, buffer);
    +    return (((int16_t)buffer[0]) << 8) | buffer[1];
    +}
    +void MPU6050::setYAccelOffset(int16_t offset) {
    +    I2Cdev::writeWord(devAddr, MPU6050_RA_YA_OFFS_H, offset);
    +}
    +
    +// ZA_OFFS_* register
    +
    +int16_t MPU6050::getZAccelOffset() {
    +    I2Cdev::readBytes(devAddr, MPU6050_RA_ZA_OFFS_H, 2, buffer);
    +    return (((int16_t)buffer[0]) << 8) | buffer[1];
    +}
    +void MPU6050::setZAccelOffset(int16_t offset) {
    +    I2Cdev::writeWord(devAddr, MPU6050_RA_ZA_OFFS_H, offset);
    +}
    +
    +// XG_OFFS_USR* registers
    +
    +int16_t MPU6050::getXGyroOffsetUser() {
    +    I2Cdev::readBytes(devAddr, MPU6050_RA_XG_OFFS_USRH, 2, buffer);
    +    return (((int16_t)buffer[0]) << 8) | buffer[1];
    +}
    +void MPU6050::setXGyroOffsetUser(int16_t offset) {
    +    I2Cdev::writeWord(devAddr, MPU6050_RA_XG_OFFS_USRH, offset);
    +}
    +
    +// YG_OFFS_USR* register
    +
    +int16_t MPU6050::getYGyroOffsetUser() {
    +    I2Cdev::readBytes(devAddr, MPU6050_RA_YG_OFFS_USRH, 2, buffer);
    +    return (((int16_t)buffer[0]) << 8) | buffer[1];
    +}
    +void MPU6050::setYGyroOffsetUser(int16_t offset) {
    +    I2Cdev::writeWord(devAddr, MPU6050_RA_YG_OFFS_USRH, offset);
    +}
    +
    +// ZG_OFFS_USR* register
    +
    +int16_t MPU6050::getZGyroOffsetUser() {
    +    I2Cdev::readBytes(devAddr, MPU6050_RA_ZG_OFFS_USRH, 2, buffer);
    +    return (((int16_t)buffer[0]) << 8) | buffer[1];
    +}
    +void MPU6050::setZGyroOffsetUser(int16_t offset) {
    +    I2Cdev::writeWord(devAddr, MPU6050_RA_ZG_OFFS_USRH, offset);
    +}
    +
    +// INT_ENABLE register (DMP functions)
    +
    +bool MPU6050::getIntPLLReadyEnabled() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setIntPLLReadyEnabled(bool enabled) {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, enabled);
    +}
    +bool MPU6050::getIntDMPEnabled() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setIntDMPEnabled(bool enabled) {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, enabled);
    +}
    +
    +// DMP_INT_STATUS
    +
    +bool MPU6050::getDMPInt5Status() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_5_BIT, buffer);
    +    return buffer[0];
    +}
    +bool MPU6050::getDMPInt4Status() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_4_BIT, buffer);
    +    return buffer[0];
    +}
    +bool MPU6050::getDMPInt3Status() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_3_BIT, buffer);
    +    return buffer[0];
    +}
    +bool MPU6050::getDMPInt2Status() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_2_BIT, buffer);
    +    return buffer[0];
    +}
    +bool MPU6050::getDMPInt1Status() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_1_BIT, buffer);
    +    return buffer[0];
    +}
    +bool MPU6050::getDMPInt0Status() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_0_BIT, buffer);
    +    return buffer[0];
    +}
    +
    +// INT_STATUS register (DMP functions)
    +
    +bool MPU6050::getIntPLLReadyStatus() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer);
    +    return buffer[0];
    +}
    +bool MPU6050::getIntDMPStatus() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DMP_INT_BIT, buffer);
    +    return buffer[0];
    +}
    +
    +// USER_CTRL register (DMP functions)
    +
    +bool MPU6050::getDMPEnabled() {
    +    I2Cdev::readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setDMPEnabled(bool enabled) {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, enabled);
    +}
    +void MPU6050::resetDMP() {
    +    I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_RESET_BIT, true);
    +}
    +
    +// BANK_SEL register
    +
    +void MPU6050::setMemoryBank(uint8_t bank, bool prefetchEnabled, bool userBank) {
    +    bank &= 0x1F;
    +    if (userBank) bank |= 0x20;
    +    if (prefetchEnabled) bank |= 0x40;
    +    I2Cdev::writeByte(devAddr, MPU6050_RA_BANK_SEL, bank);
    +}
    +
    +// MEM_START_ADDR register
    +
    +void MPU6050::setMemoryStartAddress(uint8_t address) {
    +    I2Cdev::writeByte(devAddr, MPU6050_RA_MEM_START_ADDR, address);
    +}
    +
    +// MEM_R_W register
    +
    +uint8_t MPU6050::readMemoryByte() {
    +    I2Cdev::readByte(devAddr, MPU6050_RA_MEM_R_W, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::writeMemoryByte(uint8_t data) {
    +    I2Cdev::writeByte(devAddr, MPU6050_RA_MEM_R_W, data);
    +}
    +void MPU6050::readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address) {
    +    setMemoryBank(bank);
    +    setMemoryStartAddress(address);
    +    uint8_t chunkSize;
    +    for (uint16_t i = 0; i < dataSize;) {
    +        // determine correct chunk size according to bank position and data size
    +        chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE;
    +
    +        // make sure we don't go past the data size
    +        if (i + chunkSize > dataSize) chunkSize = dataSize - i;
    +
    +        // make sure this chunk doesn't go past the bank boundary (256 bytes)
    +        if (chunkSize > 256 - address) chunkSize = 256 - address;
    +
    +        // read the chunk of data as specified
    +        I2Cdev::readBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, data + i);
    +        
    +        // increase byte index by [chunkSize]
    +        i += chunkSize;
    +
    +        // uint8_t automatically wraps to 0 at 256
    +        address + chunkSize;
    +
    +        // if we aren't done, update bank (if necessary) and address
    +        if (i < dataSize) {
    +            if (address == 0) bank++;
    +            setMemoryBank(bank);
    +            setMemoryStartAddress(address);
    +        }
    +    }
    +}
    +bool MPU6050::writeMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify, bool useProgMem) {
    +    setMemoryBank(bank);
    +    setMemoryStartAddress(address);
    +    uint8_t chunkSize;
    +    uint8_t *verifyBuffer;
    +    uint8_t *progBuffer;
    +    uint16_t i;
    +    uint8_t j;
    +    if (verify) verifyBuffer = (uint8_t *)malloc(MPU6050_DMP_MEMORY_CHUNK_SIZE);
    +    if (useProgMem) progBuffer = (uint8_t *)malloc(MPU6050_DMP_MEMORY_CHUNK_SIZE);
    +    for (i = 0; i < dataSize;) {
    +        // determine correct chunk size according to bank position and data size
    +        chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE;
    +
    +        // make sure we don't go past the data size
    +        if (i + chunkSize > dataSize) chunkSize = dataSize - i;
    +
    +        // make sure this chunk doesn't go past the bank boundary (256 bytes)
    +        if (chunkSize > 256 - address) chunkSize = 256 - address;
    +        
    +        if (useProgMem) {
    +            // write the chunk of data as specified
    +            for (j = 0; j < chunkSize; j++) progBuffer[j] = pgm_read_byte(data + i + j);
    +            I2Cdev::writeBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, progBuffer);
    +        } else {
    +            // write the chunk of data as specified
    +            I2Cdev::writeBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, data + i);
    +        }
    +
    +        // verify data if needed
    +        if (verify && verifyBuffer) {
    +            setMemoryBank(bank);
    +            setMemoryStartAddress(address);
    +            I2Cdev::readBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, verifyBuffer);
    +            if (memcmp(data + i, verifyBuffer, chunkSize) != 0) {
    +                Serial.print("Block write verification error, bank ");
    +                Serial.print(bank, DEC);
    +                Serial.print(", address ");
    +                Serial.print(address, DEC);
    +                Serial.print("!\nExpected:");
    +                for (j = 0; j < chunkSize; j++) {
    +                    Serial.print(" 0x");
    +                    if (useProgMem) {
    +                        if (progBuffer[j] < 16) Serial.print("0");
    +                        Serial.print(progBuffer[j], HEX);
    +                    } else {
    +                        if (data[i + j] < 16) Serial.print("0");
    +                        Serial.print(data[i + j], HEX);
    +                    }
    +                }
    +                Serial.print("\nReceived:");
    +                for (uint8_t j = 0; j < chunkSize; j++) {
    +                    Serial.print(" 0x");
    +                    if (verifyBuffer[i + j] < 16) Serial.print("0");
    +                    Serial.print(verifyBuffer[i + j], HEX);
    +                }
    +                Serial.print("\n");
    +                free(verifyBuffer);
    +                if (useProgMem) free(progBuffer);
    +                return false; // uh oh.
    +            }
    +        }
    +
    +        // increase byte index by [chunkSize]
    +        i += chunkSize;
    +
    +        // uint8_t automatically wraps to 0 at 256
    +        address + chunkSize;
    +
    +        // if we aren't done, update bank (if necessary) and address
    +        if (i < dataSize) {
    +            if (address == 0) bank++;
    +            setMemoryBank(bank);
    +            setMemoryStartAddress(address);
    +        }
    +    }
    +    if (verify) free(verifyBuffer);
    +    if (useProgMem) free(progBuffer);
    +    return true;
    +}
    +bool MPU6050::writeProgMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify) {
    +    writeMemoryBlock(data, dataSize, bank, address, verify, true);
    +}
    +
    +// DMP_CFG_1 register
    +
    +uint8_t MPU6050::getDMPConfig1() {
    +    I2Cdev::readByte(devAddr, MPU6050_RA_DMP_CFG_1, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setDMPConfig1(uint8_t config) {
    +    I2Cdev::writeByte(devAddr, MPU6050_RA_DMP_CFG_1, config);
    +}
    +
    +// DMP_CFG_2 register
    +
    +uint8_t MPU6050::getDMPConfig2() {
    +    I2Cdev::readByte(devAddr, MPU6050_RA_DMP_CFG_2, buffer);
    +    return buffer[0];
    +}
    +void MPU6050::setDMPConfig2(uint8_t config) {
    +    I2Cdev::writeByte(devAddr, MPU6050_RA_DMP_CFG_2, config);
    +}
    diff --git a/sheets/gyro/Test program/Arduino/MPU6050/MPU6050.h b/sheets/gyro/Test program/Arduino/MPU6050/MPU6050.h
    new file mode 100644
    index 0000000..b52e999
    --- /dev/null
    +++ b/sheets/gyro/Test program/Arduino/MPU6050/MPU6050.h	
    @@ -0,0 +1,966 @@
    +// I2Cdev library collection - MPU6050 I2C device class
    +// Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00)
    +// 10/3/2011 by Jeff Rowberg 
    +// Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
    +//
    +// Changelog:
    +//     ... - ongoing debug release
    +
    +// NOTE: THIS IS ONLY A PARIAL RELEASE. THIS DEVICE CLASS IS CURRENTLY UNDERGOING ACTIVE
    +// DEVELOPMENT AND IS STILL MISSING SOME IMPORTANT FEATURES. PLEASE KEEP THIS IN MIND IF
    +// YOU DECIDE TO USE THIS PARTICULAR CODE FOR ANYTHING.
    +
    +/* ============================================
    +I2Cdev device library code is placed under the MIT license
    +Copyright (c) 2011 Jeff Rowberg
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy
    +of this software and associated documentation files (the "Software"), to deal
    +in the Software without restriction, including without limitation the rights
    +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    +copies of the Software, and to permit persons to whom the Software is
    +furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in
    +all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    +THE SOFTWARE.
    +===============================================
    +*/
    +
    +#ifndef _MPU6050_H_
    +#define _MPU6050_H_
    +
    +#include "I2Cdev.h"
    +#include 
    +
    +#define MPU6050_ADDRESS_AD0_LOW     0x68 // address pin low (GND), default for InvenSense evaluation board
    +#define MPU6050_ADDRESS_AD0_HIGH    0x69 // address pin high (VCC)
    +#define MPU6050_DEFAULT_ADDRESS     MPU6050_ADDRESS_AD0_LOW
    +
    +#define MPU6050_RA_XG_OFFS_TC       0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
    +#define MPU6050_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
    +#define MPU6050_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
    +#define MPU6050_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
    +#define MPU6050_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
    +#define MPU6050_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
    +#define MPU6050_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS
    +#define MPU6050_RA_XA_OFFS_L_TC     0x07
    +#define MPU6050_RA_YA_OFFS_H        0x08 //[15:0] YA_OFFS
    +#define MPU6050_RA_YA_OFFS_L_TC     0x09
    +#define MPU6050_RA_ZA_OFFS_H        0x0A //[15:0] ZA_OFFS
    +#define MPU6050_RA_ZA_OFFS_L_TC     0x0B
    +#define MPU6050_RA_XG_OFFS_USRH     0x13 //[15:0] XG_OFFS_USR
    +#define MPU6050_RA_XG_OFFS_USRL     0x14
    +#define MPU6050_RA_YG_OFFS_USRH     0x15 //[15:0] YG_OFFS_USR
    +#define MPU6050_RA_YG_OFFS_USRL     0x16
    +#define MPU6050_RA_ZG_OFFS_USRH     0x17 //[15:0] ZG_OFFS_USR
    +#define MPU6050_RA_ZG_OFFS_USRL     0x18
    +#define MPU6050_RA_SMPLRT_DIV       0x19
    +#define MPU6050_RA_CONFIG           0x1A
    +#define MPU6050_RA_GYRO_CONFIG      0x1B
    +#define MPU6050_RA_ACCEL_CONFIG     0x1C
    +#define MPU6050_RA_FF_THR           0x1D
    +#define MPU6050_RA_FF_DUR           0x1E
    +#define MPU6050_RA_MOT_THR          0x1F
    +#define MPU6050_RA_MOT_DUR          0x20
    +#define MPU6050_RA_ZRMOT_THR        0x21
    +#define MPU6050_RA_ZRMOT_DUR        0x22
    +#define MPU6050_RA_FIFO_EN          0x23
    +#define MPU6050_RA_I2C_MST_CTRL     0x24
    +#define MPU6050_RA_I2C_SLV0_ADDR    0x25
    +#define MPU6050_RA_I2C_SLV0_REG     0x26
    +#define MPU6050_RA_I2C_SLV0_CTRL    0x27
    +#define MPU6050_RA_I2C_SLV1_ADDR    0x28
    +#define MPU6050_RA_I2C_SLV1_REG     0x29
    +#define MPU6050_RA_I2C_SLV1_CTRL    0x2A
    +#define MPU6050_RA_I2C_SLV2_ADDR    0x2B
    +#define MPU6050_RA_I2C_SLV2_REG     0x2C
    +#define MPU6050_RA_I2C_SLV2_CTRL    0x2D
    +#define MPU6050_RA_I2C_SLV3_ADDR    0x2E
    +#define MPU6050_RA_I2C_SLV3_REG     0x2F
    +#define MPU6050_RA_I2C_SLV3_CTRL    0x30
    +#define MPU6050_RA_I2C_SLV4_ADDR    0x31
    +#define MPU6050_RA_I2C_SLV4_REG     0x32
    +#define MPU6050_RA_I2C_SLV4_DO      0x33
    +#define MPU6050_RA_I2C_SLV4_CTRL    0x34
    +#define MPU6050_RA_I2C_SLV4_DI      0x35
    +#define MPU6050_RA_I2C_MST_STATUS   0x36
    +#define MPU6050_RA_INT_PIN_CFG      0x37
    +#define MPU6050_RA_INT_ENABLE       0x38
    +#define MPU6050_RA_DMP_INT_STATUS   0x39
    +#define MPU6050_RA_INT_STATUS       0x3A
    +#define MPU6050_RA_ACCEL_XOUT_H     0x3B
    +#define MPU6050_RA_ACCEL_XOUT_L     0x3C
    +#define MPU6050_RA_ACCEL_YOUT_H     0x3D
    +#define MPU6050_RA_ACCEL_YOUT_L     0x3E
    +#define MPU6050_RA_ACCEL_ZOUT_H     0x3F
    +#define MPU6050_RA_ACCEL_ZOUT_L     0x40
    +#define MPU6050_RA_TEMP_OUT_H       0x41
    +#define MPU6050_RA_TEMP_OUT_L       0x42
    +#define MPU6050_RA_GYRO_XOUT_H      0x43
    +#define MPU6050_RA_GYRO_XOUT_L      0x44
    +#define MPU6050_RA_GYRO_YOUT_H      0x45
    +#define MPU6050_RA_GYRO_YOUT_L      0x46
    +#define MPU6050_RA_GYRO_ZOUT_H      0x47
    +#define MPU6050_RA_GYRO_ZOUT_L      0x48
    +#define MPU6050_RA_EXT_SENS_DATA_00 0x49
    +#define MPU6050_RA_EXT_SENS_DATA_01 0x4A
    +#define MPU6050_RA_EXT_SENS_DATA_02 0x4B
    +#define MPU6050_RA_EXT_SENS_DATA_03 0x4C
    +#define MPU6050_RA_EXT_SENS_DATA_04 0x4D
    +#define MPU6050_RA_EXT_SENS_DATA_05 0x4E
    +#define MPU6050_RA_EXT_SENS_DATA_06 0x4F
    +#define MPU6050_RA_EXT_SENS_DATA_07 0x50
    +#define MPU6050_RA_EXT_SENS_DATA_08 0x51
    +#define MPU6050_RA_EXT_SENS_DATA_09 0x52
    +#define MPU6050_RA_EXT_SENS_DATA_10 0x53
    +#define MPU6050_RA_EXT_SENS_DATA_11 0x54
    +#define MPU6050_RA_EXT_SENS_DATA_12 0x55
    +#define MPU6050_RA_EXT_SENS_DATA_13 0x56
    +#define MPU6050_RA_EXT_SENS_DATA_14 0x57
    +#define MPU6050_RA_EXT_SENS_DATA_15 0x58
    +#define MPU6050_RA_EXT_SENS_DATA_16 0x59
    +#define MPU6050_RA_EXT_SENS_DATA_17 0x5A
    +#define MPU6050_RA_EXT_SENS_DATA_18 0x5B
    +#define MPU6050_RA_EXT_SENS_DATA_19 0x5C
    +#define MPU6050_RA_EXT_SENS_DATA_20 0x5D
    +#define MPU6050_RA_EXT_SENS_DATA_21 0x5E
    +#define MPU6050_RA_EXT_SENS_DATA_22 0x5F
    +#define MPU6050_RA_EXT_SENS_DATA_23 0x60
    +#define MPU6050_RA_MOT_DETECT_STATUS    0x61
    +#define MPU6050_RA_I2C_SLV0_DO      0x63
    +#define MPU6050_RA_I2C_SLV1_DO      0x64
    +#define MPU6050_RA_I2C_SLV2_DO      0x65
    +#define MPU6050_RA_I2C_SLV3_DO      0x66
    +#define MPU6050_RA_I2C_MST_DELAY_CTRL   0x67
    +#define MPU6050_RA_SIGNAL_PATH_RESET    0x68
    +#define MPU6050_RA_MOT_DETECT_CTRL      0x69
    +#define MPU6050_RA_USER_CTRL        0x6A
    +#define MPU6050_RA_PWR_MGMT_1       0x6B
    +#define MPU6050_RA_PWR_MGMT_2       0x6C
    +#define MPU6050_RA_BANK_SEL         0x6D
    +#define MPU6050_RA_MEM_START_ADDR   0x6E
    +#define MPU6050_RA_MEM_R_W          0x6F
    +#define MPU6050_RA_DMP_CFG_1        0x70
    +#define MPU6050_RA_DMP_CFG_2        0x71
    +#define MPU6050_RA_FIFO_COUNTH      0x72
    +#define MPU6050_RA_FIFO_COUNTL      0x73
    +#define MPU6050_RA_FIFO_R_W         0x74
    +#define MPU6050_RA_WHO_AM_I         0x75
    +
    +#define MPU6050_TC_PWR_MODE_BIT     7
    +#define MPU6050_TC_OFFSET_BIT       6
    +#define MPU6050_TC_OFFSET_LENGTH    6
    +#define MPU6050_TC_OTP_BNK_VLD_BIT  0
    +
    +#define MPU6050_VDDIO_LEVEL_VLOGIC  0
    +#define MPU6050_VDDIO_LEVEL_VDD     1
    +
    +#define MPU6050_CFG_EXT_SYNC_SET_BIT    5
    +#define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3
    +#define MPU6050_CFG_DLPF_CFG_BIT    2
    +#define MPU6050_CFG_DLPF_CFG_LENGTH 3
    +
    +#define MPU6050_EXT_SYNC_DISABLED       0x0
    +#define MPU6050_EXT_SYNC_TEMP_OUT_L     0x1
    +#define MPU6050_EXT_SYNC_GYRO_XOUT_L    0x2
    +#define MPU6050_EXT_SYNC_GYRO_YOUT_L    0x3
    +#define MPU6050_EXT_SYNC_GYRO_ZOUT_L    0x4
    +#define MPU6050_EXT_SYNC_ACCEL_XOUT_L   0x5
    +#define MPU6050_EXT_SYNC_ACCEL_YOUT_L   0x6
    +#define MPU6050_EXT_SYNC_ACCEL_ZOUT_L   0x7
    +
    +#define MPU6050_DLPF_BW_256         0x00
    +#define MPU6050_DLPF_BW_188         0x01
    +#define MPU6050_DLPF_BW_98          0x02
    +#define MPU6050_DLPF_BW_42          0x03
    +#define MPU6050_DLPF_BW_20          0x04
    +#define MPU6050_DLPF_BW_10          0x05
    +#define MPU6050_DLPF_BW_5           0x06
    +
    +#define MPU6050_GCONFIG_FS_SEL_BIT      4
    +#define MPU6050_GCONFIG_FS_SEL_LENGTH   2
    +
    +#define MPU6050_GYRO_FS_250         0x00
    +#define MPU6050_GYRO_FS_500         0x01
    +#define MPU6050_GYRO_FS_1000        0x02
    +#define MPU6050_GYRO_FS_2000        0x03
    +
    +#define MPU6050_ACONFIG_XA_ST_BIT           7
    +#define MPU6050_ACONFIG_YA_ST_BIT           6
    +#define MPU6050_ACONFIG_ZA_ST_BIT           5
    +#define MPU6050_ACONFIG_AFS_SEL_BIT         4
    +#define MPU6050_ACONFIG_AFS_SEL_LENGTH      2
    +#define MPU6050_ACONFIG_ACCEL_HPF_BIT       2
    +#define MPU6050_ACONFIG_ACCEL_HPF_LENGTH    3
    +
    +#define MPU6050_ACCEL_FS_2          0x00
    +#define MPU6050_ACCEL_FS_4          0x01
    +#define MPU6050_ACCEL_FS_8          0x02
    +#define MPU6050_ACCEL_FS_16         0x03
    +
    +#define MPU6050_DHPF_RESET          0x00
    +#define MPU6050_DHPF_5              0x01
    +#define MPU6050_DHPF_2P5            0x02
    +#define MPU6050_DHPF_1P25           0x03
    +#define MPU6050_DHPF_0P63           0x04
    +#define MPU6050_DHPF_HOLD           0x07
    +
    +#define MPU6050_TEMP_FIFO_EN_BIT    7
    +#define MPU6050_XG_FIFO_EN_BIT      6
    +#define MPU6050_YG_FIFO_EN_BIT      5
    +#define MPU6050_ZG_FIFO_EN_BIT      4
    +#define MPU6050_ACCEL_FIFO_EN_BIT   3
    +#define MPU6050_SLV2_FIFO_EN_BIT    2
    +#define MPU6050_SLV1_FIFO_EN_BIT    1
    +#define MPU6050_SLV0_FIFO_EN_BIT    0
    +
    +#define MPU6050_MULT_MST_EN_BIT     7
    +#define MPU6050_WAIT_FOR_ES_BIT     6
    +#define MPU6050_SLV_3_FIFO_EN_BIT   5
    +#define MPU6050_I2C_MST_P_NSR_BIT   4
    +#define MPU6050_I2C_MST_CLK_BIT     3
    +#define MPU6050_I2C_MST_CLK_LENGTH  4
    +
    +#define MPU6050_CLOCK_DIV_348       0x0
    +#define MPU6050_CLOCK_DIV_333       0x1
    +#define MPU6050_CLOCK_DIV_320       0x2
    +#define MPU6050_CLOCK_DIV_308       0x3
    +#define MPU6050_CLOCK_DIV_296       0x4
    +#define MPU6050_CLOCK_DIV_286       0x5
    +#define MPU6050_CLOCK_DIV_276       0x6
    +#define MPU6050_CLOCK_DIV_267       0x7
    +#define MPU6050_CLOCK_DIV_258       0x8
    +#define MPU6050_CLOCK_DIV_500       0x9
    +#define MPU6050_CLOCK_DIV_471       0xA
    +#define MPU6050_CLOCK_DIV_444       0xB
    +#define MPU6050_CLOCK_DIV_421       0xC
    +#define MPU6050_CLOCK_DIV_400       0xD
    +#define MPU6050_CLOCK_DIV_381       0xE
    +#define MPU6050_CLOCK_DIV_364       0xF
    +
    +#define MPU6050_I2C_SLV_RW_BIT      7
    +#define MPU6050_I2C_SLV_ADDR_BIT    6
    +#define MPU6050_I2C_SLV_ADDR_LENGTH 7
    +#define MPU6050_I2C_SLV_EN_BIT      7
    +#define MPU6050_I2C_SLV_BYTE_SW_BIT 6
    +#define MPU6050_I2C_SLV_REG_DIS_BIT 5
    +#define MPU6050_I2C_SLV_GRP_BIT     4
    +#define MPU6050_I2C_SLV_LEN_BIT     3
    +#define MPU6050_I2C_SLV_LEN_LENGTH  4
    +
    +#define MPU6050_I2C_SLV4_RW_BIT         7
    +#define MPU6050_I2C_SLV4_ADDR_BIT       6
    +#define MPU6050_I2C_SLV4_ADDR_LENGTH    7
    +#define MPU6050_I2C_SLV4_EN_BIT         7
    +#define MPU6050_I2C_SLV4_INT_EN_BIT     6
    +#define MPU6050_I2C_SLV4_REG_DIS_BIT    5
    +#define MPU6050_I2C_SLV4_MST_DLY_BIT    4
    +#define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5
    +
    +#define MPU6050_MST_PASS_THROUGH_BIT    7
    +#define MPU6050_MST_I2C_SLV4_DONE_BIT   6
    +#define MPU6050_MST_I2C_LOST_ARB_BIT    5
    +#define MPU6050_MST_I2C_SLV4_NACK_BIT   4
    +#define MPU6050_MST_I2C_SLV3_NACK_BIT   3
    +#define MPU6050_MST_I2C_SLV2_NACK_BIT   2
    +#define MPU6050_MST_I2C_SLV1_NACK_BIT   1
    +#define MPU6050_MST_I2C_SLV0_NACK_BIT   0
    +
    +#define MPU6050_INTCFG_INT_LEVEL_BIT        7
    +#define MPU6050_INTCFG_INT_OPEN_BIT         6
    +#define MPU6050_INTCFG_LATCH_INT_EN_BIT     5
    +#define MPU6050_INTCFG_INT_RD_CLEAR_BIT     4
    +#define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT  3
    +#define MPU6050_INTCFG_FSYNC_INT_EN_BIT     2
    +#define MPU6050_INTCFG_I2C_BYPASS_EN_BIT    1
    +#define MPU6050_INTCFG_CLKOUT_EN_BIT        0
    +
    +#define MPU6050_INTMODE_ACTIVEHIGH  0x00
    +#define MPU6050_INTMODE_ACTIVELOW   0x01
    +
    +#define MPU6050_INTDRV_PUSHPULL     0x00
    +#define MPU6050_INTDRV_OPENDRAIN    0x01
    +
    +#define MPU6050_INTLATCH_50USPULSE  0x00
    +#define MPU6050_INTLATCH_WAITCLEAR  0x01
    +
    +#define MPU6050_INTCLEAR_STATUSREAD 0x00
    +#define MPU6050_INTCLEAR_ANYREAD    0x01
    +
    +#define MPU6050_INTERRUPT_FF_BIT            7
    +#define MPU6050_INTERRUPT_MOT_BIT           6
    +#define MPU6050_INTERRUPT_ZMOT_BIT          5
    +#define MPU6050_INTERRUPT_FIFO_OFLOW_BIT    4
    +#define MPU6050_INTERRUPT_I2C_MST_INT_BIT   3
    +#define MPU6050_INTERRUPT_PLL_RDY_INT_BIT   2
    +#define MPU6050_INTERRUPT_DMP_INT_BIT       1
    +#define MPU6050_INTERRUPT_DATA_RDY_BIT      0
    +
    +// TODO: figure out what these actually do
    +// UMPL source code is not very obivous
    +#define MPU6050_DMPINT_5_BIT            5
    +#define MPU6050_DMPINT_4_BIT            4
    +#define MPU6050_DMPINT_3_BIT            3
    +#define MPU6050_DMPINT_2_BIT            2
    +#define MPU6050_DMPINT_1_BIT            1
    +#define MPU6050_DMPINT_0_BIT            0
    +
    +#define MPU6050_MOTION_MOT_XNEG_BIT     7
    +#define MPU6050_MOTION_MOT_XPOS_BIT     6
    +#define MPU6050_MOTION_MOT_YNEG_BIT     5
    +#define MPU6050_MOTION_MOT_YPOS_BIT     4
    +#define MPU6050_MOTION_MOT_ZNEG_BIT     3
    +#define MPU6050_MOTION_MOT_ZPOS_BIT     2
    +#define MPU6050_MOTION_MOT_ZRMOT_BIT    0
    +
    +#define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT   7
    +#define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT   4
    +#define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT   3
    +#define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT   2
    +#define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT   1
    +#define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT   0
    +
    +#define MPU6050_PATHRESET_GYRO_RESET_BIT    2
    +#define MPU6050_PATHRESET_ACCEL_RESET_BIT   1
    +#define MPU6050_PATHRESET_TEMP_RESET_BIT    0
    +
    +#define MPU6050_DETECT_ACCEL_ON_DELAY_BIT       5
    +#define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH    2
    +#define MPU6050_DETECT_FF_COUNT_BIT             3
    +#define MPU6050_DETECT_FF_COUNT_LENGTH          2
    +#define MPU6050_DETECT_MOT_COUNT_BIT            1
    +#define MPU6050_DETECT_MOT_COUNT_LENGTH         2
    +
    +#define MPU6050_DETECT_DECREMENT_RESET  0x0
    +#define MPU6050_DETECT_DECREMENT_1      0x1
    +#define MPU6050_DETECT_DECREMENT_2      0x2
    +#define MPU6050_DETECT_DECREMENT_4      0x3
    +
    +#define MPU6050_USERCTRL_DMP_EN_BIT             7
    +#define MPU6050_USERCTRL_FIFO_EN_BIT            6
    +#define MPU6050_USERCTRL_I2C_MST_EN_BIT         5
    +#define MPU6050_USERCTRL_I2C_IF_DIS_BIT         4
    +#define MPU6050_USERCTRL_DMP_RESET_BIT          3
    +#define MPU6050_USERCTRL_FIFO_RESET_BIT         2
    +#define MPU6050_USERCTRL_I2C_MST_RESET_BIT      1
    +#define MPU6050_USERCTRL_SIG_COND_RESET_BIT     0
    +
    +#define MPU6050_PWR1_DEVICE_RESET_BIT   7
    +#define MPU6050_PWR1_SLEEP_BIT          6
    +#define MPU6050_PWR1_CYCLE_BIT          5
    +#define MPU6050_PWR1_TEMP_DIS_BIT       3
    +#define MPU6050_PWR1_CLKSEL_BIT         2
    +#define MPU6050_PWR1_CLKSEL_LENGTH      3
    +
    +#define MPU6050_CLOCK_INTERNAL          0x00
    +#define MPU6050_CLOCK_PLL_XGYRO         0x01
    +#define MPU6050_CLOCK_PLL_YGYRO         0x02
    +#define MPU6050_CLOCK_PLL_ZGYRO         0x03
    +#define MPU6050_CLOCK_PLL_EXT32K        0x04
    +#define MPU6050_CLOCK_PLL_EXT19M        0x05
    +#define MPU6050_CLOCK_KEEP_RESET        0x07
    +
    +#define MPU6050_PWR2_LP_WAKE_CTRL_BIT       7
    +#define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH    2
    +#define MPU6050_PWR2_STBY_XA_BIT            5
    +#define MPU6050_PWR2_STBY_YA_BIT            4
    +#define MPU6050_PWR2_STBY_ZA_BIT            3
    +#define MPU6050_PWR2_STBY_XG_BIT            2
    +#define MPU6050_PWR2_STBY_YG_BIT            1
    +#define MPU6050_PWR2_STBY_ZG_BIT            0
    +
    +#define MPU6050_WAKE_FREQ_1P25      0x0
    +#define MPU6050_WAKE_FREQ_2P5       0x1
    +#define MPU6050_WAKE_FREQ_5         0x2
    +#define MPU6050_WAKE_FREQ_10        0x3
    +
    +#define MPU6050_BANKSEL_PRFTCH_EN_BIT       6
    +#define MPU6050_BANKSEL_CFG_USER_BANK_BIT   5
    +#define MPU6050_BANKSEL_MEM_SEL_BIT         4
    +#define MPU6050_BANKSEL_MEM_SEL_LENGTH      5
    +
    +#define MPU6050_WHO_AM_I_BIT        6
    +#define MPU6050_WHO_AM_I_LENGTH     6
    +
    +#define MPU6050_DMP_MEMORY_BANKS        8
    +#define MPU6050_DMP_MEMORY_BANK_SIZE    256
    +#define MPU6050_DMP_MEMORY_CHUNK_SIZE   16
    +
    +// note: DMP code memory blocks defined at end of header file
    +
    +class MPU6050 {
    +    public:
    +        MPU6050();
    +        MPU6050(uint8_t address);
    +
    +        void initialize();
    +        bool testConnection();
    +
    +        // AUX_VDDIO register
    +        uint8_t getAuxVDDIOLevel();
    +        void setAuxVDDIOLevel(uint8_t level);
    +
    +        // SMPLRT_DIV register
    +        uint8_t getRate();
    +        void setRate(uint8_t rate);
    +
    +        // CONFIG register
    +        uint8_t getExternalFrameSync();
    +        void setExternalFrameSync(uint8_t sync);
    +        uint8_t getDLPFMode();
    +        void setDLPFMode(uint8_t bandwidth);
    +
    +        // GYRO_CONFIG register
    +        uint8_t getFullScaleGyroRange();
    +        void setFullScaleGyroRange(uint8_t range);
    +
    +        // ACCEL_CONFIG register
    +        bool getAccelXSelfTest();
    +        void setAccelXSelfTest(bool enabled);
    +        bool getAccelYSelfTest();
    +        void setAccelYSelfTest(bool enabled);
    +        bool getAccelZSelfTest();
    +        void setAccelZSelfTest(bool enabled);
    +        uint8_t getFullScaleAccelRange();
    +        void setFullScaleAccelRange(uint8_t range);
    +        uint8_t getDHPFMode();
    +        void setDHPFMode(uint8_t mode);
    +
    +        // FF_THR register
    +        uint8_t getFreefallDetectionThreshold();
    +        void setFreefallDetectionThreshold(uint8_t threshold);
    +
    +        // FF_DUR register
    +        uint8_t getFreefallDetectionDuration();
    +        void setFreefallDetectionDuration(uint8_t duration);
    +
    +        // MOT_THR register
    +        uint8_t getMotionDetectionThreshold();
    +        void setMotionDetectionThreshold(uint8_t threshold);
    +
    +        // MOT_DUR register
    +        uint8_t getMotionDetectionDuration();
    +        void setMotionDetectionDuration(uint8_t duration);
    +
    +        // ZRMOT_THR register
    +        uint8_t getZeroMotionDetectionThreshold();
    +        void setZeroMotionDetectionThreshold(uint8_t threshold);
    +
    +        // ZRMOT_DUR register
    +        uint8_t getZeroMotionDetectionDuration();
    +        void setZeroMotionDetectionDuration(uint8_t duration);
    +
    +        // FIFO_EN register
    +        bool getTempFIFOEnabled();
    +        void setTempFIFOEnabled(bool enabled);
    +        bool getXGyroFIFOEnabled();
    +        void setXGyroFIFOEnabled(bool enabled);
    +        bool getYGyroFIFOEnabled();
    +        void setYGyroFIFOEnabled(bool enabled);
    +        bool getZGyroFIFOEnabled();
    +        void setZGyroFIFOEnabled(bool enabled);
    +        bool getAccelFIFOEnabled();
    +        void setAccelFIFOEnabled(bool enabled);
    +        bool getSlave2FIFOEnabled();
    +        void setSlave2FIFOEnabled(bool enabled);
    +        bool getSlave1FIFOEnabled();
    +        void setSlave1FIFOEnabled(bool enabled);
    +        bool getSlave0FIFOEnabled();
    +        void setSlave0FIFOEnabled(bool enabled);
    +
    +        // I2C_MST_CTRL register
    +        bool getMultiMasterEnabled();
    +        void setMultiMasterEnabled(bool enabled);
    +        bool getWaitForExternalSensorEnabled();
    +        void setWaitForExternalSensorEnabled(bool enabled);
    +        bool getSlave3FIFOEnabled();
    +        void setSlave3FIFOEnabled(bool enabled);
    +        bool getSlaveReadWriteTransitionEnabled();
    +        void setSlaveReadWriteTransitionEnabled(bool enabled);
    +        uint8_t getMasterClockSpeed();
    +        void setMasterClockSpeed(uint8_t speed);
    +
    +        // I2C_SLV* registers (Slave 0-3)
    +        uint8_t getSlaveAddress(uint8_t num);
    +        void setSlaveAddress(uint8_t num, uint8_t address);
    +        uint8_t getSlaveRegister(uint8_t num);
    +        void setSlaveRegister(uint8_t num, uint8_t reg);
    +        bool getSlaveEnabled(uint8_t num);
    +        void setSlaveEnabled(uint8_t num, bool enabled);
    +        bool getSlaveWordByteSwap(uint8_t num);
    +        void setSlaveWordByteSwap(uint8_t num, bool enabled);
    +        bool getSlaveWriteMode(uint8_t num);
    +        void setSlaveWriteMode(uint8_t num, bool mode);
    +        bool getSlaveWordGroupOffset(uint8_t num);
    +        void setSlaveWordGroupOffset(uint8_t num, bool enabled);
    +        uint8_t getSlaveDataLength(uint8_t num);
    +        void setSlaveDataLength(uint8_t num, uint8_t length);
    +
    +        // I2C_SLV* registers (Slave 4)
    +        uint8_t getSlave4Address();
    +        void setSlave4Address(uint8_t address);
    +        uint8_t getSlave4Register();
    +        void setSlave4Register(uint8_t reg);
    +        void setSlave4OutputByte(uint8_t data);
    +        bool getSlave4Enabled();
    +        void setSlave4Enabled(bool enabled);
    +        bool getSlave4InterruptEnabled();
    +        void setSlave4InterruptEnabled(bool enabled);
    +        bool getSlave4WriteMode();
    +        void setSlave4WriteMode(bool mode);
    +        uint8_t getSlave4MasterDelay();
    +        void setSlave4MasterDelay(uint8_t delay);
    +        uint8_t getSlate4InputByte();
    +
    +        // I2C_MST_STATUS register
    +        bool getPassthroughStatus();
    +        bool getSlave4IsDone();
    +        bool getLostArbitration();
    +        bool getSlave4Nack();
    +        bool getSlave3Nack();
    +        bool getSlave2Nack();
    +        bool getSlave1Nack();
    +        bool getSlave0Nack();
    +
    +        // INT_PIN_CFG register
    +        bool getInterruptMode();
    +        void setInterruptMode(bool mode);
    +        bool getInterruptDrive();
    +        void setInterruptDrive(bool drive);
    +        bool getInterruptLatch();
    +        void setInterruptLatch(bool latch);
    +        bool getInterruptLatchClear();
    +        void setInterruptLatchClear(bool clear);
    +        bool getFSyncInterruptLevel();
    +        void setFSyncInterruptLevel(bool level);
    +        bool getFSyncInterruptEnabled();
    +        void setFSyncInterruptEnabled(bool enabled);
    +        bool getI2CBypassEnabled();
    +        void setI2CBypassEnabled(bool enabled);
    +        bool getClockOutputEnabled();
    +        void setClockOutputEnabled(bool enabled);
    +
    +        // INT_ENABLE register
    +        bool getIntFreefallEnabled();
    +        void setIntFreefallEnabled(bool enabled);
    +        bool getIntMotionEnabled();
    +        void setIntMotionEnabled(bool enabled);
    +        bool getIntZeroMotionEnabled();
    +        void setIntZeroMotionEnabled(bool enabled);
    +        bool getIntFIFOBufferOverflowEnabled();
    +        void setIntFIFOBufferOverflowEnabled(bool enabled);
    +        bool getIntI2CMasterEnabled();
    +        void setIntI2CMasterEnabled(bool enabled);
    +        bool getIntDataReadyEnabled();
    +        void setIntDataReadyEnabled(bool enabled);
    +
    +        // INT_STATUS register
    +        bool getIntFreefallStatus();
    +        bool getIntMotionStatus();
    +        bool getIntZeroMotionStatus();
    +        bool getIntFIFOBufferOverflowStatus();
    +        bool getIntI2CMasterStatus();
    +        bool getIntDataReadyStatus();
    +
    +        // ACCEL_*OUT_* registers
    +        void getMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* mx, int16_t* my, int16_t* mz);
    +        void getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz);
    +        void getAcceleration(int16_t* x, int16_t* y, int16_t* z);
    +        int16_t getAccelerationX();
    +        int16_t getAccelerationY();
    +        int16_t getAccelerationZ();
    +
    +        // TEMP_OUT_* registers
    +        int16_t getTemperature();
    +
    +        // GYRO_*OUT_* registers
    +        void getRotation(int16_t* x, int16_t* y, int16_t* z);
    +        int16_t getRotationX();
    +        int16_t getRotationY();
    +        int16_t getRotationZ();
    +
    +        // EXT_SENS_DATA_* registers
    +        uint8_t getExternalSensorByte(int position);
    +        uint16_t getExternalSensorWord(int position);
    +        uint32_t getExternalSensorDWord(int position);
    +
    +        // MOT_DETECT_STATUS register
    +        bool getXNegMotionDetected();
    +        bool getXPosMotionDetected();
    +        bool getYNegMotionDetected();
    +        bool getYPosMotionDetected();
    +        bool getZNegMotionDetected();
    +        bool getZPosMotionDetected();
    +        bool getZeroMotionDetected();
    +
    +        // I2C_SLV*_DO register
    +        void setSlaveOutputByte(uint8_t num, uint8_t data);
    +
    +        // I2C_MST_DELAY_CTRL register
    +        bool getExternalShadowDelayEnabled();
    +        void setExternalShadowDelayEnabled(bool enabled);
    +        bool getSlaveDelayEnabled(uint8_t num);
    +        void setSlaveDelayEnabled(uint8_t num, bool enabled);
    +
    +        // SIGNAL_PATH_RESET register
    +        void resetGyroscopePath();
    +        void resetAccelerometerPath();
    +        void resetTemperaturePath();
    +
    +        // MOT_DETECT_CTRL register
    +        uint8_t getAccelerometerPowerOnDelay();
    +        void setAccelerometerPowerOnDelay(uint8_t delay);
    +        uint8_t getFreefallDetectionCounterDecrement();
    +        void setFreefallDetectionCounterDecrement(uint8_t decrement);
    +        uint8_t getMotionDetectionCounterDecrement();
    +        void setMotionDetectionCounterDecrement(uint8_t decrement);
    +
    +        // USER_CTRL register
    +        bool getFIFOEnabled();
    +        void setFIFOEnabled(bool enabled);
    +        bool getI2CMasterModeEnabled();
    +        void setI2CMasterModeEnabled(bool enabled);
    +        void switchSPIEnabled(bool enabled);
    +        void resetFIFO();
    +        void resetI2CMaster();
    +        void resetSensors();
    +
    +        // PWR_MGMT_1 register
    +        void reset();
    +        bool getSleepEnabled();
    +        void setSleepEnabled(bool enabled);
    +        bool getWakeCycleEnabled();
    +        void setWakeCycleEnabled(bool enabled);
    +        bool getTempSensorEnabled();
    +        void setTempSensorEnabled(bool enabled);
    +        uint8_t getClockSource();
    +        void setClockSource(uint8_t source);
    +
    +        // PWR_MGMT_2 register
    +        uint8_t getWakeFrequency();
    +        void setWakeFrequency(uint8_t frequency);
    +        bool getStandbyXAccelEnabled();
    +        void setStandbyXAccelEnabled(bool enabled);
    +        bool getStandbyYAccelEnabled();
    +        void setStandbyYAccelEnabled(bool enabled);
    +        bool getStandbyZAccelEnabled();
    +        void setStandbyZAccelEnabled(bool enabled);
    +        bool getStandbyXGyroEnabled();
    +        void setStandbyXGyroEnabled(bool enabled);
    +        bool getStandbyYGyroEnabled();
    +        void setStandbyYGyroEnabled(bool enabled);
    +        bool getStandbyZGyroEnabled();
    +        void setStandbyZGyroEnabled(bool enabled);
    +
    +        // FIFO_COUNT_* registers
    +        uint16_t getFIFOCount();
    +
    +        // FIFO_R_W register
    +        uint8_t getFIFOByte();
    +        void setFIFOByte(uint8_t data);
    +
    +        // WHO_AM_I register
    +        uint8_t getDeviceID();
    +        void setDeviceID(uint8_t id);
    +        
    +        // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
    +        
    +        // XG_OFFS_TC register
    +        int8_t getXGyroOffset();
    +        void setXGyroOffset(int8_t offset);
    +
    +        // YG_OFFS_TC register
    +        int8_t getYGyroOffset();
    +        void setYGyroOffset(int8_t offset);
    +
    +        // ZG_OFFS_TC register
    +        int8_t getZGyroOffset();
    +        void setZGyroOffset(int8_t offset);
    +
    +        // X_FINE_GAIN register
    +        int8_t getXFineGain();
    +        void setXFineGain(int8_t gain);
    +
    +        // Y_FINE_GAIN register
    +        int8_t getYFineGain();
    +        void setYFineGain(int8_t gain);
    +
    +        // Z_FINE_GAIN register
    +        int8_t getZFineGain();
    +        void setZFineGain(int8_t gain);
    +
    +        // XA_OFFS_* registers
    +        int16_t getXAccelOffset();
    +        void setXAccelOffset(int16_t offset);
    +
    +        // YA_OFFS_* register
    +        int16_t getYAccelOffset();
    +        void setYAccelOffset(int16_t offset);
    +
    +        // ZA_OFFS_* register
    +        int16_t getZAccelOffset();
    +        void setZAccelOffset(int16_t offset);
    +
    +        // XG_OFFS_USR* registers
    +        int16_t getXGyroOffsetUser();
    +        void setXGyroOffsetUser(int16_t offset);
    +
    +        // YG_OFFS_USR* register
    +        int16_t getYGyroOffsetUser();
    +        void setYGyroOffsetUser(int16_t offset);
    +
    +        // ZG_OFFS_USR* register
    +        int16_t getZGyroOffsetUser();
    +        void setZGyroOffsetUser(int16_t offset);
    +        
    +        // INT_ENABLE register (DMP functions)
    +        bool getIntPLLReadyEnabled();
    +        void setIntPLLReadyEnabled(bool enabled);
    +        bool getIntDMPEnabled();
    +        void setIntDMPEnabled(bool enabled);
    +        
    +        // DMP_INT_STATUS
    +        bool getDMPInt5Status();
    +        bool getDMPInt4Status();
    +        bool getDMPInt3Status();
    +        bool getDMPInt2Status();
    +        bool getDMPInt1Status();
    +        bool getDMPInt0Status();
    +
    +        // INT_STATUS register (DMP functions)
    +        bool getIntPLLReadyStatus();
    +        bool getIntDMPStatus();
    +        
    +        // USER_CTRL register (DMP functions)
    +        bool getDMPEnabled();
    +        void setDMPEnabled(bool enabled);
    +        void resetDMP();
    +        
    +        // BANK_SEL register
    +        void setMemoryBank(uint8_t bank, bool prefetchEnabled=false, bool userBank=false);
    +        
    +        // MEM_START_ADDR register
    +        void setMemoryStartAddress(uint8_t address);
    +        
    +        // MEM_R_W register
    +        uint8_t readMemoryByte();
    +        void writeMemoryByte(uint8_t data);
    +        void readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0);
    +        bool writeMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true, bool useProgMem=false);
    +        bool writeProgMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true);
    +
    +        // DMP_CFG_1 register
    +        uint8_t getDMPConfig1();
    +        void setDMPConfig1(uint8_t config);
    +
    +        // DMP_CFG_2 register
    +        uint8_t getDMPConfig2();
    +        void setDMPConfig2(uint8_t config);
    +
    +    private:
    +        uint8_t devAddr;
    +        uint8_t buffer[14];
    +};
    +
    +#ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS20
    +    /* This is only included if you want it, since it eats about 2K of program
    +     * memory, which is a waste if you aren't using the DMP (or if you aren't
    +     * using this particular flavor of DMP).
    +     *
    +     * Source is from the InvenSense MotionApps v2 demo code. Original source is
    +     * unavailable, unless you happen to be amazing as decompiling binary by
    +     * hand (in which case, please contact me, and I'm totally serious).
    +     *
    +     * Also, I'd like to offer many, many thanks to Noah Zerkin for all of the
    +     * DMP reverse-engineering he did to help make this bit of wizardry
    +     * possible.
    +     */
    +
    +    #define MPU6050_DMP_CODE_SIZE 1929
    +
    +    // this block of memory gets written to the MPU on start-up, and it seems
    +    // to be volatile memory, so it has to be done each time (it only takes ~1
    +    // second though)
    +    prog_uchar dmpMemory[MPU6050_DMP_CODE_SIZE] PROGMEM = {
    +        // bank 0, 256 bytes
    +        0xFB, 0x00, 0x00, 0x3E, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00,
    +        0x00, 0x65, 0x00, 0x54, 0xFF, 0xEF, 0x00, 0x00, 0xFA, 0x80, 0x00, 0x0B, 0x12, 0x82, 0x00, 0x01,
    +        0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0x45, 0x81, 0xFF, 0xFF, 0xFA, 0x72, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x7F, 0xFF, 0xFF, 0xFE, 0x80, 0x01,
    +        0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x3E, 0x03, 0x30, 0x40, 0x00, 0x00, 0x00, 0x02, 0xCA, 0xE3, 0x09, 0x3E, 0x80, 0x00, 0x00,
    +        0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
    +        0x41, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x2A, 0x00, 0x00, 0x16, 0x55, 0x00, 0x00, 0x21, 0x82,
    +        0xFD, 0x87, 0x26, 0x50, 0xFD, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x05, 0x80, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
    +        0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6F, 0x00, 0x02, 0x65, 0x32, 0x00, 0x00, 0x5E, 0xC0,
    +        0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0xFB, 0x8C, 0x6F, 0x5D, 0xFD, 0x5D, 0x08, 0xD9, 0x00, 0x7C, 0x73, 0x3B, 0x00, 0x6C, 0x12, 0xCC,
    +        0x32, 0x00, 0x13, 0x9D, 0x32, 0x00, 0xD0, 0xD6, 0x32, 0x00, 0x08, 0x00, 0x40, 0x00, 0x01, 0xF4,
    +        0xFF, 0xE6, 0x80, 0x79, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xD6, 0x00, 0x00, 0x27, 0x10,
    +
    +        // bank 1, 256 bytes
    +        0xFB, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0xFA, 0x36, 0xFF, 0xBC, 0x30, 0x8E, 0x00, 0x05, 0xFB, 0xF0, 0xFF, 0xD9, 0x5B, 0xC8,
    +        0xFF, 0xD0, 0x9A, 0xBE, 0x00, 0x00, 0x10, 0xA9, 0xFF, 0xF4, 0x1E, 0xB2, 0x00, 0xCE, 0xBB, 0xF7,
    +        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0C,
    +        0xFF, 0xC2, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xCF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x03, 0x3F, 0x68, 0xB6, 0x79, 0x35, 0x28, 0xBC, 0xC6, 0x7E, 0xD1, 0x6C,
    +        0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2, 0x6A, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x30,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x25, 0x4D, 0x00, 0x2F, 0x70, 0x6D, 0x00, 0x00, 0x05, 0xAE, 0x00, 0x0C, 0x02, 0xD0,
    +
    +        // bank 2, 256 bytes
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x54, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0xFF, 0xEF, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
    +        0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +
    +        // bank 3, 256 bytes
    +        0xD8, 0xDC, 0xBA, 0xA2, 0xF1, 0xDE, 0xB2, 0xB8, 0xB4, 0xA8, 0x81, 0x91, 0xF7, 0x4A, 0x90, 0x7F,
    +        0x91, 0x6A, 0xF3, 0xF9, 0xDB, 0xA8, 0xF9, 0xB0, 0xBA, 0xA0, 0x80, 0xF2, 0xCE, 0x81, 0xF3, 0xC2,
    +        0xF1, 0xC1, 0xF2, 0xC3, 0xF3, 0xCC, 0xA2, 0xB2, 0x80, 0xF1, 0xC6, 0xD8, 0x80, 0xBA, 0xA7, 0xDF,
    +        0xDF, 0xDF, 0xF2, 0xA7, 0xC3, 0xCB, 0xC5, 0xB6, 0xF0, 0x87, 0xA2, 0x94, 0x24, 0x48, 0x70, 0x3C,
    +        0x95, 0x40, 0x68, 0x34, 0x58, 0x9B, 0x78, 0xA2, 0xF1, 0x83, 0x92, 0x2D, 0x55, 0x7D, 0xD8, 0xB1,
    +        0xB4, 0xB8, 0xA1, 0xD0, 0x91, 0x80, 0xF2, 0x70, 0xF3, 0x70, 0xF2, 0x7C, 0x80, 0xA8, 0xF1, 0x01,
    +        0xB0, 0x98, 0x87, 0xD9, 0x43, 0xD8, 0x86, 0xC9, 0x88, 0xBA, 0xA1, 0xF2, 0x0E, 0xB8, 0x97, 0x80,
    +        0xF1, 0xA9, 0xDF, 0xDF, 0xDF, 0xAA, 0xDF, 0xDF, 0xDF, 0xF2, 0xAA, 0xC5, 0xCD, 0xC7, 0xA9, 0x0C,
    +        0xC9, 0x2C, 0x97, 0x97, 0x97, 0x97, 0xF1, 0xA9, 0x89, 0x26, 0x46, 0x66, 0xB0, 0xB4, 0xBA, 0x80,
    +        0xAC, 0xDE, 0xF2, 0xCA, 0xF1, 0xB2, 0x8C, 0x02, 0xA9, 0xB6, 0x98, 0x00, 0x89, 0x0E, 0x16, 0x1E,
    +        0xB8, 0xA9, 0xB4, 0x99, 0x2C, 0x54, 0x7C, 0xB0, 0x8A, 0xA8, 0x96, 0x36, 0x56, 0x76, 0xF1, 0xB9,
    +        0xAF, 0xB4, 0xB0, 0x83, 0xC0, 0xB8, 0xA8, 0x97, 0x11, 0xB1, 0x8F, 0x98, 0xB9, 0xAF, 0xF0, 0x24,
    +        0x08, 0x44, 0x10, 0x64, 0x18, 0xF1, 0xA3, 0x29, 0x55, 0x7D, 0xAF, 0x83, 0xB5, 0x93, 0xAF, 0xF0,
    +        0x00, 0x28, 0x50, 0xF1, 0xA3, 0x86, 0x9F, 0x61, 0xA6, 0xDA, 0xDE, 0xDF, 0xD9, 0xFA, 0xA3, 0x86,
    +        0x96, 0xDB, 0x31, 0xA6, 0xD9, 0xF8, 0xDF, 0xBA, 0xA6, 0x8F, 0xC2, 0xC5, 0xC7, 0xB2, 0x8C, 0xC1,
    +        0xB8, 0xA2, 0xDF, 0xDF, 0xDF, 0xA3, 0xDF, 0xDF, 0xDF, 0xD8, 0xD8, 0xF1, 0xB8, 0xA8, 0xB2, 0x86,
    +
    +        // bank 4, 256 bytes
    +        0xB4, 0x98, 0x0D, 0x35, 0x5D, 0xB8, 0xAA, 0x98, 0xB0, 0x87, 0x2D, 0x35, 0x3D, 0xB2, 0xB6, 0xBA,
    +        0xAF, 0x8C, 0x96, 0x19, 0x8F, 0x9F, 0xA7, 0x0E, 0x16, 0x1E, 0xB4, 0x9A, 0xB8, 0xAA, 0x87, 0x2C,
    +        0x54, 0x7C, 0xB9, 0xA3, 0xDE, 0xDF, 0xDF, 0xA3, 0xB1, 0x80, 0xF2, 0xC4, 0xCD, 0xC9, 0xF1, 0xB8,
    +        0xA9, 0xB4, 0x99, 0x83, 0x0D, 0x35, 0x5D, 0x89, 0xB9, 0xA3, 0x2D, 0x55, 0x7D, 0xB5, 0x93, 0xA3,
    +        0x0E, 0x16, 0x1E, 0xA9, 0x2C, 0x54, 0x7C, 0xB8, 0xB4, 0xB0, 0xF1, 0x97, 0x83, 0xA8, 0x11, 0x84,
    +        0xA5, 0x09, 0x98, 0xA3, 0x83, 0xF0, 0xDA, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0xD8, 0xF1, 0xA5,
    +        0x29, 0x55, 0x7D, 0xA5, 0x85, 0x95, 0x02, 0x1A, 0x2E, 0x3A, 0x56, 0x5A, 0x40, 0x48, 0xF9, 0xF3,
    +        0xA3, 0xD9, 0xF8, 0xF0, 0x98, 0x83, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0x97, 0x82, 0xA8, 0xF1,
    +        0x11, 0xF0, 0x98, 0xA2, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0xDA, 0xF3, 0xDE, 0xD8, 0x83, 0xA5,
    +        0x94, 0x01, 0xD9, 0xA3, 0x02, 0xF1, 0xA2, 0xC3, 0xC5, 0xC7, 0xD8, 0xF1, 0x84, 0x92, 0xA2, 0x4D,
    +        0xDA, 0x2A, 0xD8, 0x48, 0x69, 0xD9, 0x2A, 0xD8, 0x68, 0x55, 0xDA, 0x32, 0xD8, 0x50, 0x71, 0xD9,
    +        0x32, 0xD8, 0x70, 0x5D, 0xDA, 0x3A, 0xD8, 0x58, 0x79, 0xD9, 0x3A, 0xD8, 0x78, 0x93, 0xA3, 0x4D,
    +        0xDA, 0x2A, 0xD8, 0x48, 0x69, 0xD9, 0x2A, 0xD8, 0x68, 0x55, 0xDA, 0x32, 0xD8, 0x50, 0x71, 0xD9,
    +        0x32, 0xD8, 0x70, 0x5D, 0xDA, 0x3A, 0xD8, 0x58, 0x79, 0xD9, 0x3A, 0xD8, 0x78, 0xA8, 0x8A, 0x9A,
    +        0xF0, 0x28, 0x50, 0x78, 0x9E, 0xF3, 0x88, 0x18, 0xF1, 0x9F, 0x1D, 0x98, 0xA8, 0xD9, 0x08, 0xD8,
    +        0xC8, 0x9F, 0x12, 0x9E, 0xF3, 0x15, 0xA8, 0xDA, 0x12, 0x10, 0xD8, 0xF1, 0xAF, 0xC8, 0x97, 0x87,
    +
    +        // bank 5, 256 bytes
    +        0x34, 0xB5, 0xB9, 0x94, 0xA4, 0x21, 0xF3, 0xD9, 0x22, 0xD8, 0xF2, 0x2D, 0xF3, 0xD9, 0x2A, 0xD8,
    +        0xF2, 0x35, 0xF3, 0xD9, 0x32, 0xD8, 0x81, 0xA4, 0x60, 0x60, 0x61, 0xD9, 0x61, 0xD8, 0x6C, 0x68,
    +        0x69, 0xD9, 0x69, 0xD8, 0x74, 0x70, 0x71, 0xD9, 0x71, 0xD8, 0xB1, 0xA3, 0x84, 0x19, 0x3D, 0x5D,
    +        0xA3, 0x83, 0x1A, 0x3E, 0x5E, 0x93, 0x10, 0x30, 0x81, 0x10, 0x11, 0xB8, 0xB0, 0xAF, 0x8F, 0x94,
    +        0xF2, 0xDA, 0x3E, 0xD8, 0xB4, 0x9A, 0xA8, 0x87, 0x29, 0xDA, 0xF8, 0xD8, 0x87, 0x9A, 0x35, 0xDA,
    +        0xF8, 0xD8, 0x87, 0x9A, 0x3D, 0xDA, 0xF8, 0xD8, 0xB1, 0xB9, 0xA4, 0x98, 0x85, 0x02, 0x2E, 0x56,
    +        0xA5, 0x81, 0x00, 0x0C, 0x14, 0xA3, 0x97, 0xB0, 0x8A, 0xF1, 0x2D, 0xD9, 0x28, 0xD8, 0x4D, 0xD9,
    +        0x48, 0xD8, 0x6D, 0xD9, 0x68, 0xD8, 0xB1, 0x84, 0x0D, 0xDA, 0x0E, 0xD8, 0xA3, 0x29, 0x83, 0xDA,
    +        0x2C, 0x0E, 0xD8, 0xA3, 0x84, 0x49, 0x83, 0xDA, 0x2C, 0x4C, 0x0E, 0xD8, 0xB8, 0xB0, 0xA8, 0x8A,
    +        0x9A, 0xF5, 0x20, 0xAA, 0xDA, 0xDF, 0xD8, 0xA8, 0x40, 0xAA, 0xD0, 0xDA, 0xDE, 0xD8, 0xA8, 0x60,
    +        0xAA, 0xDA, 0xD0, 0xDF, 0xD8, 0xF1, 0x97, 0x86, 0xA8, 0x31, 0x9B, 0x06, 0x99, 0x07, 0xAB, 0x97,
    +        0x28, 0x88, 0x9B, 0xF0, 0x0C, 0x20, 0x14, 0x40, 0xB8, 0xB0, 0xB4, 0xA8, 0x8C, 0x9C, 0xF0, 0x04,
    +        0x28, 0x51, 0x79, 0x1D, 0x30, 0x14, 0x38, 0xB2, 0x82, 0xAB, 0xD0, 0x98, 0x2C, 0x50, 0x50, 0x78,
    +        0x78, 0x9B, 0xF1, 0x1A, 0xB0, 0xF0, 0x8A, 0x9C, 0xA8, 0x29, 0x51, 0x79, 0x8B, 0x29, 0x51, 0x79,
    +        0x8A, 0x24, 0x70, 0x59, 0x8B, 0x20, 0x58, 0x71, 0x8A, 0x44, 0x69, 0x38, 0x8B, 0x39, 0x40, 0x68,
    +        0x8A, 0x64, 0x48, 0x31, 0x8B, 0x30, 0x49, 0x60, 0xA5, 0x88, 0x20, 0x09, 0x71, 0x58, 0x44, 0x68,
    +
    +        // bank 6, 256 bytes
    +        0x11, 0x39, 0x64, 0x49, 0x30, 0x19, 0xF1, 0xAC, 0x00, 0x2C, 0x54, 0x7C, 0xF0, 0x8C, 0xA8, 0x04,
    +        0x28, 0x50, 0x78, 0xF1, 0x88, 0x97, 0x26, 0xA8, 0x59, 0x98, 0xAC, 0x8C, 0x02, 0x26, 0x46, 0x66,
    +        0xF0, 0x89, 0x9C, 0xA8, 0x29, 0x51, 0x79, 0x24, 0x70, 0x59, 0x44, 0x69, 0x38, 0x64, 0x48, 0x31,
    +        0xA9, 0x88, 0x09, 0x20, 0x59, 0x70, 0xAB, 0x11, 0x38, 0x40, 0x69, 0xA8, 0x19, 0x31, 0x48, 0x60,
    +        0x8C, 0xA8, 0x3C, 0x41, 0x5C, 0x20, 0x7C, 0x00, 0xF1, 0x87, 0x98, 0x19, 0x86, 0xA8, 0x6E, 0x76,
    +        0x7E, 0xA9, 0x99, 0x88, 0x2D, 0x55, 0x7D, 0x9E, 0xB9, 0xA3, 0x8A, 0x22, 0x8A, 0x6E, 0x8A, 0x56,
    +        0x8A, 0x5E, 0x9F, 0xB1, 0x83, 0x06, 0x26, 0x46, 0x66, 0x0E, 0x2E, 0x4E, 0x6E, 0x9D, 0xB8, 0xAD,
    +        0x00, 0x2C, 0x54, 0x7C, 0xF2, 0xB1, 0x8C, 0xB4, 0x99, 0xB9, 0xA3, 0x2D, 0x55, 0x7D, 0x81, 0x91,
    +        0xAC, 0x38, 0xAD, 0x3A, 0xB5, 0x83, 0x91, 0xAC, 0x2D, 0xD9, 0x28, 0xD8, 0x4D, 0xD9, 0x48, 0xD8,
    +        0x6D, 0xD9, 0x68, 0xD8, 0x8C, 0x9D, 0xAE, 0x29, 0xD9, 0x04, 0xAE, 0xD8, 0x51, 0xD9, 0x04, 0xAE,
    +        0xD8, 0x79, 0xD9, 0x04, 0xD8, 0x81, 0xF3, 0x9D, 0xAD, 0x00, 0x8D, 0xAE, 0x19, 0x81, 0xAD, 0xD9,
    +        0x01, 0xD8, 0xF2, 0xAE, 0xDA, 0x26, 0xD8, 0x8E, 0x91, 0x29, 0x83, 0xA7, 0xD9, 0xAD, 0xAD, 0xAD,
    +        0xAD, 0xF3, 0x2A, 0xD8, 0xD8, 0xF1, 0xB0, 0xAC, 0x89, 0x91, 0x3E, 0x5E, 0x76, 0xF3, 0xAC, 0x2E,
    +        0x2E, 0xF1, 0xB1, 0x8C, 0x5A, 0x9C, 0xAC, 0x2C, 0x28, 0x28, 0x28, 0x9C, 0xAC, 0x30, 0x18, 0xA8,
    +        0x98, 0x81, 0x28, 0x34, 0x3C, 0x97, 0x24, 0xA7, 0x28, 0x34, 0x3C, 0x9C, 0x24, 0xF2, 0xB0, 0x89,
    +        0xAC, 0x91, 0x2C, 0x4C, 0x6C, 0x8A, 0x9B, 0x2D, 0xD9, 0xD8, 0xD8, 0x51, 0xD9, 0xD8, 0xD8, 0x79,
    +
    +        // bank 7, 138 bytes (remainder)
    +        0xD9, 0xD8, 0xD8, 0xF1, 0x9E, 0x88, 0xA3, 0x31, 0xDA, 0xD8, 0xD8, 0x91, 0x2D, 0xD9, 0x28, 0xD8,
    +        0x4D, 0xD9, 0x48, 0xD8, 0x6D, 0xD9, 0x68, 0xD8, 0xB1, 0x83, 0x93, 0x35, 0x3D, 0x80, 0x25, 0xDA,
    +        0xD8, 0xD8, 0x85, 0x69, 0xDA, 0xD8, 0xD8, 0xB4, 0x93, 0x81, 0xA3, 0x28, 0x34, 0x3C, 0xF3, 0xAB,
    +        0x8B, 0xF8, 0xA3, 0x91, 0xB6, 0x09, 0xB4, 0xD9, 0xAB, 0xDE, 0xFA, 0xB0, 0x87, 0x9C, 0xB9, 0xA3,
    +        0xDD, 0xF1, 0xA3, 0xA3, 0xA3, 0xA3, 0x95, 0xF1, 0xA3, 0xA3, 0xA3, 0x9D, 0xF1, 0xA3, 0xA3, 0xA3,
    +        0xA3, 0xF2, 0xA3, 0xB4, 0x90, 0x80, 0xF2, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,
    +        0xA3, 0xB2, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xB0, 0x87, 0xB5, 0x99, 0xF1, 0xA3, 0xA3, 0xA3,
    +        0x98, 0xF1, 0xA3, 0xA3, 0xA3, 0xA3, 0x97, 0xA3, 0xA3, 0xA3, 0xA3, 0xF3, 0x9B, 0xA3, 0xA3, 0xDC,
    +        0xB9, 0xA7, 0xF1, 0x26, 0x26, 0x26, 0xD8, 0xD8, 0xFF
    +    };
    +
    +    uint8_t dmpUpdates[29][9] = {
    +        { 0x03, 0x7B, 0x03, 0x4C, 0xCD, 0x6C },         // FCFG_1 inv_set_gyro_calibration
    +        { 0x03, 0xAB, 0x03, 0x36, 0x56, 0x76 },         // FCFG_3 inv_set_gyro_calibration
    +        { 0x00, 0x68, 0x04, 0x02, 0xCB, 0x47, 0xA2 },   // D_0_104 inv_set_gyro_calibration
    +        { 0x02, 0x18, 0x04, 0x00, 0x05, 0x8B, 0xC1 },   // D_0_24 inv_set_gyro_calibration
    +        { 0x01, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00 },   // D_1_152 inv_set_accel_calibration
    +        { 0x03, 0x7F, 0x06, 0x0C, 0xC9, 0x2C, 0x97, 0x97, 0x97 }, // FCFG_2 inv_set_accel_calibration
    +        { 0x03, 0x89, 0x03, 0x26, 0x46, 0x66 },         // FCFG_7 inv_set_accel_calibration
    +        { 0x00, 0x6C, 0x02, 0x20, 0x00 },               // D_0_108 inv_set_accel_calibration
    +        { 0x02, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00 },   // CPASS_MTX_00 inv_set_compass_calibration
    +        { 0x02, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00 },   // CPASS_MTX_01
    +        { 0x02, 0x48, 0x04, 0x00, 0x00, 0x00, 0x00 },   // CPASS_MTX_02
    +        { 0x02, 0x4C, 0x04, 0x00, 0x00, 0x00, 0x00 },   // CPASS_MTX_10
    +        { 0x02, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00 },   // CPASS_MTX_11
    +        { 0x02, 0x54, 0x04, 0x00, 0x00, 0x00, 0x00 },   // CPASS_MTX_12
    +        { 0x02, 0x58, 0x04, 0x00, 0x00, 0x00, 0x00 },   // CPASS_MTX_20
    +        { 0x02, 0x5C, 0x04, 0x00, 0x00, 0x00, 0x00 },   // CPASS_MTX_21
    +        { 0x02, 0xBC, 0x04, 0x00, 0x00, 0x00, 0x00 },   // CPASS_MTX_22
    +        { 0x01, 0xEC, 0x04, 0x00, 0x00, 0x40, 0x00 },   // D_1_236 inv_apply_endian_accel
    +        { 0x03, 0x7F, 0x06, 0x0C, 0xC9, 0x2C, 0x97, 0x97, 0x97 }, // FCFG_2 inv_set_mpu_sensors
    +        { 0x04, 0x02, 0x03, 0x0D, 0x35, 0x5D },         // CFG_MOTION_BIAS inv_turn_on_bias_from_no_motion
    +        { 0x04, 0x09, 0x04, 0x87, 0x2D, 0x35, 0x3D },   // FCFG_5 inv_set_bias_update
    +        { 0x00, 0xA3, 0x01, 0x00 },                     // D_0_163 inv_set_dead_zone
    +        // SET INT_ENABLE at i=22
    +        { 0x07, 0x86, 0x01, 0xFE },                     // CFG_6 inv_set_fifo_interupt
    +        { 0x07, 0x41, 0x05, 0xF1, 0x20, 0x28, 0x30, 0x38 }, // CFG_8 inv_send_quaternion
    +        { 0x07, 0x7E, 0x01, 0x30 },                     // CFG_16 inv_set_footer
    +        { 0x07, 0x46, 0x01, 0x9A },                     // CFG_GYRO_SOURCE inv_send_gyro
    +        { 0x07, 0x47, 0x04, 0xF1, 0x28, 0x30, 0x38 },   // CFG_9 inv_send_gyro -> inv_construct3_fifo
    +        { 0x07, 0x6C, 0x04, 0xF1, 0x28, 0x30, 0x38 },   // CFG_12 inv_send_accel -> inv_construct3_fifo
    +        { 0x02, 0x16, 0x02, 0x00, 0x0A }                // D_0_22 inv_set_fifo_rate
    +};
    +
    +#endif
    +
    +#endif /* _MPU6050_H_ */
    diff --git a/sheets/led_5m.pdf b/sheets/led_5m.pdf
    new file mode 100644
    index 0000000..d1f3fe6
    Binary files /dev/null and b/sheets/led_5m.pdf differ
    diff --git a/sheets/noso.gif b/sheets/noso.gif
    new file mode 100644
    index 0000000..7a5fa53
    Binary files /dev/null and b/sheets/noso.gif differ
    diff --git a/sheets/step_motor_28BYJ-48.pdf b/sheets/step_motor_28BYJ-48.pdf
    new file mode 100644
    index 0000000..b1842d2
    Binary files /dev/null and b/sheets/step_motor_28BYJ-48.pdf differ
    diff --git a/sheets/t-alt-pci-motherboard.gif b/sheets/t-alt-pci-motherboard.gif
    new file mode 100644
    index 0000000..f8fdf36
    Binary files /dev/null and b/sheets/t-alt-pci-motherboard.gif differ
    diff --git a/slides/img/720px-Arduino_Logo.svg.png b/slides/img/720px-Arduino_Logo.svg.png
    new file mode 100644
    index 0000000..7acc485
    Binary files /dev/null and b/slides/img/720px-Arduino_Logo.svg.png differ
    diff --git a/slides/img/background.jpg b/slides/img/background.jpg
    new file mode 100644
    index 0000000..9b08c62
    Binary files /dev/null and b/slides/img/background.jpg differ
    diff --git a/slides/img/background_desaturated.jpg b/slides/img/background_desaturated.jpg
    new file mode 100644
    index 0000000..173ea9c
    Binary files /dev/null and b/slides/img/background_desaturated.jpg differ
    diff --git a/slides/img/slide_bg.png b/slides/img/slide_bg.png
    new file mode 100644
    index 0000000..7ba53ed
    Binary files /dev/null and b/slides/img/slide_bg.png differ
    diff --git a/slides/presentazione_arduino_base_templat_custom.odp b/slides/presentazione_arduino_base_templat_custom.odp
    new file mode 100644
    index 0000000..563aed2
    Binary files /dev/null and b/slides/presentazione_arduino_base_templat_custom.odp differ
    diff --git a/slides/presentazione_arduino_base_templat_custom.pdf b/slides/presentazione_arduino_base_templat_custom.pdf
    new file mode 100644
    index 0000000..0ad4ae4
    Binary files /dev/null and b/slides/presentazione_arduino_base_templat_custom.pdf differ
    diff --git a/slides/presentazione_arduino_base_templat_custom.pwp b/slides/presentazione_arduino_base_templat_custom.pwp
    new file mode 100644
    index 0000000..02bd57e
    --- /dev/null
    +++ b/slides/presentazione_arduino_base_templat_custom.pwp
    @@ -0,0 +1 @@
    +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
    \ No newline at end of file
    diff --git a/staff b/staff
    new file mode 100644
    index 0000000..a468f34
    --- /dev/null
    +++ b/staff
    @@ -0,0 +1,6 @@
    +
    +La Caterina e' la fidanzata del tipo delle stampanti 3D, ha a che fare con il corso e dice che ci dobbiamo sentire per laboratorio e balle varie. E quella dell'altra organizzazione che ha raccolto gli iscritti (non ricordo il nome).
    +
    +Maria e' la ragazzina piu' giovane, penso la statista. E' quella delle caramelle per la gola.
    +
    +C'e' il tipo degli aereoplani, che vola con EPP e taranis, non mi ricordo come si chiama. E' uno dei tutor...
    diff --git a/status b/status
    new file mode 100644
    index 0000000..c41f53f
    --- /dev/null
    +++ b/status
    @@ -0,0 +1,7 @@
    +Tue Jan 27 16:49:08 CET 2015
    +Sentito Walter, forse due corsi
    +in due giorni vedere quanti iscritti
    +per fare eventualmente due serate
    +
    +Bisogna decidere se dividere in due gli studenti
    +e fare due corsi.
    diff --git a/stores/Materiale_laboratorio.odt b/stores/Materiale_laboratorio.odt
    new file mode 100644
    index 0000000..6dc5afb
    Binary files /dev/null and b/stores/Materiale_laboratorio.odt differ
    diff --git a/stores/banggood.pdf b/stores/banggood.pdf
    new file mode 100644
    index 0000000..9e70dcd
    Binary files /dev/null and b/stores/banggood.pdf differ
    diff --git a/stores/lista.html b/stores/lista.html
    new file mode 100644
    index 0000000..b5f7059
    --- /dev/null
    +++ b/stores/lista.html
    @@ -0,0 +1,420 @@
    +
    +
    +
    +
    +
    +
    +Lista materiali
    +
    +
    +
    +
    +

    Lista materiali

    + +

    Stima per 20 studenti, in caso dividere quantita' proposte. +Componenti in alternativa a kit completi: +- http://www.banggood.com/Basic-Starter-Learning-Kit-UNO-For-Arduino-Basics-p-934217.html +- http://www.banggood.com/Arduino-Compatible-UNO-R3-Starter-Kit-Set-Upgraded-Version-With-RFID-p-908543.html

    + + + + + + + +
    +

    TODO

    +
      +
    • Cercare potenziometri
    • +
    • Vedere se servono altri transistor
    • +
    • +
    +
    +
    + + diff --git a/tobuy b/tobuy new file mode 100644 index 0000000..7628465 --- /dev/null +++ b/tobuy @@ -0,0 +1,5 @@ + +motori elettrici DC da 5v ~150mAh: tipo i 7mm per motori di coda v911. + +- Micro servo motori +- multimetri diff --git a/var/Esposizione_in_fiera.odt b/var/Esposizione_in_fiera.odt new file mode 100644 index 0000000..09a167e Binary files /dev/null and b/var/Esposizione_in_fiera.odt differ diff --git a/var/fieraelettronica2015-7.doc b/var/fieraelettronica2015-7.doc new file mode 100644 index 0000000..3b3e23e Binary files /dev/null and b/var/fieraelettronica2015-7.doc differ diff --git a/var/lezioni.rst_original b/var/lezioni.rst_original new file mode 100644 index 0000000..27e1b33 --- /dev/null +++ b/var/lezioni.rst_original @@ -0,0 +1,335 @@ +=================================== +Argomenti per Lezioni Arduino Base +=================================== + + + :Author: Andrea Manni + :Copyright: GFDL + :Version: 0.9 + +.. sectnum:: + +.. contents:: Indice degli argomenti +.. |date| date:: + +Generato il |date| con: http://docutils.sourceforge.net/rst.html + + +Note: this is the first draft befor ispell check. + +Appunti e materiali per lezioni del corso base su Arduino. Questo documento e' da considerarsi come una traccia degli argomenti considerati e non il manuale definitivo delle lezioni. + +Il corso +========== + +Il corso di base di Arduino e' rivolto a chi si approccia per la prima volta al mondo dei makers, fornendo le basi di elettronica, informatica e elettronica per orientarsi e poter iniziare a interagire nell'innovativo mondo dell'elettronica digitale. + +Obbiettivo del corso e' utilizzare la piattaforma Arduino come primo approccio all'elettrinica digitale, potendo cosi' lavorare sulle basi di elettronica, informatica e programmazione. Le varie tematiche verrano affrontate praticamente dagli studenti con prototipi funzionanti basati sull'elaborazione delle informazioni fornite da vari tipi di sensori al microcontroller Arduino che elaborera' i dati per comandare vari tipi di attuatori come motori, luci LED, altoparlanti. + +Contesto +------------ + +Negli anni recenti molto e' cambiato nel panorama dell'elettronica, la contaminazione con gli ambienti aperti del settore informatico, la disponibilita' di sistemi miniaturizzati a basso costo ha reso disponibili nuove piattaforme come Arduino o RaspBerryPi, soluzioni economiche e flessibili. + +Grazie a queste ed altre tecnologie oggi sono alla portata dell'hobbista soluzioni che fino a pochi anni fa erano esclusiva dell'automazione industriale, per via degli alti costi e dell'esclusivita' delle varie implementazioni. + +Oggi il Free Software, Open Source e Open Hardware, Crowdfounding hanno rivoluzionato l'elettronica con una serie di dispositivi che hanno riportato la creativita' elettronica nella disponibilita' dei makers, dai micro cotroller come Arduino a nuovi strumenti come le stampanti 3D permettono a un vasto pubblico di dedicarsi a robotica, domotica e a tutte le ultime innovazioni tecnologiche. + +Finalita' +----------- + +Tutta questa flessibilita' e disponibilita' di nuove soluzioni puo' pero' disorientare chi si approccia a queste soluzioni, sia per chi e' ai primi passi che per coloro che magari hanno precedenti esperienze con solo alcune delle discipline che si amalgamano con Arduino. Scopo del corso e' quindi stabilire delle fondamenta di informatica e elettronica per poi poter crescere sia con Arduino che con le altre tecnologie alla moda. + + +Durante lo svolgimento del corso i partecipanti imparerranno a programmare in Arduino C in ambiente Gnu/Linux utilizzando una breadboard e diversi input/output. + + +Introduzione +================ + +- Cos'e' un microcontroller (tutto compreso, memoria calcolo inputr-outpt)/ attuatore +- Cenni alle classi di elaboratori +- Cos'e' l'informatica e la programmazione +- Elettronica e elettronica digitale + +Perche' l'informatica ha bisogno di un attuatore: interazione con il reale. +Elettronica digitale: vantaggi di usare un sofware (esempio di un bottone, logica booleana): cablatura instantanea, aggiunta di features. + + +Avvertenze +--------------- + +Precauzioni per non danneggiare la scheda durante l'uso: + +* Applicare materiale isolante (fondo in polistirolo) sotto alla scheda. +* Applicare isolante al connettore USB per staccare il cavo senza statica. +* Solo la porta 13 ha una resistenza integrata, per tutte le altre usare una resistenza da ''~300 ohms''. + +Precauzioni per non danneggiare la scheda durante l'uso: + +* Applicare materiale isolante (fondo in polistirolo) sotto alla scheda. +* Applicare isolante al connettore USB per staccare il cavo senza statica. +* Solo la porta 13 ha una resistenza integrata, per tutte le altre usare una resistenza da ~300. +* Non usare Arduino come un trasformatore! + + +Blink +-------- + +Analisi di un sketch: + +- Struttura (setup, loop, input output) +- Fondamenti di programmazione: i 4 elementi base (fare descrizione completa dopo aver fatto cicli - INPUT). + +- Dichiarazione di variabili: LED +- Funzioni per cambio di stato: digitalWrite / delay - output + + +Pratica +~~~~~~~~~ + +# Fare accendere il LED per 1/10 di secondo +# Far spegnere il LED per 1/10 di s. + +Descrivere una instruzione + + +* Far accendere il LED per 1/10 di secondo e un secondo + +Questa e' una sequenza di istruzioni, accenno alle funzioni, es delay() . + + + + +Verifica e compilazione +------------------------ + +Codice sorgente e codice oggetto, compilazione del codice. +Controllo formale, preprocessor (#define constantName value). + +Eseguire procedure manualmente con makefile, visualizzazione codice oggetto. + + + +Input +===== + +Esempio con un imput, primo esempio con un bottone che fa accendere un LED. + +Invertire il circuito del bottone / parametro della lminosita per spiegare i *vantaggi dell'elettronica digitale* rispetto a elettronica "cablata" (cenni a PWM, varie letture degli eventi di *click*). + +Cicli Condizionali +---------------------- + +Eventualmente usare un generatore random (esercizio per testa / croce) per introdurre i cicli condizionali. + + +Ottimizzazioni +--------------- + +.. NOTE:: + Questa parte andra' affrontata dopo i motori (servo inclusi). + + +De-bouncing, multitasking con millis(), identificare il cambio di stato. + + +Sensori: dilatare i tempi di lettura, utilizzare valori medi di pu' letture (smoothing), calibrazione dei sensori utilizzando seraile e riferimenti. + + + +Eventuali +~~~~~~~~~~ + +Transformazioni di input: da fot-sensore a piezo: Pitch follower + + + +Analisi ulteriore +================== + +Introdurre i data types + + +Cicli iterativi: for - while + + +Seriali +======== + +Inviare dati via seriale per debugging. + +Output +======== + +LED, motori, servomotori, piezo, seriale. + +PWM +----------- + +Esmpio con un ''byte'' di ''brightness++" per aumentare la luminosita' di un LED. +Introdurre eventualmente i cicli ''for'' . + + +Funzioni +----------- + +Creare una funzione con un ciclo for per aumentare / diminuire la luminosita' in base a un parametro passato alla funzione. + + + +Piezo +------- + +Emettere suoni e melodie tramite un trasduttore piezoelettrico. +- Onde sonore: frequenze e pitch. +- Sketch di esempi in Digital + + +(Sketches in multiple tabs, array). +Pitch follower: transformazione input fi un sensore photo -> onde sonore tramite piezo. + + +Calibrare l'input +------------------ + +Calibrare l'input di un potenziometro / sensore: identificare valori minimi, massimi, offset e stabilire una formula: ''Range = (1024 - offset) * 1024 / (1024 - offset) '' . + +Utilizzare ''map()'' per fare la stessa cosa. Caso specifico: cinversione tra ''1024 <-> 256'' : usare un fattore 4. + + +Usare un sensore di luminosita' +------------------------------- + +Utilizzare come sorgente di imput la resistenza rilevata da un sensore di luminosita', mappare l'input del sensore su un LED PWM / seriale. + + + + +Motori +======== + +Utilizzo di un motore 5v ~14mAh direttamente su Arduino tramite un transistor e diodo. Variare la velocita' tramite PWM e un ciclo for, utilizzare un potenziometro come input analogico per variare la velocita', trovare il valore minimo di carico per attivare il motore tramite debuggin seriale. + + +Servo motori +-------------- + +Differenze rispetto a un motore DC, scopi di utilizzo. +Caratteristichei: coppia, velocita', peso, alimentazione. +Funzionamento: analogici e digitali, riduttori plastici e metallici, bearings. + +Skretch Base e Knob. Utilizzare librerie esterne. + +- http://handyboard.com/hb/faq/hardware-faqs/dc-vs-servo/ + + +Motori passo-passo +----------------------- + +Funzionamento, caratteristiche di utilizzo (consumo - coppia), campi di utilizzo (automazione power tools), differenze rispetto a servo (controllo posizione) e motori normali. + + +Motori brushless +----------------- + +Differenze e caratteristiche rispetto ai motori a spazzole. +Uso di una ESC, BEC. + + +Caratterstiche generali +------------------------- + +Potenza, KV, voltaggio utilizzabile, amper massimi, potenza / peso, efficenza. + + + +Elettronica di base +===================== + +Si dovranno introdurre: + +- Legge di Ohm +- Serie e parallelo, in particolare per batterie e resistenze +- Caratteristiche e uso dei LED: come calcolare resistenze necessarie +- Uso di transistor per motori DC + + +Eventuale: saldature +-------------------- + +Guida di base alle piccole saldature: cavi intrecciato, cavi dritti, PCB. Dissaldare. + + +Approfondimenti +------------------ + +Resistenze: resistivita' in base a sezione e lunghezza: effetti su sere e parallelo. +(Fisica) Semiconduttori: resistenze -> diodi -> transistor : cenni sul funzionamento in base ai possibili range di spostamento degli elettroni. + + +Linux +======= + +Argomenti specifici per utilizzare integrare Arduino in ambiente Linux. + +- Installazione +- Leggere informazioni da seriale (redirezione INPUT, verso un file, screen), mandare informazioni (echo, cat) +- Eventuale: editor alternativi, compilazione e upload manuale (creare un make file). + + +Scratch +----------- + +Installare Scratch per arduino. + +- http://webtechie.be/2014/05/08/scratch-and-arduino-on-linux/ +- http://s4a.cat/ + + +Bibliografia +============ + +Testi consigliati, non richiesti. + +- Beginning C for Arduino: Learn C Programming for the Arduino +- Practical Electronics for Inventors +- Arduino Language Reference +- Getting Started With Arduino 2nd Edition +- Arduino for Dummies + +Risorse on line +---------------- + +- http://arduino.cc/en/Reference/HomePage +- http://www.ladyada.net/learn/arduino/index.html +- https://learn.adafruit.com/series/learn-arduino +- https://wiki.archlinux.org/index.php/arduino +- http://arduinoprincipiante.blogspot.it/2013/04/presentazione.html + + + + +Utilizzi +--------- + +- Input tramite manipolazione oggetti fisici. +- Stazioni per rilevamento dati: metereologiche, movimento. +- Attuatori per controllo numerico applicato a vari strumenti (stampanti 3D, frese , laser). +- Device per lettura di sensori da utilizzare con smartphones - computer +- Adattatore per sensori verso IoT +- Attuatore per device IoT: arduino - wifi - rele = accensione / spegnimento +- RFID per device domenstici: smartphone in contesti diversi = diversi profili +- Interfaccia input per tutti gli scenari in cui non si puo' usare un touch screeen / tastiera +- Domotica: irrigazione, controllo temperatura ambienti e acqua. +- Robotica: integrazione di apparecchiature di sorveglianza, robot domestici (aspirapolvere) e da giardino (macchine agricole unmanned in miniatura). +- Controllo droni, gyro, GPS, viewpoint. Ardupilot http://diydrones.com/notes/ArduPilot +- Prototipi per maccine di dimensioni performance superiori. + + +Progetti +---------- + +- Chorus – United Visual Artists: http://www.elmsly.com/Chorus-United-Visual-Artists +- Ardupilot http://diydrones.com/notes/ArduPilot + diff --git a/var/presentazione_arduino_base.odp b/var/presentazione_arduino_base.odp new file mode 100644 index 0000000..24ac7b4 Binary files /dev/null and b/var/presentazione_arduino_base.odp differ diff --git a/var/presentazione_arduino_base_template.odp b/var/presentazione_arduino_base_template.odp new file mode 100644 index 0000000..aa3ac97 Binary files /dev/null and b/var/presentazione_arduino_base_template.odp differ diff --git a/var/rspi_presentazione_corso.pdf b/var/rspi_presentazione_corso.pdf new file mode 100644 index 0000000..53db941 Binary files /dev/null and b/var/rspi_presentazione_corso.pdf differ diff --git a/var_sketches/get_started_2/_2_push_button/_2_push_button.ino b/var_sketches/get_started_2/_2_push_button/_2_push_button.ino new file mode 100644 index 0000000..c54c56f --- /dev/null +++ b/var_sketches/get_started_2/_2_push_button/_2_push_button.ino @@ -0,0 +1,24 @@ +// Example 02: Turn on LED while the button is pressed +const int LED = 13; +// the pin for the LED +const int BUTTON = 7; // the input pin where the +// pushbutton is connected +int val = 0; +// val will be used to store the state +// of the input pin +void setup() { + pinMode(LED, OUTPUT); // tell Arduino LED is an output + pinMode(BUTTON, INPUT); // and BUTTON is an input +} +void loop(){ + val = digitalRead(BUTTON); // read input value and store it + // check whether the input is HIGH (button pressed) + if (val == HIGH) { + digitalWrite(LED, HIGH); // turn LED ON + } + else { + digitalWrite(LED, LOW); + } +} + + diff --git a/var_sketches/get_started_2/example_03c_button_debouncing/example_03c_button_debouncing.ino b/var_sketches/get_started_2/example_03c_button_debouncing/example_03c_button_debouncing.ino new file mode 100644 index 0000000..a9e26c0 --- /dev/null +++ b/var_sketches/get_started_2/example_03c_button_debouncing/example_03c_button_debouncing.ino @@ -0,0 +1,41 @@ +// Example 03C: Turn on LED when the button is pressed +// and keep it on after it is released +// including simple de-bouncing +// Now with another new and improved formula!! + + +const int LED = 13; +// the pin for the LED +const int BUTTON = 7; +// the input pin where the +// pushbutton is connected +int val = 0; +// val will be used to store the state +// of the input pin +int old_val = 0; // this variable stores the previous +// value of "val" +int state = 0; +// 0 = LED off and 1 = LED on +void setup() { + pinMode(LED, OUTPUT); + // tell Arduino LED is an output + pinMode(BUTTON, INPUT); // and BUTTON is an input +} +void loop(){ + val = digitalRead(BUTTON); // read input value and store it + // yum, fresh + // check if there was a transition + if ((val == HIGH) && (old_val == LOW)){ + state = 1 - state; + delay(10); + } + old_val = val; // val is now old, let's store it + if (state == 1) { + digitalWrite(LED, HIGH); // turn LED ON + } + else { + digitalWrite(LED, LOW); + } +} + +