fix infinity loop in SpinDelayUs() and SpinDelayUsPrecision()

I don't know why : but AT91C_BASE_PWMC_CH0->PWMC_CCNTR value is never
equal to 0, so if start+ticks was equal to 0, it was inifity looping.
This fix may produce bit longer wait than expected in some case,
depending on if AT91C_BASE_PWMC_CH0->PWMC_CCNTR delay between 0xFFFF
and 0x0001 is just 1 step or 2...

/!\ Figure out why AT91C_BASE_PWMC_CH0->PWMC_CCNTR is never 0 and fix
it there is probably a better way to fix this infinity loop issue /!\
This commit is contained in:
Yann GASCUEL 2023-02-10 13:24:58 +01:00
commit a7b699b27e

View file

@ -35,11 +35,14 @@ void SpinDelayUsPrecision(int us) {
AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0; // Channel Duty Cycle Register
AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xFFFF; // Channel Period Register
uint16_t start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
uint16_t end = AT91C_BASE_PWMC_CH0->PWMC_CCNTR + ticks;
if (end == 0) // AT91C_BASE_PWMC_CH0->PWMC_CCNTR is never == 0
end++; // so we have to end++ to avoid inivity loop
for (;;) {
uint16_t now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
if (now == (uint16_t)(start + ticks))
if (now == end)
return;
WDT_HIT();
@ -59,13 +62,15 @@ void SpinDelayUs(int us) {
AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0; // Channel Duty Cycle Register
AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff; // Channel Period Register
uint16_t start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
uint16_t end = AT91C_BASE_PWMC_CH0->PWMC_CCNTR + ticks;
if (end == 0) // AT91C_BASE_PWMC_CH0->PWMC_CCNTR is never == 0
end++; // so we have to end++ to avoid inivity loop
for (;;) {
uint16_t now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
if (now == (uint16_t)(start + ticks))
return;
if (now == end)
return;
WDT_HIT();
}
}