寄存器

1.寄存器

Cortex-M3拥有R0~R15通用寄存器和一些特殊功能寄存器。

R0~R12这些通用寄存器,复位初始值都是不可预料的。

2.Cortex-M3有R0到R15的通用寄存器组

“”

注:绝大部分的16位thumb只能访问R0到R7,而32位thumb-2可以访问全部寄存器

3.特殊功能寄存器

“”

3.1程序状态寄存器组(应用程序PSR+中断号PSR+执行PSR)

3.2中断屏蔽寄存器组:用于控制异常的除能和使能

3.3控制寄存器:用于定义特权级别和当前使用哪个堆栈指针

4.操作模式和特权级别:

两种操作模式(处理器模式):Handler模式和线程模式(用于区分异常服务例程的代码和普通程序的代码)

两种特权等级:特权级和用户级(是指在硬件层面上对存储器访问权限的设置)

注:Cortex-M3在运行主程序(即线程模式)可以使用特权级别和用户级别;但是异常服务例程(即handler模式)只能使用特权级别。当处于线程+用户模式时一些访问权限将被禁止

将代码区分成用户级和特权级,有利于程序架构的稳定,如某一个用户代码出问题,不会使其成为害群之狗,因为用户级别的代码是禁止对一些要害寄存器操作的。

5.异常处理

5.1CONTROL[0]=0;

“”

5.2CONTROL[0]=1;

“”

CONTROL[0]只有在特权级别下可以访问,若在用户级别想访问先通过"系统服务呼叫指令(SVC)"来触发SVC异常,然后在该异常的服务例程中可以修改CONTROL[0]。

6.下面是各操作模式的转换

“”

7.异常和中断

可以有11个系统异常和最多240个外部中断(IRQ),具体芯片使用了多少要看芯片制造厂商。 

作为中断功能的强化,NVIC 还有一条NMI输入信号线,具体做什么由芯片制造商决定,NMI(not masked interrupted)

8.向量表:当一个异常被Cortex-M3内核接受。对应的异常Handler就会执行,向量表用来决定Handler的入口地址。

9.Cortex-M3的双堆栈:主堆栈(MSP)和进程堆栈(PSP)。是由CONTROL[1]控制的。

10.复位序列:

先从0X00地址取出MSP的值再从0x04地址取出PC的初始值,0X04处存的值是复位向量,而不是跳转指令。

“”

此处Cortex-M3与ARM及单片机不同。以前ARM都是从0X00地址开始执行第一条指令,一般第一条指令都是跳转指令

11.MSP及PC初始化的一个例程

“”

本文转载自:网络
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 147

我们需要在外部定义一个SystemInit 函数设置 STM32 的时钟;STM32 上电后,会执行 SystemInit 函数,最后执行我们 C 语言中的 main 函数。

下面就开始使用寄存器来操作 STM32 使 PC0 输出一个低电平。要操作 STM32寄存器,我们就需要使用 C 语言对其封装,这部分程序我们都放在 stm32f10x.h中。具体代码如下:

#define PERIPH_BASE ((unsigned int)0x40000000)

#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)

要控制 PF9 输出低电平,需知道 GPIO 这个外设它是挂接在哪个总线上的,通过Block2外设基地址及APB2总线的偏移地址就可以得到APB2外设的基地址。

GPIO 就是挂接在 APB2 总线上的,根据 GPIOC 的偏移地址就可以得到 GPIOC 外设的基地址,GPIOC 外设内部含有很多个寄存器,比如GPIOC_CRL、GPIOC_CRH 端口配置寄存器、GPIOC_BSRR 置位复位寄存器等,通过他们各自的偏移地址就可以获取对应的寄存器地址,然后要操作地址里面的内容就需要使用到指针,将其强制转换为 unsigned int*指针类型,然后在通过一个*指针来操作该地址里面的内容。在 STM32 中凡是使用到外设功能,都要使能对应的外设时钟,否则即使配置好端口初始化也无法正常使用。因此还需要知道时钟 RCC 外设的基地址,通过数据手册“存储器映射”章节可以知道 RCC 时钟外设是挂接在 AHB 总线上, 根据其偏移值可以得到 RCC 时钟外设的基地址,然后可通过《STM32F1xx 中文参考手册》的“6 小容量、中容量和大容量产品的复位和时钟控制(RCC)”的“6.3.7 APB2 外设时钟使能寄存器(RCC_APB2ENR)”可找到对应的端口 RCC 使能寄存器,只要将 GPIOC 端口时钟使能即可。

使用 C 语言封装好寄存器后,就开始编写 main 函数。

main.c代码:

