Добрый день всем !
Существует необходимость работы процессора BF533 с последовательным портом RS232.
На данном этапе работаю в оценочном режиме и использую
аппаратную платформу для этого применения - KIT ADDS - BF533 - EZLite.
создал простейший проект для работы в зеркальном режиме с HYP Terminal Windows. и вот уже который день бьюсь с тем, чтобы хоть как то запустить проект в работу.
хочу привести пример своего описания (все сделано в main). Если не затруднит опытных разработчиков - сделайте пожалуйста замечания по инициализации и работе с портом.
в HYP Terminal настраиваюсь на работу со скоростью 19200.
#include <cdefBF533.h>
#include <ccblkfn.h>
#include <sysreg.h>
#include <sys\exception.h>
#define N 128
// ---------------------------------------------------------------------------------
void initUART(void) ; //function for initializing the UART
void initIRQ(void) ; //initialization Interrupt
void init_UART_Irq(void) ;
void initIRQ(void) ; //function for receive interrupt
void initPLL(void) ; //Initialize PLL to 594MHz and set up SCLK 118MHz.
EX_INTERRUPT_HANDLER(UARTRx_ISR);
void UART_putRECData(void) ; // back Receve Data to terminal
// ---------------------------------------------------------------------------------
char welcomemessage[] = {"\fHello! \n\r"
"Initialization UART comlete ! \n\r"} ;
char REC_Data[N] ;
main()
{
initPLL();
initUART();
// после инициализации порта появилось гостевое приглашение.
// далее следует обработка прерывания по приему данных.
init_UART_Irq() ;
initIRQ() ;
while(1)
{
};
}
void initUART()
{
int i ;
*pUART_LCR = 0x00B3 ;
// 0000|0000
// 1011
// DLAB = 1 разрешен доступ к регистру делителя (исспользование общего адресного простр.),
// SB = 0 соединение не разрывается,
// бит четности передается м проверяется как 0.
// проверка на четность
// 0011
// PEN = 0 бит проверки не передается и не проверяется
// STB = 0 1 стоповый бит
// WLS[1:0] - 11 - 8 разрядное слово
*pUART_MCR = 0x0000 ;
*pUART_GCTL = 0x0031;
// 0000|0000
// 00
// FFE = 1 нормальный режим работы.
// FPE = 1 нормальный режим работы.
// IREN = 0 работа IRDA запрешена.
// UCEN = 1 разрешение подачи сигнала тактовой синхронизации
*pUART_DLL = 0x0083 ; // 10000011 ;
*pUART_DLH = 0x0001 ; // 00000001 ; // Divizor = 387 (19200)
// разрешить доступ к регистру передачи и приема
*pUART_LCR = 0x0033 ;
// передача приветствия в терминальную программу
int Size ;
Size = sizeof(welcomemessage) ;
for ( i=0 ; i<Size ; i++)
{
// ждать готовность передатчика
do {;}
while (TEMT == 0) ; // пока сдвиговый и буферн. регистры заполнены.
*pUART_THR = welcomemessage[i] ;
}
}
void init_UART_Irq(void)
{
*pUART_IER = 0x0001 ;
}
void initIRQ(void)
{
*pSIC_IAR0 = 0xffffffff ;
*pSIC_IAR1 = 0xf3ffffff ; // назначение ID 3 для приема данных по UART
*pSIC_IAR2 = 0xffffffff ;
register_handler(ik_ivg10, UARTRx_ISR); // UART RX -> IVG 10
*pSIC_IMASK = 0x00004000;
}
void initPLL(void)
{
sysreg_write(reg_SYSCFG, 0x32); // Инициализация системного конф.регистра
*pSIC_IWR = 0x1;
*pPLL_CTL = 0x2C00; // множитель 22, а делитель 5 (27МГц.* 22 = 594 МГц / 5 = 118 МГц.)
ssync();
idle();
}
// -------------------------------------------------------------------------------------
EX_INTERRUPT_HANDLER(UARTRx_ISR)
{
static int ii ;
++ii ;
//char temp = 0xA ;
REC_Data[ii] = *pUART_RBR ; // -- чтение должно отпустить прерывание.
//REC_Data[ii] = temp ;
if (ii == N)
{
UART_putRECData();
}
}
// -------------------------------------------------------------------------------------
void UART_putRECData(void)
{
int i ;
int Size_REC ;
Size_REC = sizeof(REC_Data) ;
for (i = 0;i < Size_REC; i++)
{
while (THRE == 0) ; // пока не пуст.
{;}
*pUART_THR = REC_Data[i] ;
}
}
Заранее благодарен.