打印

STM32的串口发送中断一直进入

[复制链接]
14214|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
遇从灵来|  楼主 | 2014-6-25 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 遇从灵来 于 2014-6-25 15:13 编辑

请教一个串口相关的问题,代码如下:
void Uart_Port_Init(void)   ?配置端口
{
        GPIO_InitTypeDef         GPIO_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        
//         USART_DeInit(USART1);
        /* Connect PXx to USARTx_Tx */
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
        /* Connect PXx to USARTx_Rx */
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void Uart_Init(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        USART_ClockInitTypeDef        USART_Clock_InitStructure;
               
        USART_InitTypeDef        USART_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_Parity_Even;
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_Init(USART1, &USART_InitStructure);
        
        USART_Clock_InitStructure.USART_Clock = USART_Clock_Disable;
        USART_Clock_InitStructure.USART_CPOL = USART_CPOL_Low;                                                  //²»Ê¹ÓÃͬ²½Ä£Ê½
        USART_Clock_InitStructure.USART_CPHA = USART_CPHA_2Edge;                                                                                          
        USART_Clock_InitStructure.USART_LastBit = USART_LastBit_Disable;        
        USART_ClockInit(USART1,&USART_Clock_InitStructure);
        
        USART_ClearFlag(USART1,USART_IT_RXNE);
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        USART_ClearFlag(USART1,USART_IT_TXE);
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
        USART_ClearFlag(USART1,USART_FLAG_TC);
        USART_ITConfig(USART1, USART_IT_TC, ENABLE);
//         USART_Cmd(USART1, ENABLE);
        USART1->CR1 |= 0x0006;        
        
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        
        NVIC_Init(&NVIC_InitStructure);        
}

void USART1_IRQHandler(void)
{
        INT8U Temp;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                Temp = USART_ReceiveData(USART1);
                USART_SendData(USART1,Temp);
                USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
        }
        if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
        {   
                USART_ClearITPendingBit(USART1,USART_IT_TXE);
                USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
//                 USART1->SR &= ~(1<<7);
        }  
}
结果程序一直进入TXE中断,仿真时TXE一直为1,专门清也清不掉,想进入RXNE中断。反而进入不了。
沙发
wenunit| | 2014-6-25 15:17 | 只看该作者
发送完了,要关发送中断,不然就是一直进的.

使用特权

评论回复
板凳
遇从灵来|  楼主 | 2014-6-25 15:19 | 只看该作者
本帖最后由 遇从灵来 于 2014-6-25 15:27 编辑
wenunit 发表于 2014-6-25 15:17
发送完了,要关发送中断,不然就是一直进的.


关键是我现在都还没发送数据,唯一的一次发送是在接受里面进行的,而接受一直进入不了

使用特权

评论回复
地板
wenunit| | 2014-6-25 15:26 | 只看该作者
理解一下吧,只要开了中断,就一定要发数据..

使用特权

评论回复
5
遇从灵来|  楼主 | 2014-6-25 15:35 | 只看该作者
wenunit 发表于 2014-6-25 15:26
理解一下吧,只要开了中断,就一定要发数据..

我开始时就关掉中断,TXE还是一直为1,串口中断也进不了了

使用特权

评论回复
6
mmuuss586| | 2014-6-25 15:47 | 只看该作者
USART_ClearFlag(USART1,USART_FLAG_TC);
         USART_ITConfig(USART1, USART_IT_TC, ENABLE);
去掉这2句试下;

使用特权

评论回复
7
遇从灵来|  楼主 | 2014-6-25 15:51 | 只看该作者
mmuuss586 发表于 2014-6-25 15:47
USART_ClearFlag(USART1,USART_FLAG_TC);
         USART_ITConfig(USART1, USART_IT_TC, ENABLE);
去掉这 ...

我如果不加上这一句的话,不仅TXE一直为1,而且TC也一直为1

使用特权

评论回复
8
wenunit| | 2014-6-25 15:52 | 只看该作者
做为软件工程师,要学会举一反三.
原理就是这样,开了发送中断,就一定要发数据,
不开中断,你何必管TXE呢...

使用特权

评论回复
9
mmuuss586| | 2014-6-25 15:55 | 只看该作者
遇从灵来 发表于 2014-6-25 15:51
我如果不加上这一句的话,不仅TXE一直为1,而且TC也一直为1

:)
那你试下其它网友发的例程吧;

使用特权

评论回复
10
遇从灵来|  楼主 | 2014-6-25 15:57 | 只看该作者
wenunit 发表于 2014-6-25 15:52
做为软件工程师,要学会举一反三.
原理就是这样,开了发送中断,就一定要发数据,
不开中断,你何必管TXE呢... ...


我可以不管TXE,但问题是接受中断也进不去  

使用特权

评论回复
11
遇从灵来|  楼主 | 2014-6-25 16:00 | 只看该作者
mmuuss586 发表于 2014-6-25 15:55
那你试下其它网友发的例程吧;

网上一般都是F系列的例程,我那程序在F103上也可以跑的,但到了L系列上就不好使了

使用特权

评论回复
12
mmuuss586| | 2014-6-25 16:06 | 只看该作者
你在接收中断中,使能发送中断;
在发送中断中,禁止发送中断;
这样做的目的是啥啊?

使用特权

评论回复
13
遇从灵来|  楼主 | 2014-6-25 16:14 | 只看该作者
mmuuss586 发表于 2014-6-25 16:06
你在接收中断中,使能发送中断;
在发送中断中,禁止发送中断;
这样做的目的是啥啊? ...

在接受中断中使能发送,之后把接收到的数据发出去,在发送中断中,发送后就发中断禁了,就是为了防止在不发送时进入发送中断

使用特权

评论回复
14
z755924843| | 2014-6-26 10:32 | 只看该作者
是不是你在接收中断里 发送数据了 然后又开了发送中断  所以才会一直进入到中断里面啊?建议你调试的时候 在每个中断里加个调试信息。你好确定每次进入的是哪个中断啊。

使用特权

评论回复
15
wyde518| | 2014-6-26 11:26 | 只看该作者
你这个没实验,不能妄加评论,但有几个建议:

判断发送完成判断TC,而不是TXE
发送完全可以用查询法,不必用中断法

使用特权

评论回复
16
遇从灵来|  楼主 | 2014-7-7 09:57 | 只看该作者
问题找出来了,是函数库有问题,一模一样翻译成寄存器版就OK了

使用特权

评论回复
17
CatGreenEyes| | 2015-6-28 15:44 | 只看该作者
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);          //接收满中断
USART_ITConfig(USART2, USART_IT_TC,  ENABLE);            //发送完成中断

如果写成  USART_ITConfig(USART2, USART_IT_TXE,  ENABLE),就会一直进入发送中断,因为TXE是发送寄存器空中断,即只要发送寄存器里一直没有数据,就会一直引起发送中断,改成USART_IT_TC,即 数据发送完的时刻引发一次发送中断,就可实现,发完数据一次,引发一次中断。        

使用特权

评论回复
18
todou1020| | 2016-5-1 08:33 | 只看该作者
遇从灵来 发表于 2014-7-7 09:57
问题找出来了,是函数库有问题,一模一样翻译成寄存器版就OK了

哪个有问题,现在遇到同样问题,只要调试就一直TC TXE置位,根本清不了,,

使用特权

评论回复
19
cnb12345| | 2016-5-2 11:53 | 只看该作者

使用特权

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

本版积分规则

2

主题

63

帖子

0

粉丝