#include "stm32f10x.h"

#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10) 
//在引用的头文件中声明过GPIOC_BASE
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
void SystemInit(){}
u32 i;
void Delay(i)
{
while(i--);
}
int main()
{
RCC_APB2ENR =(0X01<<4); //使能时钟
while(1)
{
//D1点亮  
GPIOC_CRL &= ~( 0x0F<< (4*0)); //设置推挽输出模式
GPIOC_CRL |= (3<<4*0);
GPIOC_BSRR = (0x01<<(16+0));   //PC0管脚输出低电平
Delay(0x3FFFF);   //延时
GPIOC_BSRR = (0x0000ffff);//D1输出高电平
//D2亮
GPIOC_CRL &= ~( 0x0F<< (4*1));
GPIOC_CRL |= (3<<4*1);
GPIOC_BSRR = (0x01<<(16+1));
Delay(0x3FFFF); 
GPIOC_BSRR = (0x0000ffff);
                //D3
GPIOC_CRL &= ~( 0x0F<< (4*2));
GPIOC_CRL |= (3<<4*2);
GPIOC_BSRR = (0x01<<(16+2));
Delay(0x3FFFF);  
GPIOC_BSRR = (0x0000ffff);
//D4
GPIOC_CRL &= ~( 0x0F<< (4*3));
GPIOC_CRL |= (3<<4*3);
GPIOC_BSRR = (0x01<<(16+3));
Delay(0x3FFFF); 
GPIOC_BSRR = (0x0000ffff);
//D5
GPIOC_CRL &= ~( 0x0F<< (4*4));
GPIOC_CRL |= (3<<4*4);
GPIOC_BSRR = (0x01<<(16+4));
Delay(0x3FFFF);  
GPIOC_BSRR = (0x0000ffff);
//D6
GPIOC_CRL &= ~( 0x0F<< (4*5));
GPIOC_CRL |= (3<<4*5);
GPIOC_BSRR = (0x01<<(16+5));
Delay(0x3FFFF); 
GPIOC_BSRR = (0x0000ffff);
//D7
GPIOC_CRL &= ~( 0x0F<< (4*6));
GPIOC_CRL |= (3<<4*6);
GPIOC_BSRR = (0x01<<(16+6));
Delay(0x3FFFF);   
GPIOC_BSRR = (0x0000ffff);
//D8
GPIOC_CRL &= ~( 0x0F<< (4*7));
GPIOC_CRL |= (3<<4*7);
GPIOC_BSRR = (0x01<<(16+7));
Delay(0x3FFFF);   
GPIOC_BSRR = (0x0000ffff);
}
}

注意:

①包含 stm32f10x.h 头文件,在这个头文件中我们定义的都是寄存器,因此如果要在其他文件中使用这些寄存器就需要把这个头文件包含进来, 否则编译就会报错。

②SystemInit 函数,在前面讲解启动文件时已经说明,程序运行的时候先进入这个函数进行 STM32 的初始化,如果不写这个函数编译器就会报错。这里我们编写这个函数,里面并不对其操作。

③开启 GPIOC 时钟。要使 PC0 正常工作输出一个低电平,必须要打开它的时钟。RCC_APB2ENR 寄存器是在 stm32f10x.h 头文件中定义好的,只要查下《STM32F1xx 中文参考手册》RCC 时钟使能寄存器内容就可以知道此寄存器的第4 位是控制 GPIOC 外设的时钟使能位,只有该位为 1 时才使能,如果为 0 即关闭GPIOC 时钟。所以要让 1 左移 4 位。

④配置 GPIOC 为通用推完输出模式。STM32 的 GPIO 模式有很多,可根据CRx 寄存器设置,CRL 对应 GPIO 的低 8 位,CRH 对应 GPIO 的高 8 位。如果不是特殊需求,一般输出采用推挽输出模式。我们要让 PC0 管脚输出一个低电平,故使用推挽输出模式。只要查下《STM32F1xx 中文参考手册》GPIO 配置寄存器内容就可以知道此寄存器内每 4 位控制一个管脚。

⑤使 PC0 输出低电平。GPIOC_BSRR 为置位、复位寄存器,只要查下《STM32F1xx 中文参考手册》GPIO 置位复位寄存器内容就可以知道,其高 16 位用于复位,如果当高 16 位某位为 1,表示那一位管脚输出低电平,为 0 不影响其输出电平。如果当低 16 位的某位为 1,表示那一位管脚输出高电平,为 0 不影响其输出电平。所以要让 1 左移 16+0 位。

本文转载自:STM32嵌入式开发
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 52

一、STM32 芯片架构简图


