STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Fiamma
Родился
Сообщения: 2
Зарегистрирован: Пн мар 31, 2014 15:31:46

Re: STM32 новичку в ARM что к чему

Сообщение Fiamma »

Доброго времени суток!

Целый рабочий день пытаюсь ресетнуть регистр TIM3->CNT. Казалось бы, все просто:

Код: Выделить всё

TIM3->CNT = 0x00;


Но не тут-то было. Отладчик в IAR с упорством сумасшедшего показывает мне, что регистр обнулен не был. Объясню поподробнее.
Вот есть такой код, в котором я пытаюсь сделать так, чтобы флаг переполнения счетчика никогда не поднимался:

Код: Выделить всё

do
{
     TIM3->EGR = 0x01;
} while ((TIM3->SR & 0x01) != 1);


Но это не работает. Аналогичный вариант с топорным обнулением счетного регистра. Ну, не может такого быть, чтобы настроенный на частоту 1 МГц таймер за время проверки условия выхода из цикла досчитал до 65535 и обнулился! Может, я настраиваю чего не так:

Код: Выделить всё

RCC->APB1ENR |= RCC_APB1Periph_TIM3;
TIM3->CR1 = 0;
TIM3->ARR = 0xffff;
TIM3->PSC = (uint16_t) (SystemCoreClock  / 1000000) - 1;
TIM3->EGR = TIM_PSCReloadMode_Immediate;


Вся эта чертовщина происходит на STM32F0 discovery. Но отчего она?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

может так: TIM3->CNT = 0x0000;
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 952
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение GARMIN »

Fiamma писал(а):Доброго времени суток!

Целый рабочий день пытаюсь ресетнуть регистр TIM3->CNT. Казалось бы, все просто:

Код: Выделить всё

TIM3->CNT = 0x00;

Вся эта чертовщина происходит на STM32F0 discovery. Но отчего она?

У меня тоже STM32F051 не очень дружит с IAR.
И в отладке тоже свои грабли. Например - с точкой останова напротив подпрограммы.
В твоём случае проверь, можно ли в окошке регистров вручную поменять значение регистра CNT. Если сработает - смотри ассемблерный листинг и значения регистров процессора.
Fiamma
Родился
Сообщения: 2
Зарегистрирован: Пн мар 31, 2014 15:31:46

Re: STM32 новичку в ARM что к чему

Сообщение Fiamma »

может так: TIM3->CNT = 0x0000;


Если уж совсем неукоснительно следовать букве даташита, то надо вот так:
TIM3->CNT = 0x00000000;

Но все оказалось значительно проще. Оказывается, обнулять счет таймера можно только после его остановки, что, с одной стороны, довольно логично, а с другой - как будто бессмысленно, ведь на остановку и запуск теряется драгоценное время, которое я с помощью таймера как раз и пытаешься отследить.

Точки останова напротив желаемой строки, бывает, не ставятся из-за волшебной иаровской оптимизации. Если у тебя выбрана какая-нибудь степень оптимизации в опциях проекта, то, считай, все, отследить что-либо будет уже не возможно, потому что оптимизация сожрет кусок твоего кода, развернет циклы и вообще будет думать за тебя.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

неукоснительно следовать букве даташита

Изображение
вроде же правильнее TIM3->CNT = 0x0000;
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 новичку в ARM что к чему

Сообщение HHIMERA »

Fiamma писал(а):настроенный на частоту 1 МГц таймер

Откуда??? 48000000 / 48 / 65536 = 15,2587890625 Гц...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Леонид Иванович »

Очевидно, Fiamma имел в виду не частоту переполнений, а тактовую частоту таймера (т.е. выход прескалера), которая равна 1 МГц.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32 новичку в ARM что к чему

Сообщение ut1wpr »

oleg110592 писал(а):
неукоснительно следовать букве даташита

вроде же правильнее TIM3->CNT = 0x0000;

Ноль безразмерный. Компилятору пофиг. Но если так уж хочется...

Код: Выделить всё

TIM3->CNT = 0U;
С уважением,
Виктор.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 новичку в ARM что к чему

Сообщение HHIMERA »

Леонид Иванович писал(а):Очевидно, Fiamma имел в виду не частоту переполнений, а тактовую частоту таймера (т.е. выход прескалера), которая равна 1 МГц.

Может быть... но чтобы UG не работал... нонсенс... две строчки в даташите прочитать...
Народ вот... нули обкатывает... у кого нулявее и нулястее... весело...
"Я не даю готовых решений, я заставляю думать!"(С)
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32 новичку в ARM что к чему

Сообщение ut1wpr »

