Сергей Борщ 134 12 июня Опубликовано 12 июня · Жалоба 22 минуты назад, Plain сказал: Про CC2IE есть сноска в таблице. В руководстве пользователя 12 таблиц в разделе, посвященном LPTIM. Ни под одной из них я упоминания CC2IE не нашел. Какую именно таблицу вы имеете ввиду? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 198 12 июня Опубликовано 12 июня · Жалоба Table 221. LPTIM register map and reset values Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 12 июня Опубликовано 12 июня · Жалоба 1 час назад, Plain сказал: Table 221. LPTIM register map and reset values С этим все в порядке. P.S. А какая частота шины APB для таймера? Я бы попробовал ее сильно снизить для эксперимента. Вдруг так окажется, что прерывания в NVIC там заведены импульсного типа и они на высокой частоте не успевают защелкнуться. Но это, конечно, скорее, исключительное "из ряда вон". P.S. По Errata пробегались? Там есть несколько пунктов интересных про LPTIM (в т.ч. про его тактирование от PLL2 - я не знаю что у Вас там). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 12 июня Опубликовано 12 июня · Жалоба 1 час назад, Plain сказал: Table 221 Ой. 13 таблиц. Но да, тут два канала и соответствующий флаг в ISR выставляется. А проблема с любым флагом. Ни одно событие, взводящее флаг в ISR, не вызывает прерывание. 22 минуты назад, Arlleex сказал: P.S. А какая частота шины APB для таймера? Я бы попробовал ее сильно снизить для эксперимента. На APB включен делитель 2. Попробовал 16 - не помогает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 12 июня Опубликовано 12 июня · Жалоба Крайнее мое предложение (больше пока мыслей нет) - а расставьте барьеры DSB (а еще лучше - для теста - добавьте небольшие циклы пустого ожидания в виде NOP) между всеми операциями записи в регистры LPTIM. На STM32F4 для записи таймерных регистров я тоже однажды ловил интересные глюки с выставлением флагов (хотя не флагов прерываний). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 198 12 июня Опубликовано 12 июня · Жалоба 1 час назад, Arlleex сказал: С этим все в порядке Вы о чём? Речь о количестве каналов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 76 12 июня Опубликовано 12 июня · Жалоба В 11.06.2024 в 18:51, Сергей Борщ сказал: Таймер стартует, импульсы на выходе вижу, в регистре LPTIMx->ISR нужные флаги появляются, а в NVIC->ISPR2 соответствующий бит не взводится и обработчик прерывания, соответственно, не вызывается. Что я делаю не так??? А в errata есть такой пункт, может быть там где-то собака порылась?: When any interrupt bit of the LPTIM_DIER register is modified, the corresponding flag of the LPTIM_ISR register is cleared by hardware Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 12 июня Опубликовано 12 июня · Жалоба 1 час назад, Arlleex сказал: а расставьте барьеры DSB (а еще лучше - для теста - добавьте небольшие циклы пустого ожидания в виде NOP) между всеми операциями записи в регистры LPTIM. Лучше не барьеры, а операции обратного чтения после каждой записи в регистры конфигурации таймера. Т.е. - после записи каждого регистра таймера - сделать чтение из него. Впрочем - выше я уже предлагал это, но не знаю - делалось ли это или нет? На XMC4xxx во многих случаях, необходимо такое обратное чтение после записи в какой-либо регистр периферии, если сразу после этого идёт другая запись, в другой регистр, зависящая от эффекта предыдущей записи. Например: запись значения X1 в регистр конфигурации периферии R1, а потом - следующая запись (в регистр R2), включающая эту периферию, режим включения которой зависит от записи X1. Если между записью R1 и R2 не вставить чтение R1, то может работать некорректно. Инструкции барьеров в этом случае не помогают. Только обратное чтение. На STM32F429 тоже сталкивался с таким в какой-то периферии (при работе на макс. частоте). В документации XMC4xxx упоминается необходимость таких обратных чтений между зависимыми записями в регистры конфигурации. В коде операция: LPTIM1->DIER = ... не факт что успевает выполниться до последующего разрешения таймера. Обратное чтение LPTIM1->DIER после записи, до разрешения таймера, должно дать гарантию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 12 июня Опубликовано 12 июня · Жалоба 49 минут назад, HardEgor сказал: А в errata есть такой пункт, может быть там где-то собака порылась?: Это учтено. Флаги в ISR у меня выставляются. Если их сбросить - выставляются снова. Тут все хорошо. Ставлю куб от безысходности... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 12 июня Опубликовано 12 июня · Жалоба В кубовом проекте прерывание происходит. "Будем искать". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 12 июня Опубликовано 12 июня · Жалоба 2 часа назад, Plain сказал: Вы о чём? Речь о количестве каналов. Я о них же. Посмотрите в табличке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 12 июня Опубликовано 12 июня · Жалоба 2 часа назад, Сергей Борщ сказал: В кубовом проекте прерывание происходит. "Будем искать". Следите за руками. Вот так не работает: LPTIM1->DIER = 0 | 0 * LPTIM_DIER_UEIE // Update event DMA request enable | 0 * LPTIM_DIER_CMP2OKIE // CCR2 update complete interrupt enable | 1 * LPTIM_DIER_CC2IE // Capture/Compare 2 interrupt enable | 0 * LPTIM_DIER_REPOKIE // RCR update interrupt enable | 0 * LPTIM_DIER_UEIE // Update event interrupt enable | 0 * LPTIM_DIER_DOWNIE // Direction change to down interrupt enable | 0 * LPTIM_DIER_UPIE // Direction change to up interrupt enable | 0 * LPTIM_DIER_ARROKIE // ARR update complete interrupt enable | 0 * LPTIM_DIER_CMP1OKIE // CCR1 update complete interrupt enable | 0 * LPTIM_DIER_EXTTRIGIE // External trigger valid edge interrupt enable | 0 * LPTIM_DIER_ARRMIE // Autoreload match interrupt enable | 0 * LPTIM_DIER_CC1IE // Capture/Compare 1 interrupt enable ; // enable timer LPTIM1->CR = 0 | 0 * LPTIM_CR_RSTARE // Reset after read enable, can be set when LPTIM is enabled | 0 * LPTIM_CR_COUNTRST // Reset counter, can be set when LPTIM is enabled | 0 * LPTIM_CR_CNTSTRT // Start in continuous mode, can be set when LPTIM is enabled | 0 * LPTIM_CR_SNGSTRT // Start in single pulse mode, can be set when LPTIM is enabled | 1 * LPTIM_CR_ENABLE // Enable ; А вот так работает: // enable timer LPTIM1->CR = 0 | 0 * LPTIM_CR_RSTARE // Reset after read enable, can be set when LPTIM is enabled | 0 * LPTIM_CR_COUNTRST // Reset counter, can be set when LPTIM is enabled | 0 * LPTIM_CR_CNTSTRT // Start in continuous mode, can be set when LPTIM is enabled | 0 * LPTIM_CR_SNGSTRT // Start in single pulse mode, can be set when LPTIM is enabled | 1 * LPTIM_CR_ENABLE // Enable ; LPTIM1->DIER = 0 | 0 * LPTIM_DIER_UEIE // Update event DMA request enable | 0 * LPTIM_DIER_CMP2OKIE // CCR2 update complete interrupt enable | 1 * LPTIM_DIER_CC2IE // Capture/Compare 2 interrupt enable | 0 * LPTIM_DIER_REPOKIE // RCR update interrupt enable | 0 * LPTIM_DIER_UEIE // Update event interrupt enable | 0 * LPTIM_DIER_DOWNIE // Direction change to down interrupt enable | 0 * LPTIM_DIER_UPIE // Direction change to up interrupt enable | 0 * LPTIM_DIER_ARROKIE // ARR update complete interrupt enable | 0 * LPTIM_DIER_CMP1OKIE // CCR1 update complete interrupt enable | 0 * LPTIM_DIER_EXTTRIGIE // External trigger valid edge interrupt enable | 0 * LPTIM_DIER_ARRMIE // Autoreload match interrupt enable | 0 * LPTIM_DIER_CC1IE // Capture/Compare 1 interrupt enable ; Хотя в в обоих случаях отладчик показывает, что нужные биты в DIER устанавливаются. Для регистров CCRx, ARR, RCR в документации явно указано, что писать их можно только при активированном (enabled) таймере, для CFGR - наоборот, при неактивном. На запись в DIER никаких ограничений в документации нет. Куб оказался ни при чем, но помог. В его проекте DIER вообще не трогался и влияющих на него галочек я не обнаружил. Куб просто запускал таймер и когда я, остановив программу, отладчиком включал нужные биты в DIER на уже включенном активированном и запущенном таймере - прерывания запускались. Вычитывать DIER после записи пробовал - не помогало. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 51 12 июня Опубликовано 12 июня · Жалоба Поздравляю с открытием клуба трансформации в ёжиков ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 12 июня Опубликовано 12 июня · Жалоба 2 часа назад, Сергей Борщ сказал: Следите за руками. Вот так не работает: ... А вот так работает: ... А если для обоих случаев посмотреть, что возвращает ISR->DIEROK? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 13 июня Опубликовано 13 июня · Жалоба 16 часов назад, Arlleex сказал: А если для обоих случаев посмотреть, что возвращает ISR->DIEROK? Да, вы правы - в первом случае DIEROK не выставляется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться