手把手教你写STM32的bootloader(SDIO读取TF更新Bootloader)

手把手教你写STM32的bootloader(SDIO读取TF更新Bootloader)
手把手教你写STM32的bootloader(SDIO读取TF更新Bootloader)

手把手教你写STM32的bootloader

(SDIO读取TF卡更新固件)

作者:谭建裕

1、bootloader的简介及作用

什么是bootloader?本人不知道该怎么说,反正会来看这篇都是知道自己要干嘛的。不过bootloader的作用还是要提提的,bootloader最直观的作用就方便,比如你用单片机给人家做了一款产品,后期你的产品固件需要更新的时候,你总不能带着电脑直接去客户那里拆开产品给单片机下程序吧?也不能教客户怎么给单片机

下程序吧?用户体验感太差。

其实本质上bootloader的也是一个完整的程序,也有main函数,有自己的中断向量表,栈顶指针,它可以检查有没有新的固件,如果有,则将新的固件的数据写入到我们指定的flash地址中,之后跳到新的程序中去就OK了。此时bootloader的优势就来了,bootloade 更新固件有很多种方式,本人在这里只详细讲解一种,搞懂一种之后,其它的都好办,因为它们的思路都是一样的。Bootloader的主体原理是:首先将bin文件的数据复制到特定的地址。然后设置中断向量表,设置MSP主堆栈指针(具体请看CM3权威指南),设置复位向量。然后就没有然后了。

2、bootloader涉及的知识

本人在此讲解的是STM32通过读取TF内的bin文件数据来更新固件。这里牵扯到STM32的SDIO外设,FATFS文件系统,STM32的flash读写操作。

2.1 SDIO

SDIO是STM32的外设,需要注意的是只有100引脚及以上的才有。电路原理图如图2-1-1所示。

图2-1-1

注意:在使用TF之前必须保证TF卡格式为FAT32,单元大小为2048。如图2-1-2所示。

图2-1-2

记得在stm32f10x_it.c文件中添加中断函数。如图2-1-3所示。

图2-1-3

2.2 FATFS文件系统移植和使用

文件系统使用的是FATFS9,源码在压缩包的ff9文件夹,如图2-2-1所示。

图2-2-1

从bootloader工程框图(图2-2-2)可以看出需要添加进工程的只有ff.c和disio.c。其实disio.c是需要我们自己编写。

FATFS文件系统给我们提供很多库函数,我们主要只用到了一下:FIL fnew;//定义一个文件结构体

FATFS fs;//定义一个工作区

FRESULT res; //状态标志

UINT br, bw; //读取和写入字节计数变量

f_mount(0,&fs);//在驱动器0中开启一个工作区fs

res = f_open(&fnew, "0:APP.bin", FA_OPEN_EXISTING | FA _READ );//只读(FA_READ )形式打开存在文件(FA_OPEN_EXISTI NG),路径为根目录下的APP.bin文件,文件属性存在fnew中。

f_lseek(&fnew, x);//跳转指令,可以跳转到fnew文件中第x 个字节。

f_read(&fnew, data, 2, &br);//从fnew指向的文件中读取2个字节存在data中。

f_close(&fnew);//关闭文件

f_mount(0,0);//关闭工作区

2.3 STM32的flash读写操作

在对STM32的flash进行写操作之前必须要先擦除要写入地址所在页的数据,而且解锁flash。在写入时,尽管每个地址只能存放8位,每次写入是数据至少是16位,所以写flash时,每次是连续写入两个地址。从这里我们可以看出,以后写数据时,尽量写的地址为偶数。

用到的库函数有:

FLASH_Status FLASH_ErasePage(uint32_t Page_Address);

FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);

void FLASH_Unlock(void);

void FLASH_Lock(void);

本人利用这几个库函数,封装了一下

3、booloader的工作流程

3.1程序流程

1)读取出BIN文件的数据,并写到指定的地址中。

2)设置中断向量表、主堆栈指针和复位向量(具体为什么要设置这个可以去看CM3权威指南)。

3.2 BIN

BIN只是二进制文件,不含有地址信息,纯粹的程序文件。HEX 文件是带有地址信息的,在烧写hex文件时,需要一边转化一些写入。BIN文件的开头的前32位是主堆栈指针,接着32位是复位向量指针。具体如何生成BIN文件,在4节。

3.3查看bootloader所占内存大小

双击图3-3-1中的bootloader-TJY,便会弹出map文件,找到如图3-3-2中的内容,可以看出bootloader所占的flash地址是从0x0800000-0x08004c48。我们在放置新的程序时,就不能放在这段区域内,否则会出问题。

图3-3-1

图3-3-2

4、APP程序的编写

Bootloader写好之后,我们如何写新的程序呢?其实很简单,就和你平时写程序一样,唯一不同是,你要修改两个地方:第一:将IROM1修改成如图4-1所示的数据。原因在3.3小节讲解了,为了不让新程序覆盖bootloader而导致问题。本人的芯片是VCT6,flash地址是0x0800 000 - 0x0804 0000。Bootloader末地址在0x08004c48,给够bootloader的余量,所以我们新程序start:0x0801 0000 ,size:0x3 0000

