STM32F103中断出现错误了

[复制链接]
1202|6
 楼主| 麦克塔维什 发表于 2015-9-13 18:27 | 显示全部楼层 |阅读模式
代码如下
  1. #include "stm32f10x.h"  

  2. void USART1_Init()  
  3. {  
  4.     NVIC_InitTypeDef NVIC_InitStructure;  
  5.     GPIO_InitTypeDef GPIO_InitStructure;  
  6.     USART_InitTypeDef USART_InitStructure;  
  7.        
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  10.       
  11.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  
  13.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  14.     GPIO_Init(GPIOA, &GPIO_InitStructure);  
  15.       
  16.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  17.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  
  18.     GPIO_Init(GPIOA, &GPIO_InitStructure);  
  19.        
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  21.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  
  22.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  23.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  24.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         
  25.     NVIC_Init(&NVIC_InitStructure);
  26.   
  27.     USART_InitStructure.USART_BaudRate = 9600;
  28.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  29.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  30.     USART_InitStructure.USART_Parity = USART_Parity_No;
  31.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  32.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  33.     USART_Init(USART1, &USART_InitStructure);
  34.   
  35.     USART_Cmd(USART1, ENABLE);
  36.     USART_ITConfig(USART1, USART_IT_TC, ENABLE);
  37.     USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
  38. }   
  39.   
  40. int global = 50;

  41. int main(void)  
  42. {  
  43.     USART1_Init();  
  44.        
  45.         while (1)
  46.         {
  47.             USART_SendData(USART1, global);
  48.     }
  49.        
  50.         return 0;
  51. }  

  52. void USART1_IRQHandler(void)
  53. {
  54.     if(USART_GetITStatus(USART1, USART_IT_TC) == SET)
  55.     {
  56.         USART_ClearFlag(USART1, USART_FLAG_TC);
  57.     }
  58.     global++;
  59. }
只有在执行
  1. USART_ITConfig(USART1, USART_IT_TC, ENABLE);
后才会进入中断,主函数中发送字符不会进入中断,是什么原因呢?

244753440 发表于 2015-9-14 09:52 | 显示全部楼层
楼主  1.编写的程序好像没有开启 复用时钟?2.其实使用 TXE:发送数据寄存器空 这个寄存器位 判断数据发送完成比较简洁一些。
关于你说的问题,我自己测试了一下,可能问题是这个原因:
不知道你读数据手册的时候,有没有注意到 状态寄存器(USART_SR) 寄存器位的说明,关于TC位,TC:发送完成 (Transmission complete)当包含有数据的一帧发送完成后,并且TXE=1 时,由硬件将该位置’1’。如果USART_CR1 中的TCIE为’1’,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。  说明,你的中断程序中,需要先读取USART_SR位,然后再调用 USART_SendData(USART1, global); 这个函数写入 USART_DR寄存器,这样的话,才能保证下次也进入中断。
下面是我自己的调试代码,楼主可参考一下:
  1. int main(void)
  2. {                               
  3.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       
  4.         Uart_Init(115200);
  5.         USART_SendData(USART1, global);
  6.         while (1)
  7.   {  
  8.   }
  9. }

  10. void USART1_IRQHandler(void)
  11. {
  12.     if(USART_GetITStatus(USART1, USART_IT_TC) == SET)
  13.     {
  14.                         USART_GetFlagStatus(USART1,USART_FLAG_TC);                //
  15.                         USART_SendData(USART1, global);
  16.                         USART_ClearFlag(USART1, USART_FLAG_TC);
  17.     }
  18.     global++;
  19. }


另外再说明一点,楼主提到 “只有在执行USART_ITConfig(USART1, USART_IT_TC, ENABLE);后才会进入中断”
其实,这段代码是初始化的代码,为什么会出现这种情况,是因为初始化之后,直接 进入了 USART_SendData函数,楼主并没有在发送数据之前读取 USART_SR寄存器位,也就是USART_SR寄存器位根本就没有被清除掉,才会导致进入中断。楼主可在 USART初始化代码中,添加一句读取USART_SR的代码,USART_GetFlagStatus(USART1,USART_FLAG_TC); 添加之后,可以看看按照你之前的代码是否还会进入 中断服务函数

评分

参与人数 1威望 +1 收起 理由
麦克塔维什 + 1 赞一个!

查看全部评分

 楼主| 麦克塔维什 发表于 2015-9-14 16:35 | 显示全部楼层
244753440 发表于 2015-9-14 09:52
楼主  1.编写的程序好像没有开启 复用时钟?2.其实使用 TXE:发送数据寄存器空 这个寄存器位 判断数据发送完 ...

讲的很详细,学习了!学习的还有很多呀!
justperky 发表于 2015-9-16 09:25 | 显示全部楼层
学习了,二楼的说法很详细!
王大熊 发表于 2015-9-18 08:06 | 显示全部楼层
不错,很好的经验分享
september7 发表于 2015-9-19 16:43 | 显示全部楼层
讲的很详细,二楼有心了!
 楼主| 麦克塔维什 发表于 2016-2-23 16:40 | 显示全部楼层
结贴老是错误,不知道为什么。二楼讲的很详细,学到了许多东西!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

101

帖子

0

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