打印
[STM32F0]

STM32F030没有向其发送数据却进入了接收中断

[复制链接]
2040|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ambercat|  楼主 | 2015-7-29 19:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在使用STM32F030-DISCOVERY开发板,使用UART1普通发送,中断接收。
用串口转USB工具在PC监控。
发现我PC端并没有向芯片发送数据,芯片却进入了中断,查询中断状态寄存器,并不是溢出等中断,就是接收中断标志,很奇怪,而且每次显示接收到的都是0xC000,就好像是初始化后移位寄存器里就有数据了。但是不应该啊,为什么呢

void USART_IROHandler(void)
{
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);
                RevBuf = UART_Recive();
                RevIsOn = 1;
                USART_SendData(USART1, (uint16_t)(USART1->ISR));
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){}  ;        //µÈ´ýÊý¾Ý·¢ËÍ
                USART_SendData(USART1, (uint16_t)((USART1->ISR)>>8));
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){}  ;        //µÈ´ýÊý¾Ý·¢ËÍ
        }
}

void Usart1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
                
        USART_DeInit(USART1); //¸´Î»Usart1
       
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//ʹÄÜUSART1
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
                       
        USART_InitStructure.USART_BaudRate = dUsart1BaudRate; //²¨ÌØÂÊ
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//Êý¾Ýλ8λ
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ֹͣλ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_ITConfig(USART1, USART_IT_RXNE, ENABLE);//½ÓÊÕÖжÏʹÄÜ
        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);  
        USART_Cmd(USART1, ENABLE);
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);

        GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_9);//TX1
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´ÓÃÊä³ö
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//Êä³öÉèΪÍÆÍìģʽ
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;;//
        GPIO_Init( GPIOA, &GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_10);//RX1
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´ÓÃ
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;;
        GPIO_Init( GPIOA, &GPIO_InitStructure );
       
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

       
}

int main ( void )
{
       
        SystemInit();
        LED_Init();
        Usart1_Init();
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//½ÓÊÕÖжÏʹÄÜ
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);

        LED_Open( GPIO_Pin_9 );

        while(1)
        {
                if ( RevIsOn )
                {
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){}  ;        //µÈ´ýÊý¾Ý·¢ËÍ
                        USART1_Puts("received");
                        USART_SendData(USART1, RevBuf);
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                        LED_reverse( GPIO_Pin_9 );
                        RevIsOn = 0;
               
                }
       
        }
               
}
沙发
ambercat|  楼主 | 2015-7-29 19:11 | 只看该作者
除了最开始会莫名进入一次接收中断,后续的发送和接收都很正常

使用特权

评论回复
板凳
amanda_s| | 2015-7-30 14:42 | 只看该作者
PC端的程序不开,也会进去吗?

使用特权

评论回复
地板
ambercat|  楼主 | 2015-7-30 19:06 | 只看该作者
amanda_s 发表于 2015-7-30 14:42
PC端的程序不开,也会进去吗?

也会进去的。

使用特权

评论回复
5
kangke| | 2015-8-10 14:28 | 只看该作者
   问题就出在 USART_GetITStatus(USART1, USART_IT_RXNE) 这个函数,你仔细看看库函数,这个函数返回的是CR1/CR2/CR3的值,但是所有的中断标志位都是在ISR寄存器中,只有USART_GetFlagStatus函数返回的是ISR寄存器的值。

使用特权

评论回复
6
caocai18| | 2017-6-16 15:27 | 只看该作者
楼主怎么解决的 我也遇到同样问题

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