欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 测试example-uart串口功能

测试example-uart串口功能

2025/3/10 18:40:32 来源:https://blog.csdn.net/horse_2007s/article/details/145930698  浏览:    关键词:测试example-uart串口功能

一、环境准备

电脑系统:Windows 10 专业版 22H2

IDE:VScode

测试硬件:AG32VF407

二、测试步骤

1、测试目的

串口功能逐步实现吧

2、查询模式

example_uart_rcvIqr.c: (访问密码: 1666)

①将文件移植到src文件夹下,放其他文件夹可能要指定头文件路径。

②在example.h中声明TestUart_simple,需要在main中调用

③编译调试

图示串口助手发送2次,才回应,测试发现是单帧固定12字节,才立马回应,不是很符合要求,需求是不定长才行

 ④修改工程代码

 简单工程可以这样做,有阻塞延时等,估计就做不了了,感觉开启FIFO缓存,可能还要好些。

example_uart_查询.rar: (访问密码: 1666)

3、接收中断模式

example_uart_rcvIqr.c: (访问密码: 1666)
①将文件移植到src文件夹下,放其他文件夹可能要指定头文件路径。

②在example.h中声明TestUart_rcvIrq,需要在main中调用

 

③编译调试

发现此demo只能单帧发送8字节,才能完成一次中断触发,或者说是每8字节触发一次中断。

需要注意一个调试bug,发送大于16字节数据,单帧连续触发2次中断,仿真模式下,可能不在触发中断了,但其他功能正常运行。可能是调试模式兼容问题,暂时没找到原因,避开就行。

 ④结合手册后发现,是启用了FIFO导致的,工程中启用的FIFO。

⑤修改工程代码

UART_Init初始化内设置UART_LCR_FIFO_1;

屏蔽UART_SetRxIntFifoLevel;

将中断内改为,接收一字节,就立马发送一字节;

屏蔽isRecv,避免下方while循环内再次发送;

 ⑥编译调试

达到预期

example_uart_接收中断.rar: (访问密码: 1666)
 

4、空闲中断

example_uart_rxIdleIrq.c: (访问密码: 1666)

①将文件移植到src文件夹下,放其他文件夹可能要指定头文件路径。

②修改example.c、example.h文件

③由于使用uart0测试,故需要注意检测ve文件,修改链接信息

 

④编译并测试

满足我的需求,基本不用怎么改,估计就把发送函数移植到空闲中断就可以了

⑤大致原理

//1、初始化串口,并开启FIFO
UART_Init(UART0, 115200, UART_LCR_DATABITS_8, UART_LCR_STOPBITS_1, UART_LCR_PARITY_NONE, UART_LCR_FIFO_16);
//2、开启接收中断、超时中断,定义FIFO缓存,每满一半时,触发一次接收中断。
UART_EnableInt(UART0, UART_INT_RT); //配置 收超时中断
UART_EnableInt(UART0, UART_INT_RX); //配置 收中断
UART_SetRxIntFifoLevel(UART0, UART_INT_FIFO_HALF);  //配置FIFO收多少字节时产生收中断
INT_EnableIRQ(UART0_IRQn, UART_PRIORITY);
//3、触发接收中断,说明FIFO中数据超过一半了,此时读取7字节,留一个字节给空闲中断或者下次接收中断。
//这里有个不是bug的bug的,如果在接收中断中一次将FIFO数据都读取了,那么就不会触发空闲中断。
//所以如果接收中断一次读取8字节,而刚好也发送8字节,那么接收中断读取后,FIFO中为空,空闲中断不会触发,也就不会发送数据了
void UART0_isr()
{if (UART_IsRawIntActive(UART0, UART_INT_RX)) {UART_ClearInt(UART0, UART_INT_RX);//注意:这时FIFO里有8个字节长度,但特意不全部收取。//这么做,是为了保证传输数据刚好是8的整数倍时,仍然会触发下边的UART_INT_RT中断。UART_Receive(UART0, rxbuf + rcvLen, 7, 0); //half: 16/2=8。rcvLen += 7;}else if (UART_IsRawIntActive(UART0, UART_INT_RT)) {UART_ClearInt(UART0, UART_INT_RT);rcvLen += UART_Receive(UART0, rxbuf + rcvLen, 8, 1); //最后一个参数不能为0,为0时UART_Receive是不会超时退出的UART_Send(UART0, rxbuf, rcvLen);rcvLen = 0;//isRecvEnd = 1;  //idle一包收满}
}

 example_uart_空闲中断.rar: (访问密码: 1666)

三、运行效果

四、工程资料下载

五、系统中断向量表及中断函数名

可从AltaRiscv.h中查看

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词