В библиотеке 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 без оптимизации кода.
Я собираюсь догадаться, что у вашего чипа есть 16-битные регистры таймера. То есть это может быть 32-битный регистр, но в нем всего 16 полезных битов.
Что-то вроде:
31 16 15 0
+--------------------+------------------+
| RESERVED | Auto-reload value|
+--------------------+------------------+
Ожидается проверка фактов (если у вас есть конкретный номер детали, который поможет мне).
Изменить: глядя на некоторую документацию [PDF ссылка], мое предположение, кажется, подтверждается:
Изменить 2: Поскольку вы упомянули, какой чип вы использовали, я нашел эту документацию тоже [PDF ссылка], которая содержит эту удобную диаграмму:
Как видите, некоторые таймеры имеют 32-битную автозагрузку, а некоторые нет. Какой таймер вы выберете, повлияет на поведение, которое вы видите.
Других решений пока нет …