⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 基于TMS320C6416串口的测试程序
💻 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 + -