MM32F0020的復位腳nRST複用成普通GPIO PA10功能

Armny發表於2022-03-29

目錄:

1.MM32F0020簡介

2.MM32F0020的復位腳nRST和PA10的說明

3.MM32F0020的選項位元組說明

4.MM32F0020的FLASH_OBR選項位元組暫存器說明

5.MM32F0020對選項位元組區塊操作限制的解除與使能

6.MM32F0020對選項位元組區塊擦除的步驟

7.MM32F0020對選項位元組區塊程式設計步驟

8.MM32F0020的復位腳nRST複用成普通GPIO PA10功能

9.驗證MM32F0020的復位腳nRST複用成普通GPIO PA10功能

提要:

  學習MM32F0020 的復位腳RST複用成普通GPIO PA10功能,並用PA10驅動LED燈翻轉,即LED1 TOGGLE。要把nRST復位腳複用成普通GPIO PA10功能需配置使用者選項位元組的

OBR_nRST位7設定為0即可,注意完成選項位元組配置後,需重新給MCU上電才生效。

  特別注意:MM32F0020的復位腳nRST在MCU內部是與PA10繫結的,因此在複用成普通GPIO PA10後,在上電後會從復位到複用的一個過程切換即PA10會有一個低電平到高電平

變化所以工程師要特別注意PA10管腳的應用,如果用在控制MOSFET管要注意避開!!!

內容:

1、MM32F0020簡介

  (1)MM32F0020微控制器是基於Arm® Cortex®-M0核心,最高工作頻率可達48MHz;

  (2)供電電壓支援:2.0V - 5.5V;

  (3)多達32KB的Flash,2KB的SRAM;

  (4)1個I2C;

  (5)2個UART;

  (6)1個12位的共8通道的ADC;

  (7)1個I2C或I2S;

  (8)1個16位高階定時,1個16位通用定時器,1個16位基本定時器;

  (9)1個IWDG和一個WWDG看門狗。

2.MM32F0020的復位腳nRST和PA10的說明

  (1)MM32F0020的MCU有兩種封裝,即TSSOP20和QFN20,TSSOP20封裝的復位腳nRST在MCU的第4腳,QFN20封裝的復位腳nRST在MCU的第1腳分別如下圖1和圖2所示:

                              圖1

                                   圖2

  (2)必須特別強調MM32F0020的復位腳NRST在MCU內部是與PA10繫結的,因此在複用成普通GPIO PA10後,在上電後會從復位到複用的一個過程切換即PA10會有一個低電平到高電平變化,所以工程師要特別注意PA10管腳的應用,如果用在控制MOSFET管要注意避開;

  (3)MM32F0020的復位腳nRST複用成普通GPIO PA10功能是在FLASH_OBR選項位元組暫存器的相關位設定的。

3.MM32F0020的選項位元組說明

  (1)參考MM32F0020的UM手冊嵌入式快閃記憶體章節,在選項位元組頁中,內容主要有防寫使能,看門狗使能等。 Flash 控制器可以通過選項位元組中值的設置,達到使能主儲存器禁止寫入功能,以避免非法寫入;還可以使能硬體看門狗。相關資訊儲存在選項字節中,修改選項位元組中內容後,需要復位或重新上電後才生效,寫入時需按反碼方式寫入,如 nUser, nData等。每次系統復位後,選項位元組會重新裝載選項位元組資訊塊的資料,並做相應的判斷與狀態改變,這些狀態儲存在選項位元組暫存器(FLASH_OBR 及 FLASH_WRPR)中。在資訊塊中每個選擇位都有對應的反碼位,在載入選擇位時反碼位用於驗證選擇位是否正確,如果在載入過程中發現有差別,將產生一個選項字節錯誤標誌(OPTERR),如開啟中斷,將觸發中斷。選項位元組塊中選項位元組的組織結構如下表所示:

(位 15 ∼ 8中的值為位 7 ∼ 0中選項位元組 0 的反碼):

  (2)如上表2-3選項位元組組織結構可知:其中地址0x1FFFF800的nRDP是用於設定選項位元組讀保護相關,地址0x1FFFF802的nUSER是使用者選項位元組設定,用於設定外設相關

功能以及使用者自定義選項位元組設定。

  (3)使用者nUSER選項位元組的含義如下表所示,具體也可參考MM32F0020的UM手冊。

  (3)從上表使用者選項位元組暫存器描述可知,要把nRST復位腳複用成普通GPIO PA10功能需配置使用者選項位元組的OBR_nRST位為0即可,注意完成選項位元組配置後,需重新上電才生效。

4.MM32F0020的FLASH_OBR選項位元組暫存器說明

  (1)如下表所示為MM32F0020的FLASH_OBR選項位元組暫存器,要把nRST復位腳複用成普通GPIO PA10功能需配置使用者選項位元組的OBR_nRST位7設定為0即可,注意完成選項位元組

配置後,需重新給MCU上電才生效。

  

     

5.MM32F0020對選項位元組區塊操作限制的解除與使能

  快閃記憶體控制器在復位後,它的選項位元組區塊預設是處於防寫的,並且任何時候都是可讀的。同樣是為了避免對選項位元組區做塊擦除和寫值等破壞性操作,復位後, FLASH_CR 暫存器進入鎖定狀態,FLASH_CR 的 LOCK 位被控制器模組置為 1,而 OPTWRE 位被控制器模組清除為 0;因此需先後向FLASH_KEYR 暫存器寫入 0x45670123 和 0xCDEF89AB 做解鎖 FLASH 操作, FLASH_CR 的LOCK 位置為 0 後,才做選項位元組區的解鎖。通過向 FLASH_OPT_KEYR 暫存器先後寫入 0x45670123和 0xCDEF89AB ,從而使硬體將 FLASH_CR 暫存器的 OPTWRE 位置 1,才能對選項位元組區執行塊擦除,半字程式設計操作。可將 FLASH_CR 暫存器的 OPTWRE 位置 0,從而禁止對選項位元組區執行塊擦除,半字程式設計操作。

  MM32F0020對選項位元組區塊操作限制的解除和使能如下程式碼所示:

(1)解鎖FLASH

 

#define FLASH_KEY1  ((u32)0x45670123)
#define FLASH_KEY2  ((u32)0xCDEF89AB)

void FLASH_Unlock(void)
{
    FLASH->KEYR = FLASH_KEY1;
    FLASH->KEYR = FLASH_KEY2;
}

(2)解鎖選項位元組區

 

void FLASH_OPTB_Enable(void)
{
    FLASH->OPTKEYR = FLASH_KEY1;
    FLASH->OPTKEYR = FLASH_KEY2;
}

 

(3)上鎖FLASH

 

void FLASH_Lock(void)
{
    FLASH->CR |= FLASH_CR_LOCK;
}

 

6.MM32F0020對選項位元組區塊擦除的步驟

  MM32F0020對選項位元組區塊擦除的步驟如下所示:

 

7.MM32F0020對選項位元組區塊程式設計步驟

  (1)選項位元組區塊的程式設計與主快閃記憶體塊地址的程式設計不同,因其寫入值復位後載入到配置選項,需要更加嚴格的保護。解除對快閃記憶體控制器的訪問限制後,還需要對選項位元組區塊解除訪問限制。完成該操作後,FLASH_CR 暫存器中的 OPTWRE 位會被置 1, 才能允許後續的程式設計操作。

  (2)選項位元組有效資料為低 8 位,而高 8 位為低 8 位的反碼,從而組成為 16 位資料。在程式設計過程中,軟體將高 8 位設定為低 8 位的反碼,保證選項位元組的寫入值總是對的,然後依次寫入 16 位資料。當選項位元組被改變時,需要系統上電覆位使之生效。

  (3)MM32F0020對選項位元組區塊程式設計步驟如下所示:

8.MM32F0020的復位腳nRST複用成普通GPIO PA10功能

  MM32F0020的復位腳nRST複用成普通GPIO PA10功能程式碼如下所示:

//操作MM32F0020的先選位元組把復位腳nRST複用成GPIO PA10功能,注意:因與復位腳共用MCU上電到復位成功後PA10預設高電平。
void Bsp_OPTB_Operation(void)
{
    //Flash UnLock
    FLASH_Unlock();
    //Option Byte Erase
    FLASH_EraseOptionBytes();
    //寫回0x5AA5
    FLASH_ProgramOptionHalfWord(0x1FFFF800,0x5AA5);
#if(1)
    //從UM手冊的選項位元組表可知nUSER使用者選項位元組的起始地址為0x1FFFF802
    //PA10:RST複用為GPIO功能,選項位元組低8位有效,高8位取低8位的反碼寫入,寫入後MCU需重新上電後生效。
    FLASH_ProgramOptionHalfWord(0x1FFFF802,0x20DF);
#else
    //PA10:恢復為RST復位功能,選項位元組低8位有效,高8位取低8位的反碼寫入,寫入後MCU需重新上電後生效。
    FLASH_ProgramOptionHalfWord(0x1FFFF802,0x00FF);
#endif
    //Flash Lock
    FLASH_Lock();
}

