Für meine delay_ms() benutz ich den Systick, das kann zwar um 1 ms
schwanken, aber das reicht mir meistens aus. Für die delay_us() kommt es
mir meistens nicht auf die exakte Verzögerung an, da benutz einfach nur
eine kleine Schleife, die runterzählt. Die Schleifendurchläufe hab ich
mir mit einem Logic Analyzer angenähert, aber die können durchaus um
25%-50% schwanken
Bei 168 MHz ergibt das bei mir:
1 | void time_waitMs(uint32_t delayMs) {
|
2 | uint32_t end = time_getMS() + delayMs + 1;
|
3 | while(end > time_getMS()) {
|
4 | }
|
5 | }
|
6 |
|
7 | void time_waitUs(uint16_t delay) {
|
8 | // determined by trial and error...
|
9 | uint8_t temp;
|
10 | while (delay) {
|
11 | temp = 12;
|
12 | while(temp) {
|
13 | temp--;
|
14 | }
|
15 | delay--;
|
16 | }
|
17 | }
|
18 |
|
19 | void time_waitNs(uint16_t delay) {
|
20 | // determined by trial and error...
|
21 | delay = delay >> 6;
|
22 | while (delay) {
|
23 | delay--;
|
24 | }
|
25 | }
|