编程实现串口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;
}