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