HHIMERA писал(а):Народ вот... нули обкатывает... у кого нулявее и нулястее... весело...
Каждый резвится на своей лужайке.. :)
С уважением,
Виктор.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

Та не нули обкатываем - непонятно в документации F0 TIM3->CNT Reset value: 0x00000000, а в регистре 16 бит, где делись еще 16 бит, в документации F4 - для TIM3->CNT Reset value: 0x0000
Аватара пользователя
kisssko
Открыл глаза
Сообщения: 52
Зарегистрирован: Пт янв 10, 2014 02:05:13
Откуда: Воронеж

Re: STM32 новичку в ARM что к чему

Сообщение kisssko »

Надо просто в инклудник глянуть, какой тип там прописан для TIM3.CNT - столько и нулей писать. :)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

в файле stm32f0xx.h структура TIM_TypeDef:

Код: Выделить всё

 __IO uint32_t CNT;             /*!< TIM counter register, Address offset: 0x24 */
 __IO uint16_t PSC;             /*!< TIM prescaler register, Address offset: 0x28 */

"просто глянуть" - не прояснило:
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.
.....
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 новичку в ARM что к чему

Сообщение HHIMERA »

Да всё там есть...

Код: Выделить всё

/*******************  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 */
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

и все таки
14.4.10 TIM3 counter ( TIM3_CNT)
Address offset: 0x24
Reset value: 0x00000000

в документации ошибка, или задел на будущее?
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 новичку в ARM что к чему

Сообщение HHIMERA »

Ошибка, злокопипаст... какая разница... хоть в восьмиричной туда ноль пиши...
По факту - таймер 16-ти разрядный... всё лишнее лихо обрежется...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
kisssko
Открыл глаза
Сообщения: 52
Зарегистрирован: Пт янв 10, 2014 02:05:13
Откуда: Воронеж

Re: STM32 новичку в ARM что к чему

Сообщение kisssko »

У stm32 большинство регистров - 32 битные. Некоторые допускают 16 и 8 битовый доступ.
Просто не у всех все 32 бита используются. И тогда не значащие биты просто игнорируются.

Но вот с точки зрения компилятора то значение правильное, которое соответствует объявленному типу.
Хотя, он может и не сказать ничего, а молча преобразовать тип. Особенно, если из короткого в длинный.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 новичку в ARM что к чему

Сообщение HHIMERA »

kisssko писал(а):У stm32 большинство регистров - 32 битные. Некоторые допускают 16 и 8 битовый доступ.

Это всё яснопонятная хрень... может не всем...
Просто не у всех все 32 бита используются. И тогда не значащие биты просто игнорируются.

Ващета... не всегда... прецеденты есть...
А так... ну есть злокопипаст, ошибки и прочая хрень в документации... по TIM в частности... а как же без них...
Для ленивых - юзать SPL...
Для остальных - разбираться и отталкиваться от того, что все таймера, по сути, во всех STM32 +- одинаковы... референсы других линеек часто могут пролить свет... и юзать средства визуализации... без них всё печально...
Но вот с точки зрения компилятора то значение правильное, которое соответствует объявленному типу.
Хотя, он может и не сказать ничего, а молча преобразовать тип. Особенно, если из короткого в длинный.

Как и из длинного в короткий... на то он и умный компилятор...
"Я не даю готовых решений, я заставляю думать!"(С)
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32 новичку в ARM что к чему

Сообщение ut1wpr »

Fiamma писал(а):Доброго времени суток!

Целый рабочий день пытаюсь ресетнуть регистр TIM3->CNT. Казалось бы, все просто:

Код: Выделить всё

TIM3->CNT = 0x00;


Но не тут-то было. Отладчик в IAR с упорством сумасшедшего показывает мне, что регистр обнулен не был. Объясню поподробнее.
А если предположить, что таймер при дебаггинге просто не останавливается? Живет себе своей жизнью и плюет на ИАР. Попробуйте иной способ проверки на обнуление. Ну, хотя бы при запрещенных прерываниях, при "стоячем таймере" :)
С уважением,
Виктор.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

ut1wpr писал(а):А если предположить, что таймер при дебаггинге просто не останавливается?


Дык подобные "грабли" и на 8ми битках многих "разработчиков" в ступор вводили . :)))
Но. В новой периферии - F4,F3,F0 есть Debug MCU APB1 freeze register и Debug MCU APB2 freeze register .
В старой так же кое что замораживается при дебаге, стоит поискать в референс мануале по freeze .

Зы. "Размерность" нуля - достойна баша ... :)))
Ответить

Вернуться в «ARM»