[uquote="tonyk",url="/forum/viewtopic.php?p=4231592#p4231592"]А что сложного открыть исходники ХАЛа и посмотреть на то, что и как делает эта функция?[/uquote]
Ничего особенного в функции HAL_IncTick не происходит, просто лишние расчёты, но тоже неприятно, зачем оно мне.
Код: Выделить всё
extern __IO uint32_t uwTick;
__weak void HAL_IncTick(void)
{
uwTick += uwTickFreq;
}
Переменная uwTick в функции HAL_IncTick повышается с каждым прерыванием на 1.
Одно прерывание, переменная uwTick==1
Второе прерывание, переменная uwTick==2
Третье прерывание, переменная uwTick ==3
и.т.д.
Может это надо библиотеке HAL для установки частоты.
Но мне это будет мешать, зачем мне лишние 4 294 967 295 хранящиеся в переменной uwTick.
(При одном килогерце эта переменная переполнится через 49 дней.)
И HAL портить не хочется и использовать стандартную функцию SysTick_Handler хочется.
HAL мне кажется не очень хорошо поступил, занял чужую функцию.
Обнуление преременной uwTick нет, так что именно инкрементирование с каждым прерыванием идёт.
Моей функции это вредить не будет, но и зачем оно надо.
Спойлер
Код: Выделить всё
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
//-----------------------------------------------
extern __IO uint32_t uwTick;
typedef enum
{
HAL_TICK_FREQ_10HZ = 100U,
HAL_TICK_FREQ_100HZ = 10U,
HAL_TICK_FREQ_1KHZ = 1U,
HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ
} HAL_TickFreqTypeDef;
HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT;
__weak void HAL_IncTick(void)
{
uwTick += uwTickFreq;
}
Зачем инкрементировать эту переменную uwTick? Какое гениальное решение за этим кроется?
Отсчитывать сколько времени прошло? Это можно было бы сделать и без переполнения, например при достижении определённого значения uwTick обнулять эту переменную, считая секунды, а не миллисекунды.
Считая секунды переполнение беззнаковой int переменной наступит через 138 лет.
Нашёл единственное применение этой переменной в функции HAL_GetTick
Просто возвращает сколько натикало
Код: Выделить всё
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
С гарантией 49 дней получается.
А, хотя эта функция HAL_GetTick(); применяется в функции HAL_Delay
Спойлер
Код: Выделить всё
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while((HAL_GetTick() - tickstart) < wait)
{
}
}
Здесь переполнение думаю расчётам не повредит и 49 дней ограничения не будет.
Но функция SysTick_Handler занята
Функция HAL_GetTick() очень много где используется, так что да, лучше не ломать инкрементирование uwTick.
Минус 4 Байт в МК для переменной uwTick