组员:吴迪&王柳杨&金虎&陈武荣&谭金柏

Slides:



Advertisements
Similar presentations
单片机 C 语言应用程序设计 主讲教师:廉哲 QQ: 电话: 办公室:综合楼 C318.
Advertisements

第6章 存储系统 6. 1 存储器的分类与性能评价 6. 2 存储器访问的局部性原理与 层次结构存储系统 6. 3 半导体存储器
现代电子技术实验 ——综合实验之单片机部分
什么是SOPC: SOPC是英文System On a Programmable Chip的缩写,称为片上可编程系统。SOPC将传统的EDA技术、计算机系统、嵌入式系统、数字信号处理等融为一体,综合了各自的优势,且在结构上形成一块芯片。 为什么用SOPC:SOPC是现代电子技术和电子系统设计的发展趋势,建立了电子系统设计的新模式。用户利用SOPC开发平台,自行设计高速、高性能的DSP处理器、特定功能的CPU及其外围接口电路,创建结构最为简洁的电子系统。
C语言程序设计 主讲教师 :张群燕 电话:
外国短篇小说——契科夫笔下的女性形象分析
門神 在傳統觀念中,門是居住環境中與外界相通的出入口,具有重要的屏障作用。門神顧名思義就是護宅守門的神仙,每逢過年,上至天子百官下至普通百姓,家家戶戶必在門上張貼門神,以保一家平安。 門神種類主要有宅第大門上將軍武門神、內室門戶上祈福文門神,還有童子門神、仙子門神等,形象豐富多樣,皇家貴戚還往往在畫上瀝粉貼金,十分吉祥喜慶。
第3讲 教学内容 1.3~ 微型计算机系统——硬件部分 计算机的产生发展 计算机系统组成(硬件结构) 计算机工作原理
纳税人学堂课件天地第201509期 高新技术产业税收优惠政策培训 授课老师:周晶 上海市嘉定区国家税务局
Memory Pool ACM Yanqing Peng.
第一章 C语言概述 计算机公共教学部.
关于绘本 深圳市第十二幼儿园 ——何雅秋.
提升“三率”争做“五活” PPT交流 ——上余镇残联 徐俊俊.
编译原理上机实习
2010年,全世界约有盲人4000万到4500万,低视力者是盲人的3倍,约1.4亿人
中交天津航道局有限公司 党委工作部 陈晓敏 2012年11月5日
《三国演义》 之司马懿和诸葛亮的性格差异.
《计算机操作员》精品 课件 淮南市潘集职教中心
Linux Further.
第四章 BootLoader开发 附-s3c2410/s3c2440处理器介绍
主讲教师:唐大仕 第5讲 计算机硬件 主讲教师:唐大仕
C语言程序设计 第十二章 位运算.
基本硬體介紹 1.主機板 2.CPU(運算中心) 3.記憶體(RAM-短暫記憶資料處) 4. 硬碟(HDD儲存資料處) 5.顯示卡(接螢幕)
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
Timer & KEYPAD 11/24.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
C H A P T E R 10 存储器层次.
5 Computer Organization (計算機組織).
搜尋資料結構 Search Structures.
Game Boy Architecture 计算机体系结构课程报告 --刘继元.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
CH.8 硬體管理.
NO.3.1 SOPC技术 第5章 Nios II 系统的外围设备.
单片机应用技术 项目一 循环彩灯装置 第2讲 51单片机的结构与引脚 《单片机应用技术》精品课程组 湖北职业技术学院机电工程系.
在專用的嵌入式板子運行 GNU/Linux 系統已經變得越來越流行。一個嵌入式 Linux 系統從軟體的角度看通常可以分為四個層次:
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 第六讲 基于ARM的嵌入式硬件结构设计.
Ch9 Communicating with Hardware
第五章 C/C++及汇编语言的混合编程 5.1 ARM C/C++编译器 5.2 在C/C++程序中内嵌汇编指令
音乐学科简报 第二期 编辑:范正明 杨芳 安徽省中小学幼儿园教师信息技术应用能力提升培训项目 延时符.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
Author:BobZhang Copy Right 2007
合泰半导体股份有限公司 技术讲座 - Holtek V3 C Compiler介绍 主讲人:王幼端 2017/06/15.
Holtek C Compiler V3--advanced
(第2版).
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
8051單晶片 蘇恆生 老師.
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
单片机原理与应用 主讲人:张荣刚 福建师范大学福清分校.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第7章 程序的结构 四、生存期与存储属性 五、extern关键字与外部连接属性 六、static关键字与内部连接属性.
第二章 类型、对象、运算符和表达式.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
第十二章 位运算.
请添加标题 请添加作者.
单片机应用技术 (C语言版) 第4章 C51程序设计入门
清明上河圖 於原作 原作者 擇端(北宋) 北宋風俗畫作品 中國十大傳世名畫之一,屬一级國寶 欲知詳情請點出口   清乾隆 摹本 清明上河.
开题报告PPT模板 点击此处添加副标题 姓 名 导 师.
第6章 嵌入式软件开发基础.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
单击此处添加标题 单击这里添加您的副标题 汇报人:宝藏PPT.
Presentation transcript:

