• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ustawianie flag w przerwaniu timera - dobrze, czy źle

0 głosów
33 wizyt
pytanie zadane 11 października w Arduino przez Spektral Początkujący (400 p.)

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ź.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 118 wizyt
0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 2 czerwca 2016 w C i C++ przez Squidy Bywalec (2,310 p.)
0 głosów
2 odpowiedzi 75 wizyt
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

56,372 zapytań

101,068 odpowiedzi

208,201 komentarzy

28,042 pasjonatów

Przeglądających: 345
Pasjonatów: 13 Gości: 332

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...