Я вас наверно утомил... Прошу помощи солидных АРМоводов. Система Кортекс М3.
Таймер с режимом предварительной загрузки регистра перезагрузки, период 100 тактов.
Запрос по переполнению подключен к кольцевому DMA, по DMA переключаются ноги GPIO. Приоритет канала DMA наивысший (3).
Запрос по совпадению подключен к нормальному каналу DMA, по этому каналу перезагружается регистр перезагрузки. Приоритет канала DMA более низкий 2.
Значение регистра совпадения от 0 до 20, при больших значения ваще не работает, и без предварительной загрузки не работает.
Управляю периодом таймера из основного потока несколькими подобными функциями
Ё
static unsigned short PeriodPmas[2]={110,100};
static inline void KorrektP(void)
{
LL_DMA_DisableChannel(DMA1, DMAchKorrekt);
while(LL_DMA_IsEnabledChannel(DMA1, DMAchKorrekt)){;}
LL_DMA_SetDataLength(DMA1, DMAchKorrekt, 2);
LL_DMA_SetMemoryAddress(DMA1,DMAchKorrekt, (unsigned long)PeriodPmas);
LL_DMA_EnableChannel(DMA1, DMAchKorrekt);
}
Ё
Также в системе есть одно прерывание (20 команд) и канал DMA с самым низким приоритетом, (УАРТ).
Жалобы - глючит!
Пока не вставил while(LL_DMA_IsEnabledChannel(DMA1, DMAchKorrekt)){;}, вообще факт коррекции таймера зависел от того вывожу ли я диагностику по второму Уарту.
Глюкавость зависит от уровня оптимизации компилятора.
Совершенно непонятно поведение регистра совпадения.
Нутром чую, надо где-то и какой-то барьер поставить. Где и какой, знаний не хватает. Где, даже догадываюсь, перед включением DMA, а какой?