📄 uart.c
字号:
/*****************************************************************************
FILENAME: FLASH.C
DESIGNER: 戴展波
DATE: 2004/09/25
******************************************************************************/
#include <stdio.h>
#include <csl.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_emifb.h>
#include <csl_gpio.h>
#include "uart.h"
GPIO_Handle hGpio;
static Uint32 gpgc = GPIO_GPGC_RMK(
GPIO_GPGC_GP0M_GPIOMODE,
GPIO_GPGC_GPINT0M_DEFAULT,
GPIO_GPGC_GPINTPOL_DEFAULT,
GPIO_GPGC_LOGIC_DEFAULT,
GPIO_GPGC_GPINTDV_DEFAULT
);
static Uint32 gpen = GPIO_GPEN_OF(0x10);
static Uint32 gpdir = GPIO_GPDIR_OF(GPIO_GPDIR_DEFAULT);
static Uint32 gpval = GPIO_GPVAL_OF(GPIO_GPVAL_DEFAULT);
static Uint32 gphm = GPIO_GPHM_RMK(GPIO_GPHM_GPXHM_DEFAULT);
static Uint32 gplm = GPIO_GPLM_RMK(GPIO_GPLM_GPXLM_DEFAULT);
static Uint32 gppol = GPIO_GPPOL_RMK(GPIO_GPPOL_GPINTXPOL_DEFAULT);
static EMIFB_Config MyEmifbConfig =
{
EMIFB_GBLCTL_RMK
(
EMIFB_GBLCTL_EK2RATE_FULLCLK, //1 X EMIF input clock
EMIFB_GBLCTL_EK2HZ_CLK, //eclkout2 continue output during hold
EMIFB_GBLCTL_EK2EN_ENABLE, //eclkout2 enable output
EMIFB_GBLCTL_BRMODE_MRSTATUS, //bus request is memory access or refresh pending/in progress
EMIFB_GBLCTL_NOHOLD_ENABLE,
EMIFB_GBLCTL_EK1HZ_CLK, //eclkout1 continue output during hold
EMIFB_GBLCTL_EK1EN_ENABLE //eclkout1 enable output
),
0x7830df0c, //clk/4
// 0x2370ca0b, //clk/6
0x22a28a22,
0x22a28a22,
0x22a28a22,
EMIFB_SDCTL_DEFAULT,
EMIFB_SDTIM_DEFAULT,
EMIFB_SDEXT_DEFAULT,
0x00000002,
0x00000002,
0x00000002,
0x00000002
};
unsigned char receive_232_data_A[160];
unsigned char receive_count_A = 0;
unsigned char deal_count_A = 0;
unsigned char receive_232_data_B[160];
unsigned char receive_count_B = 0;
unsigned char deal_count_B = 0;
unsigned char temp;
#pragma DATA_SECTION(uart_ab_channel_select,".uart_var");
unsigned char uart_ab_channel_select = 0;
void init_UART(void);
extern far void vectors();
void main()
{
unsigned char i;
//初始化CSL
CSL_init();
//关闭总中断
IRQ_globalDisable();
//配置EMIFB
EMIFB_config(&MyEmifbConfig);
//打开GPIO句柄
hGpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);
//GPIO配置
GPIO_configArgs(hGpio,gpgc,gpen,gpdir,gpval,gphm,gplm,gppol);
//初始化UART
init_UART();
//设置中断矢量表地址
IRQ_setVecs(vectors);
//设置中断通道
IRQ_map(IRQ_EVT_EXTINT4,4);
//中断使能
IRQ_enable(IRQ_EVT_EXTINT4);
//使能NMI中断
IRQ_nmiEnable();
//打开总中断
IRQ_globalEnable();
for(;;)
{
if(receive_count_A != deal_count_A)
{
if((uart_ab_channel_select & 0x01) == 0x01)
{
temp = *UARTA_LSR&0x40;
if(temp == 0x40)
{
for(i = 0; i < FIFO_LENGTH; i++)
{
*UARTA_THR = receive_232_data_A[deal_count_A];
}
deal_count_A++;
if(deal_count_A == 160)
{
deal_count_A = 0;
}
}
}
else
{
deal_count_A++;
if(deal_count_A == 160)
{
deal_count_A = 0;
}
}
}
if(receive_count_B != deal_count_B)
{
if((uart_ab_channel_select & 0x02) == 0x02)
{
temp = *UARTB_LSR&0x40;
if(temp == 0x40)
{
for(i = 0; i < FIFO_LENGTH; i++)
{
*UARTB_THR = receive_232_data_B[deal_count_B];
}
deal_count_B++;
if(deal_count_B == 160)
{
deal_count_B = 0;
}
}
}
else
{
deal_count_B++;
if(deal_count_B == 160)
{
deal_count_B = 0;
}
}
}
}
}
void init_UART(void)
{
//初始化UART—A
*UARTA_LCR = (data_w8+data_s1+uart_parity+LC_1_DLAB); /*8位数据 1停止位 偶校验位 开启除数转换*/
*UARTA_DLL = buad_19k2_l; /*19.2K波特率*/
*UARTA_DLH = buad_19k2_h;
*UARTA_LCR = (data_w8+data_s1+uart_parity+LC_0_DLAB); /*8位数据 1停止位 偶校验位 开启其余寄存器转换*/
*UARTA_MCR = UartLoop;
*UARTA_FCR = fifo_reset;
*UARTA_IER = 0;
// *UARTA_FCR = fifo_disable;//fifo_enable+fifo_txdip16+fifo_rxdip16;
temp = *UARTA_RHR;
*UARTA_IER = uartint_rhr;
//初始化UART-B
*UARTB_LCR = (data_w8+data_s1+uart_parity+LC_1_DLAB); /*8位数据 1停止位 偶校验位 开启除数转换*/
*UARTB_DLL = buad_19k2_l; /*19.2K波特率*/
*UARTB_DLH = buad_19k2_h;
*UARTB_LCR = (data_w8+data_s1+uart_parity+LC_0_DLAB); /*8位数据 1停止位 偶校验位 开启其余寄存器转换*/
*UARTB_MCR = UartLoop;
*UARTB_FCR = fifo_reset;
*UARTB_IER = 0;
// *UARTB_FCR = fifo_disable;//fifo_enable+fifo_txdip16+fifo_rxdip16;
temp = *UARTB_RHR;
*UARTB_IER = uartint_rhr;
}
interrupt void uarta_int(void)
{
unsigned char i;
if((*EXT_INT_STATUS & 0x10) == 0x10)
{
if((*UARTA_LSR&0x01) == 0x01)
{
for(i = 0; i < FIFO_LENGTH; i++)
{
receive_232_data_A[receive_count_A] = *UARTA_RHR&0xff;
}
receive_count_A++;
if(receive_count_A == 160) receive_count_A = 0;
}
else
{
*UARTA_FCR = 0x02;
}
}
else if((*EXT_INT_STATUS & 0x20) == 0x20)
{
if((*UARTB_LSR&0x01) == 0x01)
{
for(i = 0; i < FIFO_LENGTH; i++)
{
receive_232_data_B[receive_count_B] = *UARTB_RHR&0xff;
}
receive_count_B++;
if(receive_count_B == 160) receive_count_B = 0;
}
else
{
*UARTB_FCR = 0x02;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -