Добрый день всем ! Существует необходимость работы процессора 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] ; } }
Заранее благодарен.
|