Неожиданный актерский состав во время задания

В библиотеке stm32 есть фрагмент кода, который ведет себя странно. Это назначение, сделанное из инициализирующей структуры в регистр автоперезагрузки таймера:

/* Set the Autoreload value */
TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;

Я TIM_Period = 1999999Однако после назначения TIMx->ARR = 33919, Меньшее число обычно указывает на переполнение, поэтому я проверил: (1999999-33919) / 65536 = 30, Это будет означать, что число переполнено 30 раз для 16-битного типа данных, но обе переменные представляют собой 32-битные целые числа без знака. Извлечено из объявлений структуры:

Для TIMx:

  __IO uint32_t ARR;         /*!< TIM auto-reload register,            Address offset: 0x2C */

Для TIM_TimeBaseInitStruct:

uint32_t TIM_Period;            /*!< Specifies the period value to be loaded into the active
Auto-Reload Register at the next update event.
This parameter must be a number between 0x0000 and 0xFFFF.  */

куда __IO определяется как volatile,

Это разборка этого назначения:

 296        TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
0800c37c:   ldr r3, [r7, #0]
0800c37e:   ldr r2, [r3, #4]
0800c380:   ldr r3, [r7, #4]
0800c382:   str r2, [r3, #44]       ; 0x2c

Что здесь происходит … может ли это быть что-то внешнее, вызывая переполнение значения? Обратите внимание, что я отлаживаю на реальном оборудовании через ST-Link без оптимизации кода.

3

Решение

Я собираюсь догадаться, что у вашего чипа есть 16-битные регистры таймера. То есть это может быть 32-битный регистр, но в нем всего 16 полезных битов.

Что-то вроде:

 31                16 15               0
+--------------------+------------------+
|      RESERVED      | Auto-reload value|
+--------------------+------------------+

Ожидается проверка фактов (если у вас есть конкретный номер детали, который поможет мне).

Изменить: глядя на некоторую документацию [PDF ссылка], мое предположение, кажется, подтверждается:

введите описание изображения здесь

Изменить 2: Поскольку вы упомянули, какой чип вы использовали, я нашел эту документацию тоже [PDF ссылка], которая содержит эту удобную диаграмму:

введите описание изображения здесь

Как видите, некоторые таймеры имеют 32-битную автозагрузку, а некоторые нет. Какой таймер вы выберете, повлияет на поведение, которое вы видите.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]