網(wǎng)上有很多關(guān)于pos機(jī)電源修復(fù),手把手指導(dǎo)單片機(jī)復(fù)位原因分析的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)電源修復(fù)的問題,今天pos機(jī)之家(m.afbey.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!
本文目錄一覽:
pos機(jī)電源修復(fù)
我是輕松學(xué)長(zhǎng),一個(gè)愛折騰的程序袁,仰望星空、腳踏實(shí)地,做一個(gè)有趣有料的技術(shù)人。
本節(jié)解決問題:軟件代碼識(shí)別STM32復(fù)位原因,輔助代碼調(diào)試。
當(dāng)STM32發(fā)生復(fù)位時(shí),可能原因有上電復(fù)位、掉電復(fù)位、看門狗復(fù)位、軟件復(fù)位等多種,那怎么判斷STM32復(fù)位的原因呢?且看輕松學(xué)長(zhǎng)慢慢道來。
1、STM32 復(fù)位類型STM32有三種復(fù)位:系統(tǒng)復(fù)位、電源復(fù)位和后備域復(fù)位。
1.1 系統(tǒng)復(fù)位指除時(shí)鐘控制寄存器CSR中的復(fù)位標(biāo)志和備份區(qū)域中的寄存器外,將其他的所有寄存器復(fù)位為它們的復(fù)位數(shù)值。系統(tǒng)復(fù)位可通過查看RCC_CSR控制狀態(tài)寄存器中的復(fù)位狀態(tài)標(biāo)志位識(shí)別復(fù)位事件來源,這就是今天的重點(diǎn)。
關(guān)于備份區(qū)域的理解可看下圖:
有以下事件發(fā)生時(shí),會(huì)產(chǎn)生一個(gè)系統(tǒng)復(fù)位:
軟件復(fù)位(SW復(fù)位)低功耗管理復(fù)位NRST引腳上的低電平(外部復(fù)位)窗口看門狗計(jì)數(shù)終止(WWDG復(fù)位)獨(dú)立看門狗計(jì)數(shù)終止(IWDG復(fù)位)看門狗復(fù)位和外部復(fù)位好理解,那軟件復(fù)位和低功耗管理復(fù)位怎么理解呢,何時(shí)會(huì)發(fā)生復(fù)位?
軟件復(fù)位即通過將Cortex?-M3中斷應(yīng)用和復(fù)位控制寄存器中的SYSRESETREQ位置’1’,實(shí)現(xiàn)軟件復(fù)位。STM32官方已經(jīng)將軟件復(fù)位過程給封裝好了,即 NVIC_SystemReset() 函數(shù),NVIC_SystemReset()函數(shù)的內(nèi)容如下:
/* 公眾號(hào):輕松學(xué)長(zhǎng) */ /** \\brief System Reset \\details Initiates a system reset request to reset the MCU. */__STATIC_INLINE void NVIC_SystemReset(void){ __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ __DSB(); /* Ensure completion of memory access */ for(;;) /* wait until reset */ { __NOP(); }}
使用軟件復(fù)位NVIC_SystemReset()函數(shù)時(shí),需在該函數(shù)之前加上__set_FAULTMASK(1)語句,表示關(guān)閉所有中斷的意思;
因?yàn)樵凇禖ortex-M3權(quán)威指南》中有這么一句話提醒我們:從 SYSRESETREQ 被置為有效,到復(fù)位發(fā)生器執(zhí)行復(fù)位令,往往會(huì)有一個(gè)延時(shí)。在此延時(shí)期間,處理器仍然可以響應(yīng)中斷請(qǐng)求。但我們的本意往往是要讓此次執(zhí)行到此為止,不要再做任何其它事情了。所以,最好在發(fā)出復(fù)位請(qǐng)求前,先把 FAULTMASK 置位,即關(guān)閉所有中斷。
低功耗管理復(fù)位:在以下兩種情況下可產(chǎn)生低功耗管理復(fù)位:
1.在進(jìn)入待機(jī)模式時(shí)產(chǎn)生低功耗管理復(fù)位:通過將用戶選擇字節(jié)中的nRST_STDBY位置’1’將使能該復(fù)位。這時(shí),即使執(zhí)行了進(jìn)入待機(jī)模式的過程,系統(tǒng)將被復(fù)位而不是進(jìn)入待機(jī)模式。2.在進(jìn)入停止模式時(shí)產(chǎn)生低功耗管理復(fù)位:通過將用戶選擇字節(jié)中的nRST_STOP位置’1’將使能該復(fù)位。這時(shí),即使執(zhí)行了進(jìn)入停機(jī)模式的過程,系統(tǒng)將被復(fù)位而不是進(jìn)入停機(jī)模式。1.2 電源復(fù)位電源復(fù)位將復(fù)位除了備份區(qū)域外的所有寄存器,當(dāng)發(fā)生以下事件之一時(shí),會(huì)產(chǎn)生電源復(fù)位:
上電/掉電復(fù)位(POR/PDR復(fù)位)從待機(jī)模式中返回電源復(fù)位的復(fù)位源將最終作用于RESET引腳,并在復(fù)位過程中保持低電平。
芯片內(nèi)部的復(fù)位信號(hào)會(huì)在NRST引腳上輸出,脈沖發(fā)生器保證每一個(gè)(外部或內(nèi)部)復(fù)位源都能有至少20μs的脈沖延時(shí);當(dāng)NRST引腳被拉低產(chǎn)生外部復(fù)位時(shí),它將產(chǎn)生復(fù)位脈沖。
STM32芯片內(nèi)部的復(fù)位電路如下圖所示:
1.3 備份域復(fù)位當(dāng)以下事件發(fā)生之一時(shí),會(huì)產(chǎn)生備份區(qū)域復(fù)位,備份區(qū)域復(fù)位只影響備份區(qū)域。
軟件復(fù)位,備份區(qū)域復(fù)位可由設(shè)置備份域控制寄存器 (RCC_BDCR)中的BDRST位產(chǎn)生。在VDD和VBAT兩者掉電的前提下,VDD或VBAT上電將引發(fā)備份區(qū)域復(fù)位。2、軟件判斷復(fù)位原因方法:通過查看控制/狀態(tài)寄存器(RCC_CSR)中的復(fù)位狀態(tài)標(biāo)志位識(shí)別復(fù)位事件來源。
先看一下stm32中文參考手冊(cè)對(duì)RCC_CSR寄存器的描述:
stm32對(duì)CSR寄存器各個(gè)位的宏封裝:
/* 公眾號(hào):輕松學(xué)長(zhǎng) */ /* Flags in the CSR register */#define RCC_FLAG_LSIRDY ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_LSIRDY))) /*!< Internal Low Speed oscillator Ready */#define RCC_FLAG_LSECSS ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_LSECSSD))) /*!< CSS on LSE failure Detection */#define RCC_FLAG_OBLRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_OBLRSTF))) /*!< Options bytes loading reset flag */#define RCC_FLAG_PINRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_PINRSTF))) /*!< PIN reset flag */#define RCC_FLAG_PORRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_PORRSTF))) /*!< POR/PDR reset flag */#define RCC_FLAG_SFTRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_SFTRSTF))) /*!< Software Reset flag */#define RCC_FLAG_IWDGRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_IWDGRSTF))) /*!< Independent Watchdog reset flag */#define RCC_FLAG_WWDGRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_WWDGRSTF))) /*!< Window watchdog reset flag */#define RCC_FLAG_LPWRRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_LPWRRSTF))) /*!< Low-Power reset flag */#define RCC_FLAG_LSERDY ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_LSERDY))) /*!< External Low Speed oscillator Ready */
stm32獲取復(fù)位標(biāo)志的宏:__HAL_RCC_GET_FLAG(FLAG)
/* 公眾號(hào):輕松學(xué)長(zhǎng) */ /** @brief Check RCC flag is set or not. * @param __FLAG__ specifies the flag to check. * This parameter can be one of the following values: * @arg @ref RCC_FLAG_HSIRDY HSI oscillator clock ready. * @arg @ref RCC_FLAG_MSIRDY MSI oscillator clock ready. * @arg @ref RCC_FLAG_HSERDY HSE oscillator clock ready. * @arg @ref RCC_FLAG_PLLRDY Main PLL clock ready. * @arg @ref RCC_FLAG_LSERDY LSE oscillator clock ready. * @arg @ref RCC_FLAG_LSECSS CSS on LSE failure Detection (*) * @arg @ref RCC_FLAG_LSIRDY LSI oscillator clock ready. * @arg @ref RCC_FLAG_OBLRST Option Byte Load reset * @arg @ref RCC_FLAG_PINRST Pin reset. * @arg @ref RCC_FLAG_PORRST POR/PDR reset. * @arg @ref RCC_FLAG_SFTRST Software reset. * @arg @ref RCC_FLAG_IWDGRST Independent Watchdog reset. * @arg @ref RCC_FLAG_WWDGRST Window Watchdog reset. * @arg @ref RCC_FLAG_LPWRRST Low Power reset. * @note (*) This bit is available in high and medium+ density devices only. * @retval The new state of __FLAG__ (TRUE or FALSE). */#define __HAL_RCC_GET_FLAG(__FLAG__) (((((__FLAG__) >> 5U) == CR_REG_INDEX)? RCC->CR :RCC->CSR) & (1U << ((__FLAG__) & RCC_FLAG_MASK)))
stm32清除復(fù)位標(biāo)志的宏:__HAL_RCC_CLEAR_RESET_FLAGS()
/* 公眾號(hào):輕松學(xué)長(zhǎng) */ /** @brief Set RMVF bit to clear the reset flags. * The reset flags are RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST */#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF)2.1 代碼思路
看了對(duì)上面對(duì)控制/狀態(tài)寄存器(RCC_CSR)的描述,代碼的思路就已經(jīng)很明顯了,通過RCC_CSR寄存器中的復(fù)位狀態(tài)標(biāo)志位獲取復(fù)位事件來源,應(yīng)用層做復(fù)位標(biāo)志位,最后清除復(fù)位標(biāo)志。
定義復(fù)位類型枚舉/* 公眾號(hào):輕松學(xué)長(zhǎng) */ /* Reset Flag Status */typedef enum{ RCC_RESET_FLAG_NONE = 0x00, /*!< None Reset Flag */ RCC_RESET_FLAG_IWDGRST = 0x01, /*!< Independent Watchdog Reset Flag */ RCC_RESET_FLAG_SFTRST = 0x02, /*!< Software Reset Flag */ RCC_RESET_FLAG_PORRST = 0x03, /*!< POR/PDR Reset Flag */ RCC_RESET_FLAG_PINRST = 0x04, /*!< PIN Reset Flag */ RCC_RESET_FLAG_LPWRRST = 0x05, /*!< Low-Power Reset Flag */ RCC_RESET_FLAG_OBLRST = 0x06, /*!< Options Bytes Loading Reset Flag */ RCC_RESET_FLAG_WWDGRST = 0x07 /*!< Window Watchdog Reset Flag */}RCC_RESET_FLAG_TypeDef;獲取STM32復(fù)位類型
/* 公眾號(hào):輕松學(xué)長(zhǎng) */ RCC_RESET_FLAG_TypeDef RCC_ResetFlag_GetStatus(void){ RCC_RESET_FLAG_TypeDef ResetStatusFlag = RCC_RESET_FLAG_NONE; if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) { ResetStatusFlag = RCC_RESET_FLAG_IWDGRST; } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) { ResetStatusFlag = RCC_RESET_FLAG_SFTRST; } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) { ResetStatusFlag = RCC_RESET_FLAG_PORRST; } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) { ResetStatusFlag = RCC_RESET_FLAG_PINRST; } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) != RESET) { ResetStatusFlag = RCC_RESET_FLAG_LPWRRST; } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_OBLRST) != RESET) { ResetStatusFlag = RCC_RESET_FLAG_OBLRST; } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) { ResetStatusFlag = RCC_RESET_FLAG_WWDGRST; } __HAL_RCC_CLEAR_RESET_FLAGS(); return ResetStatusFlag;}
到這里就結(jié)束啦,這只是應(yīng)用在STM32單片機(jī)上的復(fù)位類型判斷思路及案例。其他的單片機(jī)一樣的思路,也可以實(shí)現(xiàn)同樣的問題,注意查看其官方手冊(cè)對(duì)相應(yīng)寄存器的描述即可。
任何芯片的官方手冊(cè)都是一筆寶藏,待你去挖掘。
以上就是關(guān)于pos機(jī)電源修復(fù),手把手指導(dǎo)單片機(jī)復(fù)位原因分析的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)電源修復(fù)的知識(shí),希望能夠幫助到大家!
![](/style/images/zhouzong.jpg)