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

📄 main.c

📁 ADI DSP blackfin UART demo
💻 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 + -