华芯微特开发论坛

 找回密码
 立即注册
搜索
热搜: SWM341 资料
查看: 1361|回复: 0

SWMxxx UART FIFO 应用笔记

[复制链接]

14

主题

61

帖子

789

积分

超级版主

Rank: 8Rank: 8

积分
789
发表于 2024-1-25 09:30:38 | 显示全部楼层 |阅读模式
本帖最后由 XIVN1987 于 2024-1-25 09:46 编辑

SWMxxx 芯片 UART 有独立的 RX FIFO 和 TX FIFO,深度都是 8。RX FIFO 可以设定当 FIFO 中数据个数大于指定个数时产生中断,通知 APP 将接收到的数据读走。TX FIFO 可以设定当 FIFO 中数据个数小于指定个数时产生中断,通知 APP 将需要发送的数据写入 TX FIFO。通过使用 FIFO 和 门限中断,可以大幅减少 UART_Handler 中断函数执行的频率,提高芯片执行效率。

接收门限中断与接收超时中断

以如下配置为例:
  1. RXThreshold = 3;
  2. RXThresholdIEn = 1;
  3. TimeoutTime = 10;
  4. TimeoutIEn = 1;
复制代码

SWM181、SWM260、SWM320

对方发送8个数据的情况
SWM_UART_RXFIFO_8.jpg
每接收到一个数据,RX FIFO中数据个数加一,当RX FIFO中数据个数大于RXThreshold时,触发接收中断。

对方发送9个数据的情况
SWM_UART_RXFIFO_9.jpg
只有当接收FIFO中有数据,且在指定时间内未接收到新的数据时,才会触发超时中断。

若应用中希望通过数据间时间间隔作为帧间隔依据,即不管对方发送过来多少个数据,最后都能产生超时中断,可以通过在接收ISR中从RX FIFO中读取数据时总是少读一个(即让一个数据留在RX FIFO中)来实现。实现代码如下:
  1. void UART0_Handler(void)
  2. {
  3.         uint32_t chr;
  4.         
  5.         if(UART_INTStat(UART0, UART_IT_RX_THR))
  6.         {
  7.                 while((UART0->FIFO & UART_FIFO_RXLVL_Msk) > 1)
  8.                 {
  9.                         if(UART_ReadByte(UART0, &chr) == 0)
  10.                         {
  11.                                 CirBuf_Write(&CirBuf, (uint8_t *)&chr, 1);
  12.                         }
  13.                 }
  14.         }
  15.         else if(UART_INTStat(UART0, UART_IT_RX_TOUT))
  16.         {
  17.                 while(UART_IsRXFIFOEmpty(UART0) == 0)
  18.                 {
  19.                         if(UART_ReadByte(UART0, &chr) == 0)
  20.                         {
  21.                                 CirBuf_Write(&CirBuf, (uint8_t *)&chr, 1);
  22.                         }
  23.                 }
  24.                
  25.                 msg_rcvd = true;
  26.         }
  27. }
复制代码

SWM190、SWM211、SWM341

UARTx->TOCR.MODE = 0
与SWM181、SWM260、SWM320情况完全相同

UARTx->TOCR.MODE = 1
不管对方发送几个数据,最后都能触发超时中断,,因此不需要通过在接收门限中断中少读取一个字符来产生超时中断。。代码如下:
  1. void UART0_Handler(void)
  2. {
  3.         uint32_t chr;
  4.         
  5.         if(UART_INTStat(UART0, UART_IT_RX_THR | UART_IT_RX_TOUT))
  6.         {
  7.                 while(UART_IsRXFIFOEmpty(UART0) == 0)
  8.                 {
  9.                         if(UART_ReadByte(UART0, &chr) == 0)
  10.                         {
  11.                                 CirBuf_Write(&CirBuf, (uint8_t *)&chr, 1);
  12.                         }
  13.                 }
  14.                
  15.                 if(UART_INTStat(UART0, UART_IT_RX_TOUT))
  16.                 {
  17.                         UART_INTClr(UART0, UART_IT_RX_TOUT);
  18.                         
  19.                         msg_rcvd = true;
  20.                 }
  21.         }
  22. }
复制代码

发送门限中断

以如下配置为例:
  1. TXThreshold = 4;
  2. TXThresholdIEn = 1;
复制代码

SWM_UART_TXFIFO.jpg

每发送出一个数据,TX FIFO中数据个数减一,当TX FIFO中数据个数小于等于TXThreshold时,触发发送中断。在ISR中将要发送的数据填入 TX FIFO 中,若没有数据可填,则关闭发送门限中断。。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|华芯微特开发论坛

GMT+8, 2025-1-9 20:47 , Processed in 0.036186 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表