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