[STM8] STM8L串口发送中断一直触发

[复制链接]
16774|18
 楼主| donsbin 发表于 2015-7-12 09:36 | 显示全部楼层 |阅读模式
本人小白一个,查询发送可以的。现在想通过串口中断来发送。可是调试发现一直触发中断,查询出不来了。上代码

  1. //初始化
  2. void USART_Config(void)  
  3. {  
  4.     GPIO_Init(GPIOC,2,GPIO_Mode_In_PU_No_IT);
  5.     GPIO_Init(GPIOC,3,GPIO_Mode_Out_PP_High_Fast);
  6.     CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);      
  7.     USART_DeInit(USART1);        
  8.     USART_Init(USART1,(uint32_t)9600, USART_WordLength_8b, USART_StopBits_1,  
  9.     USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));  
  10.     USART_ITConfig(USART1,(USART_IT_RXNE|USART_IT_TC),ENABLE);  //使能发送接收中断
  11.     ITC_SetSoftwarePriority(USART1_TX_IRQn, ITC_PriorityLevel_1); //优先级
  12.     ITC_SetSoftwarePriority(USART1_RX_IRQn, ITC_PriorityLevel_1);
  13.     USART_Cmd(USART1,ENABLE);   
  14. }  


  1. //发送中断
  2. INTERRUPT_HANDLER(Uart_TX_IRQHandler,27)
  3. {
  4.     USART_SendData8(USART1,(unsigned char)TxBuff[cunt]);
  5.     USART_ClearFlag(USART1,USART_IT_TC);
  6.     USART_ITConfig(USART1,USART_IT_TC,ENABLE);  
  7. }

求解答
NE5532 发表于 2015-7-12 10:35 | 显示全部楼层
ISR里面不是重新发送了数据么,那发完了还不是应该进来?而且ISR里面还设什么enable,一看就是乱来。小白不怕,怕不思考的小白。
 楼主| donsbin 发表于 2015-7-12 11:31 | 显示全部楼层
NE5532 发表于 2015-7-12 10:35
ISR里面不是重新发送了数据么,那发完了还不是应该进来?而且ISR里面还设什么enable,一看就是乱来。小白不 ...

不好意思,受教了。改了下还是这种情况。

  1. INTERRUPT_HANDLER(Uart_TX_IRQHandler,27)
  2. {
  3.   if (flag)        
  4.   {
  5.       USART_SendData8(USART1,(unsigned char)TxBuff[txbtm++]);
  6.       if(txbtm > 10)
  7.        {
  8.             flag = 0;
  9.             txbtm  = 0;
  10.        }
  11.   }
  12.   USART_ClearITPendingBit(USART1,USART_IT_TC);
  13.   //USART_ITConfig(USART1,USART_IT_TC,ENABLE);
  14. }
NE5532 发表于 2015-7-12 12:43 | 显示全部楼层
txbtm是全局变量么?把这个变量通过串口发出来看,在变化么?
冰河w 发表于 2015-7-12 13:15 | 显示全部楼层
楼主对程序理解的不是很深入呀
 楼主| donsbin 发表于 2015-7-12 13:47 | 显示全部楼层
NE5532 发表于 2015-7-12 12:43
txbtm是全局变量么?把这个变量通过串口发出来看,在变化么?

自己配了下寄存器,可以了。
原因还没找到,不过还是谢谢
XC456 发表于 2015-7-12 14:39 | 显示全部楼层
硬件电路确定没有问题吗?改下触发方式看看,标志位什么的
 楼主| donsbin 发表于 2015-7-12 14:51 | 显示全部楼层
XC456 发表于 2015-7-12 14:39
硬件电路确定没有问题吗?改下触发方式看看,标志位什么的

我用官方的库函数,查询发送,中断接收都是可以的。
都是如果存在初始化使能发送中断,就会不停进入串口发送中断服务函数。
lgq1542380129 发表于 2015-7-12 17:23 | 显示全部楼层
donsbin 发表于 2015-7-12 14:51
我用官方的库函数,查询发送,中断接收都是可以的。
都是如果存在初始化使能发送中断,就会不停进入串口 ...

楼主初始化的时候,清发送标志位看看呢。
尤彼卡 发表于 2015-7-12 22:17 | 显示全部楼层
标志位是不是每次都得清
feilusia 发表于 2015-7-13 05:44 来自手机 | 显示全部楼层
usart_it_tc 楼主,这个是啥
XC456 发表于 2015-7-13 08:37 | 显示全部楼层
donsbin 发表于 2015-7-12 14:51
我用官方的库函数,查询发送,中断接收都是可以的。
都是如果存在初始化使能发送中断,就会不停进入串口 ...

中断标志位及时清除了吗?
 楼主| donsbin 发表于 2015-7-13 09:29 | 显示全部楼层
feilusia 发表于 2015-7-13 05:44
usart_it_tc 楼主,这个是啥

TC:发送完成
当包含有数据的一帧发送完成后,由硬件将该位置位。如果UART_CR2中的TCIEN为1,则产生中断。
 楼主| donsbin 发表于 2015-7-13 09:37 | 显示全部楼层
我看论坛里有人说过:
TXE:发送数据寄存器空    触发中断
TC:发送完成                触发中断
而我使能的是发送完成触发中断

  1. USART_ITConfig(USART1,(USART_IT_RXNE|USART_IT_TC),ENABLE);  //使能发送接收中断

中断标识我没进一次都是清除的。

  1. USART_ClearITPendingBit(USART1,USART_IT_TC);

更有帖子里说使能发送中断就是要一直触发的,不发送就关闭中断。
:dizzy:准备先试试看吧
feilusia 发表于 2015-7-13 11:21 | 显示全部楼层
donsbin 发表于 2015-7-13 09:29
TC:发送完成
当包含有数据的一帧发送完成后,由硬件将该位置位。如果UART_CR2中的TCIEN为1,则产生中断 ...

USART_ITConfig(USART1,(USART_IT_RXNE|USART_IT_TC),ENABLE);  //使能发送接收中断
为啥需要“USART_IT_TC”?
 楼主| donsbin 发表于 2015-7-13 11:27 | 显示全部楼层
问题已解决!感谢大家的帮助。:D
feilusia 发表于 2015-7-13 11:30 | 显示全部楼层
donsbin 发表于 2015-7-13 11:27
问题已解决!感谢大家的帮助。

恭喜~分享一下解决办法吧
 楼主| donsbin 发表于 2015-7-13 11:37 | 显示全部楼层
feilusia 发表于 2015-7-13 11:30
恭喜~分享一下解决办法吧

14楼我已经说明了问题。两个中断选一个使用
wjl520tyy 发表于 2017-9-15 14:09 | 显示全部楼层
您好,我想问一下,你这个是怎么实现发送中断的
请求代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

96

帖子

2

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