OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1996|回复: 4

关于STM8S串口发送中断TXE

[复制链接]

2

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-7-1
在线时间
9 小时
发表于 2016-11-2 21:10:39 | 显示全部楼层 |阅读模式
1金钱
RT,最近要用STM8S串口做一个项目,用到串口,接收没问题,主要是发送,我就吶了闷,只要开了TXE的发送空中断,就直接往中断里冲了。先把代码贴上:
   初始化:
  GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);
   GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_PU_NO_IT);  
   UART1_DeInit();
   UART1_Init((u32)1200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
   UART1_ITConfig(UART1_IT_TXE, ENABLE);
   UART1_Cmd(ENABLE);

中断处理函数:
  static u8 i;
   i++;
   if(i==1) UART1_SendData8(0x11);
   else if(i==2) UART1_SendData8(0x22);
   else if(i==3) UART1_SendData8(0x33);
   else if(i==4) UART1_SendData8(0x44);
   else if(i==5) UART1_SendData8(0x55);
   else if(i==6) UART1_SendData8(0x66);
   else if(i==7) {UART1_ITConfig(UART1_IT_TXE, DISABLE);UART1_SendData8(0x77);}


初始化写完这么多后,发现程序直接往发送中断里跑了,找了半天,发现UART1->SR状态寄存器的最高位永远是1,在IAR中VIEW,REGISTER中看到,这个寄存器复位值为OXC0,但是后面我无论怎么改,诸如&=0X3F,这样,最高位还是为1,所以只要UART1_IT_TXE被设置为ENABLE了,就直接进发送中断。
按照我上面的中断写法,使用起来没什么问题。但是那个SR寄存器的最高位为什么一直是1,心理总是不舒服,就怕程序上有什么隐患,还望各位大佬帮分析分析,是不是我新手哪里有遗漏的。


补上:后来我直接在时钟初始化后加上UART1->SR&=0X3F,用断点查看,TC为0了,TXE仍然为1!!!!!!!草,OMG.........

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2014-9-11
在线时间
9 小时
发表于 2017-10-31 19:08:37 | 显示全部楼层
问题解决了吗?我也遇到同样问题,困扰中!!!!
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2014-9-11
在线时间
9 小时
发表于 2017-10-31 19:08:56 | 显示全部楼层
问题解决了吗?我也遇到同样问题,困扰中!!!!
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2014-9-11
在线时间
9 小时
发表于 2017-10-31 19:10:13 | 显示全部楼层
void Usart2_Config(void)
{
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART2, ENABLE);
  UART2_DeInit();
  UART2_Init((uint32_t)4800, UART2_WORDLENGTH_8D,UART2_STOPBITS_1, UART2_PARITY_NO,
                   UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);

  UART2_ITConfig(UART2_IT_TXE,ENABLE);
  //UART2_ClearFlag(UART2_FLAG_TC);
  UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);
  UART2_ClearFlag(UART2_FLAG_RXNE);
   
  //UART2_ClearFlag(UART2_FLAG_TXE);
  
  UART2_Cmd(ENABLE);  
  //enableInterrupts();  
}

这是我的配置
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-10-31 21:20:44 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 12:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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