串口编程练习

编程实现串口2发送 ‘T’ ,波特率115200,数据位8位,校验位无,停止位1(ARM-A9系列开发板)

查看电路原理图(找管脚)

串口2->con7->
GPA1_0
GPA1_1

查看芯片手册(找寄存器)

//第6章节,管脚模式配置
GPA1CON 0x11400020  
			[3:0] = 0x2  // UART_2_RXD  
			[7:4] = 0x2  // UART_2_TXD
			[7:0] = 0x22;
//第28章节,串口2相关寄存器
ULCON2    0x13820000 
			[1:0] = 0x3;
		    [2]   = 0;
			[5:3] = 0;
		    [6]   = 0;
UCON2     0x13820004
    		[1:0] = 0x1;
			[3:2] = 0x1;
UTRSTAT2  0x13820010
    	   	[0] =  //接收状态 0:empty 1:收到数据
    	   	[1] =  //发送专题 0:发送中 1:发送完成
UTXH2     0x13820020
    		[7:0] = 'T'; //发送寄存器
URXH2     0x13820024
    		[7:0] = //接收到的数据
UBRDIV2   0x13820028
    		[15:0] = Baud-rate division value (UBRDIVn) = 53
    
UFRACVAL2 0x1382002C
		    [3:0]  = Determines the fractional part of Baud-rate divisor.
    		       = UFRACVALn  = 4

/* 波特率计算公式 */
SCLK_UART:串口时钟,100Mhz
bps:设定的波特率 115200

DIV_VAL = (SCLK_UART/(bps * 16)) - 1    
        = 100000000/(115200 * 16) - 1
        = 53.25

UBRDIVn = 53 (integer part of DIV_VAL)
 
UFRACVALn/16 = 0.25
Therefore, UFRACVALn = 0.25*16  = 4

编写c程序,并下载到开发板测试。

void uart_init(void); //串口初始化
void uart_putchar(char ch); //发送字符
char uart_getchar(void); //获取字符
void send_string(char *str); //发送字符串



#define GPF3CON *(volatile unsigned int *)0x114001E0
#define GPF3DAT *(volatile unsigned int *)0x114001E4

/*串口2相关寄存器*/

#define GPA1CON  *(unsigned int*)0x11400020
#define ULCON2  *(unsigned int*)0x13820000
#define UCON2  *(unsigned int*)0x13820004
#define UTRSTAT2  *(unsigned int*)0x13820010
#define UTXH2  *(unsigned int*)0x13820020
#define URXH2  *(unsigned int*)0x13820024
#define UBRDIV2  *(unsigned int*)0x13820028
#define UFRACVAL2  *(unsigned int*)0x1382002C

void uart_init(void) //串口初始化
{
	GPA1CON = (GPA1CON & ~(0XFF))|0X22;
    ULCON2=0x3;
    UCON2=0x5;

	/* 波特率设置 为115200 */
    UBRDIV2=53;
    UFRACVAL2=4;
	

	/* 波特率设置 为9600 */
    //UBRDIV2=650;
    //UFRACVAL2=6;

}
char uart_getchar(void) 
{
	while(! (UTRSTAT2&0x1) ); 

	return URXH2 &(0XFF);
}
void uart_putchar(char ch)
{
	while(1){
		if( UTRSTAT2 &(0x1<<1) ){  //发送完成后 结束循环
			break;
		}
	}

	UTXH2 = ch;
#if 0
	while( ! (UTRSTAT2 &(0x1<<1)) );
	UTXH2 = ch;
#endif 
}
void send_string(char *str)
{
	while(*str!='\0'){
		uart_putchar(*str++);
	}
}

void led4_init(void)
{
	GPF3CON = GPF3CON & (~(0xf<<4*4));
	GPF3CON = GPF3CON | (0x1<<4*4);
}
void led4_on(void)
{
	GPF3DAT = GPF3DAT | (0x1<<4);
}
void led4_off(void)
{
	GPF3DAT = GPF3DAT & ~(0x1<<4);
}

void delay(int x)
{
	int i,j;
	for(i=0;i<x;i++){
		for(j=0;j<2000;j++){
			;
		}
	}
}

int main(void)
{	
	
	uart_init();
	
	send_string("uart_test\r\n");
	
	char ch;

	while(1)
	{
		ch = uart_getchar();


		send_string("recv:");
		uart_putchar(ch);
	}

	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值