Программа простая:
1) Проинициализировал UART, и по нажатию кнопки высылаю строку.
2) По приему строки в прерывании мигаю светодиодами.
С отправкой проблем не возникло, так как там реализовал через прерывание порта вх/вых.
С приемом никак не получается, не входит в прерывание UART3. Не входит даже при отправке хотя вроде должен.
Включал/отключал буфер фифо, менял настройки по котором срабатывает прерывание фифо. Это не помогло.
В чем может быть проблема?
Код инициализации ниже.
Код: Выделить всё
void USART_Init(void)
{
// Vybor 3 alternativnoy funkcii dlya F12 and F13. Smotri ERRATA
NT_COMMON_REG->GPIOPCTLF_bit.PIN12 = 0x2, /*!< third alternative function for pin */
NT_COMMON_REG->GPIOPCTLF_bit.PIN13 = 0x2, /*!< third alternative function for pin */
// Vybor 2 alternativnoy funkcii dlya D1 and D2.
// D1 - RX
// D2 - TX
NT_GPIOD -> OUTENSET |= 0x0004; // VKLYCHITb PORT D[2] na VYHOD
NT_GPIOD->ALTFUNCSET |= (1 << 2) | (1 << 1); // vkl alternative function
NT_COMMON_REG->GPIOPCTLD_bit.PIN2 |= 0x1, /*!< second alternative function for pin */
NT_COMMON_REG->GPIOPCTLD_bit.PIN1 |= 0x1, /*!< second alternative function for pin */
NT_COMMON_REG->GPIODEND |= (1 << 2) | (1 << 1); // vkl D1 i D2
// UART 3 INIT. speed = 115200, sysclock = 75 MGh
NT_COMMON_REG -> PER_RST0 |= COMMON_REG_PER_RST0_UARTRST3_Msk; // reset usart
NT_COMMON_REG -> UART_CLK |= COMMON_REG_UART_CLK_CLKEN_UART3_Msk | COMMON_REG_UART_CLK_DIVEN_UART3_Msk;
NT_COMMON_REG -> UART_SPI_CLK_SEL_bit.SEL_UART3 = 0; // SYS_FREQ taktiryet UART3
NT_COMMON_REG -> UART_CLK_bit.DIV_UART3 = 5; // delitelb na 10. UART CLK = 75/5 = 15 MGh
// on del, on clk
NT_UART3 -> CR_bit.UARTEN = 0;
NT_UART3 -> IBRD = 3; // chelaya chastb delitelya.
NT_UART3 -> FBRD = 15; // drobnaya chastb
NT_UART3 -> LCR_H_bit.PEN = 0; // chetnostb off
NT_UART3 -> LCR_H_bit.STP2 = 0; // 1 stop bit
NT_UART3 -> LCR_H_bit.FEN = 0; // FIFO OFF
NT_UART3 -> LCR_H_bit.WLEN = 3; // 8 bit mode
NT_UART3 -> CR_bit.TXE = 1;
NT_UART3 -> CR_bit.RXE = 1;
NT_UART3 -> CR_bit.UARTEN = 1;
Энвик_ClearPendingIRQ(UART3_IRQn); // CLEAR IQR AND ON IRQ3
Энвик_EnableIRQ(UART3_IRQn);
NT_UART3 -> ICR = 1;
}
Программа Основная
Код: Выделить всё
int main()
{
SystemInit();
SystemCoreClockUpdate();
GPIO_Init();
USART_Init();
while (1) {
};
return 0;
}
void GPIOF_IRQHandler(void)
{
NT_GPIOF -> INTSTATUS = 0xFFFF;// sbros IQR
USART_3_send_string ("0W");
NT_GPIOC ->DATAOUT ^= 0x3E00;
}
void UART3_IRQHandler(void)
{
char uart_data;
if (NT_UART3 -> RIS_bit.RXRIS == 1 & NT_UART3 -> RIS_bit.OERIS == 1)
{
if (uart_data=='1')
NT_GPIOC ->DATAOUT ^= 0x3D00; // esli nazhali 1
NT_UART3 -> ICR_bit.RXIC = 1;
NT_UART3 -> ICR_bit.OEIC = 1;
}
NT_UART3 -> ICR = 1;
}