【AT-START-F425测评】+ UART串行通讯及应用
[复制链接]
本帖最后由 jinglixixi 于 2022-4-11 00:24 编辑
在AT32F425内部有4个USART,对如今越来越丰富的串口设备来讲实在是件好事情。
为用好串口通信,首先学习例程的使用方法,然后再根据实际需要化为自己的功能程序。
我所关注的主要是2个问题,即:
1. 掌握串口输出功能
在没有显示器件的情况下,掌握串口输出功能是十分作用的。
以下面一段程序为例,若不使用串口输出功能,要分析其功能会费一点时间,而借助串口输出功能,则会轻松地分析出它的功能。
- for(i = 0x80; i; i >>= 1)
- {
- printf("i=%x\r\n",i);
- if(*rgb & i)*buf = 0x0e;
- else *buf = 0x08;
- printf("buf[%d]=%x\r\n",j,*buf);
- i >>= 1;
- printf("i=%x\r\n",i);
- *buf <<= 4;
- printf("buf[%d]=%x\r\n",j,*buf);
- if(*rgb & i)*buf |= 0x0e;
- else *buf |= 0x08;
- printf("buf[%d]=%x\r\n",j,*buf);
- buf++;
- j=j+1;
- }
经编译,其运行结果如图1所示。
图1 输出结果
由输出结果可知,该程序的作用是,将1个字节的数据转变为4个字节的数据,其中若某位“1”变为“e”, 若“0”变为“8”的数据形式。
2.掌握串口的收发功能
对于收发要求不高的情况,在初始化好串口后,使用函数usart_data_transmit()和函数usart_data_receive t()就可解决问题。
例如在使用迪文显示屏的时候,就要求向指定的存储单元发出读取指令,随后才能接收显示屏所发来的数据,并提取出相应的数据。
由于显示屏的指令为十六进制码,故为了便于使用是将指令存放到数组中(com[]))来进行发送,其中变量com _len所存放的是指令的长度,使用USART2的发送程序为:
i=0;
while(i<com _len)
{
while(usart_flag_get(USART2, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USART2, usart2_com);
i=i+1;
}
在发出读取指令后,就等待接收处理了,同样为了便于后续的参数提取,所接收的内容也是存放到数组中(rx_buffer[]),其中变量dat _len所存放的是接收的数据长度,使用USART2的接收程序为:
i=0;
while(i< dat _len)
{
while(usart_flag_get(USART2, USART_RDBF_FLAG) == RESET);
rx_buffer= usart_data_receive(USART2);
i=i+1;
}
以读取首地址为0X2000的7个单元数据为例,其读取指令为“5A A5 04 83 20 00 07”,而接收的内容则如图1所示。
其中,“00 0B 00 88 00 3E 00 3C 00 02 00 02 00 02”是获取的数据,每个数据占2个字节,共7个参数。
图2 收发测试
对于USART2来讲,其使用的引脚如图2所示。
图3串口引脚
3.实现双串口间的转换性通信
这里所说的转换性通信,一是指在通讯过程中实现数据格式的转换,另一个则是解决通讯双方不同波特率的对接。
USART2 以115200bps接收信息,USART1以9600bps发送信息,并执行数据格式的转换。
例如:
发送单元地址的内容,转换为MP3的播放指令。
接收:“5A A5 12 83 20 00 01 00 02” -->rx_buff[] (9) 115200bps
发送:“7F FF 06 03 00 00 02 FE F6 EF”-->tx_buff[] (10) 9600bps
实现转换性通信的程序为:
- i=0;
- while(i<9)
- {
- while(usart_flag_get(USART2, USART_RDBF_FLAG) == RESET);
- usart2_buffer= usart_data_receive(USART2);
- i=i+1;
- }
-
- usart2_mp3[6]=usart2_buffer[8];
- usart2_mp3[8]=0XF8-usart2_buffer[8];
- i=0;
- while(i<10)
- {
- while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
- usart_data_transmit(USART1, usart2_mp3);
- i=i+1;
- }
图4 USART1接收
图5 USART2发送
图6USART1接收
图7 USART2发送
由此可见用AT32F425来设计不同波特率的协议转换器是可行的且是有效地,它可以解决那些串口模块因波特率被固定而无法改变的情况下,在两种串口设备间的架起转换的桥梁。
|