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功能代码如下所示:

//操作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管要注意避开!!!

Study is interesting