ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
1113188
IBAH (29.06.2021 22:42, просмотров: 3255)
Я вас наверно утомил... Прошу помощи солидных АРМоводов. 

Система Кортекс М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, а какой?