组员:吴迪&王柳杨&金虎&陈武荣&谭金柏 Flash reply 电子科技大学  Flash 解析 第七组 组长:黄其柏 组员:吴迪&王柳杨&金虎&陈武荣&谭金柏 电子科技大学

目录 Contents Flash reply 1 Flash 简介&设备特性&工作原理 2 函数功能介绍&代码剖析 3 相关寄存器简介 4 电子科技大学 1 Flash 简介&设备特性&工作原理 目录 Contents 2 函数功能介绍&代码剖析 3 相关寄存器简介 电子科技大学 4 感谢

Flash reply Flash 简介 FLASH 存储器: 电子科技大学 Flash 简介 FLASH 存储器: FLASH 存储器又称为闪存,它也是可重复擦写的存储器,部分书籍会把 FLASH 存储器称为 FLASH ROM,但它的容量一般比 EEPROM 大得多,且在擦除时,一般以多个字节为单位。 根据存储单元电路的不同,FLASH 存储器又分为 NOR FLASH 和 NAND FLASH。 电子科技大学

Flash reply 电子科技大学 Flash 设备特性 电子科技大学

Flash reply Flash 工作原理 电子科技大学 支持 XIP(应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。),才能直接运行代码,SD 卡,硬盘,U 盘其实都是 NAND FLASH。

Flash reply stm_flash.h: 电子科技大学 #define STM32_FLASH_KEY1 0x45670123 #define STM32_FLASH_KEY2 0xCDEF89AB #define STM32_FLASH_SR_BSY (1 << 16) #define STM32_FLASH_CR_PG (1 << 0) #define STM32_FLASH_CR_SER (1 << 1) #define STM32_FLASH_CR_STRT (1 << 16) #define STM32_FLASH_CR_LOCK (1 << 31) #define STM32_FLASH_CR_SNB_OFFSET 3 #define STM32_FLASH_CR_SNB_MASK (15 << STM32_FLASH_CR_SNB_OFFSET) /* Flash ACR: Access control register */ #define FLASH_ACR_WS(n) n #define FLASH_ACR_PRFTEN (1 << 8) #define FLASH_ACR_ICEN (1 << 9) #define FLASH_ACR_DCEN (1 << 10) struct stm32_flash_regs { u32 acr; u32 key; u32 optkeyr; u32 sr; u32 cr; u32 optcr; u32 optcr1; }; 电子科技大学

Flash reply stm_flash.c: //头文件 #include <common.h> 电子科技大学 stm_flash.c: //头文件 #include <common.h> #include <asm/io.h> #include <asm/arch/stm32.h> #include "stm32_flash.h“ //flash信息结构体 flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; //flash基地址 #define STM32_FLASH ((struct stm32_flash_regs *)FLASH_CNTL_BASE) 电子科技大学

Flash reply 电子科技大学 //配置 Flash等待周期 、预取指令、指令缓存和数据缓存 void stm32_flash_latency_cfg(int latency) //加解锁 static void stm32_flash_lock(u8 lock) //flash初始化 unsigned long flash_init(void) //flash打印信息 void flash_print_info(flash_info_t *info) //flash擦除扇区 int flash_erase(flash_info_t *info, int first, int last) 电子科技大学 //flash写入 int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt)

Flash reply 源码解析: flash基地址在stm32中:0x4002 3C00 挂在高速总线AHB1上 //flash基地址 电子科技大学 源码解析: //flash基地址 #define STM32_FLASH ((struct stm32_flash_regs *)FLASH_CNTL_BASE) 采用相对寻址的方式: #define FLASH_CNTL_BASE (AHB1_PERIPH_BASE + 0x3C00) #define AHB1_PERIPH_BASE (PERIPH_BASE + 0x00020000) #define PERIPH_BASE 0x40000000UL 电子科技大学 flash基地址在stm32中:0x4002 3C00 挂在高速总线AHB1上

Flash reply 知识扩展: stm32总线基地址: APB1 0x4000 0000 0x0(相对总线基地址偏移量) 电子科技大学 stm32总线基地址: APB1 0x4000 0000 0x0(相对总线基地址偏移量) APB2 0x4001 0000 0x0001 0000 AHB1 0x4002 0000 0x0002 0000 AHB2 0x5000 0000 0x1000 0000 AHB3 0x6000 0000 不在片上外设范围内 总线的基址:APB1 0x4000 0000 知识扩展: AHB系统总线(高速):主要用于高性能模块之间的连接,如CPU、DMA和DSP等。 APB外围总线(低速)APB主要用于低带宽的周边外设之间的连接,如UART等。 电子科技大学

