打印

进入USART中断出不来了

[复制链接]
2974|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
joypark159|  楼主 | 2013-8-9 13:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 joypark159 于 2013-8-9 13:49 编辑

进入接收中断后出不来了,单步运行可以执行程序,一全速运行就进入接收中断,无法出来,
void USART3_IRQHandler(void)
{
        /*if(USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
                        {
       USART_ReceiveData(USART3);
                        }*/
        
        if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
                {        
                        RX_ID[cose++]= USART_ReceiveData(USART3);               
                        USART_ClearITPendingBit(USART3,USART_IT_RXNE);
                                       
                }
        
}
沙发
crazy2012| | 2013-8-9 14:01 | 只看该作者
你怎么就知道出不来了呢,你把全部代码发出来看看。

使用特权

评论回复
板凳
joypark159|  楼主 | 2013-8-9 14:10 | 只看该作者
crazy2012 发表于 2013-8-9 14:01
你怎么就知道出不来了呢,你把全部代码发出来看看。

全速运行的时候,一断开就是中断里面,并且一直都在中断里面,但我没发送数据给芯片,单步运行的时候是可以执行跳出中断,然后再全速运行又死在了中断

使用特权

评论回复
地板
crazy2012| | 2013-8-9 14:13 | 只看该作者
joypark159 发表于 2013-8-9 14:10
全速运行的时候,一断开就是中断里面,并且一直都在中断里面,但我没发送数据给芯片,单步运行的时候是可 ...

你把全部代码发出来看看

使用特权

评论回复
5
joypark159|  楼主 | 2013-8-9 14:17 | 只看该作者
crazy2012 发表于 2013-8-9 14:13
你把全部代码发出来看看

void USART3_Config(void)
{       
        USART_InitTypeDef USART_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);           
       
        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(USART3, &USART_InitStructure);
        USART_Cmd(USART3, ENABLE);
        USART_ITConfig(USART3,USART_IT_TXE,DISABLE);       
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
       
}


void USART3_IRQHandler(void)
{
        /*if(USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
                        {
       USART_ReceiveData(USART3);
                        }*/

        if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
                {       
                        RX_ID[cose++]= USART_ReceiveData(USART3);               
                        USART_ClearITPendingBit(USART3,USART_IT_RXNE);                       
                }
                /*if(USART_GetFlagStatus(USART3,USART_FLAG_ORE)==SET)
                {
                USART_ClearFlag(USART3,USART_FLAG_ORE);
                USART_ReceiveData(USART3);
                }*/
       
}

这是主要的,其它的是一些应用程序,就是当接收到数组后执行的程序,就这发了,太长。采用的是中断接收,查询发送。

使用特权

评论回复
6
feilusia| | 2013-8-9 14:31 | 只看该作者
你把IO口配置完再试试

使用特权

评论回复
7
joypark159|  楼主 | 2013-8-9 14:39 | 只看该作者
feilusia 发表于 2013-8-9 14:31
你把IO口配置完再试试

IO,USART,NVIC全部都配置了

使用特权

评论回复
8
feilusia| | 2013-8-9 14:47 | 只看该作者
供参考,我觉得你是IO口没设置好,不稳定而进入中断。
void USART_CONFIG()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        USART_ClockInitTypeDef USART_ClockInitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                        //GPIOA的第9口设置为复用输出,50MHz
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                        //GPIOA的第10口设置为上拉输入,50MHz
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;//   
        USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;  
        USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;  
        USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;   
        USART_ClockInit(USART1,&USART_ClockInitStructure);
       
        USART_InitStructure.USART_BaudRate = 115200;                                                                                //设置串口通信时的波特率115200   
        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_Init进行初始化  
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);                                                                                //使能串口1接收中断
        USART_Cmd(USART1, ENABLE);                                                                                                                        //开启USART1,注意与上面RCC_APB2PeriphClockCmd()设置的区别
}

使用特权

评论回复
9
chuangpu| | 2013-8-9 20:12 | 只看该作者
单步调试   看看哪里出了问题   代码量太多哦

使用特权

评论回复
10
joypark159|  楼主 | 2013-8-10 08:53 | 只看该作者
chuangpu 发表于 2013-8-9 20:12
单步调试   看看哪里出了问题   代码量太多哦

单步高度没有问题,每一步都能通过,但只要一全速运行就进入中断

使用特权

评论回复
11
trumpxp| | 2013-8-10 10:02 | 只看该作者
难道是中断标志位没有及时清除   或者是直接进入了死循环吗

使用特权

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

本版积分规则

8

主题

30

帖子

0

粉丝