图4-1

第二:勾选Run #1,在里面填入

D:\MDK\ARM\ARMCC\bin\fromelf.exe --bin -o..\OUTPUT\APP.bin ..\OUTPUT\APP.axf

图4-2

只有这样,编译器才会生成BIN文件。D:\MDK\ARM\ARMCC\bin

是fromelf.exe的路径,在安装MDK的安装文件夹下,每个人的不同,自己可以搜索一下, --bin -o生成BIN的命令,了解一点gcc的人会好理解点。..\OUTPUT\是存放BIN的路径。其中..是工程的同级文件夹(工程存在Project中,BIN放在Output文件夹中,它们是同级的),和.有区别,大家注意一下。APP.axf是工程名字,生成的HEX 文件就是这个名字,不要弄错了。

BIN的名字可以随便改,但是bootloader程序中也要做出相应的修改,否则bootloader找不到新程序的。

最后将BIN放到TF中就可以愉快地升级啦!我的邮箱是641533882@https://www.360docs.net/doc/e49790607.html,。有什么问题,欢迎交流。

寄存器和存储器的区别

https://www.360docs.net/doc/e49790607.html,/p-20032411.html

寄存器和存储器的区别

如果仅是讨论CPU的范畴 寄存器在cpu的内部,容量小,速度快 存储器一般都在cpu外部,容量大,速度慢 回答者:athlongyj - 高级经理六级6-1 08:52 从根本上讲,寄存器与RAM的物理结构不一样。 一般寄存器是指由基本的RS触发器结构衍生出来的D触发, 就是一些与非门构成的结构,这个在数电里面大家都看过; 而RAM则有自己的工艺,一般1Bit由六MOS管构成。所以, 这两者的物理结构不一样也导致了两者的性能不同。寄存器 访问速度快,但是所占面积大。而RAM相反,所占面积小, 功率低,可以做成大容量存储器,但访问速度相对慢一点。 1、 寄存器存在于CPU中,速度很快,数目有限; 存储器就是内存,速度稍慢,但数量很大; 计算机做运算时,必须将数据读入寄存器才能运算。 2、 存储器包括寄存器, 存储器有ROM和RAM 寄存器只是用来暂时存储,是临时分配出来的,断电,后,里面的内容就没了`````

寄存器跟存储器有什么区别? 一般数据在内存里面,要处理(或运算)的时候, 独到寄存器里面。 然后CPU到寄存器里面拿值,拿到运算核内部, 算好了在送到寄存器里面 再到内存 寄存器跟存储器有什么区别? 寄存器跟存储器有什么区别? 寄存器上:“一个操作码+一个操作数”等于一条微指令吗?一条微指令是完成一条机器指令的一个步骤对吗?cpu是直接跟寄存器打交道的对吗?也就是说寄存器是运算器、控制器的组成部分对不? 设计一条指令就是说把几条微指令组合起来对吗? 刚开始学硬件相关知识,学的晕头转向的!! 存储器与寄存器区别 2009-06-09 12:27 寄存器是CPU内部存储单元,数量有限,一般在128bit内,但是速度快,CPU访问几乎没有任何延迟。分为通用寄存器和特殊功能寄存器。 通常说的存储器是独立于cpu之外的,比如内存,硬盘,光盘等。 所有数据必须从存储器传入寄存器后,cpu才能使用。

STM32学习笔记

输入模式初始化GPIOE2,3,4 ①IO口初始化:GPIO_InitTypeDef GPIO_InitStructure; ②使能PORTA,PORTE时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE); ③PE.2.3.4端口配置:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; ④设置成(上拉)输入:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; ⑤GPIO_Init(GPIOE, &GPIO_InitStructure); 输出模式初始化 ①IO口初始化:GPIO_InitTypeDef GPIO_InitStructure; ②使能PB,PE端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); ③3LED0-->PB.5 端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; ④设置(推挽)输出模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ⑤设置IO口速度为50MHz GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ⑥说明初始化哪个端口GPIO_Init(GPIOB, &GPIO_InitStructure); 在LED灯试验中初始为高电平灭GPIO_SetBits(GPIOB,GPIO_Pin_5); 再初始化相同发输出模式时③④⑤可省略例如(经实验初始化恰好为不同IO口相同IO序号③可省略,应该不规范吧) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出,IO口速度为50MHz GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高 1,头文件可以定义所用的函数列表,方便查阅你可以调用的函数; 2,头文件可以定义很多宏定义,就是一些全局静态变量的定义,在这样的情况下,只要修改头文件的内容,程序就可以做相应的修改,不用亲自跑到繁琐的代码内去搜索。 3,头文件只是声明,不占内存空间,要知道其执行过程,要看你头文件所申明的函数是在哪个.c文件里定义的,才知道。 4,他并不是C自带的,可以不用。 5,调用了头文件,就等于赋予了调用某些函数的权限,如果你要算一个数的N次方,就要调用Pow()函数,而这个函数是定义在math.c里面的,要用这个函数,就必需调用math.h 这个头文件。

STM32学习笔记_STM32F103ZET6

STM32F103 系列芯片的系统架构: 系统结构: 在每一次复位以后,所有除SRAM 和FLITF 以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR 来打开该外设的时钟。

GPIO 输入输出,外部中断,定时器,串口。理解了这四个外设,基本就入门了一款MCU。 时钟控制RCC: -4~16M 的外部高速晶振 -内部8MHz 的高速RC 振荡器 -内部40KHz低速RC 振荡器,看门狗时钟 -内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL 倍频后得到 - 外部低速32.768K 的晶振,主要做RTC 时钟源

ARM存储器映像: 数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。

存储器映像与寄存器映射: ARM 存储器映像 4GB 0X0000 00000X1FFF FFFF 0X2000 00000X3FFF FFFF 0X4000 00000X5FFF FFFF

寄存器说明: 寄存器名称 相对外设基地址的偏移值 编号 位表 读写权限 寄存器位 功能说明 使用C语言封装寄存器: 1、总线和外设基地址封装利用地址偏移 (1)定义外设基地址(Block2 首地址) (2)定义APB2总线基地址(相对外设基地址偏移固定) (3)定义GPIOX外设基地址(相对APB2总线基地址偏移固定)(4)定义GPIOX寄存器地址(相对GPIOX外设基地址偏移固定)(5)使用 C 语言指针操作寄存器进行读/写 //定义外设基地址 #define PERIPH_BASE ((unsigned int)0x40000000) 1) //定义APB2 总线基地址 #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) 2) //定义GPIOC 外设基地址 #define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) 3) //定义寄存器基地址这里以GPIOC 为例 #define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00) 4) #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) //控制GPIOC 第0 管脚输出一个低电平5) GPIOC_BSRR = (0x01<<(16+0)); //控制GPIOC 第0 管脚输出一个高电平 GPIOC_BSRR = (0x01<<0);

stm32学习 c语言笔记

这是前段时间做彩屏显示时候遇到的难题, *(__IO uint16_t *) (Bank1_LCD_C)这个就是将后面的数据转换为地址,然后对地址单元存放数据。可如下等效: __IO uint16_t *addr; addr = (__IO uint16_t *) Bank1_LCD_C; #ifdef和#elif连用,语法和if。。。else if语句一样 推挽输出增加驱动,可以驱动LED起来 static int count=0 count++ 这个语句中,count仅仅被初始化一次 以后加加一次期中的值就不会变化了 SysTick_CTRL(控制和状态寄存器) SysTick_LOAD(重装载寄存器) SysTick_VAL(当前值寄存器) SysTick_CALIB(校准值寄存器)

TFT经验:弄多大的相片,必须先把那个相片的尺寸改掉,再去取模,才可以,要不会有重影的嘿嘿嘿嘿 VBAT 是电池供电的引脚 VBAT和ADD同时都掉电时才能让备份区复位。 volatile一个变量的存储单元可以在定义该变量的程序之外的某处被引用。 volatile主要是程序员要告诉编译器不要对其定义的这个变量进行优化,防止其不能被引用,不能被改变。 VDDA>2.4V ADC才能工作 VDDA>2.7V USB才能工作 VDD(1.8-3.6v) VBAT=1.8-3.6v VSS VSSA VREF必须接到地线 没有外部电源供电时必须VBAT接上VDD 使用PLL时,VDDA必须供电

printf("abs(x)=%d\n",x<0?(-1)*x:x) 条件编译是问号前边为真则取冒号前边的值,为假的,则取后边的值。 所以说上边这条打印的语句是打印x的绝对值。 //stm32f10x_nvic.c stm32f10x_lib.c stm32f10x_gpio.c stm32f10x_flash.c stm32f10x_rcc.c TIM6 TIM7基本定时器 (只有这两个定时器不能产生PWM) TIM1 TIM8高级控制定时器 TIM2 TIM3 TIM4 TIM5为通用定时器 其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出! 修改和自己写代码时候

STM32学习笔记

STM32学习笔记——时钟频率 ******************************** 本学习笔记基于STM32固件库V3.0 使用芯片型号:STM32F103 开发环境:MDK ******************************** 第一课时钟频率 STM32F103内部8M的内部震荡,经过倍频后最高可以达到72M。目前TI的M3系列芯片最高频率可以达到80M。 在stm32固件库3.0中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。系统给出的函数为SystemInit()。但在调用前还需要进行一些宏定义的设置,具体的设置在system_stm32f10x.c文件中。 文件开头就有一个这样的定义: //#define SYSCLK_FREQ_HSE HSE_Value //#define SYSCLK_FREQ_20MHz 20000000 //#define SYSCLK_FREQ_36MHz 36000000 //#define SYSCLK_FREQ_48MHz 48000000 //#define SYSCLK_FREQ_56MHz 56000000 #define SYSCLK_FREQ_72MHz 72000000 ST 官方推荐的外接晶振是8M,所以库函数的设置都是假定你的硬件已经接了8M 晶振来运算的.以上东西就是默认晶振8M 的时候,推荐的CPU 频率选择.在这里选择了: #define SYSCLK_FREQ_72MHz 72000000 也就是103系列能跑到的最大值72M 然后这个C文件继续往下看 #elif defined SYSCLK_FREQ_72MHz const uint32_t SystemFrequency = SYSCLK_FREQ_72MHz; const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_72MHz; const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_72MHz; const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_72MHz/2); const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_72MHz; 这就是在定义了CPU跑72M的时候,各个系统的速度了.他们分别是:硬件频率,系统时 钟,AHB总线频率,APB1总线频率,APB2总线频率.再往下看,看到这个了: #elif defined SYSCLK_FREQ_72MHz static void SetSysClockTo72(void); 这就是定义72M 的时候,设置时钟的函数.这个函数被SetSysClock ()函数调用,而SetSysClock ()函数则是被SystemInit()函数调用.最后SystemInit()函数,就是被你调用的了

寄存器概念整理

寄存器、RAM、ROM、Flash相关概念区别整理 寄存器 寄存器是中央处理器内的组成部份。它跟CPU有关。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。 存储器 存储器范围最大,它几乎涵盖了所有关于存储的范畴。你所说的寄存器,内存,都是存储器里面的一种。凡是有存储能力的硬件,都可以称之为存储器,这是自然,硬盘更加明显了,它归入外存储器行列,由此可见——。 内存 内存既专业名上的内存储器,它不是个什么神秘的东西,它也只是存储器中的沧海一粟,它包涵的范围也很大,一般分为只读存储器和随即存储器,以及最强悍的高速缓冲存储器(CACHE),只读存储器应用广泛,它通常是一块在硬件上集成的可读芯片,作用是识别与控制硬件,它的特点是只可读取,不能写入。随机存储器的特点是可读可写,断电后一切数据都消失,我们所说的内存条就是指它了。 CACHE 高速缓冲存储器(Cache)其原始意义是指存取速度比一般随机存取记忆体(RAM)来得快的一种RAM,一般而言它不像系统主记忆体那样使用DRAM技术,而使用昂贵但较快速的SRAM技术,也有快取记忆体的名称。 CACHE是在CPU中速度非常块,而容量却很小的一种存储器,它是计算机存储器中最强悍的存储器。由于技术限制,容量很难提升,一般都不过兆。 ROM、RAM的区别: ROM(只读存储器或者固化存储器) RAM(随机存取存储器) ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。 RAM有两大类,一种称为静态RAM(Static RAM/SRAM),当数据被存入其中后不会消失。SRAM速度非常快,是目前读写最快的存储设备了。当这个SRAM 单元被赋予0 或者1 的状态之后,它会保持这个状态直到下次被赋予新的状态或者断电之后才会更改或者消失。但是存储1bit 的信息需要4-6 只晶体管。因此它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。另一种称为动态RAM(Dynamic

STM32学习笔记(5)通用定时器PWM输出

STM32学习笔记(5):通用定时器PWM输出 2011年3月30日TIMER输出PWM 1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。 STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。 1.1PWM输出模式 STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1和模式2的区别如下: 110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。 由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。 而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。 1.2PWM输出管脚 PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。但是这些重映像的管脚也是由参考手册给出的。比如

STM32学习笔记

1、GPIO函数: 输出: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);//此例以PA12口为例 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); //此例以PA12口为例 HAL_GPIO_ TogglePin(GPIOA,GPIO_PIN_12); //此例以PA12口为例 2、串口函数: 1、串口发送/接收函数 HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制 HAL_UART_Receive();串口轮询模式接收,使用超时管理机制 HAL_UART_Transmit_IT();串口中断模式发送 HAL_UART_Receive_IT();串口中断模式接收 HAL_UART_Transmit_DMA();串口DMA模式发送 HAL_UART_Transmit_DMA();串口DMA模式接收 2、串口中断函数 HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用 HAL_UART_TxCpltCallback();数据完全发送完成后调用 HAL_UART_RxHalfCpltCallback();一半数据接收完成时调用 HAL_UART_RxCpltCallback();数据完全接受完成后调用 HAL_UART_ErrorCallback();传输出现错误时调用 例程:串口接收中断 uint8_t aTxStartMessages[] = "\r\n******UART commucition using IT******\r\nPlease enter 10 characters:\r\n"; uint8_t aRxBuffer[20]; 2、在main函数中添加两个语句通过串口中断发送aTxStartMessage数组的数据和接收数据10个字符,保存在数组aRxBuffer中 HAL_UART_Transmit_IT(&huart1 ,(uint8_t*)aTxStartMessages,sizeof(aTxStartMessages)); //sizeof()可读取目标长度 HAL_UART_Receive_IT(&huart1,(uint8_t*)aRxBuffer,10); 3、在main.c文件后面添加中断接收完成函数,将接收到的数据又通过串口发送回去。 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { UNUSED(huart); HAL_UART_Transmit(&huart1,(uint8_t*)aRxBuffer,10,0xFFFF);//(uint8_t*)aRxBuffer为字符串地址,10为字符串长度,0xFFFF为超时时可以在中间加任何可执行代码。 }

通用寄存器存储器实验

计算机组成原理 实验报告 学号: 姓名: 提交日期: 成绩: 东北大学秦皇岛分校 实验三通用寄存器存储器实验 1、实验目的与要求 实验目的: 熟悉通用寄存器的数据通路; 掌握通用寄存器的构成和运用; 熟悉和了解存储器组织与总线组成的数据通路

实验要求: 在掌握了AX、BX运算寄存器的读写操作后,继续完成CX、DX通用寄存器的数据写入与读出; 按照实验步骤完成实验项目,掌握存储部件在原理计算机中的运用。 2、实验原理 通用寄存器: 通用寄存器数据通路如下图所示。由四片8位字长的74LS574组成CX、DX通用寄存器组。途中X1 X2 X0定义为输出选通使能,SI、XP控制位为源选通选择。RXW为寄存器数据写入使能,Q2 Q1 Q0及OP、DI为目的寄存器选择。T4信号为寄存器、对战数据写入脉冲,上升沿有效。准双向I/O 输入输出端口用于置数操作,经2片74LS245三态门与数据总线相连。 存储器: 存储器是计算机的存储部件,用于存放程序和数据。存储器是计算机信息存储的核心,是计算机必不可少的部件之一,计算机就是按存放在存储器中的程序自动有序不间断地进行工作。 本系统从提高存储器存储信息效率的角度设计数据通路,按现代计算机中最为典型的分段存储理念把存储器组织划分为程序段、数据段等,由此派生了数据总线(DBus)、指令总线(IBus)、微总线(μBus)等与现代计算机设计规范相吻合的实验环境。 实验所用的存储器电路原理如图3-1所示,该存储器组织由二片6116构成具有奇偶概念的十六位信息存储体系,该存储体系AddBus由IP指针和AR指针分时提供,E/M控位为“1”时选通IP,反之选通AR。该存储体系可随机定义总线宽度,动态变更总线结构,把我们的教学实验提高到能与现代计算机设计规范相匹配与接轨的层面。

计算机组成原理存储器读写实验报告

《计算机组成原理》实验报告 实验名称:存储器读写实验班级: 学号:姓名: 一、实验目的 1、掌握存储器的工作特征 2、熟悉静态存储器的操作过程,验证存储器的读取方法 二、实验设备 1、YY—Z02计算机组成原理实验仪一台。 2、排线若干。 3、PC微机一台。 三、实验原理 1.存储器是计算机的主要部件,用来保存程序和数据。从工作方式上分类, 其可分为易失性和非易失性存储器,易失性存储器中的数据在关电后将 不复存在,非易失性存储器中的数据在关电后不会丢失。易失性存储器 又可分为动态存储器和静态存储器,动态存储器保存信息的时间只有 2ms,工作时需要不断更新,既不断刷新数据;静态存储器只要不断电, 信息是不会丢失的。 2.静态存储器芯片6116的逻辑功能: 3.存储器实验单元电路:

存储器实验单元电路控制信号逻辑功能表: 4.存储器实验电路: 存储器读写实验需三部分电路共同完成:存储器单元、地址寄存器单元和输入、输出单元。存储器单元以6116芯片为中心构成,地址寄存器单元主要由一片74LS273组成,控制信号B-AR的作用是把总线上的数据送人地址寄存器,向存储器单元电路提供地址信息,输入、输出单元作用与以前相同。

四、实验结果记录 (1)连线准备 1.连接输入、输出实验的全部连线。 2.按实验逻辑原理图连接M-W、M-R两根信号低电平有效信号线。 3.连接A7—A0 8根地址线。 4.连接B-AR正脉冲有效信号线。 (2)记录结果(包含采集结果前的动作) 地址写入数据读出数据结果说明 01H0010000000100000数据的写入与读取02H0001001100010011数据的写入与读取03H0010011000100110数据的写入与读取04H数据的写入与读取05H0000010100000101数据的写入与读取25H不写存储器一个随机地址 36H0010000100100001数据的写入与读取 0A0H写总线悬空时的数 据总线悬空时表示的数据是FFH,即写入的数据是,所以读出结果为 五、实验总结与心得体会

STM32学习心得笔记

STM32学习心得笔记 时钟篇 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍, 但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外, 实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。 STM32中有一个全速功能的USB 模块,其串行接口引擎需要一个频率为48MHz的时

钟源。该时钟源只能 从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL 必须使能, 并且时钟频率配置为48MHz或72MHz。 另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。 系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL 输出、HSI或者HSE。系统时钟最 大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分 频。其中AHB分频器输出的时钟送给5大模块使用: ①、送给AHB 总线、内核、内存和DMA使用的HCLK时钟。 ②、通过8分频后送给Cortex的系统定时器时钟。 ③、直接送给Cortex的空闲运行时钟FCLK。 ④、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz), 另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。

计算机组成原理实验五-存储器读写实验

实验五 存储器读写实验 一、 实验目的 1. 掌握存储器的工作特性。 2. 数学静态存储器的操作过程,验证存储器的读写方法。 二、 实验原理 存储器是计算机的主要部件,用来保存程序和数据。从工作方式上分类,存储器可分成易失性和非易失性存储器,易失性存储器中的数据在关电后将不复存在,非易失性储器又可分为动态存储器和静态存储器,动态存储器保存信息的时间只有2ms ,工作时需要不断更新,既不断刷新数据;静态存储器只要不断电,信息是不会丢失的。为简单起见,计算机组成实验用的是容量为2K 的镜头存储器6116。 1. 静态存储器芯片6116的逻辑功能 6116是一种数据宽度为8位(8个二进制位),容量为2048字节的态存储器芯片,封在24引脚的封装中,封装型式如图2-7所示。6116芯片有8根双向三态数据线D7-D0,所谓三态是指输入状态、输出状态和高阻状态,高阻状态数据线处于一种特殊的“断开”状态;11根地址线A10-A0, 指示芯片内部2048个存储单元号;3根控制线CS ???片选控制信号,低电平时,芯片可进行读写操作,高电平时,芯片保存信息不能进行读写;WE ???为写入控制信号,低电平时,把数据线上的信息存入地址线A10-A0指示的存储 单元中;OE ???为输出使能控制信号,低电平时,把地址线A10-A0指示的存储单元中的数据读出送到数据线上。芯片控制信号逻辑功能见表2-9。 图2-7 存储器部件电路图 2. 存储器实验单元电力路 因为在计算机组成原理实验中仅用了256个存储单元,所以6116芯片 的三根地址线A11-A8接地也没有多片联用问题,片选信号CS ???接地使芯片总是处于被选中状态。芯片的,WE.和OE ???信号分别连接实验台的存储器写信号M ?W ???????和存储器读写信号M ?R ???????,存储器实验单元逻辑电路如图2-7所示。这

计算机组成原理实验五存储器读写实验

实验五存储器读写实验 一、实验目的 1.掌握存储器的工作特性。 2.数学静态存储器的操作过程,验证存储器的读写方法。 二、实验原理 存储器是计算机的主要部件,用来保存程序和数据。从工作方式上分类,存储器可分成易失性和非易失性存储器,易失性存储器中的数据在关电后将不复存在,非易失性储器又可分为动态存储器和静态存储器,动态存储器保存信息的时间只有2ms,工作时需要不断更新,既不断刷新数据;静态存储器只要不断电,信息是不会丢失的。 为简单起见,计算机组成实验用的是容量为2K的镜头存储器6116。 1.静态存储器芯片6116的逻辑功能 6116是一种数据宽度为8位(8个二进制位),容量为2048字节的态存储器芯片,封在24引脚的封装中,封装型式如图2-7 所示。6116芯片有8根双向三态数据线D7-D0,所谓三态是指输 入状态、输出状态和高阻状态,高阻状态数据线处于一种特殊的 “断开”状态;11根地址线A10-A0,指示芯片内部2048个存储 单元号;3根控制线CS???片选控制信号,低电平时,芯片可进行读 写操作,高电平时,芯片保存信息不能进行读写;WE???为写入控制 信号,低电平时,把数据线上的信息存入地址线A10-A0指示的存 储单元中;OE???为输出使能控制信号,低电平时,把地址线A10-A0 指示的存储单元中的数据读出送到数据线上。芯片控制信号逻辑 功能见表2-9。 表2-9 6116芯片控制信号逻辑功能表 图2-7 存储器部件电路图 2.存储器实验单元电力路

因为在计算机组成原理实验中仅用了256个存储单元,所以6116芯片的三根地址线A11-A8接地也没有多片联用问题,片选 信号CS ???接地使芯片总是处于被选中状态。芯片的,WE.和OE ???信号分别连接实验台的存储器写信号M ?W ???????和存储器读写信号M ?R ???????,存储 器实验单元逻辑电路如图2-7所示。这种简化了控制过程的实验电路可方便实验进行,存储器实验单元电路控制信号逻辑功能见 3. 存储器实验电路 存储器读/写实验需呀三部分电路共同完成:存储器单元(MEM UNIT )、地址寄存器单元(ADDRESS UNIT )和输入、输出单元(INPUT/OUTPUT UNIT )。存储器单元以6116总线上的数据送入地址寄存器,向存储器单元电路提供地址信息,输入、输出单元作用与以前相同。存储器实验的逻辑原理如图2-8所示。 图2-8 存储器实验电路逻辑图 三、 实验过程 1. 连线 (1) 连接实验一(输入、输出实验)的全部连线。 (2) 按实验逻辑原理图连接M ?W ???????、M ?R ???????两根信号低电平有效信号 线。 (3) 连接A7-A0 8根地址线。 (4) 连接B-AR 正脉冲有效信号线。 2. 顺序写入存储单元实验操作过程 (1) 把B-AR 控制开关拨到0(因此信号是正脉冲有效),把其他控 制开关全部拨到1,使全部控制信号都处于无效状态。 (2) 在输入数据开关上拨一个地址数据(如00000001,即16进制 01H ),拨下,IOR.开关,把地址数据送总线。 (3) 拨动一下B-AR 开关,实现“0-1-0”,产生一个正脉冲,把地 址数据送地址寄存器(AR )保存。 (4) IO ?R ?????????控制开关,把实验数据送到总线。 (5) 拨动M ?W ???????控制开关,即实现“0-1-0”,产生一个负脉冲,把 实验数据存入存储器的01H 号单元。

STM32学习笔记(18)-数据的保存和毁灭

数据的保存和毁灭(2) 和以前学到的有关数据保存不同,这里的数据保存还有“保密”之意,即一旦受到意外的侵入,STM32将毁灭数据。这是通过Tamper机制来实现的。 以下是数据手册中的有关说明: 5.3.1 侵入检测 当TAMPER引脚上的信号从0变成1或者从1变成0(取决于备份控制寄存器BKP_CR的TPAL 位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。然而为了避免丢失侵入事件,侵入检测信号是边沿检测的信号与侵入检测允许位的逻辑与,从而在侵入检测引脚被允许前发生的侵入事件也可以被检测到。 ●当 TPAL=0 时:如果在启动侵入检测TAMPER引脚前(通过设置TPE位)该引脚已经为高电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置’1’后并没有出现上升沿)。 ●当 TPAL=1 时:如果在启动侵入检测引脚TAMPER前(通过设置TPE位)该引脚已经为低电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置’1’后并没有出现下降沿)。 设置BKP_CSR寄存器的TPIE位为’1’,当检测到侵入事件时就会产生一个中断。 在一个侵入事件被检测到并被清除后,侵入检测引脚TAMPER应该被禁止。然后,在再次写入备份数据寄存器前重新用TPE位启动侵入检测功能。这样,可以阻止软件在侵入检测引脚上仍然有侵入事件时对备份数据寄存器进行写操作。这相当于对侵入引脚TAMPER进行电平检测。 注:当V DD电源断开时,侵入检测功能仍然有效。为了避免不必要的复位数据备份寄存器,TAMPER引脚应该在片外连接到正确的电平。 显然,Tamper需要硬件与之配合。以上数据手册描述了硬件配置时的一些注意事项。 (1)可以是把引脚由低电平到高电平认为是一次侵入,也可以把引脚从高电平变到低电平认为是一次侵入,这通过TPAL来设置。

单片机存储器和寄存器

单片机的存储器、寄存器 单片机的存储器有程序存储器ROM与数据存储器RAM两种。这两种存储器在使用上是严格区分的,不得混用。程序存储器存放程序指令,以及常数,表格等;而数据存储器则存放缓冲数据。 MCS-51单片机存储器的结构共有3部分:一是程序存储器二是内部数据存储器三是外部数据存储器MCS-51单片机的存储器可分为5类:程序存储器、内部数据存储器、特殊功能寄存器、位地址空间、外部数据存储器 程序存储器 程序是控制计算机动作的一系列命令,单片机只认识由“0”和“1”代码构成的机器指令。如前述用助记符编写的命令MOV A,#20H,换成机器认识的代码74H、20H:(写成二进制就是01110100B和00100000B)。在单片机处理问题之前必须事先将编好的程序、表格、常数汇编成机器代码后存入单片机的存储器中,该存储器称为程序存储器。程序存储器可以放在片内或片外,亦可片内片外同时设置。由于PC程序计数器为16位,使得程序存储器可用16位二进制地址,因此,内外存储器的地址最大可从0000H到FFFFH。8051内部有4k字节的ROM,就占用了由0000H~0FFFH的最低4k个字节,这时片外扩充的程序存储器地址编号应由1000H开始,如果将8051当做8031使用,不想利用片内4kROM,全用片外存储器,则地址编号仍可由0000H开始。不过,这时应使8051的第{31}脚(即EA脚)保持低电平。当EA为高电平时,用户在0000H至0FFFH范围内使用内部ROM,大于0FFFH后,单片机CPU自动访问外部程序存储器。 数据存储器 单片机的数据存储器由读写存储器RAM组成。其最大容量可扩展到64k,用于存储实时输入的数据。8051内部有256个单元的内部数据存储器,其中00H~7FH为内部随机存储器RAM,80H~FFH为专用寄存器区。实际使用时应首先充分利用内部存储器,从使用角度讲,搞清内部数据存储器的结构和地址分配是十分重要的。因为将来在学习指令系统和程序设计时会经常用到它们。8051内部数据存储器地址由00H至FFH共有256个字节的地址空间,该空间被分为两部分,其中内部数据RAM的地址为00H~7FH(即0~127)。而用做特殊功能寄存器的地址为80H~FFH。在此256个字节中,还开辟有一个所谓“位地址”区,该区域内不但可按字节寻址,还可按“位(bit)”寻址。对于那些需要进行位操作的数据,可以存放到这个区域。从00H到1FH安排了四组工作寄存器,每组占用8个RAM 字节,记为R0~R7。究竟选用那一组寄存器,由前述标志寄存器中的RS1和RS0来选用。在这两位上放入不同的二进制数,即可选用不同的寄存器组。 特殊功能寄存器 特殊功能寄存器(SFR)的地址范围为80H~FFH。在MCS-51中,除程序计数器PC和四个工作寄存器区外,其余21个特殊功能寄存器都在这SFR块中。其中5个是双字节寄存器,它们共占用了26个字节。各特殊功能寄存器的符号和地址见附表2。其中带*号的可位寻址。特殊功能寄存器反映了8051的状态,实际上是8051的状态字及控制字寄存器。用于CPU PSW便是典型一例。这些特殊功能寄存器大体上分为两类,一类与芯片的引脚有关,另一类作片内功能的控制用。与芯片引脚有关的特殊功能寄存器是P0~P3,它们实际上是4个八位锁存器(每个I/O口一个),每个锁存器附加有相应的输出驱动器和输入缓冲器就构成了一个并行口。MCS-51共有P0~P3四个这样的并行口,可提供32 根I/O线,每根线都是双向的,并且大都有第二功能。其余用于芯片控制的寄存器中,累加

STM32自学笔记

一、原子位操作: 原子位操作定义在文件中。令人感到奇怪的是位操作函数是对普通的内存地址进行操作的。原子位操作在多数情况下是对一个字长的内存访问,因而位号该位于0-31之间(在64位机器上是0-63之间),但是对位号的范围没有限制。 原子操作中的位操作部分函数如下: void set_bit(int nr, void *addr)原子设置addr所指的第nr位 void clear_bit(int nr, void *addr)原子的清空所指对象的第nr位 void change_bit(nr, void *addr)原子的翻转addr所指的第nr位int test_bit(nr, void *addr)原子的返回addr位所指对象nr位int test_and_set_bit(nr, void *addr)原子设置addr所指对象的第nr位,并返回原先的值 int test_and_clear_bit(nr, void *addr)原子清空addr所指对象的第nr位,并返回原先的值 int test_and_change_bit(nr, void *addr)原子翻转addr所指对象的第nr位,并返回原先的值 unsigned long word = 0; set_bit(0, &word); /*第0位被设置*/ set_bit(1, &word); /*第1位被设置*/ clear_bit(1, &word); /*第1位被清空*/ change_bit(0, &word); /*翻转第0位*/ 二、STM32的GPIO锁定: 三、中断挂起: 因为某种原因,中断不能马上执行,所以“挂起”等待。比如有高、低级别的中断同时发生,就挂起低级别中断,等高级别中断程序执行完,在执行低级别中断。四、固文件: 固件(Firmware)就是写入EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。 五、固件库:包含各个外设或者内核的驱动头文件和C文件。 六、TIx的输入捕获滤波器(消抖): 采样频率fSAMPLING,采样次数N,如果以采样频率对一脉冲进行采样时,如果在N个采样方波里该脉宽不变,则视为一次有效的脉冲,否则视为无效的脉冲。 七、高级定时器的PWM互补输出: 常用于X相电机驱动,其中的互补输出则防止电机的死区出现。

实验三:存储器读写实验

计算机组成原理实验报告 Computer Organization Lab Reports ______________________________________________________________________________ 班级: __________ 姓名:___________ 学号:__________ 实验日期:_____________ 学院: _____________________________ 专业:__________________________________ 实验顺序:_______ 原创:___________ 实验名称:______________________________ 实验分数:_______ 考评日期:________ 指导教师:张旭 ______________________________________________________________________________ 一、实验目的 熟悉和了解存储器逻辑结构与总线组成的数据通路及其基本的工作原理。 理解AR地址寄存器与PC地址寄存器的各自的作用。 二、实验要求 按照实验步骤完成实验项目,掌握存储部件在原理计算机中的运用。 三、实验原理 存储器是计算机的存储部件,用于存放程序和数据。存储器是计算机信息存储的核心, 是计算机必不可少的部件之一,计算机就是按存放在存储器中的程序自动有序不间断地进行 工作。 本系统从提高存储器存储信息效率的角度设计数据通路,按现代计算机中最为典型的分 段存储理念把存储器组织划分为程序段、数据段等,由此派生了数据总线(DBus)、指令总 线(IBus)、微总线(μBus)等与现代计算机设计规范相吻合的实验环境。 实验所用的存储器电路原理如图3-1所示,该存储器组织由二片6116构成具有奇偶概 念的十六位信息存储体系,该存储体系AddBus由IP指针和AR指针分时提供,E/M控位 为“1”时选通IP,反之选通AR。该存储体系可随机定义总线宽度,动态变更总线结构, 把我们的教学实验提高到能与现代计算机设计规范相匹配与接轨的层面。 图3-1 存储器数据通路

相关文档
最新文档