Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class Uart
{
public:
Uart (short ch, word bd, bool doinit);
Uart (short ch, word bd, word isrptr = 0);
~Uart(void);
static class Uart *self;
static void isr (void);
//тут какой-то код
protected:
//тут всякое разное
USART_TypeDef* Reg;
};
static class Uart *self;
USART_TypeDef* Reg
Является указателем на нужный нам регистр нужного порта для автоматизации.__disable_irq();
self = this;
....
switch (channel)
.....
Reg = (USART_TypeDef*) USART1_BASE;
IRQ_VECTOR_TABLE[USART1_IRQn + IRQ0_EX] = isrptr;
....
init();
__enable_irq();
class Uart *Uart::self = nullptr;
...
void Uart::isr(void)
{
if (self->Reg->SR & USART_SR_RXNE) //receive
{
self->Reg->SR &= ~USART_SR_RXNE;
}
else if (self->Reg->SR & USART_SR_TC) //transfer
{
self->Reg->SR &= ~USART_SR_TC;
}
}
class Gps: public Uart
{
public:
Gps(short ch, word bd) :
Uart::Uart(ch, bd, (word) &gpsisr)
{
Gps::self = this;
}
static void gpsisr(void);
static class Gps *self;
};
void Gps::gpsisr(void)
{
if (self->Reg->SR & USART_SR_RXNE)
{
short a = self->Reg->DR;
self->Reg->SR &= ~USART_SR_RXNE;
if (self->ready)
{
return;
}
if (0 == self->nmeastr_len && '$' != a)
{
return;
}
.....................И.Т.Д.
}
}
Динамическое управление прерываниями в ARM