STM32 有三种启动方式,从 FLASH 启动(包含系统存储器),从内部 SRAM 启动,从外部 RAM 启动。

二、存储器映射

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,具体见下图。 如果给存储器再分配一个地址就叫存储器重映射。


在这 4GB 的地址空间中, ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个块也都规定了用途,具体分类见下表。每个块的大小都有 512MB,显然这是非常大的,芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的一部分而已。


在这 8 个 Block 里面,有 3 个块非常重要,也是我们最关心的三个块。 Boock0 用来设计成内部 FLASH, Block1 用来设计成内部 RAM, Block2 用来设计成片上的外设,下面我们简单的介绍下这三个 Block 里面的具体区域的功能划分。

1、存储器 Block0 内部区域功能划分

Block0 主要用于设计片内的 FLASH, F429 系列片内部 FLASH 最大是 2MB,STM32F429IGT6 的 FLASH 是 1MB。


2、储存器 Block1 内部区域功能划分

Block1 用于设计片内的 SRAM。 F429 内部 SRAM 的大小为 256KB,其中 64KB 的CCM RAM 位于 Block0,剩下的 192KB 位于 Block1,分 SRAM1 112KB, SRAM2 16KB,SRAM3 64KB, Block 内部区域的功能划分具体见下表。


3、储存器 Block2 内部区域功能划分

Block2 用于设计片内的外设,根据外设的总线速度不同, Block 被分成了 APB 和 AHB两部分,其中 APB 又被分为 APB1 和 APB2, AHB 分为 AHB1 和 AHB2,具体见下表。还有一个 AHB3 包含了 Block3/4/5/6,这四个 Block 用于扩展外部存储器,如 SDRAM,NORFLASH 和 NANDFLASH 等。


三、寄存器映射

根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

1、STM32 的外设地址映射

片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设, APB挂载低速外设, AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中 APB1 总线的地址最低,片上外设从这里开始,也叫外设基地址。

(1)总线基地址


(2)外设基地址

总线上挂载着各种外设,这些外设也有自己的地址范围,特定外设的首个地址称为“ XX 外设基地址”,也叫 XX 外设的边界地址。


(3)外设寄存器

GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为 32bit,占四个字节,在该外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。


2、C 语言对寄存器的封装
(1)封装总线和外设基地址

为了方便理解和记忆,我们把总线基地址和外设基地址都以相应的宏定义起来,总线或者外设都以他们的名字作为宏名。


(2)封装寄存器列表

GPIOA-GPIOH 都各有一组功能相同的寄存器,如 GPIOA_MODER/GPIOB_MODER/GPIOC_MODER 等等,它们只是地址不一样,但却要为每个寄存器都定义它的地址。为了更方便地访问寄存器,我们引入 C 语言中的结构体语法对寄存器进行封装。



这样的地址偏移与 STM32 GPIO 外设定义的寄存器地址偏移一一对应,只要给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存器了。


3、修改寄存器的位操作方法

用 C 语言对寄存器赋值时,我们常常要求只修改该寄存器的某几位的值,且其它的寄存器位不变,这个时候我们就需要用到 C 语言的位操作方法了。

(1)把变量的某位清零

此处我们以变量 a 代表寄存器,并假设寄存器中本来已有数值,此时我们需要把变量a 的某一位清零,且其它位不变。


(2)把变量的某几个连续位清零

由于寄存器中有时会有连续几个寄存器位用于控制某个功能,现假设我们需要把寄存器的某几个连续位清零,且其它位不变。


(3)对变量的某几位进行赋值

寄存器位经过上面的清零操作后,接下来就可以方便地对某几位写入所需要的数值了,且其它位不变,这时候写入的数值一般就是需要设置寄存器的位参数。


(4)对变量的某位取反

某些情况下,我们需要对寄存器的某个位进行取反操作,即 1 变 0 , 0 变 1,这可以直接用如下操作,其它位不变。


本文为CSDN博主 Sumjess 原创文章,
遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:
https://blog.csdn.net/qq_38351824/article/details/104157958

围观 100

标准的 51 单片机内部有 T0 和 T1 这两个定时器,T 就是 Timer 的缩写,现在很多 51 系列单片机还会增加额外的定时器,在这里我们先讲定时器 0 和 1。前边提到过,对于单片机的每一个功能模块,都是由它的 SFR,也就是特殊功能寄存器来控制。与定时器有关的特殊功能寄存器,有以下几个,大家不需要去记忆这些寄存器的名字和作用,你只要大概知道就行,用的时候,随时可以查手册,找到每个寄存器的名字和每个寄存器所起到的作用。

表 5-1 的寄存器是存储定时器的计数值的。TH0/TL0 用于 T0,TH1/TL1 用于 T1。

表 5-2 是定时器控制寄存器 TCON 的位分配,表 5-3 是则是对每一位的具体含义的描述。


大家注意在表 5-3 中的描述中,只要写到硬件置 1 或者清 0 的,就是指一旦符合条件,单片机将自动完成的动作,只要写软件置 1 或者清 0 的,是指我们必须用程序去完成这个动作,后续遇到此类描述就不再另做说明了。

对于 TCON 这个 SFR,其中有 TF1、TR1、TF0、TR0 这 4 位需要我们理解清楚,它们分别对应于 T1 和 T0,我们以定时器 1 为例讲解,那么定时器 0 同理。先看 TR1,当我们程序中写 TR1 = 1 以后,定时器值就会每经过一个机器周期自动加 1,当我们程序中写 TR1 = 0以后,定时器就会停止加 1,其值会保持不变化。TF1,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的定时器设置成 16 位的模式,那么每经过一个机器周期,TL1加 1 一次,当 TL1 加到 255 后,再加 1,TL1 变成 0,TH1 会加 1 一次,如此一直加到 TH1和 TL1 都是 255(即 TH1 和 TL1 组成的 16 位整型数为 65535)以后,再加 1 一次,就会溢出了,TH1 和 TL1 同时都变为 0,只要一溢出,TF1 马上自动变成 1,告诉我们定时器溢出了,仅仅是提供给我们一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。

本节开头我们就提到了定时器有多种工作模式,工作模式的选择就由 TMOD 来控制,TMOD 的位分配和描述见表 5-4 到 5-6 所示,TMOD 的位功能如表 5-5 所示。



可能你已经注意到了,表 5-2 的 TCON 最后标注了“可位寻址”,而表 5-4 的 TMOD 标注的是“不可位寻址”。意思就是说:比如 TCON 有一个位叫 TR1,我们可以在程序中直接进行 TR1 = 1 这样的操作。但对 TMOD 里的位比如(T1)M1 = 1 这样的操作就是错误的。我们要操作就必须一次操作这整个字节,也就是必须一次性对 TMOD 所有位操作,不能对其中某一位单独进行操作,那么我们能不能只修改其中的一位而不影响其它位的值呢?当然可以,在后续课程中你就会学到方法的,现在就先不关心它了。

表 5-6 列出的就是定时器的 4 中工作模式,其中模式 0 是为了兼容老的 8048 系列单片机而设计的,现在的 51 几乎不会用到这种模式,而模式 3 根据我的应用经验,它的功能用模式 2 完全可以取代,所以基本上也是不用的,那么我们就重点来学习模式 1 和模式 2。

模式 1,是 THn 和 TLn 组成了一个 16 位的定时器,计数范围是 0~65535,溢出后,只要不对 THn 和 TLn 重新赋值,则从 0 开始计数。模式 2,是 8 位自动重装载模式,只有 TLn做加 1 计数,计数范围 0~255,THn 的值并不发生变化,而是保持原值,TLn 溢出后,TFn就直接置 1 了,并且 THn 原先的值直接赋给 TLn,然后 TLn 从新赋值的这个数字开始计数。这个功能可以用来产生串口的通信波特率,我们讲串口的时候要用到,本章节我们重点来学习模式 1。为了加深大家理解定时器的原理,我们来看一下他的模式 1 的电路示意图 5-2。

图 5-2 定时器/计数器模式 1 示意图

我带领大家一起来分析一遍这个示意图,日后如果再遇到类似的图,大家就可以自己研究了。OSC 框表示时钟频率,因为 1 个机器周期等于 12 个时钟周期,所以那个 d 就等于 12。下边 GATE 右边的那个门是一个非门电路,再右侧是一个或门,再往右是一个与门电路,大家可以对照一下 5-1 节的内容。

图上可以看出来,下边部分电路是控制了上边部分,那我们先来看下边是如何控制的,我们以定时器 0 为例。

1) TR0 和下边或门电路的结果要进行与运算,TR0 如果是 0 的话,与运算完了肯定是 0,所以如果要让定时器工作,那么 TR0 就必须置 1。

2) 这里的与门结果要想得到 1,那么前面的或门出来的结果必须也得是 1 才行。在 GATE位为 1 的情况下,经过一个非门变成 0,或门电路结果要想是 1 的话,那 INT0 即 P3.2 引脚必须是 1 的情况下,这个时候定时器才会工作,而 INT0 引脚是 0 的情况下,定时器不工作,这就是 GATE 位的作用。

