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

📄 uart.c

📁 基于TI公司6416DSP的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[160];
unsigned char receive_count = 0;
unsigned char deal_count = 0;
unsigned char temp;

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 != deal_count)
		{	
			temp = *UARTA_LSR&0x40;
        		if(temp == 0x40)
        		{
        			for(i = 0; i < 16; i++)
        			{
        				*UARTA_THR = receive_232_data[16*deal_count+i];
            			}  
        			deal_count++;
        			if(deal_count == 10)	
        			{
        				deal_count = 0;
        			}
        		}
        	}  
	}
	
}

void init_UART(void)
{
	*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_enable+fifo_txdip16+fifo_rxdip16;
	
	 
//	temp = UARTA_RHR;
	*UARTA_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 < 16; i++)
   		{
   			receive_232_data[16*receive_count+i] = *UARTA_RHR&0xff;  
   		}
   			receive_count++; 
   			if(receive_count == 10)	receive_count = 0;  
   	}
   	else
   	{
   		*UARTA_FCR = 0x02;
   	}
   	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -