目录:

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

  

MM32F0140的复位脚nRST复用成普通GPIO PA10功能的更多相关文章

  1. stm32复位引脚NRST

    STM32F的NRST是异步复位脚. 当NRST输入低电平的时候,MCU处于复位状态,重设所有的内部寄存器,及片内几十KB的SRAM. 当NRST从低电平变高时,PC指针从0开始. 但是复位的时候不会 ...

  2. 关于springmvc下服务器文件打包成zip格式下载功能

    关于springmvc下服务器文件打包成zip格式下载功能 2016年09月21日 11:22:14 toxic_guantou 阅读数:5731更多 个人分类: 技术点存储   版权声明:本文为博主 ...

  3. mdm9607 gpio12~17改成普通gpio的方法

    qualcomm mdm9607的gpio12~gpio17定义如下: 现在如果想要设置GPIO_12~GPIO_17为普通GPIO口. 需要修改如下: 顺便附上qualcomm的说明: Remove ...

  4. imx6中iomux IO复用

    IOMUX Controller (IOMUXC) IO多路复用控制器1.overviewThe IOMUX Controller (IOMUXC), together with the IOMUX, ...

  5. 高通GPIO驱动(DTS方式)

    gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...

  6. rp6818 和rp4418 重点修改的kernel几个问题!

    kernel\arch\arm\plat-s5p6818\drone\include文件下#define PAD_GPIOD1     (PAD_MODE_ALT | PAD_FUNC_ALT1 | ...

  7. MM32F0140 UART1 DMA RX and TX 中断接收和发送数据

    目录: 1.MM32F0140简介 2.DMA工作原理简介 3.初始化MM32F0140 UART1 4.配置MM32F0140 UART1 DMA接收 5.配置MM32F0140 UART1 DMA ...

  8. STM32管教复用与重映射关系

    摘自:http://blog.csdn.net/lincheng15/article/details/51789093 概括一下:复用就是一个引脚有几个功能,1.做普通IO输入输出 2.其他外设的输入 ...

  9. MM32F0140 UART1中断接收和UART1中断发送

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...

随机推荐

  1. 实体类分层命名PO,VO,BO,DTO,POJO,DAO,DO

    一.Java中PO.DO.TO.DTO. VO. BO.POJO .DAO的概念 PO:persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录.好处是可以把一条记录 ...

  2. 从零开始,开发一个 Web Office 套件(5):Mouse hover over text

    <从零开始, 开发一个 Web Office 套件>系列博客目录 这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office ...

  3. 三大数据库 sequence 之华山论剑 (中篇)

    sequence 用法四 AUTO INCREMENT 通过 DEFAULT 还是需要手动创建 sequence.有没有更简单的用法呢? 当然,就是通过 AUTO INCREMENT 方式,自动创建 ...

  4. 以小25倍参数量媲美GPT-3的检索增强自回归语言模型:RETRO

    NLP论文解读 原创•作者 | 吴雪梦Shinemon 研究方向 | 计算机视觉 导读说明: 一个具有良好性能的语言模型,一定量的数据样本必不可少.现有的各种语言模型中,例如GPT3具有1750亿的参 ...

  5. Html简单标签

    学习html <h1> 标题标签</h1> 标题标签 <p>段落标签</p> 段落标签 换行标签</br> 换行标签 水平线标签</h ...

  6. 安装好的pycharm修改代码存储路径

    安装好pycharm的时候,第一次点开pycharm没有配置好,导致代码存放的路径是默认的.但是现在想把路径改成自己的路径怎么办? 首先,pycharm->file->settings-& ...

  7. 【C# 线程】内存模型(C#)---非常重要 【多线程、并发、异步的基础知识】

    内存模型概述 MSDN:理论与实践中的 C# 内存模型 MSDN:理论与实践中的 C# 内存模型,第 2 部分 内存模型就是内存一致性模型. 以下内如来自维基百科 内存一致性模型列表 线性一致性(Li ...

  8. 多态在C#中的应用

    C# 语言经过专门设计,以便不同库中的基类与派生类之间的版本控制可以不断向前发展,同时保持向后兼容.这具有多方面的意义.例如,这意味着在基类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是 ...

  9. 安装grunt-browser-sync时报错:“未能加载Visual C++ 组件 “VCBuild.exe”

    报错环境:windows7 X64 , VS2012 报错内容: MSBUILD : error MSB3428: 未能加载 Visual C++ 组件"VCBuild.exe". ...

  10. 由浅入深---MyBatis的全局配置文件

    从我开始接触代码,我就很怕写配置文件,一般的配置文件我都是直接从上一个项目复制到这个项目来改改,可能有部分同学也有我这种痛吧: 我目前一般的做法,先去找找例子(从网上,从github,从官网)之后再改 ...