Flash reply 源码解析: //配置 Flash等待周期 、预取指令、指令缓存和数据缓存 电子科技大学 源码解析: //配置 Flash等待周期 、预取指令、指令缓存和数据缓存 void stm32_flash_latency_cfg(int latency) { writel(FLASH_ACR_WS(latency) | FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN, &STM32_FLASH->acr); } 内联函数定义:static inline void writel(u32 val, void *addr) 内联函数减少了对栈的进出时间的开销,却扩大了主存的空间来容纳本来在栈里的函数。 电子科技大学 *(u32 *)addr = val;//将对应的值写入地址

Flash reply 源码解析: FLASH_ACR_WS(latency) 电子科技大学 源码解析: FLASH_ACR_WS(latency) 为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR) 中正确地编程等待周期数 (LATENCY)。 FLASH时序延迟几个周期,等待总线同步操作。 推荐按照单片机系统运行频率, 0~24MHz时,取Latency=0; 24~48MHz时,取Latency=1; 48~72MHz时,取Latency=2; 电子科技大学 FLASH_ACR_PRFTEN 预取指令 FLASH_ACR_ICEN 指令缓存 FLASH_ACR_DCEN 数据缓存

Flash reply 电子科技大学 电子科技大学

Flash reply 电子科技大学 源码解析: static void stm32_flash_lock(u8 lock) { if (lock) { //加锁,将STM32_FLASH->cr的最高位置1 setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_LOCK); } else { //解锁 writel(STM32_FLASH_KEY1, &STM32_FLASH->key); writel(STM32_FLASH_KEY2, &STM32_FLASH->key); } #define setbits_le32(addr, set) setbits(le32, addr, set) #define setbits(type, addr, set) write_##type((addr), read_##type(addr) | (set)) #define STM32_FLASH_CR_LOCK (1 << 31) 电子科技大学 解锁  (1) 往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123  (2) 再往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB 

源码解析: //flash初始化 电子科技大学 unsigned long flash_init(void) { unsigned long total_size = 0; u8 i, j; for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) { flash_info[i].flash_id = FLASH_STM32;//使能stm32的flash flash_info[i].sector_count = CONFIG_SYS_MAX_FLASH_SECT;//最大分配扇区数量 flash_info[i].start[0] = CONFIG_SYS_FLASH_BASE + (i << 20);//虚拟的扇区地址 flash_info[i].size = sect_sz_kb[0];//每个扇区的大小空间 for (j = 1; j < CONFIG_SYS_MAX_FLASH_SECT; j++) { /*下一个扇区的起始地址是上一个的起始地址+上一个扇区的大小*/ flash_info[i].start[j] = flash_info[i].start[j - 1] + (sect_sz_kb[j - 1]); //累加,一个flash中每个扇区加起来的总大小 flash_info[i].size += sect_sz_kb[j]; } total_size += flash_info[i].size;//累加,多个flash总大小空间 return total_size; //返回总大小空间 电子科技大学

i<<20:表示每个flash最大分配空间1024KB CONFIG_SYS_MAX_FLASH_SECT:最大被分配扇区数量 flash_info[i].start[0] = CONFIG_SYS_FLASH_BASE + (i << 20);//虚拟的扇区起始地址0xbfc00000, i<<20:表示每个flash最大分配空间1024KB CONFIG_SYS_MAX_FLASH_SECT:最大被分配扇区数量 flash_info[i].size:每个扇区的大小 for (j = 1; j < CONFIG_SYS_MAX_FLASH_SECT; j++) { /*下一个扇区的起始地址是上一个的起始地址+上一个扇 区的大小*/ flash_info[i].start[j] = flash_info[i].start[j - 1] + (sect_sz_kb[j - 1]); //每个扇区加起来的总大小 flash_info[i].size += sect_sz_kb[j]; } 电子科技大学

总共1024KB,被分成8个扇区 0~3 32KB 4 128KB 5~7 256KB Flash的扇区的大小排列(Byte): static const u32 sect_sz_kb[CONFIG_SYS_MAX_FLASH_SECT] = { [0 ... 3] = 32 * 1024, [4] = 128 * 1024, [5 ... 7] = 256 * 1024 }; 总共1024KB,被分成8个扇区 0~3 32KB 4 128KB 5~7 256KB 电子科技大学

这部分 没什么好讲的 //flash打印信息 电子科技大学 void flash_print_info(flash_info_t *info) { int i; if (info->flash_id == FLASH_UNKNOWN) { printf("missing or unknown FLASH type\n"); return; } else if (info->flash_id == FLASH_STM32) { printf("stm32 Embedded Flash\n"); } printf(" Size: %ld MB in %d Sectors\n", info->size >> 20, info->sector_count); printf(" Sector Start Addresses:"); for (i = 0; i < info->sector_count; ++i) { if ((i % 5) == 0) printf("\n "); printf(" %08lX%s", info->start[i], info->protect[i] ? " (RO)" : " "); printf("\n"); 这部分 没什么好讲的 电子科技大学

//flash擦除扇区 int flash_erase(flash_info_t *info, int first, int last) { u8 bank = 0xFF; int i; //找到要擦除的flash for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) { if (info == &flash_info[i]) { bank = i; break; } if (bank == 0xFF)//不存在 return -1; //解锁flash stm32_flash_lock(0); for (i = first; i <= last; i++) { //检查 FLASH_SR 状态寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作 while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY); /*在写入新的扇区之前,先清除旧的扇区*/ clrbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_SNB_MASK); 电子科技大学

电子科技大学 if (bank == 0) { //设置操作的扇区编号0 setbits_le32(&STM32_FLASH->cr, (i << STM32_FLASH_CR_SNB_OFFSET)); } else if (bank == 1) { //设置扇区编号1 setbits_le32(&STM32_FLASH->cr,((0x10 | i) << STM32_FLASH_CR_SNB_OFFSET)); } else { stm32_flash_lock(1);//加锁,返回异常 return -1; } //在 FLASH_CR 寄存器中,将 SER 位置 1,激活扇区擦除 setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_SER); //将 FLASH_CR 寄存器中的 STRT 位置 1,该位置 1 后可触发擦除操作。 //该位只能通过软件置 1,并在 BSY 位清零后随之清零。 setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_STRT); while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY);//等待 BSY 位清零 //在 FLASH_CR 寄存器中,将 SER 位置 0 clrbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_SER); stm32_flash_lock(1);//擦除完加锁 return 0; 电子科技大学

知识扩展: 扇区擦除 电子科技大学 扇区擦除的具体步骤如下: 1.检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作 2. 在 FLASH_CR 寄存器中,将 SER 位置 1,并从主存储块的 12 个 (STM32F405xx/07xx 和 STM32F415xx/17xx) 或 24 个 (STM32F42xxx 和 STM32F43xxx) 扇区中选择要擦除的扇区 (SNB) 3. 将 FLASH_CR 寄存器中的 STRT 位置 1 4. 等待 BSY 位清零 批量擦除,建议采用以下步骤: 2. 将 FLASH_CR 寄存器中的 MER 位置 1(STM32F405xx/07xx 和 STM32F415xx/17xx 器件) 3. 将 FLASH_CR 寄存器中的 MER 和 MER1 位置 1(STM32F42xxx 和 STM32F43xxx 器件) 4. 将 FLASH_CR 寄存器中的 STRT 位置 1 5. 等待 BSY 位清零批量擦除 电子科技大学

int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt) { ulong i; /*检查 FLASH_SR 状态寄存器中的 BSY 位,以确认当前未执行 任何 Flash 操作*/ while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY); //解锁 stm32_flash_lock(0); //将cr寄存器的PG位置一,激活 Flash 编程 setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_PG); 电子科技大学

for (i = 0; i < cnt; i++) { //写入数据 *(uchar *)(addr + i) = src[i]; //把当前CPU寄存器中的被修改过的数值存入内存 mb(); //等待 BSY 位清零 while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY); } //将cr寄存器的PG位置一,关闭激活 Flash 编程 clrbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_PG); stm32_flash_lock(1);//加锁 return 0; 电子科技大学

mb(); #define mb() asm volatile("dmb 3\n" : : : "memory") 告诉编辑器,内存已经被修改,编辑器就会在这段指令之前,插入必要的指令将前面因为优化Cache 到寄存器中的变量值先写回内存,如果以后又要使用这些变量再重新读取。 DMB 指令保证: 仅当所有在它前面的存储器访问操作 都执行完毕后,才提交在它后面的存储器访问操作。 电子科技大学

Flash reply 电子科技大学 Associate Register Here 相关寄存器介绍

电子科技大学

电子科技大学

电子科技大学

电子科技大学

电子科技大学

电子科技大学

电子科技大学

电子科技大学

电子科技大学

电子科技大学

电子科技大学

电子科技大学

Thanks For Watching! Flash reply 电子科技大学 版权声明:300套精品模板商业授权,请联系【锐旗设计】:https://9ppt.taobao.com,专业PPT老师为你解决所有PPT问题!