这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请注意STM32的USART寄存器TX中断标志位

共6条 1/1 1 跳转至

请注意STM32的USART寄存器TX中断标志位

菜鸟
2013-04-25 15:48:10     打赏

TXE和TC这两个标志位,是常为1,MCU复位后这两位为1,清零的方法是往DR寄存器写入数据,而置位的方法是等DR里面的数据从TX引脚上全部发出来。

所以STM32在中断的时候,更适合使用环形缓存的方式。通常的单片机在使用环形缓存时,要用两个过程,第一步压入数据,第二步是检查压入环形缓存前环形缓存是否为空并判断是否需要向寄存器发射第一个字节,否则不能保证数据的连贯。

在STM32上使用环形缓存时,可以这么做。

初始化单片机时,使能串口中断,但是TXEIE和TCIE不要使能。

UART_WRITE函数是中断外调用的函数(函数名自定义,也可以是PUTCH),该函数压入环形缓存后,再使能TXEIE或者TCIE中任意一个,则会自动进入中断函数。

中断函数中的TXE标准和TC标准(一定要和TXEIE和TCIE一起相“与”),只判断环形缓存的入口和出口(检测缓存中有没有数据),如果环形缓存中有数据,则取一个字节出来并写入DR,如果环形缓存空了,则在TXE中断或者TC中断里面关闭TXEIE或者TCIE。




关键词: 请注意     STM32     USART     寄存器     中断     标志    

高工
2013-04-25 22:38:26     打赏
2楼
注意你的头像!

高工
2013-04-25 23:16:27     打赏
3楼
STM32都是调用库函数的哦,很久没有操作过寄存器了,这个问题还真不晓得呢

菜鸟
2013-04-26 10:12:33     打赏
4楼
头像用得着上纲上线么?

菜鸟
2013-04-26 10:34:58     打赏
5楼

既然你喜欢用库,给你看个用库的例子。

static uint16_t UartWriteInt(struct UartFifo *pfifo,USART_TypeDef *uart,uint8_t *data,uint16_t len)
{
 uint16_t n;
 if(len == 0)
 {
  return 0;
 }
 else if(len > pfifo->txSize)
 {
  len = pfifo->txSize;
 }
 USART_ITConfig(uart,USART_IT_TXE ,DISABLE);
 for(n=0;n<len;n++)
 {
  if(pfifo->txCnt < pfifo->txSize)
  {
   pfifo->txBuf[pfifo->txPush] = *data++;
   pfifo->txPush += 1;
   pfifo->txPush %= pfifo->txSize;
   pfifo->txCnt++;
  }
  else
  {
   break;
  }
 }
 USART_ITConfig(uart,USART_IT_TXE ,ENABLE);
 return n;
}

 


高工
2013-05-04 14:28:19     打赏
6楼
static uint16_t UartWriteInt(struct UartFifo *pfifo,USART_TypeDef *uart,uint8_t *data,uint16_t len)这个函数不是官方的api函数吧?

共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]