很好,USART_SR的复位值为0x00C0

[复制链接]
3965|14
 楼主| 罗菜鸟 发表于 2013-7-18 11:46 | 显示全部楼层 |阅读模式
TXE和TC位复位值为1,这样的话,我用FIFO的形式,就可以不用担心如何去触发FIFO第一个字节的发送了。主函数内只往FIFO里面写入数据,写完后直接把USART_CTRL1的TXEIE值为1,就能进入TXE中断,中断里面读FIFO,然后写入USART_DR,FIFO空了的话就清TXEIE。
cdlxzlp520 发表于 2013-7-18 12:20 | 显示全部楼层
哈哈  不错 有代码看吗??
 楼主| 罗菜鸟 发表于 2013-7-18 13:29 | 显示全部楼层
cdlxzlp520 发表于 2013-7-18 12:20
哈哈  不错 有代码看吗??
  1. static __inline void _uart_isr(uint8_t port,struct _uart_fifo_t *pfifo,USART_TypeDef *uart)
  2. {
  3.         uint32_t iflag;
  4.         uint32_t event = 0;
  5.         uint8_t  read;
  6.         iflag = (uart->CR1 & uart->SR);//(USART_FLAG_TXE|USART_FLAG_TC|USART_FLAG_RXNE|USART_FLAG_IDLE)
  7.         //IDLE IRQ
  8.         if(iflag & USART_FLAG_IDLE)
  9.         {
  10.                 read = uart->DR;
  11.                 if(pfifo->rxCnt <= (pfifo->rxSize>>1)) //rx buffer is not full when rx idle happen
  12.                 {
  13.                         event |=  UART_RX_DONE;
  14.                 }
  15.         }
  16.         //RX IRQ
  17.         if(iflag & USART_FLAG_RXNE)
  18.         {
  19.                 read = uart->DR;
  20.                 if(pfifo->rxCnt < pfifo->rxSize)
  21.                 {
  22.                         pfifo->rxBuf[pfifo->rxPush] = read;
  23.                         pfifo->rxPush += 1;
  24.                         if(pfifo->rxPush >= pfifo->rxSize)
  25.                         {
  26.                                 pfifo->rxPush = 0;
  27.                         }
  28.                         pfifo->rxCnt += 1;
  29.                         if(pfifo->rxCnt == pfifo->rxSize)  //rx buffer is full
  30.                         {
  31.                                 event |= UART_RX_FULL;
  32.                         }
  33.                         else if(pfifo->rxCnt > (pfifo->rxSize>>1))//rx byte is more than half of rx buffer  
  34.                         {
  35.                                 event |= UART_RX_HALF;
  36.                         }
  37.                 }
  38.         }
  39.         //TXE IRQ
  40.         if(iflag & USART_FLAG_TXE)
  41.         {
  42.                 uart->CR1 &= (uint16_t)~0x0080; //off TX
  43.                 if(pfifo->txCnt)
  44.                 {
  45.                         uart->DR   = pfifo->txBuf[pfifo->txPop];
  46.                         uart->CR1 |= (uint16_t)0x0080;
  47.                         pfifo->txPop += 1;
  48.                         if(pfifo->txPop >= pfifo->txSize)
  49.                         {
  50.                                 pfifo->txPop = 0;
  51.                         }
  52.                         pfifo->txCnt -= 1;
  53.                         if(pfifo->txCnt == 0)
  54.                         {
  55.                                 event |=  UART_TX_DONE;
  56.                         }
  57.                 }
  58.         }
  59.         //run isr function
  60.         if((pfifo->isr) && (event))
  61.         {
  62.                 event |= (uint8_t)port<<8 ;
  63.                 pfifo->isr(event,pfifo->msg);
  64.         }
  65. }
jack888518 发表于 2013-7-18 14:12 | 显示全部楼层
这是不是传说中ST的USART的一个会导致程序“奇怪”的地方?
看样子GD的芯片没有这个问题...
cool_coder 发表于 2013-7-18 17:03 | 显示全部楼层
对于没有DMA的芯片这样很好;不过,GD32是带DMA的,有更好的选择,至少发送数据时是这样。
 楼主| 罗菜鸟 发表于 2013-7-19 15:09 | 显示全部楼层
jack888518 发表于 2013-7-18 14:12
这是不是传说中ST的USART的一个会导致程序“奇怪”的地方?
看样子GD的芯片没有这个问题... ...

不是bug,而是处理技巧。
 楼主| 罗菜鸟 发表于 2013-7-19 15:10 | 显示全部楼层
cool_coder 发表于 2013-7-18 17:03
对于没有DMA的芯片这样很好;不过,GD32是带DMA的,有更好的选择,至少发送数据时是这样。 ...

收数据呢?
cool_coder 发表于 2013-7-19 16:23 | 显示全部楼层
罗菜鸟 发表于 2013-7-19 15:10
收数据呢?

收数据的时候要用DMA,定长的还好说,要是变长数据的话……,反正我觉得不够方便。
 楼主| 罗菜鸟 发表于 2013-7-19 22:34 | 显示全部楼层
cool_coder 发表于 2013-7-19 16:23
收数据的时候要用DMA,定长的还好说,要是变长数据的话……,反正我觉得不够方便。 ...

DMA不是有个寄存器可以查询当前收了多少数据么?
另外,UART有个IDLE中断。
shenpingbing 发表于 2013-8-29 22:39 | 显示全部楼层
不是很明白啊
make8419247 发表于 2013-11-21 08:10 | 显示全部楼层
顶一个!!!
喵小棋 发表于 2013-11-24 23:56 | 显示全部楼层
不明觉厉
heshenggui 发表于 2013-11-25 19:56 | 显示全部楼层
不是很明白
fangxingyi 发表于 2013-11-28 20:44 | 显示全部楼层
学一下
huangjia22 发表于 2013-12-22 09:59 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

522

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部