5 прерывание микросекунды является высоким просить процессор на 80 МГц, и оставит мало время для другой работы, и если вы не выполняете другую работу, вам не нужно использовать прерывания вообще - вы можете просто опросить счетчик часов; то все равно будет много процессора, чтобы бросить на довольно тривиальную задачу - и RTOS тоже переборщит.
Лучший способ выполнить вашу задачу - использовать функцию PWM (широтно-импульсная модуляция) таймера. После этого вы сможете точно контролировать яркость с нулевыми накладными расходами программного обеспечения; оставляя ваш процессор делать более интересные вещи.
Используя PWM, вы можете управлять с гораздо более низким процессором производительности, если управление светодиодами - это все, что он сделает.
Если вы должны использовать прерывание/GPIO (например, ваш таймер не поддерживает генерацию PWM или светодиод не подключен к штырю с поддержкой PWM), тогда было бы более эффективно устанавливать таймер пошагово. Например, для отметки: пространство 150: 105, вы должны установить таймер для 150 * 5us (9,6 мс), при прерывании переключить GPIO, а затем установить таймер на 105 * 5us (6,72 мс).
Основная проблема с вашим решением заключается в том, что обработчик прерываний не возвращается - прерывания должны выполняться до завершения и быть как можно короче и предпочтительно детерминированными во время выполнения.
без использования аппаратного ШИМ, следующие на основе вашего фрагмента кода, вероятно, ближе к тому, что вам нужно:
#define PWM_QUANTA = 400 ; // 5us
static volatile uint8_t brightness = 150 ;
static Clock_Handle myClock ;
void setBrightness(uint8_t br)
{
brightness = br ;
}
void SetUp(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
GPIOPinTypeGPIOOutput(PORT_4, PIN_1);
Clock_Params clockParams;
Error_Block eb;
Error_init(&eb);
Clock_Params_init(&clockParams);
clockParams.period = brightness * PWM_QUANTA ;
clockParams.startFlag = TRUE;
myClock = Clock_create(myHandler1, 400, &clockParams, &eb);
if (myClock == NULL)
{
System_abort("Clock create failed");
}
}
void myHandler1(void)
{
static int pin_state = 1 ;
// Toggle pin state and timer period
if(pin_state == 0)
{
pin_sate = 1 ;
Clock_setPeriod(myClock, brightness * PWM_QUANTA) ;
}
else
{
pin_sate = 0 ;
Clock_setPeriod(myClock, (255 - brightness) * PWM_QUANTA) ;
}
// Set pin state
GPIOPinWrite(PORT_4, PIN_1, pin_state) ;
}
Вы не уверены, что это правильно? Ты это пробовал? Обработчик прерываний с бесконечным циклом вряд ли будет работать вообще! Если счетчик был 'uint8_t', вам также не нужен'% 256'. – Clifford