Я пытаюсь создать библиотеку для stm32. Как я могу обрабатывать "delayus или delayms") без использования "DelayHandle_t *delay1"
И как я могу использовать переменную «myTicks» в качестве глобальной переменной, потому что я не могу использовать ее для прерывания
void Delayus(uint8_t value,DelayHandle_t *delay1)
{
//enable timer 4
TIM4->CCR1 |= TIM_CR1_CNE;
delay1->myTicks = 0;
while(*(delay1->myTicks) < value);
TIM4->CCR1 &= ~TIM_CR1_CNE;
}
void Deleyms(uint8_t value,DelayHandle_t *delay1)
{
TIM4->CCR1 |= TIM_CR1_CNE;
delay1->myTicks = 0;
while(*(delay1->myTicks) < (value*1000));
TIM4->CCR1 &= ~TIM_CR1_CNE;
}
void TIM4_IRQHandler()
{
delay1->myTicks ++;
TIM4->SR &= ~(TIM_SR_UIF);
}





Более простой способ реализации микросекундных задержек на STM32 — просто настроить таймер на период 1 мкс и считать его счетчик. Вы должны использовать предварительный делитель, чтобы дать вам правильный период. например если тактовая частота, входящая в таймер, составляет 16 МГц, вы хотите разделить ее на 16. Вам нужно установить предварительный делитель на единицу меньше, например.
TIM4->PSC = 15; // Divide by 16, to get 1us period
Вы также можете настроить таймер на полный диапазон — для 16-битного таймера 0x0-0xffff:
TIME4->ARR = 0xFFFFu;
Обычно вы просто запускаете таймер и оставляете его включенным. Чтобы задержать, прочитайте счетчик в начале, а затем выполните цикл, ожидая, пока он увеличится на достаточное количество микросекунд для задержки.
Есть пара подводных камней. Некоторые таймеры на STM32 являются 16-битными таймерами (TIM4 на STM32F030...). И вы также не знаете, насколько вы близки к следующему «тику». Простое ожидание увеличения счетчика на X означает, что вы задерживаетесь между (X-1) и (X) микросекундами. Если вам нужно гарантировать не менее X микросекунд, добавьте единицу к значению задержки. Собрав все это вместе, вы можете получить что-то вроде этого:
void Delayus(uint32_t us)
{
uint16_t start;
uint32_t remaining = us + 1u; // Add one to guarantee 'at least' us
start = TIM4->CNT;
while (remaining > 0u)
{
uint16_t delay = (remaining > 0xFFFFu) ? 0xFFFFu : (uint16_t)remaining;
uint16_t end;
remaining -= delay;
do {
end = TIM4->CNT;
} while ((end - start) < delay);
start = end;
}
}
Это должно корректно справляться с любой задержкой до 0xFFFFFFFEu микросекунд.
Если все, для чего вы хотите использовать этот таймер, — это включить задержки в микросекундах, вы можете покончить с прерываниями и программными счетчиками. Просто оставьте TIM4 всегда включенным. Для задержки прочтите значение его счетчика (TIM4->CNT), затем подождите, пока оно не увеличится достаточное количество раз.