Но не тут-то было. Отладчик в IAR с упорством сумасшедшего показывает мне, что регистр обнулен не был. Объясню поподробнее.
Вот есть такой код, в котором я пытаюсь сделать так, чтобы флаг переполнения счетчика никогда не поднимался:
do
{
TIM3->EGR = 0x01;
} while ((TIM3->SR & 0x01) != 1);
Но это не работает. Аналогичный вариант с топорным обнулением счетного регистра. Ну, не может такого быть, чтобы настроенный на частоту 1 МГц таймер за время проверки условия выхода из цикла досчитал до 65535 и обнулился! Может, я настраиваю чего не так:
Вся эта чертовщина происходит на STM32F0 discovery. Но отчего она?
У меня тоже STM32F051 не очень дружит с IAR.
И в отладке тоже свои грабли. Например - с точкой останова напротив подпрограммы.
В твоём случае проверь, можно ли в окошке регистров вручную поменять значение регистра CNT. Если сработает - смотри ассемблерный листинг и значения регистров процессора.
Если уж совсем неукоснительно следовать букве даташита, то надо вот так:
TIM3->CNT = 0x00000000;
Но все оказалось значительно проще. Оказывается, обнулять счет таймера можно только после его остановки, что, с одной стороны, довольно логично, а с другой - как будто бессмысленно, ведь на остановку и запуск теряется драгоценное время, которое я с помощью таймера как раз и пытаешься отследить.
Точки останова напротив желаемой строки, бывает, не ставятся из-за волшебной иаровской оптимизации. Если у тебя выбрана какая-нибудь степень оптимизации в опциях проекта, то, считай, все, отследить что-либо будет уже не возможно, потому что оптимизация сожрет кусок твоего кода, развернет циклы и вообще будет думать за тебя.
Леонид Иванович писал(а):Очевидно, Fiamma имел в виду не частоту переполнений, а тактовую частоту таймера (т.е. выход прескалера), которая равна 1 МГц.
Может быть... но чтобы UG не работал... нонсенс... две строчки в даташите прочитать...
Народ вот... нули обкатывает... у кого нулявее и нулястее... весело...
"Я не даю готовых решений, я заставляю думать!"(С)
Та не нули обкатываем - непонятно в документации F0 TIM3->CNT Reset value: 0x00000000, а в регистре 16 бит, где делись еще 16 бит, в документации F4 - для TIM3->CNT Reset value: 0x0000
14.2 TIM3 main features
* General-purpose TIMx timer features include: 16-bit (TIM3) up, down, up/down auto-reload counter.
* 16-bit programmable prescaler used to divide (also “on the fly”) the counter clock frequency by any factor between 1 and 65535.
.....
/******************* Bit definition for TIM_CNT register ********************/
#define TIM_CNT_CNT ((uint16_t)0xFFFF) /*!<Counter Value */
/******************* Bit definition for TIM_PSC register ********************/
#define TIM_PSC_PSC ((uint16_t)0xFFFF) /*!<Prescaler Value */
/******************* Bit definition for TIM_ARR register ********************/
#define TIM_ARR_ARR ((uint16_t)0xFFFF) /*!<actual auto-reload Value */
/******************* Bit definition for TIM_RCR register ********************/
#define TIM_RCR_REP ((uint8_t)0xFF) /*!<Repetition Counter Value */
/******************* Bit definition for TIM_CCR1 register *******************/
#define TIM_CCR1_CCR1 ((uint16_t)0xFFFF) /*!<Capture/Compare 1 Value */
"Я не даю готовых решений, я заставляю думать!"(С)
У stm32 большинство регистров - 32 битные. Некоторые допускают 16 и 8 битовый доступ.
Просто не у всех все 32 бита используются. И тогда не значащие биты просто игнорируются.
Но вот с точки зрения компилятора то значение правильное, которое соответствует объявленному типу.
Хотя, он может и не сказать ничего, а молча преобразовать тип. Особенно, если из короткого в длинный.
kisssko писал(а):У stm32 большинство регистров - 32 битные. Некоторые допускают 16 и 8 битовый доступ.
Это всё яснопонятная хрень... может не всем...
Просто не у всех все 32 бита используются. И тогда не значащие биты просто игнорируются.
Ващета... не всегда... прецеденты есть...
А так... ну есть злокопипаст, ошибки и прочая хрень в документации... по TIM в частности... а как же без них...
Для ленивых - юзать SPL...
Для остальных - разбираться и отталкиваться от того, что все таймера, по сути, во всех STM32 +- одинаковы... референсы других линеек часто могут пролить свет... и юзать средства визуализации... без них всё печально...
Но вот с точки зрения компилятора то значение правильное, которое соответствует объявленному типу.
Хотя, он может и не сказать ничего, а молча преобразовать тип. Особенно, если из короткого в длинный.
Как и из длинного в короткий... на то он и умный компилятор...
"Я не даю готовых решений, я заставляю думать!"(С)
Но не тут-то было. Отладчик в IAR с упорством сумасшедшего показывает мне, что регистр обнулен не был. Объясню поподробнее.
А если предположить, что таймер при дебаггинге просто не останавливается? Живет себе своей жизнью и плюет на ИАР. Попробуйте иной способ проверки на обнуление. Ну, хотя бы при запрещенных прерываниях, при "стоячем таймере"
ut1wpr писал(а):А если предположить, что таймер при дебаггинге просто не останавливается?
Дык подобные "грабли" и на 8ми битках многих "разработчиков" в ступор вводили .
Но. В новой периферии - F4,F3,F0 есть Debug MCU APB1 freeze register и Debug MCU APB2 freeze register .
В старой так же кое что замораживается при дебаге, стоит поискать в референс мануале по freeze .