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