3) 当 GATE 位为 0 的时候,经过一个非门会变成 1,那么不管 INT0 引脚是什么电平,经过或门电路后都肯定是 1,定时器就会工作。

4) 要想让定时器工作,就是自动加 1,从图上看有两种方式,第一种方式是那个开关打到上边的箭头,就是 C/T = 0 的时候,一个机器周期 TL 就会加 1 一次,当开关打到下边的箭头,即 C/T =1 的时候,T0 引脚即 P3.4 引脚来一个脉冲,TL 就加 1 一次,这也就是计数器功能。

本文转自:微信号 - gongyebang(工业帮PLC教育机构),转载此文目的在于传递更多信息,版权归原作者所有。

围观 344

51系列单片机内部主要有四大功能模块,分别是I/O口模块、中断模块、定时器模块和串口通信模块(串行I/O口)。51开发的重点其实就是对这四个部分进行具体的开发,而其对这四个模块的开发实质则又是能否对每个模块所对应寄存器的正确操纵。

单片机的内部结构可以大概归纳如下图:四大功能模块相关的寄存器又可分为四大部分:

I/O口相关:P1 P2 P3 P4
中断相关:IP IE
定时器相关:TMOD TCON TL0、TH0、TL1、TH1
串口通信相关:PCON SBUF

51的特殊功能寄存器sfr笔记

51单片机内部共有21个特殊功能寄存器SFR,从下图中可以看出,每个SFR占1个字节,多数字节单元中的每一位又有专用的“位名称”。这21个SFR又按是否可以位寻址分为两大部分,ACC、IE、P1等11个可以位寻址,SP、TMOD等不可以位寻址。

51的特殊功能寄存器sfr笔记

51的特殊功能寄存器sfr笔记

能位寻址是指能够对它的每一位都可以进行位操作,比如我们常用的用十六进制的数据0x01为p1口赋值使得p1^0输出高电平,这种叫做能位寻址;不可寻址,则是指不能单独进行每一位的操作,如TMOD定时器工作模式及工作方式寄存器,在进行操作时,只能写TMOD=0xXX。再以IE寄存器为例进行位操作的解释。IE寄存器为中断允许寄存器,如各位的作用如图.其中第7位EA是51单片机5个中断的总开关,如要进入任何一个中断时,需先把EA打开,因为可以进行位操作,此时程序有两种写法:1)IE=0x80(假如其它位为0,即1000 0000),也可以直接写EA=1,后者EA=1即属于位操作。

51的特殊功能寄存器sfr笔记

关于能否进行位操作,可以通过查相关资料知道,当然还有个技巧就是其字节地址换成10进制后能否被“8”整除,能被“8”整除的就能进行位操作,不能被“8”整除就不能,如P1地址为90H,10进制为144 144/8=18,能被整除,所以可以位操作。再如TMOD地址为89H, 10进制为137 137/8=17.125,不能被整除,所以不可以位操作。

转自:劳斯机要开车了

围观 388

一、MM32 BKP简介及功能描述

在使用MCU的过程中,当系统在待机模式下被唤醒,或者系统复位或电源复位时,会导致我们在RAM中的一些重要数据丢失,此时该怎么处理呢?MM32为我们提供了备份寄存器(BKP), 备份寄存器是 10 个 16 位的寄存器,可用来存储 20 个字节的用户应用程序数据。他们处在备份域里,当 1.5V 电源被切断,他们仍然由 VDD维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。
复位后,对备份寄存器的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。通过设置寄存器 RCC_APB1ENR 的 PWREN 位来打开电源和后备接口的时钟,可以用半字(16 位)或字(32 位)的方式操作这些外设寄存器。

二、BKP实验分析

  •   实验内容简介

以MM32L073PF为例,往BKP写数据,如果成功则LED慢闪,如果失败则LED快闪。

  •   实验代码分析

首先我们来看main函数:

MM32 MCU之BKP备份寄存器

1、 初始化delay_init, LED_Init 函数;
2、 通过函数BKP_DATA往BKP写数据,成功则返回0;
3、 写入成功则LED慢闪,写入失败则快闪。
MM32 MCU之BKP备份寄存器

在BKP_DATA函数中打开PWR时钟,使能BKP, 先通过WriteToBackupReg函数写入数据,在通过CheckBackupReg读取写入的数据是否正确。

两个函数代码如下:

MM32 MCU之BKP备份寄存器

MM32 MCU之BKP备份寄存器

  •   实验现象

向MM32 Miniboard里下载好程序后,启动板子,发现LED快闪,说明写入成功。

转自:灵动微电子

围观 421

页面

订阅 RSS - 寄存器