9.驗證MM32F0020的復位腳RST複用成普通GPIO PA10功能

  (1)LED初始化函式程式碼如下所示:

#define LED1_ON()       GPIO_ResetBits(LED1_PORT,LED1_PIN)
#define LED1_OFF()      GPIO_SetBits(LED1_PORT,LED1_PIN)
#define LED1_TOGGLE()   (GPIO_ReadOutputDataBit(LED1_PORT,LED1_PIN))?(GPIO_ResetBits(LED1_PORT,LED1_PIN)):(GPIO_SetBits(LED1_PORT,LED1_PIN))
void Bsp_LED_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStruct;
    //Enable GPIOA Clock
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
    
    //Init struct member with its default value.
    GPIO_StructInit(&GPIO_InitStruct);
    //PA1:LED1,PA7:LED2,PA9:LED3,PA11:LED4
    GPIO_InitStruct.GPIO_Pin  =  LED1_PIN;
    //GPIO Speed
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    //Push-pull output
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    //Initializes the gpio peripheral according to the specified parameters in the init struct.
    GPIO_Init(LED1_PORT, &GPIO_InitStruct);

    //ON LED1
    LED1_ON();
}

  (2)在main函式初始化中分別呼叫Systick初始化延時函式DELAY_Init();Bsp_OPTB_Operation();選項位元組操作函式,把MM32F0020的復位腳nRST複用成普通GPIO PA10功能,然後呼叫LED初始化函式Bsp_LED_Init();  

 

  (3)在while(1)主迴圈中呼叫PA10驅動LED1_TOGGLE();翻轉,呼叫延時1000ms函式,編譯程式,燒錄程式到MCU,然後重新給MCU上電使得配置的選項位元組生效即nRST複用成普通GPIO PA10功能生效,可觀察到PA10驅動LED1_TOGGLE每1秒翻轉一次,具體程式碼如下所示:

int main(void)
{
    //Systick Init
    DELAY_Init();
    //操作MM32F0020的選項位元組把復位腳nRST複用成GPIO PA10功能,注意:因PA10與復位腳nRST共用,MCU上電到復位成功後PA10預設為高電平。
    Bsp_OPTB_Operation();
    //LED GPIO Init
    Bsp_LED_Init();  
    
    while(1) 
    {
        //LED1Toggle
        LED1_TOGGLE();
        DELAY_Ms(1000);
    }
}

(4)重新上電後也可進入除錯介面除錯,除錯程式碼沒有重複跑到初始化說明nRST複用成普通GPIO PA10設定成功。

總結:

  學習MM32F0020 的復位腳RST複用成普通GPIO PA10功能,並用PA10驅動LED燈翻轉,即LED1 TOGGLE。要把nRST復位腳複用成普通GPIO PA10功能需配置使用者選項位元組的

OBR_nRST位7設定為0即可,注意完成選項位元組配置後,需重新給MCU上電才生效。

  特別注意:MM32F0020的復位腳NRST在MCU內部是與PA10繫結的,因此在複用成普通GPIO PA10後,在上電後會從復位到複用的一個過程切換即PA10會有一個低電平到高電平

變化所以工程師要特別注意PA10管腳的應用,如果用在控制MOSFET管要注意避開!!!

注意事項:

  (1)MM32F0020的nRST復位腳複用成普通GPIO PA10功能需配置使用者選項位元組的OBR_nRST位7設定為0即可;

  (2)操作選項位元組之前需對選項位元組區塊操作限制的解除與使能,即解鎖FLASH和使能選項位元組操作;

  (3)擦除選項位元組後需在0x1FFFF800起始地址把0x5AA5重新寫回到選項位元組nRDP中;

  (4)程式設計使用者選項位元組的起始地址為0x1FFFF802;

  (5)選項位元組有效資料為低 8 位,而高 8 位為低 8 位的反碼,從而組成為 16 位資料。在程式設計過程中,軟體將高 8 位設定為低 8 位的反碼,保證選項位元組的寫入值總是對的,然後

      依次寫入 16 位資料。當選項位元組被改變時,需要系統上電覆位使之生效。

  (6)特別注意:MM32F0020的復位腳NRST在MCU內部是與PA10繫結的,因此在複用成普通GPIO PA10後,在上電後會從復位到複用的一個過程切換即PA10會有一個低電平到高

電平變化所以工程師要特別注意PA10管腳的應用,如果用在控制MOSFET管要注意避開!!!

  

 

相關文章