打印
[STM32F1]

STM32中在main函数中调用延时函数导致程序死掉!!

[复制链接]
6986|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hxb20122012|  楼主 | 2013-12-26 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在main函数中调用延时函数        
SysTick_Delay(400);
LED_ON(LED1);         
SysTick_Delay(500);
LED_OFF(LED1);

只有调用延时函数的时候就会这样。
如果程序中开了串口,我使用的是USART3,程序总是在串口中断,出不了了,请问该如何解决。

void USART3_IRQHandler(void)
{
               
        uint8_t RxBuf;
        
        if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
        {
                                RxBuf = USART_ReceiveData(USART3);
               
                                
                                RS485_RX_BUF[RS485_RX_GL] = RxBuf;
               
                                RS485_RX_GL++;
               
                                if((RS485_RX_BUF[0]!=RS485STARTCODE)||(RS485_RX_GL>=8))
                                {               
                                                RS485_RX_GL = 0;
                                                RS485_RX_STA = 0;
                                }
                                
                                
                                if(RS485_RX_BUF[7]==RS485ENDCODE)
                                {

                                                        RS485_RX_GL=0;
                                                        RS485_RX_STA=1;
                                                        printf(" RS485 Receive Data ok!\n\r");

                                }
                                
                                //-----------------------------------------------
                                
                                
                                
                        USART_ClearITPendingBit(USART3,USART_IT_RXNE);
        }
               
                if(USART_GetFlagStatus(USART3,USART_FLAG_ORE) == SET)
                {
                 
                        USART_ClearFlag(USART3,USART_FLAG_ORE);
                }
        
}

void RS485_TX_EN2(void)
{

                GPIO_SetBits(RS485_EN2_PORT,RS485_EN2_PIN);
}


void RS485_Init(void)
{
        /*-------------¶¨Òå½á¹¹Ìå±äÁ¿----------*/
        USART_InitTypeDef        USART_InitStructure;         
        GPIO_InitTypeDef        GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        /*--------------ʹÄÜÏàÓ¦ÍâÉèµÄʱÖÓ------*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        
        
        GPIO_InitStructure.GPIO_Pin =  RS485_EN2_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(RS485_EN2_PORT, &GPIO_InitStructure);
        
        USART_DeInit(USART3);

        /*-------------ÅäÖÃUSART3_TX(PB.10)----------*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

        /*-------------ÅäÖÃUSART3_RX(PB.11)----------*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,ENABLE);
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,DISABLE);
        
        RS485_RX_EN2();                //ÉèÖÃΪ½ÓÊÕģʽ

        /*------------USARTdµÄ¸÷¸ö²ÎÊýÅäÖÃ----------*/
        USART_InitStructure.USART_BaudRate = 9600;                //ÉèÖÃUSART´«ÊäµÄ²¨ÌØÂÊ
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //8λÊý¾Ýλ
        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);                //³õʼ»¯USART3µÄ¼Ä´æÆ÷
        
        
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  /* Enable the USART1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
// USART_ClearITPendingBit(USART3, USART_IT_TC);
        
        
        
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
        USART_Cmd(USART3,ENABLE);        
        
        
}


沙发
jjjkkk00| | 2013-12-26 15:07 | 只看该作者
本帖最后由 jjjkkk00 于 2013-12-26 15:10 编辑

先检查一下这几个问题:
1.你的SysTick_Delay()是如何实现延时的?是用普通函数,还是中断函数SysTick_Handler()?
2.有用到中断函数SysTick_Handler()的情况,中断函数中做了些什么?
3.注意:SysTick_Handler()的优先级是不可修改、且等于-1。

排除了SysTick_Handler()打断串口中断的因素后,
然后,在看串口中断的状态位,查找原因。

使用特权

评论回复
板凳
i55| | 2013-12-26 19:35 | 只看该作者
Systick中断优先级低。。。当然进不去了。

你的软件本身设计的逻辑原则就是大错特错,中断函数要尽快执行,给主程序发个信号量自己尽快退出去。

建议你好好学下RTOS,那里面中断是严禁调用系统延迟函数的。

使用特权

评论回复
地板
hxb20122012|  楼主 | 2013-12-26 23:29 | 只看该作者
i55 发表于 2013-12-26 19:35
Systick中断优先级低。。。当然进不去了。

你的软件本身设计的逻辑原则就是大错特错,中断函数要尽快执行 ...

不是吧,串口中断这点事情还是能做吧。RTOS我会,知道中断接受要尽快退出,我自己解决了。

使用特权

评论回复
5
hxb20122012|  楼主 | 2013-12-26 23:30 | 只看该作者
i55 发表于 2013-12-26 19:35
Systick中断优先级低。。。当然进不去了。

你的软件本身设计的逻辑原则就是大错特错,中断函数要尽快执行 ...

我中断里也没有调用延时啊。

使用特权

评论回复
6
i55| | 2013-12-26 23:32 | 只看该作者
hxb20122012 发表于 2013-12-26 23:30
我中断里也没有调用延时啊。

printf用的是semihosting么?

使用特权

评论回复
7
hxb20122012|  楼主 | 2013-12-26 23:34 | 只看该作者
i55 发表于 2013-12-26 23:32
printf用的是semihosting么?

嗯,是的。不过问题也不是这里,我自己弄好了,谢谢了!!!

使用特权

评论回复
8
磨人的小妖精| | 2021-5-27 17:58 | 只看该作者
楼主解决了吗   请问是什么原因了    我现在调用延时函数   在主函数啥都不干  程序就跑飞了

使用特权

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

本版积分规则

74

主题

564

帖子

1

粉丝