Witam. Moje pytanie tyczy się ogólnie programowania mikrokontrolerów. Oto kod dla STM32:
#include <string.h>
#include "stm32f1xx.h"
UART_HandleTypeDef uart;
TIM_HandleTypeDef tim2;
int status = 0;
void send_string(char* s)
{
HAL_UART_Transmit(&uart, (uint8_t*)s, strlen(s), 1000);
}
void TIM2_IRQHandler(void)
{
HAL_TIM_IRQHandler(&tim2);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
status = 1;
}
int main(void)
{
SystemCoreClock = 8000000; // taktowanie 8Mhz
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
GPIO_InitTypeDef gpio;
gpio.Mode = GPIO_MODE_AF_PP;
gpio.Pin = GPIO_PIN_2;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &gpio);
gpio.Mode = GPIO_MODE_AF_INPUT;
gpio.Pin = GPIO_PIN_3;
HAL_GPIO_Init(GPIOA, &gpio);
uart.Instance = USART2;
uart.Init.BaudRate = 115200;
uart.Init.WordLength = UART_WORDLENGTH_8B;
uart.Init.Parity = UART_PARITY_NONE;
uart.Init.StopBits = UART_STOPBITS_1;
uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
uart.Init.OverSampling = UART_OVERSAMPLING_16;
uart.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&uart);
tim2.Instance = TIM2;
tim2.Init.Period = 1000 - 1;
tim2.Init.Prescaler = 8000 - 1;
tim2.Init.ClockDivision = 0;
tim2.Init.CounterMode = TIM_COUNTERMODE_UP;
tim2.Init.RepetitionCounter = 0;
tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Base_Init(&tim2);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
HAL_TIM_Base_Start_IT(&tim2);
while (1)
{
if(status == 1)
{
send_string("Hello world!\r\n");
status = 0;
}
}
}
Kod ten drukuję napis co 1s. Ustawiam sobie flagę w przerwaniu i działa wszystko w porządku.
Jak zrobić tak działający program bez ustawania flag w przerwaniu? Wysyłanie napisu w samym przerwaniu nie jest rozwiązaniem, bo jeżeli co sekundę trzeba na przykład odświeżyć wyświetlacz OLED, to rozwiązanie takie będzie zabronione.
Dodam, że usłyszałem opinie, że ustawianie flag jest nieeleganckie, wręcz błędne.
Proszę o jakąś podpowiedź.