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_RECEI VE, 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_RECEI VE, 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_RE CEIVE | (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;
}
}
//
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_RECEI VE, 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_RECEI VE, 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_RE CEIVE | (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;
}
}
//