[STM32F1] 要按一下复位键后才能正常工作

[复制链接]
4892|24
 楼主| happy_10 发表于 2018-7-28 08:41 | 显示全部楼层 |阅读模式
我有一块原点的开发板,这块板有一键下载电路,通过串口连接电脑USB口可以正常下载,重新上电也可以正常工作,但当我通过该板上的3.3伏接口直接给MCU供电(没有经过一键下载电路),通过串口也可以正常下载,但重新上电后无**常工作,要按一下复位键后才能正常工作
wenfen 发表于 2018-7-28 08:43 | 显示全部楼层
这板子有啥特殊之处啊
 楼主| happy_10 发表于 2018-7-28 08:44 | 显示全部楼层
这块板在RESET口有接RC复位电路,请问为什么会出现这种情况,是不是STM32的上电复位就是这么难搞的?
zhuhuis 发表于 2018-7-28 08:46 | 显示全部楼层
其实STM的复位电路最简单,在外部一个0.1uF的电容就搞定了。
 楼主| happy_10 发表于 2018-7-28 08:48 | 显示全部楼层
还有一个问题就是有关中断函数的,开发板的例程里有个定时器程序,按设计是500毫秒触发定时中断,然后在定时中断函数里给一个LED翻转一下(也就是让它亮半秒灭半秒),但不明白的是中断函数里还有一句判断定时中断标志位的语句,只有这个标志为1才能让LED翻转,我想发既然都已经进入定时中断程序里了也说明已经触发了定时中断,为什么还要查询标志位呢,于是我将该查询标志位语句屏蔽掉结果居然不能翻转,为什么会这样呢,在51这样做是绝对没问题的,为什么STM32为不行呢?
chenho 发表于 2018-7-28 08:50 | 显示全部楼层


估计是你的RC电路问题,电容的充电太快,你最好看一下STM的内部复位电路结构
chenho 发表于 2018-7-28 08:51 | 显示全部楼层
51的定时器中断原因只有一个,那就是溢出。
chenho 发表于 2018-7-28 08:52 | 显示全部楼层


ST的定时器中断原因有很多个,你的确认这个中断是不是你要的那个
 楼主| happy_10 发表于 2018-7-28 08:54 | 显示全部楼层
照理说没有外部复位电路也可以的,因为内剖也有复位电路,而且那个电容是104的,还接了上拉电阻,而且直接通过串口接USB串口(5伏)是没问题的
huwr 发表于 2018-7-28 08:56 | 显示全部楼层
不能工作的时候,看下复位脚的电平是多少V;
huanghuac 发表于 2018-7-28 08:58 | 显示全部楼层


同样的定时器中断
ARM有很多中断源,程序当然要判断是哪个中断源引起的;
和STM32没什么关系,其它厂家的ARM也一样;
 楼主| happy_10 发表于 2018-7-28 09:00 | 显示全部楼层

//定时器3中断服务程序         
void TIM3_IRQHandler(void)  
{                                                                  
        if(TIM3->SR&0X0001)//溢出中断
        {
                LED1=!LED1;                                                                                                                        
        }                                   
        TIM3->SR&=~(1<<0);//清除中断标志位            
}

从void TIM3_IRQHandler(void)不是能看出是定时器3产生的才进入这个函数吗?
gongche 发表于 2018-7-28 09:01 | 显示全部楼层


难道别的中断也会进入这个函数吗?
wenfen 发表于 2018-7-28 09:03 | 显示全部楼层


void TIM3_IRQHandler(void)  
{                                                                  
       LED1=!LED1;                                                                                                                                                  
        TIM3->SR&=~(1<<0);//清除中断标志位            
}
如果你对TIM3只是启动了一个溢出中断,这样写也没问题。
但是如果你如果对TIM3增加了一个中断,你这个程序就要改动的比较大。所以建议你还是按照那个格式写
void TIM3_IRQHandler(void)  
{                                                                  
        if(中断原因1)
        {
                //清除中断标志1
               //中断处理1                                                                                                   
        }                     
       else if(中断原因2)
      {
             //清除中断标志2
            //中断处理2
      }                       
}
zhuhuis 发表于 2018-7-28 09:04 | 显示全部楼层
电阻R26和R27焊的那个?
 楼主| happy_10 发表于 2018-7-28 09:06 | 显示全部楼层
我只是启动了溢出中断,现在是我说屏蔽这句才出问题:if(TIM3->SR&0X0001)//溢出中断,如果象你说的启动了多个TIM3中断那当然要查询标志位,但我只启动了这一个啊,为什么还要查询标志位
 楼主| happy_10 发表于 2018-7-28 09:08 | 显示全部楼层


NRST脚通过1个10K电阻接VCC,NRST脚再接一个104电容到地
tian111 发表于 2018-7-28 09:09 | 显示全部楼层
接了这个上拉电阻反而累事了?
wenfen 发表于 2018-7-28 09:10 | 显示全部楼层
检查你用的MCU有没有BOOT启动区选择引脚(从RAM启动,从FLASH启动等),在上电时引脚是否妥当处理了?
chenho 发表于 2018-7-28 09:12 | 显示全部楼层
关于标志,楼主你把那个if判断去掉,然后在取反语句后面加几个不相关的if判断,然后再跑跑看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

744

主题

7973

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部