MaxiMuz 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Добавьте перед запуском таймера: // generate an update event to load the PSC and ARR values immediately TIM3->EGR = TIM_EGR_UG; пробывал вот так: /* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */ TIM2->ARR=(6500); // загрузка рег-ра для сравнения 366,2109375/350=1 Hz TIM2->PSC=(65535-1); // предделитель CK_CNT=24000000/65536=366,2109375 Hz TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера TIM2->EGR = TIM_EGR_UG; TIM2->SR =~(TIM_SR_UIF);// сброс ф.прерывания TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера /* Разрешение прерывания TIM2 */ NVIC_EnableIRQ(TIM2_IRQn); Не работает, таймер также запускается при ресет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба У вас прерывание назначено на событие обновления (UPDATE). Вы сначала разрешаете это прерывание, а потом генерируете событие обновления. Вот прерывание и возникает. Надо сгенерировать событие обновления, потом сбросить флаг, а уже потом разрешать прерывания: TIM2->ARR = 6500; TIM2->PSC = 65535-1; TIM2->EGR = TIM_EGR_UG; TIM2->SR = ~TIM_SR_UIF; TIM2->DIER |= TIM_DIER_UIE; TIM2->CR1 |= TIM_CR1_CEN; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaxiMuz 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 (изменено) · Жалоба Надо сгенерировать событие обновления, потом сбросить флаг, а уже потом разрешать прерывания: TIM2->ARR = 6500; TIM2->PSC = 65535-1; TIM2->EGR = TIM_EGR_UG; TIM2->SR = ~TIM_SR_UIF; TIM2->DIER |= TIM_DIER_UIE; TIM2->CR1 |= TIM_CR1_CEN; тоже самое Похоже что TIM2->SR =~(TIM_SR_UIF); не сбразывает сам "запрос" на прерывание Изменено 22 апреля, 2014 пользователем MaxiMuz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 22 апреля, 2014 Опубликовано 22 апреля, 2014 (изменено) · Жалоба тоже самое Похоже что TIM2->SR =~(TIM_SR_UIF); не сбразывает сам "запрос" на прерывание Попробуйте еще добавить: TIM2->ARR = 6500; TIM2->PSC = 65535-1; TIM2->EGR = TIM_EGR_UG; TIM2->SR = ~TIM_SR_UIF; NVIC_ClearPendingIRQ(TIM2_IRQn); TIM2->DIER |= TIM_DIER_UIE; TIM2->CR1 |= TIM_CR1_CEN; Изменено 22 апреля, 2014 пользователем KnightIgor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaxiMuz 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Выясненно опытным путем с использованием документа "Cortex-M3 programming manual". Сброс флага статусного регистра TIM2->SR =~(TIM_SR_UIF); не приводит к сбросу самого запроса на прерывание. Чтобы сбросить запрос на прерывания делаем: 1. После загрузки временных прарметров разрешаем прерывание по срабатыванию таймера 2. генерим событие таймера UG 3. Ждем один такт и только потом сбрасиываем флаг прерывания в регистре статуса таймера 4. Запускаем Таймер 5. Очищаем Interrupt clear-pending registers (NVIC_ICPRx) 6. И только потом включаем разрешение на прерывание /* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */ TIM2->ARR=(1500); // загрузка рег-ра для сравнения ~ 366/1500=0,244 Hz TIM2->PSC=(65535-1); // предделитель CK_CNT=24000000/65536=366,2109375 Hz TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера TIM2->EGR = TIM_EGR_UG; // генерим событие таймера __NOP(); TIM2->SR =~(TIM_SR_UIF);// сброс ф.прерывания TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера NVIC_ClearPendingIRQ (TIM2_IRQn); /* Разрешение прерывания TIM2 */ NVIC_EnableIRQ(TIM2_IRQn); Если закоментить nop, то сброс события таймера не проходит. Собственно вопрос такой , если мы в конце сбрасываем бит запроса на прерывания от таймера2 , тогда уже не важно какие события произошли до этого , прерывание по идее не ожидается, правильно ? Но если я убираю команду TIM2->EGR = TIM_EGR_UG; // генерим событие таймера , то таймер сразу после разрешения прерывания запускается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Haamu 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба 1. После загрузки временных прарметров разрешаем прерывание по срабатыванию таймера 2. генерим событие таймера UG 3. Ждем один такт и только потом сбрасиываем флаг прерывания в регистре статуса таймера 4. Запускаем Таймер 5. Очищаем Interrupt clear-pending registers (NVIC_ICPRx) 6. И только потом включаем разрешение на прерывание Как-то сложно всё это получается. Попробуйте просто: 1. Запустить таймер 2. Разрешить прерывание Именно в такой последовательности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 22 апреля, 2014 Опубликовано 22 апреля, 2014 · Жалоба Но если я убираю команду TIM2->EGR = TIM_EGR_UG; смысл команды не сгенерить прерывание смысл команды вызвать событие и обновить регистры таймера, обновление которых происходит по событию, которое в свою очередь и генерит прерывание. Прерывание в данном случае - побочный эффект от обновления таймера. Как-то сложно всё это получается. Попробуйте просто: 1. Запустить таймер 2. Разрешить прерывание Именно в такой последовательности. и будет исходная задача, без вызова события не произойдет настройки таймера, а событие вызовет прерывание, потому сразу после разрешения прерывания в вашем случае полетите либо по таймеру работающему по старыми настройкам, либо если обновили настройки, то сразу по прерыванию... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба REGISTR = (DEFAULT_VAL & (~INTERRUPT)); - правильно Да тоже неправильно... :) DEFAULT_VAL равно нулю... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба правильно DEFAULT_VAL равно не нулю, а тому чему оно должно быть равно для сохранения верных значений записываемых битиков.... это на случай если в регистры какие то битики обязаны записываться нулевыми, какие то единичками, правда я чет не припомню проца где это было нужно (в смысле где часть битов надо было оставлять 0, а часть 1, обычно все одинаковые) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 23 апреля, 2014 Опубликовано 23 апреля, 2014 (изменено) · Жалоба DEFAULT_VAL равно не нулю, а тому чему оно должно быть равно для сохранения верных значений записываемых битиков.... Тогда уже лучше написать DEFAULT_VAL_MASK, где все биты с атрибутом RES должны быть нулями, а устанавливаемые флаги единицами... а не DEFAULT_VAL... Я не ради докопаться... просто на другом форуме вопрошающий уже выдал непонимание происходящего... Изменено 23 апреля, 2014 пользователем HHIMERA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба Тогда уже лучше написать DEFAULT_VAL_MASK, где все биты с атрибутом RES должны быть нулями, а устанавливаемые флаги единицами... Их нельзя нулями. По мануалу нужно сохранять состояние после сброса. То есть "честное" формирование DEFAULT_VAL должно быть таким: reg_def_val = reg | <все флаги типа w0c> или reg_def_val = reg & ~<все флаги типа w1c> Не уверен, что кто-то так делает, конечно :) я чет не припомню проца где это было нужно (в смысле где часть битов надо было оставлять 0, а часть 1, обычно все одинаковые) Бывает, хотя в статусных регистрах тоже не встречал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба Их нельзя нулями. По мануалу нужно сохранять состояние после сброса. В данном случае Reset value: 0x0000, согласно мануалу. Если речь идет о TIMx_SR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба Не уверен, что кто-то так делает, конечно :) Да... сомнения присутствуют... А по поводу... По мануалу нужно сохранять состояние после сброса. Примеры SPL это отвергают напрочь... т.е. всё на совести и знаниях кодера... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба да я тоже часто в ПЛИС делают некоторые резервные биты, которые не использую, и сам их нулю внутри автоматов, но на всякий случай, мало ли чего забуду, в описании требую такие биты в регистрах не трогать. Думаю тут также, если их трогать скорее всего ничего не будет, но мало ли что, потому и приписка такая, чтоб наверняка! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 23 апреля, 2014 Опубликовано 23 апреля, 2014 · Жалоба если их трогать скорее всего ничего не будет В каком-то таймере STM32... точно уже не помню... где по референсу бит OPM отсутствует... попробовал как-то его установить... на авось... а вдруг... Результат - таймер затыкался... т.е. все эти предупреждения... как бы и не на ровном месте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться