MM32F0020的復位腳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功能代碼如下所示:

volatile  u16 ReadData_nRDP = 0x0000;
volatile  u16 ReadData_nUSER = 0x0000;
volatile  u16 ReadData_nData0 = 0x0000;
volatile  u16 ReadData_nData1 = 0x0000;
volatile  u16 ReadData_nWRP0 = 0x0000;

void Bsp_OPTB_Operation(void)
{
    ReadData_nRDP = *(u16*)0x1FFFF800;
    ReadData_nUSER = *(u16*)0x1FFFF802;
    ReadData_nData0 = *(u16*)0x1FFFF804;
    ReadData_nData1 = *(u16*)0x1FFFF806;
    ReadData_nWRP0 = *(u16*)0x1FFFF808; 
    
    //Flash UnLock
    FLASH_Unlock();
    //Option Byte Erase
    FLASH_EraseOptionBytes();
    //OptionByte Program
    FLASH_ProgramOptionHalfWord(0x1FFFF800,ReadData_nRDP); 
    
    //PA10:RST復用為GPIO功能,選項字節低8位有效,高8位取低8位的反碼寫入,寫入后MCU需重新上電后生效。
#if(1)
    //高8位取低8位的反碼,nUSER bit15-bit0:0010 0000 1101 1111
    ReadData_nUSER = 0x20DF;
    
    //從UM手冊的選項字節表可知nUSER用戶選項字節的起始地址為0x1FFFF802
    //nUSER OptionByte Program    
    FLASH_ProgramOptionHalfWord(0x1FFFF802,ReadData_nUSER);
    
    //PA10:恢復為RST復位功能,選項字節低8位有效,高8位取低8位的反碼寫入,寫入后MCU需重新上電后生效。
#else
    //高8位取低8位的反碼
    ReadData_nUSER = ReadData_nUSER & 0x0000;
    ReadData_nUSER = ReadData_nUSER | 0x00FF;

    //nUSER OptionByte Program
    FLASH_ProgramOptionHalfWord(0x1FFFF802,ReadData_nUSER);    
#endif
    FLASH_ProgramOptionHalfWord(0x1FFFF804,ReadData_nData0);
    FLASH_ProgramOptionHalfWord(0x1FFFF806,ReadData_nData1);
    FLASH_ProgramOptionHalfWord(0x1FFFF808,ReadData_nWRP0);
    
    //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管要注意避開!!!

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM