打印
[信息]

【实战经验】STM32F107 复位标志问题

[复制链接]
1548|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-14 14:04 编辑

STM32F107 复位标志问题
前言

本篇讨论了STM32F107 中RCC_CSR 寄存器中PINRSTF 标志置位的问题。

问题:

某用户使用STM32F107 产品进行设计。在使用程序入口处,会判断RCC_CSR 中的标志来确定上次
复位的类型。然而,用户发现其中的PINRSTF 标志即使在NRST 引脚并未被外部信号拉低时,也会被
置起,从而引起判断出错。
D9 的存在 IO 口实际处于Floating 状态。此时,采样此通道上电压似乎应当是一个不确定的值才对。

分析:

在参考手册中,关于RCC_CSR 寄存器的描述如下:



表面看来,对各复位源的分割是很清楚的。
然而,在分析NRST 引脚造成的复位时,还需要查看复位电路的框图。



从上图可以看出,当发生其他复位例如看门狗复位时,同样会在NRST 引脚上送出一个至少20us 的低
脉冲。在文档中对这一点也有明确说明。
而复位标志PINRSTF 在内部设计中,只要是其上有低电平,就会被置位。因此,当发生其它复位时,
该位也有可能被置位。关于这一点,在手册中的说明不够符合国内客户习惯,容易造成误解。

那么如何判断复位源呢?
考虑到上述因素,程序中只要略加判断就可以处理,即:
首先判断是否有其它标志被置起。例如,同时有看门狗复位标志和PINRSTF 标志置位,则表明是看门
狗复位。
若仅有PINRST 标志被置位,则表明是NRST 引脚被拉低产生的复位。



对应PDFSTM32F107复位标志问题
更多实战经验请看: 【ST MCU实战经验汇总贴】

沙发
wenshijian| | 2016-7-14 16:39 | 只看该作者
/***************************************************************************************
** 函数名称: F_Parameters_Init
** 功能描述: 全局參數初始
** 参    数: None
** 返 回 值: None      
** 作   者: 温世坚
** 日   期: 2015年09月19日
**--------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**--------------------------------------------------------------------------------------
****************************************************************************************/
void F_Parameters_Init(void)
{
        u8 synREST;
        if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)        //看门狗复位
                synREST=0xAA;
    else if(RCC_GetFlagStatus(RCC_FLAG_SFTRST) != RESET)   //软件复位
                synREST=0x44;
    else if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)   //上电复位
                synREST=0x33;
    else if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST) != RESET)   //低电复位
                synREST=0x22;
    else if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)    //引脚复位
                synREST=0x11;
    else if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)    //掉电复位
                synREST=0x55;
    else
        synREST=0;
        switch(synREST)
        {
                case 0xAA:
                        UARTSd_Str(USART1,"\r\n+看门狗复位");
                break;
                case 0x44:
                        UARTSd_Str(USART1,"\r\n+软件复位");
                break;
                case 0x33:
                        UARTSd_Str(USART1,"\r\n+上电复位");
                break;
                case 0x22:
                        UARTSd_Str(USART1,"\r\n+低电复位");
                break;
                case 0x11:
                        UARTSd_Str(USART1,"\r\n+引脚复位");
                break;
                case 0x55:
                        UARTSd_Str(USART1,"\r\n+掉电复位");
                break;
                default:break;
        }
===============================================
也就是说,我这样判断不对哦? 我疯了好几次都认为是引脚复位~~~~~
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

使用特权

评论回复
板凳
wenshijian| | 2016-7-14 16:41 | 只看该作者
那我的顺序该怎么排列? 最后判断RST引脚复位么?

使用特权

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

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17108

帖子

287

粉丝