天天看點

MCU開發遇到的一些小問題

文章目錄

    • 外部晶振起振
    • 内部flash讀寫
    • MCU hard fault 的常見原因
    • MCU軟體重新開機的方式

外部晶振起振

一般情況下,外部晶振(如32.768K)上電就能起振,但是在連接配接MCU的情況下,有些MCU有一個OSC子產品用于對外部晶振進行控制(模式選擇),這種情況下,請參考資料手冊,選擇正确的模式以啟動外部晶振。

MCU開發遇到的一些小問題
MCU開發遇到的一些小問題

内部flash讀寫

MCU 内部flash的讀寫擦除操作一定要小心,因為flash不能再擦除,寫的同時又進行讀,而MCU的程式一般儲存在flash中,是以在程式運作的過程中,如果你同僚對這個内部flash進行操作,一個不注意,就會發生錯誤(如寫的時候,中斷到來,程式需要讀flash),最常見的現象就是MCU重新開機

MCU hard fault 的常見原因

  • 數組越界,在copy和set的時候請使用安全函數 memcopy_s ,memset_s
    • ps:

      memcopy_s

      memset_s

      包含在

      string.h

      頭檔案中,同時需要在檔案開頭聲明

      #define __STDC_WANT_LIB_EXT1__ 1

    #define __STDC_WANT_LIB_EXT1__ 1
    #include "string.h"
               

MCU軟體重新開機的方式

cortex m處理器擁有軟體重新開機指令,一般相應的核心代碼中包含了該函數,可以直接調用

如NXP的 KL27Z晶片使用cotex m0,其SDK的頭檔案

core_cm0plus.h

中就有如下代碼

/**
  \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  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
                 SCB_AIRCR_SYSRESETREQ_Msk);
  __DSB();                                                          /* Ensure completion of memory access */

  for(;;)                                                           /* wait until reset */
  {
    __NOP();
  }
}