XMC 1400 UART with Interrupt (in µVision not Dave)

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Not applicable
Hello,
maybe someone can help me.
I am not using Dave, because we need to use Keil µVision.

We are trying to configure the UART, so it can work with Interrupts.
Without Interrupts the code works.

I tried to configure it in Dave and tried to find the important lines in the Dave generated code, but it is to big to understand for me.
In the internet there are not many Information about code for the XMC1400.

Can someone help me?
Best regards
Olli



void cUart0::init_UART0_int(void)
{
ConfigUart1.data_bits = 8U;
ConfigUart1.stop_bits = 1U;
ConfigUart1.baudrate = ASC1_BAUDRATE;

// Configure UART channel
XMC_UART_CH_Init(XMC_UART0_CH1, &ConfigUart1);

XMC_USIC_CH_SetInputSource(XMC_UART0_CH1, XMC_USIC_CH_INPUT_DX0, 0U);
XMC_USIC_CH_SetInputSource(XMC_UART0_CH1, XMC_USIC_CH_INPUT_DX3, 0U);
XMC_USIC_CH_SetInputSource(XMC_UART0_CH1, XMC_USIC_CH_INPUT_DX5, 0U);



// Configure Buffer:
XMC_USIC_CH_TXFIFO_Configure(XMC_UART0_CH1, 0, XMC_USIC_CH_FIFO_DISABLED, 0);
XMC_USIC_CH_RXFIFO_Configure(XMC_UART0_CH1, 0, XMC_USIC_CH_FIFO_DISABLED, 0);

// Configure pins
XMC_GPIO_SetMode(ASC1_TX, XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT7);
XMC_GPIO_SetMode(ASC1_RX, XMC_GPIO_MODE_INPUT_PULL_UP);



// conigure receive Interrupt :

// Set service request for transmit interrupt
XMC_USIC_CH_SetInterruptNodePointer(XMC_UART0_CH1, XMC_USIC_CH_INTERRUPT_NODE_POINTER_TRANSMIT_BUFFER, 1U);
// Set service request for receive interrupt
XMC_USIC_CH_SetInterruptNodePointer(XMC_UART0_CH1, XMC_USIC_CH_INTERRUPT_NODE_POINTER_RECEIVE, 0U); // von Dave
XMC_USIC_CH_SetInterruptNodePointer(XMC_UART0_CH1, XMC_USIC_CH_INTERRUPT_NODE_POINTER_ALTERNATE_RECEIVE, 0U); // von Dave
// XMC_USIC_CH_SetInterruptNodePointer(XMC_UART0_CH1, XMC_USIC_CH_INTERRUPT_NODE_POINTER_RECEIVE, 9U); // von Olli
// XMC_USIC_CH_SetInterruptNodePointer(XMC_UART0_CH1, XMC_USIC_CH_INTERRUPT_NODE_POINTER_ALTERNATE_RECEIVE, 9U); // von Olli
// Set service request for UART protocol events
XMC_USIC_CH_SetInterruptNodePointer(XMC_UART0_CH1, XMC_USIC_CH_INTERRUPT_NODE_POINTER_PROTOCOL, 2U);

// Set priority and enable NVIC node for transmit interrupt
NVIC_SetPriority((IRQn_Type)10, 3U);
XMC_SCU_SetInterruptControl(10U, XMC_SCU_IRQCTRL_USIC0_SR1_IRQ10);
NVIC_EnableIRQ((IRQn_Type)10);

// Set priority and enable NVIC node for receive interrupt
NVIC_SetPriority((IRQn_Type)9, 3U);
XMC_SCU_SetInterruptControl(9U, XMC_SCU_IRQCTRL_USIC0_SR0_IRQ9);
NVIC_EnableIRQ((IRQn_Type)9);

// XMC_USIC_CH_EnableEvent(XMC_UART0_CH1, (uint32_t)((uint32_t)XMC_USIC_CH_EVENT_STANDARD_RECEIVE | (uint32_t)XMC_USIC_CH_EVENT_ALTERNATIVE_RECEIVE)); // NIO

// This function clears node 9 pending status
NVIC_ClearPendingIRQ(IRQ9_IRQn);


// Start UART channel
XMC_UART_CH_Start(XMC_UART0_CH1);
}
//



extern "C" void IRQ9_Handler(void)
{
Uart0.TX_Buffer.Data[50] = 'A'; // test: does it go into this int-Routine ?
Uart0.TransmitBytes(&Uart0.TX_Buffer.Data[50], 1);

//This function clears node 9 pending status
NVIC_ClearPendingIRQ(IRQ9_IRQn);

uint8_t rxData = 0x00;

//received_data = XMC_UART_CH_GetReceivedData(uart); // receive data
rxData = XMC_UART_CH_GetReceivedData(XMC_UART0_CH1);
Uart0.RX_Buffer.Data[Uart0.RX_Buffer.WritePos] = rxData;

Uart0.RX_Buffer.WritePos++;
if(Uart0.RX_Buffer.WritePos >= sizeof(Uart0.RX_Buffer.Data))
{
Uart0.RX_Buffer.WritePos = 0;
}

}
//
0 Likes
0 Replies