“其实STM32也有其优势.......在不需要UART的地方都用STM32”,这是不是说没有FIFO的UART很不好用?
试想要传送100个字节,如果通过一个深度为16字节的FIFO,则至少要中断7次才能传送100个字节;如果使用DMA,则只需在传送结束时中断一次。哪个更高效?
对于Modbus RTU这样的协议,使用DMA也不会比使用FIFO效率低:
Modbus的请求数据包都是由下面几部分构成: 一、从机地址;固定为一个字节 二、功能代码;固定为一个字节 三、功能参数;长度依不同功能代码而不同 四、数据域;长度在功能参数中定义 五、校验码;固定为两个字节
下面以功能代码=0x03的数据包交换说明如何使用STM32进行数据传送: 1、主机发送8字节: 从机地址: 1字节 功能代码: 1字节 = 0x03 起始地址: 2字节 读取数目: 2字节 = N CRC校验码: 2字节 2、从机先接收2字节,当得知功能代码为0x03时,再继续接收6个字节 3、从机发送 N*2+4字节 = (1字节功能码+1字节数据长度+N*2字节数据+2字节校验码) 4、主机接收从机发出的(N*2+4)字节数据。因为主机知道N的数值,所以主机知道从机响应的数据包的长度
这里可以看到,如果没有FIFO,需要在上述第2阶段从机接收主机请求时分为两个步骤进行;而在其他的阶段使用DMA的效率不比使用FIFO差,而且在第4阶段,如果数据包长度大于FIFO深度时,使用DMA的效率更高! |