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

目錄:

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管要注意避開!!!