📄 main.c
字号:
#include <defbf537.h>
#include <stdio.h>
#define BUAD_RATE 115200
// -----------------------------------------------------------------
// BAUD RATE = SCLK / (16 * Divisor)
// Divisor = DLH : DLL = SCLK / (16 * BAUD RATE)
//
// SCLK = VCD / SSEL[3:0] = 250MHz / 5 = 50MHz (SSEL[3:0] ---> PLL_DIV register)
// VCD = CLKIN * MSEL[5:0] if DF=0
// = CLKIN * MSEL[5:0] * 2 if DF=1
// DF=0, MSEL[5:0]=10, CLKIN=25MHz ---> VCO = 25*10 = 250MHz
// (DF ---> PLL_CTL , MSEL[5:0] ---> PLL_DIV)
// -----------------------------------------------------------------
#if (BUAD_RATE==9600) // SCLK=50Mhz =100MHz =133MHz
#define UART_DLL 0x45 //0x45 //0x8B //0x61
#define UART_DLH 0x01 //0x01 //0x02 //0x03
#elif (BUAD_RATE==19200)
#define UART_DLL 0xA2 //0xA2 //0x46
#define UART_DLH 0x00 //0x00 //0x01
#elif (BUAD_RATE==38400)
#define UART_DLL 0x51 //0x51 //0xA3
#define UART_DLH 0x00 //0x00 //0x00
#elif (BUAD_RATE==57600)
#define UART_DLL 0x36 //0x36 //0x6D
#define UART_DLH 0x00 //0x00 //0x00
#elif (BUAD_RATE==115200)
#define UART_DLL 0x1B //0x1B //0x36
#define UART_DLH 0x00 //0x00 //0x00
#endif
#define UART_INTERRUPT
#ifdef UART_INTERRUPT
void uart0_isr_setup(void);
void isr_uart0_rx(void);
void isr_uart0_tx(void);
unsigned char count=0;
#endif
unsigned char put_ch='0';
void init_GPIO()
{
unsigned short *smmrPtr; // 16 bits
smmrPtr = (unsigned short*)PORTF_FER;
*smmrPtr = 0x0003;
*smmrPtr = 0x0003
;
// Configure UART0 RX and UART0 TX pins
smmrPtr = (unsigned short*)PORT_MUX;
*smmrPtr = 0x0000; //must write twice due to the Silicon Version
*smmrPtr = 0x0000;
}
void init_UART()
{
unsigned short *smmrPtr; // 16 bits
unsigned int *mmrPtr; // 32 bits
smmrPtr = (unsigned short*)UART0_GCTL;
*smmrPtr = UCEN;
smmrPtr = (unsigned short*)UART0_LCR;
*smmrPtr = DLAB;
smmrPtr = (unsigned short*)UART0_DLL;
*smmrPtr = UART_DLL;
smmrPtr = (unsigned short*)UART0_DLH;
*smmrPtr = UART_DLH;
smmrPtr = (unsigned short*)UART0_LCR;
*smmrPtr = WLS(8);
}
void UART_GetChar()
{
unsigned short *smmrPtr;
unsigned char temp,tempbuffer; // 16 bits
while(1)
{
smmrPtr = (unsigned short*)UART0_LSR;
temp = (unsigned char) *smmrPtr;
// printf(" temp = 0x%x \n",temp);
if ((temp & 0x01) == 0x01) break; // test DR bit
}
#ifndef UART_INTERRUPT
smmrPtr = (unsigned short*)UART0_RBR;
tempbuffer = *smmrPtr;
printf(" tempbuffer = 0x%x \n", tempbuffer);
#else
smmrPtr = (unsigned short*)UART0_IER; // DR = 1, issues interrupt
*smmrPtr = ERBFI;
#endif
}
void UART_PutChar(unsigned char ch)
{
unsigned short *smmrPtr;
unsigned char temp; // 16 bits
while(1)
{
smmrPtr = (unsigned short*)UART0_LSR;
temp = (unsigned char) *smmrPtr;
// printf(" temp = 0x%x \n",temp);
if ((temp & 0x20) == 0x20) break; // test THRE bit
}
#ifndef UART_INTERRUPT
smmrPtr = (unsigned short*)UART0_THR;
*smmrPtr = ch;
#else
smmrPtr = (unsigned short*)UART0_IER; // THRE = 1, issues interrupt
*smmrPtr = ETBEI;
#endif
}
void UART_PutString(unsigned char* s, unsigned char length)
{
unsigned char i;
for (i=0;i<length;i++)
{
UART_PutChar(*(s+i));
}
}
void main()
{
init_GPIO();
#ifdef UART_INTERRUPT
uart0_isr_setup();
#endif
init_UART();
while(1)
// UART_GetChar();
UART_PutChar(put_ch);
}
#ifdef UART_INTERRUPT
void uart0_isr_setup()
{
unsigned int *mmrPtr; // 32 bits
mmrPtr = (unsigned int*)EVT7;
*mmrPtr = (unsigned int) isr_uart0_tx; /* register interrupt service routine */
mmrPtr = (unsigned int*)IMASK;
*mmrPtr = *mmrPtr | (EVT_IVG7);
mmrPtr = (unsigned int*)SIC_IAR0;
*mmrPtr = 0xFFFFFFFF;
mmrPtr = (unsigned int*)SIC_IAR2;
*mmrPtr = 0xFFFFFFFF;
mmrPtr = (unsigned int*)SIC_IAR3;
*mmrPtr = 0xFFFFFFFF;
/* assign uart0 rx IRQ = IRQ11 to IVG7 */
/* assign uart0 tx IRQ = IRQ12 to IVG7 */
mmrPtr = (unsigned int*)SIC_IAR1;
*mmrPtr = (unsigned int) P12_IVG(7);
mmrPtr = (unsigned int*)SIC_IMASK;
/* enable uart0 rx IRQ11 */
/* enable uart0 tx IRQ12 */
// *mmrPtr = *mmrPtr | 0x0800; // set bit 11
*mmrPtr = *mmrPtr | 0x1000; // set bit 12
}
#pragma interrupt saveall
void isr_uart0_rx(void)
{
unsigned short *smmrPtr; // 16 bits
unsigned char temp_buffer[20];
smmrPtr = (unsigned short*)UART0_RBR;
temp_buffer[count] = (unsigned char) *smmrPtr;
printf("count = %d \n", count);
printf("temp_buffer[count] = 0x%x \n", temp_buffer[count]);
count++;
}
#pragma interrupt saveall
void isr_uart0_tx(void)
{
unsigned short *smmrPtr;
smmrPtr = (unsigned short*)UART0_THR;
*smmrPtr = put_ch + count; // put_ch = '0'
smmrPtr = (unsigned short*)UART0_IER;
*smmrPtr = (*smmrPtr) && 0x5;
printf("count = %d \n", count);
count++;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -