打印

STM32F103中断出现错误了

[复制链接]
950|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
麦克塔维什|  楼主 | 2015-9-13 18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下
#include "stm32f10x.h"  

void USART1_Init()  
{  
    NVIC_InitTypeDef NVIC_InitStructure;  
    GPIO_InitTypeDef GPIO_InitStructure;  
    USART_InitTypeDef USART_InitStructure;  
       
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
      
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    GPIO_Init(GPIOA, &GPIO_InitStructure);  
      
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  
    GPIO_Init(GPIOA, &GPIO_InitStructure);  
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         
    NVIC_Init(&NVIC_InitStructure);
  
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);
  
    USART_Cmd(USART1, ENABLE);
    USART_ITConfig(USART1, USART_IT_TC, ENABLE);
    USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
}   
  
int global = 50;

int main(void)  
{  
    USART1_Init();  
       
        while (1)
        {
            USART_SendData(USART1, global);
    }
       
        return 0;
}  

void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_TC) == SET)
    {
        USART_ClearFlag(USART1, USART_FLAG_TC);
    }
    global++;
}
只有在执行
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寄存器,这样的话,才能保证下次也进入中断。
下面是我自己的调试代码,楼主可参考一下:
int main(void)
{                               
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       
        Uart_Init(115200);
        USART_SendData(USART1, global);
        while (1)
  {  
  }
}

void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_TC) == SET)
    {
                        USART_GetFlagStatus(USART1,USART_FLAG_TC);                //
                        USART_SendData(USART1, global);
                        USART_ClearFlag(USART1, USART_FLAG_TC);
    }
    global++;
}


另外再说明一点,楼主提到 “只有在执行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 | 只看该作者
学习了,二楼的说法很详细!

使用特权

评论回复
5
王大熊| | 2015-9-18 08:06 | 只看该作者
不错,很好的经验分享

使用特权

评论回复
6
september7| | 2015-9-19 16:43 | 只看该作者
讲的很详细,二楼有心了!

使用特权

评论回复
7
麦克塔维什|  楼主 | 2016-2-23 16:40 | 只看该作者
结贴老是错误,不知道为什么。二楼讲的很详细,学到了许多东西!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

101

帖子

0

粉丝