Работаю в IAR 5.41. Взял за основу пример из EXAMPLE PROJECTS,PowerPac Touch Screen demo. Немного помогли переделать под эту плату.
Суть проблемы в том что UART через прерывания работает жутко медленно, как можно это всё оптимизировать. И есть ли там DMA. Потому что при выводе принятых данных на LCD, у него снижается отклик либо вообще не реагирует тачскрин.
Инициализация UART1
Код
void UART1_Initialize(Int32U baudrate)
{
Int32U Fdiv;
PINSEL0_bit.P0_15 = 0x1;//Ноги
PINSEL1_bit.P0_16 = 0x1;//Ноги
PINMODE0_bit.P0_15 = 0x2;//Отключаем подтяжки
PINMODE1_bit.P0_16 = 0x2;//Отключаем подтяжки
// PINMODE1_bit.P0_17 = 0x2;//Отключаем подтяжки
PCONP_bit.PCUART1 = 1; //PCONP
PCLKSEL0_bit.PCLK_UART1 = 0;//Clock
U1LCR = 0x83;//8 bits, no Parity, 1 Stop bit
//Fdiv = ((SYS_FREQ/4)/16*256)/baudrate;//делитель
//U3DLL = //Fdiv;//Пишем в регистр
//U3DLM = 0;//Пишем в регистр
Fdiv = ( SYS_FREQ / 64 ) / baudrate; /*baud rate */
U1DLM = Fdiv / 256; // U1DLM =
U1DLL = Fdiv % 256; //
U1FCR = 0x07; /* Enable and reset TX and RX FIFO. */
U1LCR = 0x03; /* DLAB = 0 */
/* // Настроим прерывание
VIC_SetVectoredIRQ( (void (*)()) UART1Handler, 0xFF, //priority
VIC_UART1);*/
U1IER_bit.RDAIE = 1; /* Enable UART1 interrupt */
// VICINTENABLE_bit.UART1 = 1;
//__REG8 RTSEN : 1;
//__REG8 CTSEN : 1;
U1MCR_bit.RTSEN=0;
U1MCR_bit.CTSEN=0;
OS_ARM_InstallISRHandler(VIC_UART1, (void(*)()) UART1_Handler);
OS_ARM_EnableISR(VIC_UART1);
}
{
Int32U Fdiv;
PINSEL0_bit.P0_15 = 0x1;//Ноги
PINSEL1_bit.P0_16 = 0x1;//Ноги
PINMODE0_bit.P0_15 = 0x2;//Отключаем подтяжки
PINMODE1_bit.P0_16 = 0x2;//Отключаем подтяжки
// PINMODE1_bit.P0_17 = 0x2;//Отключаем подтяжки
PCONP_bit.PCUART1 = 1; //PCONP
PCLKSEL0_bit.PCLK_UART1 = 0;//Clock
U1LCR = 0x83;//8 bits, no Parity, 1 Stop bit
//Fdiv = ((SYS_FREQ/4)/16*256)/baudrate;//делитель
//U3DLL = //Fdiv;//Пишем в регистр
//U3DLM = 0;//Пишем в регистр
Fdiv = ( SYS_FREQ / 64 ) / baudrate; /*baud rate */
U1DLM = Fdiv / 256; // U1DLM =
U1DLL = Fdiv % 256; //
U1FCR = 0x07; /* Enable and reset TX and RX FIFO. */
U1LCR = 0x03; /* DLAB = 0 */
/* // Настроим прерывание
VIC_SetVectoredIRQ( (void (*)()) UART1Handler, 0xFF, //priority
VIC_UART1);*/
U1IER_bit.RDAIE = 1; /* Enable UART1 interrupt */
// VICINTENABLE_bit.UART1 = 1;
//__REG8 RTSEN : 1;
//__REG8 CTSEN : 1;
U1MCR_bit.RTSEN=0;
U1MCR_bit.CTSEN=0;
OS_ARM_InstallISRHandler(VIC_UART1, (void(*)()) UART1_Handler);
OS_ARM_EnableISR(VIC_UART1);
}
Обработчик прерывания
Код
void UART1_Handler()
{
if(U1IIR_bit.IID == 2)// char received
{
RxBuf=U1RBR;//Читам значение из регистра
.... Делаем что либо с принятыми данными.
}
}
{
if(U1IIR_bit.IID == 2)// char received
{
RxBuf=U1RBR;//Читам значение из регистра
.... Делаем что либо с принятыми данными.
}
}
Если есть примеры нормальной работы с UART дайте пожалуйста или помогите советом.