MM32F0140的复位脚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管要注意避开!!!
MM32F0140的复位脚nRST复用成普通GPIO PA10功能的更多相关文章
- stm32复位引脚NRST
STM32F的NRST是异步复位脚. 当NRST输入低电平的时候,MCU处于复位状态,重设所有的内部寄存器,及片内几十KB的SRAM. 当NRST从低电平变高时,PC指针从0开始. 但是复位的时候不会 ...
- 关于springmvc下服务器文件打包成zip格式下载功能
关于springmvc下服务器文件打包成zip格式下载功能 2016年09月21日 11:22:14 toxic_guantou 阅读数:5731更多 个人分类: 技术点存储 版权声明:本文为博主 ...
- mdm9607 gpio12~17改成普通gpio的方法
qualcomm mdm9607的gpio12~gpio17定义如下: 现在如果想要设置GPIO_12~GPIO_17为普通GPIO口. 需要修改如下: 顺便附上qualcomm的说明: Remove ...
- imx6中iomux IO复用
IOMUX Controller (IOMUXC) IO多路复用控制器1.overviewThe IOMUX Controller (IOMUXC), together with the IOMUX, ...
- 高通GPIO驱动(DTS方式)
gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...
- rp6818 和rp4418 重点修改的kernel几个问题!
kernel\arch\arm\plat-s5p6818\drone\include文件下#define PAD_GPIOD1 (PAD_MODE_ALT | PAD_FUNC_ALT1 | ...
- MM32F0140 UART1 DMA RX and TX 中断接收和发送数据
目录: 1.MM32F0140简介 2.DMA工作原理简介 3.初始化MM32F0140 UART1 4.配置MM32F0140 UART1 DMA接收 5.配置MM32F0140 UART1 DMA ...
- STM32管教复用与重映射关系
摘自:http://blog.csdn.net/lincheng15/article/details/51789093 概括一下:复用就是一个引脚有几个功能,1.做普通IO输入输出 2.其他外设的输入 ...
- MM32F0140 UART1中断接收和UART1中断发送
目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...
随机推荐
- NSSCTF-easyupload1.0
2.0和3.0已经说过,这个1.0上传也可以使用那两个题目的做法,就是使用htaccess的方式进行定义上传文件的类型来进行连接shell,1.0肯定是没有2.0和3.0难的,所以说,也不要将这个题目 ...
- LED调颜色小程序
燧星科技有一个免费的LED调颜色蓝牙小程序,小程序有一个拾色器用来调节颜色.亮度.饱和度,同时显示出RGB的十六进制与十进制数据.还有连接蓝牙模块的功能,可向通用蓝牙模块发送调节后的RGB数据,可为平 ...
- [题解]第十一届北航程序设计竞赛预赛——D.最大公约数
题目描述 给一个长度为n(1<=n<=100000)的正整数列,分成尽量多的非空段,使得每一段的最大公约数相等.一个数的最大公约数是它本身. 解题思路 要求每一段子列的gcd相等,不妨设为 ...
- 最近好忙 (没有)35讲GUI
0: g.integerbox 表示只输入整数的对话框 1:. g.multenterbox 用来表示多个输入框. import easygui as g msg = "请填写以下联系方式& ...
- weblogic自动化打补丁脚本
转至:https://www.it610.com/article/1294086996750311424.htm 目的 weblogic每个季度都会有psu更新,打补丁操作也变成了每个季度都要做的事情 ...
- 在shell中变量的赋值有五种方法!
转至:https://blog.csdn.net/weibo1230123/article/details/82085226 在shell中变量的赋值有五种 :使用 read 命令,直接赋值,使用命令 ...
- 《Symfony 5全面开发》教程03、使用Controller创建第一个页面
我们使用Phpstorm打开我们的项目目录,展开项目目录文件夹. Symfony项目其实也是composer项目,如果你新拿到一个Symfony项目, 你可以在控制台中使用composer insta ...
- Vue 源码解读(10)—— 编译器 之 生成渲染函数
前言 这篇文章是 Vue 编译器的最后一部分,前两部分分别是:Vue 源码解读(8)-- 编译器 之 解析.Vue 源码解读(9)-- 编译器 之 优化. 从 HTML 模版字符串开始,解析所有标签以 ...
- WPF优秀组件推荐之Stylet(一)
一.简介 Stylet是基于WPF的一款MVVM组件,虽然WPF本身是自带MVVM功能的,但实现起来不是很方便 ,通过Stylet,用户可以用很少的代码就能享受MVVM带来的舒适体验. 目前Style ...
- JZ-021-栈的压入、弹出序列
栈的压入.弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等. 例如序列1,2,3,4,5是某栈的压入顺序,序列4 ...