求助STM32qq空间音乐链接地址空间

相关文章推荐
STM32F1学习-深入理解存储器(存储器映射以及bit-band)
存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOT,BLOCK等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLAS...
stm32内存空间分配学习
如图是一张stm32的内存映射图,其中代码区是从0x开始的,他的结束地址是0x加上实际芯片的flash大小,...
转载:/51mcu/p/3329921.html
如图是一张stm32的内存映射图,其中代码区是从0x开始的,他的结束地址是0x0800...
转载请注明出处,谢谢。
先说结论,STM32再启动的时候RAM首先分配给使用到的全局变量,及调用库占用的一些数据(不太清楚是什么数据)
,然后再将剩余的空间分配给Heap和stack。
1、总线系统结构系统包括一个由多个互相连接的32位AHB总线组成的矩阵
– Cortex-M4 with FPU core I-bus, D-bus and S-bus
1.堆和栈大小
定义大小在startup_stm32f2xx.s
Stack_Size
全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们:
全局自动变量——保存在读写数据段
全局静态变量——保存在...
Cortex-M3最大支持4GB的存储空间,但在实际的不同STM32不一样;
在0xExFFFFFFFF的512MB的地址存储空间是用于NVIC、MPU及调试组件等使用;
根据程序运行流程:
正常的程序启动流程:从FLASH启动时,首先从闪存的物理地址入口0x进入,然后是复位中断跳转到复位中断服务程序;复位中断服务程序执行完成后,再跳转到main函数入口...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)发表于: 09:13:14 |
分类:STM32
AT45DB041是ATMEL公司的新型FLASH芯片。该芯片具有容量大、读写速度快、外围电路少等诸多优点,更为重要的是该芯片可最低工作在2.5V,工作电流仅为4mA,因此在移动通信、便携等场合得到了广泛的应用。与STM32的联系方式如下:命令格式有:正确读出ID信息应该为:实际读出的效果:工程代码:5.19-AT45DB041D.zip
发表于: 10:16:20 |
分类:STM32
STM32的DAC可以配置为8位/12位模式,这里使用8位模式与DMA控制器配合使用。DAC通过TIM6_TRGO触发转换,这样可以实现输出信号的频率的调节。本次采用50个采样点,最高能输出60Ksps的信号。如果采用30个点采用,最高能输出100Ksps的信号。程序通过按键KEY1设置频率,通过KEY2设置输出波形。调节都在中断里面实现,main可以进行其他操作。const uint8_t Triang8bit[50] = {0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,240,230,220,210,200,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10};//26+24=50const uint8_t Square8bit[50] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250,250,250,250,250,250
发表于: 10:13:51 |
分类:STM32
CAN采用两线通信,简单能实现高波特率通信,是最有前途的现场总线之一。但是CAN的协议较复杂,涉及报文等专业内容。好在STM32的CAN容易上手,通过CAN_Init(CAN1, &CAN_InitStructure);和 CAN_FilterInit(&CAN_FilterInitStructure);配置好CAN,就可以通过CAN_Transmit(CAN1, &TxMessage);发送和CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);接收。上面只是大体的介绍了下STM32的CAN配置,具体的使用可以参考下面附件的CAN代码,包含CAN测试模式,CAN查询,CAN中断三个应用。这里特别地说明下CAN波特率的计算:CAN在APB1总线上,所以CAN 波特率设置中需要的就是PCLK1 的时钟。&& CAN_InitStructure.CAN_Mode=CAN_Mode_LoopB&& CAN_InitStructure.CAN_SJW=CAN_SJW_1&& CAN_I
发表于: 09:11:43 |
分类:STM32
IAR5.4编译环境 ,看了很多XPT2046的驱动,都是软件模拟SPI接口来驱动,偶用硬件SPI接口驱动成功。触摸控制器芯片介绍:XPT2046内部有 2.5V的参考电压源,可以作为辅助输入、电池电压测量和片内温度测量的参考电压。当不使用时,参考电压源可以处于省电模式。内部参考电压源在电源电压低至2.7V时仍可正常工作。当不使用时,参考电压还可以处于省电模式。内部参考电压在电源电压低于2.7V时仍可正常工作,并且监测着在 0V~6V范围内的电源电压。XPT2046在 125KHz转换速率和 2.7V电压下的功耗仅为750 &W。XPT2046以其低功耗和高速率等特性,被广泛应用在采用电池供电的小型手持设备上,比如 PDA、手机等。XPT2046 是一种典型的逐次逼近型模数转换器(SAR ADC),包含了采样/保持、模数转换、串口数据输出等功能。同时芯片集成有一个 2.5V的内部参考电压源、温度检测电路,工作时使用外部时钟。XPT2046 可以单电源供电,电源电压范围为 2.7V~5.5V。参考电压值直接决定ADC的输入范围,参考电压可以使内部参考电压,也可以从外部直接输入1V~VCC范围内的参考
发表于: 08:32:20 |
分类:STM32
产品唯一的身份标识(Unique Device ID)非常适合:& ●& 用来作为序列号(例如 USB字符序列号或者其他的终端应用)& ●& 用来激活带安全机制的自举过程 ●& 用来作为密码在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。96位的产品唯一身份标识所提供的参考号码对任意一个STM32 微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。& &这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8 位)为单位读取,也可以以半字(16 位)或者全字(32 位)读取。96 位的独特ID位于地址 0x1FFFF7E8 ~ 0x1FFFF7F3& 的系统存储区,用户可以以字节、半字、或字的方式单独读取其间的任一地址,其中 0x1FFFFF3 中为最高字节,0x1FFFF7E8 中为最低字节。(&__DATE__ & - & __TIME__ &)这个在编译时,编译器会自动的把计算机系统时间编译进去,它只是一个宏,编译后
发表于: 22:28:11 |
分类:STM32
LM75A是一个高速I2C接口的温度传感器,可以在-55~+125的温度范围内将温度直接转换为数字信号,并实现0.125的精度。PIC32可以通过I2C总线直接读取其内部寄存器中的数据,并可通过I2C对4个数据寄存器进行操作,设置不同的工作模式。LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。从说明书可以看到,器件的地址是0X90,温度寄存器是0X00,我们只有读取温度寄存器就能获得当前的温度。程序采用软件仿真I2C,硬件的好像不行。实际效果:3.16-LM75A温度检测软仿.rar
发表于: 22:32:33 |
分类:STM32
看门狗这个词非常形象,如果你不定时给它骨头吃,它就会汪汪叫。STM32当中写入IWDG_KR寄存器值为0XAAAA,就相当喂骨头给狗吃。如果你超时没有喂狗,后果非常严重,狗就会要咬主人啦(也就是单片机复位)。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。我们今天就实现这样一个功能,当按下KEY1键,执行喂狗程序。采用LED1指示复位情况。当配置看门狗后,LED1 将常亮,如果 KEY1按键按下,就喂狗,只要 KEY1不停的按,看门狗就一直不会产生复位。只要超过看门狗定时时间还没按,那么将会导致程序重启,而 LED1也会熄灭。程序代码:int main(void){& /* Setup STM32 system (clock, PLL and Flash configuration) */& SystemInit();& & /* Add your application code here&&&&n
发表于: 09:00:53 |
分类:STM32
数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。&& DAC主要特征 ●& 2个DAC转换器:每个转换器对应1个输出通道 ●& 8位或者12位单调输出 ●& 12位模式下数据左对齐或者右对齐 ●& 同步更新功能 ●& 噪声波形生成 ●& 三角波形生成 ●& 双DAC通道同时或者分别转换 ●& 每个通道都有DMA功能 ●& 外部触发转换 ●& 输入参考电压VREF+DAC输出电压公式 数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。 任一DAC通道引脚上的输出电压满足下面的关系: DAC输出 = VREF x (DOR /
发表于: 08:44:35 |
分类:STM32
SPI是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在& EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32 也有 SPI 接口。SPI 接口一般使用 4 条线: MISO& 主设备数据输入,从设备数据输出。 MOSI& 主设备数据输出,从设备数据输入。 SCLK 时钟信号,由主设备产生。 CS 从设备片选信号,由主设备控制。 SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。SPI总线四种工作方式SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(C
发表于: 08:25:54 |
分类:STM32
本次使用WK_UP按键来实现唤醒和进入待机模式功能,然后利用LED1指示状态。有点像手机按键开机和关机。很多单片机都有低功耗模式,STM32 也不例外。在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。STM32 的低功耗模式有 3 种: 1)睡眠模式(CM3 内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机模式(1.8V 内核电源关闭) 在运行模式下,我们也可以通过降低系统时钟关闭 APB 和 AHB 总线上未被使用的外设的时钟来降低功耗。三种低功耗模式一览表:在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要 2uA 左右的电流。停机模式是次低功耗的,其典型的电流消耗在 20uA 左右。最后就是睡眠模式了。用户可以根据自己的需求来决定使用哪种低功耗模式。 这一节,我们就针对 STM32 的最低功耗模式-待机模式,来做介绍。待机模式可实现 STM
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号STM32偏移地址是个什么东西_百度知道
STM32偏移地址是个什么东西
我有更好的答案
移地址就是相对地址,我始终比这个地址多1,那么就可以说偏移地址是1。如果比这个地址多100。假设我其实地址是x
采纳率:73%
来自团队:
关注这个问题
为您推荐:
其他类似问题
您可能关注的内容
偏移地址的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。查看: 3902|回复: 10
求助STM32外部SRAM当做RAM使用
主题帖子精华
初级会员, 积分 69, 距离下一级还需 131 积分
在线时间0 小时
最近在用STM32进行图像处理,由于内部RAM的空间不够用,所以想用外部SRAM当RAM一样使用,但后来实验发现外部SRAM是挂在FSMC上的,看了很多资料都是把外部SRAM当做存储器使用,没有当做内存来使用,现在有两个问题想请高手帮忙解答,一是如何进行配置才能把SRAM当做单独的RAM使用,特别是keil里面还有没有其他地方需要设置,(我看有些资料上说中断地址也要写到FSMC的BANK上),第二个就是挂在FSMC上的两个设备可否不通过内部RAM进行通信(外部SRAM与LCD,但此时SRAM已作为内存是否可以?)我用的是STM32F207ZGt6。请高手帮忙解答,跪谢
主题帖子精华
金钱119034
在线时间935 小时
外挂SRAM就是可以当成RAM用的。。。
不过我一般用绝对地址定位,来使用外部SRAM,而不用MDK自动分配这种方式。
因为如果速度要求高的计算,使用外部SRAM,那么速度就大打折扣了。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 69, 距离下一级还需 131 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
哦,谢谢原子哥,我试试
主题帖子精华
新手上路, 积分 26, 距离下一级还需 24 积分
在线时间0 小时
请问楼主问题解决了吗,我也有一样的疑问
主题帖子精华
初级会员, 积分 69, 距离下一级还需 131 积分
在线时间0 小时
回复【4楼】michael_open:
---------------------------------
还没有,之前逻辑有点混乱,现在重理思路,您解决的怎样了?
主题帖子精华
初级会员, 积分 69, 距离下一级还需 131 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
原子哥,您好,请问有没有使用外部SRAM作为程序运行空间的例程供小弟参考一下呢?
主题帖子精华
在线时间137 小时
103ZET6,SDIO,显示SD卡文件内容到屏幕,外扩RAM在bank1 ne3上,256*16,显示器在bank1 ne1上
11:37 上传
点击文件名下载附件
532.25 KB, 下载次数: 793
主题帖子精华
初级会员, 积分 69, 距离下一级还需 131 积分
在线时间0 小时
回复【7楼】ricefat:
---------------------------------
谢谢大侠,我下下来学习一下
主题帖子精华
初级会员, 积分 69, 距离下一级还需 131 积分
在线时间0 小时
回复【7楼】ricefat:
---------------------------------
六楼大哥,谢谢你啦,参照你的例程做法我在207上已经调通了,主要是栈起始地址设置问题还有一个就是在&&“&&&&&LDR&&&&&R0,&=SystemInit
&&&&&&&&&&&&&&&&&BLX&&&&&R0”&与“&&&&&LDR&&&&&R0,&=__main
&&&&&&&&&&&&&&&&&BX&&&&&&R0”之间
添加LDR&&&&&R0,&=__initial_sp&&&&&&&&&&;&restore&original&stack&pointer
&&&&&&&&&&&&&&&MSR&&&&&MSP,&R0
主题帖子精华
初级会员, 积分 69, 距离下一级还需 131 积分
在线时间0 小时
回复【4楼】michael_open:
---------------------------------
请看8楼我的回复,可以把六楼大哥的例程下下来看看
主题帖子精华
在线时间137 小时
回复【9楼】just0511:
---------------------------------
启动文件我也是直接用了官方外扩SRAM的实例
Powered by查看: 8820|回复: 93
求助:stm32 用内部flash虚拟u盘进行IAP
求助:stm32 用内部flash虚拟u盘进行IAP
现在我虚拟出来了(stm32f103c8t6) iap程序8k 虚拟出来是52k,格式化后32k(1024字节)
放点小文档txt往里面写点东西.重新读取出来后提示文件损坏,但是放上些较大的文件又没事(右下图为U盘TXT地址)
接着就往u盘里放bin文件…可是死都不能转跳…
App程序地址设置成0x
U盘开始地址0x0-8000为电脑格式化化后的fat表..详细信息可以看看附件pdf
我用winhex查看u盘 发现bin文件不是从”u盘地址—5000(对应实际地址0x-8008000)”开始,而是8800)于是我尝试转跳地址设置成0x,可是iap程序进入hault了
iap_load_app(0x);& & & & 无法转跳,直接进入IAP
iap_load_app(0x); 死机
我直接将app程序强制写进0x,iap转跳成功(IAP设置转跳地址为)..
求助..为啥直接放bin不能转跳.bin不是直接可以读取的文件?我找到bin真地址转跳不就行了?
本帖子中包含更多资源
才可以下载或查看,没有帐号?
文件读取没事了...但是当程序运行到
Jump_To_Application();
时会进入HardFault
编译bin的时候地址配置可好了么?格式化后用winhex手动改启动扇区可以将可用空间扩大到(总空间-1.5k)。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
eleqian 发表于
编译bin的时候地址配置可好了么?格式化后用winhex手动改启动扇区可以将可用空间扩大到(总空间-1.5k)。
app编写时已经设置好开始地址
现在bin放进u盘时 地址位于u盘5800.我认为是flash的0x 可是转跳就硬件中断了
app编写时已经设置好开始地址
现在bin放进u盘时 地址位于u盘5800.我认为是flash的0x 可是转跳就 ...
是设置开始地址在0x?bin编译时配置的地址必须和实际放的地址一致。
eleqian 发表于
是设置开始地址在0x?bin编译时配置的地址必须和实际放的地址一致。 ...
u盘开始地址是&&模拟成功后.连bin放进u盘就是8008800(用winhex查看u盘就是0x开始看到bin). app设置这是8008800 转跳就死机了
LPC1768有这样的虚拟U盘IAP程序,你可以参考。注:最近也想做LZ这样的程序。
支持楼主 这个东西 在lpc上试过 挺方便的。
我在想可否,用软件虚拟分区表,上层下来的数据直接往固定地址写入。
我在想可否,用软件虚拟分区表,上层下来的数据直接往固定地址写入。
分区表是上位机格式化时写进去的.自己下位机也可以写分区表..目前无论啥文件,除了System Volume Information这个文件夹和文件(0x0005000以前),其余都是从u盘地址0x005800开始写入..
按照我设置的U盘空间开端是STM32内部FLASH的0x,加上U盘地址0x005800就是0x...
LPC1768有这样的虚拟U盘IAP程序,你可以参考。注:最近也想做LZ这样的程序。
一起研究..话说有没有地址给我看看LPC的
如图这个正确将BIN复制进U盘里面的情况 U盘地址是05800) 可是转跳地址设置成这个就无法转跳 会在Jump_To_Application(); 这一行程序执行时进入HardFault
本帖子中包含更多资源
才可以下载或查看,没有帐号?
本帖最后由 FlandreUNX 于
23:27 编辑
1.将BIN复制到U盘.APP地址设置为0X IAP转跳设置为0X,当运行到Jump_To_Application();时.用JLINK查看到改函数指向一个0x
2.直接将BIN覆盖到FLASH的0x地址后,.APP地址设置为0X IAP转跳设置为0X当运行到Jump_To_Application();时.用JLINK查看到改函数指向一个0x08008A85
第2点 IAP能转跳APP能运行.,
第1点卡在HardFault
证明BIN文件没错 并且栈顶是识别到的if(((*(__IO uint32_t *) ApplicationAddress) & 0x2FFE0000) == 0x)这句话是通过的 直接进入下一个转跳指令
发现BIN栈顶没错,但是貌似中断向量表的(BIN开头第5节到第8节)是指向错误的(0x)
本帖子中包含更多资源
才可以下载或查看,没有帐号?
本帖最后由 FlandreUNX 于
00:07 编辑
结束此帖子
自己解决了问题..
1.MDK 编译BIN时路径打错.编译了未设置成转跳的APP 导致 中断向量表PC无法指向进图hault
2.模拟u盘程序的USB库过老 不兼容3.6的标准库 更新到4.0的USB库后根据官方例程修改实现.另外官方例程中usb_desc.c+desc.h要用自己的desc.c替换.不然下载后USB无法枚举 并且会将SWD卡死.只能ISP下载
3.转跳到APP前务必将总中断关闭.不然很容易进入HAULT
我上传一下我的IAP分享经验.看到很少人讨论.很心酸
IAP使用方法
本人是F103C8T6
判断按钮是否按下(上拉输入),按下则初始化USB
然后格式化U盘
将随意的修改好地址的APP编译成BIN放进U盘 接着重启
然后就完成了升级
希望以后能有更多人跟帖.讨论更多好玩而且安全的IAP
本帖子中包含更多资源
才可以下载或查看,没有帐号?
分区表是上位机格式化时写进去的.自己下位机也可以写分区表..目前无论啥文件,除了System Volume Informat ...
你好 , “文件(0x0005000以前) ” 这是指什么,另外看了你的代码恍然大悟,分区表不需要我自己产生。我的想法是将分区表放入ram 这样避免空间的浪费,而且重新枚举成功,由于分区表已经刷新了,固件是无法直接读出的。
你好 , “文件(0x0005000以前) ” 这是指什么,另外看了你的代码恍然大悟,分区表不需要我自己产生。我 ...
对.分区表只能针对一个设备.如果你想从USB-&RAM-&FLASH的话可以试一下将RAM虚拟成U盘,判断BIN传输是否完成.然后再copy到FLASH里面.只需要改mal.c里面的接口代码
你好 , “文件(0x0005000以前) ” 这是指什么,另外看了你的代码恍然大悟,分区表不需要我自己产生。我 ...
你好 , “文件(0x0005000以前) ” 这是指什么
flash将物理地址0x以后的空间划分到U盘.所以0x就是U盘的首地址.在PC看来就是0x.而FLASH写入只能是先一页的擦除.所以当格式化完成时.0xx)到一段地址是为FAT分区表.大概是到0xx)
按照道理当复制一个文件进入U盘时就应该从0x开始(0x).但是实际看啦并不是.而是从0x开始(0x)
这就解析了为什么当我转跳地址填0x时 过不了第一条栈顶判断
楼主,支持,能共享原理图吗? 谢谢,我最近也在使用这款芯片,不过只是刚刚入门而已,谢谢,
楼主,支持,能共享原理图吗? 谢谢,我最近也在使用这款芯片,不过只是刚刚入门而已,谢谢, ...
没啥原理图..就是标准的STM32接USB 然后自己加个按钮..网上抓一大把
你好 , “文件(0x0005000以前) ” 这是指什么
flash将物理地址0x以后的空间划分到U盘.所以0x080 ...
明白了 多谢楼主解析。
这几天刚想这么做!要顶v,mark!!
好东西,收藏
没啥原理图..就是标准的STM32接USB 然后自己加个按钮..网上抓一大把
哦,,好的,谢谢啊,
不用软件的IAP
顶楼主,该给个酷的
这个必须是个精华帖
LZ好人,这个必须是个精华帖!!
有IAR的吗?
LZ好人,这个必须是个精华帖!!
有IAR的吗?
MDK5.x版的
源代码直接招搬进去就是了.声明一下是用F10X_MD版 是B版的EVAL
MDK5.x版的
源代码直接招搬进去就是了.声明一下是用F10X_MD版 是B版的EVAL
LZ 我现在用的是STM32F103VBT6&&128K的应该怎么改啊?
mass_mal.c 文件中
#define FLASH_SIZE& & & & & & & & & & & & 0xD000改为0x18000
进入IAP,格式化后可以认出76K的空间
APP程序如下
#include &stm32f10x.h&
void delayms(u16 tim)
& & & & u16
& & & & while(tim--)
& & & & & & & & i = 1000;
& & & & & & & & while(i--);
int main(void)
& & & & GPIO_InitTypeDef GPIO_InitS
& & & & & & & &
& & & & NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
& & & & & & & &
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);& & & &
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;& &
& & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& & & & GPIO_Init(GPIOE, &GPIO_InitStructure);
& & & & while(1)
& & & & & & & & GPIO_ResetBits(GPIOE, GPIO_Pin_6);
& & & & & & & & delayms(500);
& & & & & & & & GPIO_SetBits(GPIOE, GPIO_Pin_6);& & & &
& & & & & & & & delayms(500);
编译设置和PDF文档中的一致IROM1 为 0x8008000。生成的bin文件放到U盘重启,不执行啊??
请看我上面的全部过程 在u盘中bin并不是在8000这个位置
hellolinux 发表于
LZ 我现在用的是STM32F103VBT6&&128K的应该怎么改啊?
mass_mal.c 文件中
bin并不是在8000位置中 请看我全我帖子 用winhex查看实际地址
你好 , “文件(0x0005000以前) ” 这是指什么
flash将物理地址0x以后的空间划分到U盘.所以0x080 ...
不知道为什么当复制一个文件进入U盘时就应该从0x开始(0x).而是从0x开始(0x)?
不知道为什么当复制一个文件进入U盘时就应该从0x开始(0x).而是从0x开始(0x00005 ...
自己将BIN复制进去U盘后 用WINHEX查看U盘二进制分部就知道了
楼主。还有一个问题想请教下你,你在楼主位说道 “现在我虚拟出来了(stm32f103c8t6) iap程序8k ”
这个8K大小是哪里定义的?如果IAP程序超过8K会怎么样。
我看你的关于keil里面的option如下:
这个size是为什么是64k啊?莫非就是C8的大小。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
支持分享,楼主牛逼
wuguoyan 发表于
楼主。还有一个问题想请教下你,你在楼主位说道 “现在我虚拟出来了(stm32f103c8t6) iap程序8k ”
这个8K大 ...
iap编译出来接近8k 所以我定义了iap空间为k 打后的空间就是u盘空间
c8 rom容量的确是64k
结束此帖子
自己解决了问题..
我用你的代码试了一下,我的芯片是STM32F103VCT6,出现一个问题,显示的U盘无法格式化。在电脑上打不开U盘。知道是怎么回事不?
顶。好东西,以后这种方式会流行。
楼主你虚拟出来的U盘是电脑做的文件系统,不通用,只是凑巧文件刚好在那一片连续,文件大点说不定就废了,要想办法自己做MBR和fat表,找了很多资料都没找到对这些信息详细讲解的,努力中。。。。。。。。。。。。。。。。。。。
楼主,想请教一下,是不是您这样就不用单独写驱动程序了?
U盘 IAP,MARK
谢谢分享,收藏学习
之前用楼主的代码,存在u盘不能格式化的问题,经过一番努力,改写了mass_mal.c文件。现在u盘正常了,代码分享如下:
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name& && && & : mass_mal.c
* Author& && && && & : MCD Application Team
* Version& && && && &: V2.2.0
* Date& && && && && &: 06/13/2008
* Description& && &&&: Medium Access Layer interface
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include &mass_mal.h&
#include &disk_image.h&
#include &stdio.h&
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
& & & & #define FLASH_START_ADDR& & & & 0x& & & & // Flash start address
& & & & #define FLASH_SIZE& & & & & & & & & & & & 0x40000
& & & & #define FLASH_PAGE_SIZE& & & & & & & & 0x800& & & & & & & & // 2K per page
& & & & #define FLASH_WAIT_TIMEOUT& & & & 100000
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
u32 Mass_Memory_Size[2];
u32 Mass_Block_Size[2];
u32 Mass_Block_Count[2];
/*******************************************************************************
* Function Name&&: MAL_Init
* Description& & : Initializes the Media on the STM32
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
uint16_t MAL_Init(uint8_t lun)
& & & & u16 status = MAL_OK;&&
& & & & switch (lun)&&
& & & & {& &
& & & & & & & & case 0:&&& & & & & & & &
& & & & & & & & & & & & FLASH_Unlock();& &
& & & & & & & & default:& && && && &
& & & & & & & & & & & & return MAL_FAIL;&&
& & & & }&&
/*******************************************************************************
* Function Name&&: MAL_Write
* Description& & : Write sectors
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)
& & & & uint16_t i,lenBackup=0;
& & & & static uint32_t Readbuff[FLASH_PAGE_SIZE&&2];//一个uint32_t占4个字节;数组比较大,用static修饰放在静态区避免堆栈溢出
& & & & uint32_t PageAddr,StartWriteOffset,EndWriteO//页起始地址,页内需要修改的起始偏移数,页内需要修改的结束偏移数
& & & & StartWriteOffset=(FLASH_START_ADDR + Memory_Offset)%FLASH_PAGE_SIZE;
& & & & EndWriteOffset=FLASH_PAGE_SIZE;
& & & & PageAddr=FLASH_START_ADDR + Memory_Offset-StartWriteO
& & & & if((lun!=0) && (lun!=1)) return MAL_FAIL;
& & & & while(PageAddr & FLASH_START_ADDR + Memory_Offset + Transfer_Length)
& & & & {& & & & & & & &
& & & & & & & & //printf(&\r\n PageAddr:0x%08x PageAddr - FLASH_START_ADDR:0x%04x&,PageAddr,PageAddr - FLASH_START_ADDR);
&&& & & & MAL_Read(0,PageAddr - FLASH_START_ADDR,Readbuff,FLASH_PAGE_SIZE);//读一页
// & & & & & & & & for(i=0; i & (FLASH_PAGE_SIZE&&2); i++)& &//显示修改前的数据
// & & & & & & & & & & & & printf(&\r\n &-:0x%04x& &data:0x%08x&,i&&2,Readbuff[i]);
& & & & & & & &
& & & & & & & & if(PageAddr + FLASH_PAGE_SIZE & FLASH_START_ADDR+Memory_Offset+Transfer_Length)& & & & //计算是否最后一页
& & & & & & & & & & & & EndWriteOffset=(FLASH_START_ADDR + Memory_Offset + Transfer_Length)%FLASH_PAGE_SIZE;
& & & & & & & & & & & &
& & & & & & & & //printf(&\r\nStartWriteOffset:0x%x EndWriteOffset:0x%x&,StartWriteOffset,EndWriteOffset);
& & & & & & & & for(i=StartWriteO i&EndWriteO i+=4 )//修改需要修改的数据
& & & & & & & & & & & & Readbuff[i&&2]=Writebuff[lenBackup++];
// & & & & & & & & for(i=0; i & (FLASH_PAGE_SIZE&&2); i++)& &//显示修改后的数据
// & & & & & & & & & & & & printf(&\r\n -&:0x%04x& &data:0x%08x&,i&&2,Readbuff[i]);
& & & & & & & &
& & & & & & & & FLASH_ErasePage(PageAddr); //擦除
& & & & & & & & for(i=0; i&(FLASH_PAGE_SIZE&&2); i++)//写一页
& & & & & & & & {
& & & & & & & & & & & & if( FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT) != FLASH_TIMEOUT )
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
& & & & & & & & & & & & }
& & & & & & & & & & & & if(Readbuff[i]!=0xffffffff)//0xffffffff说明原来就没有数据;这可以减少写flash的次数;
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & //printf(&\r\n i:%04x wAddr:0x%08x&&wdata:0x%08x&,i,PageAddr+(i&&2),Readbuff[i]);
& & & & & & & & & & & & & & & & FLASH_ProgramWord(PageAddr+(i&&2), Readbuff[i]);
& & & & & & & & & & & & }
& & & & & & & & }
& & & & & & & &
// & & & & & & & & MAL_Read(0,PageAddr - FLASH_START_ADDR,Readbuff,FLASH_PAGE_SIZE);//读一页
// & & & & & & & & for(i = 0; i &FLASH_PAGE_SIZE; i+=4)//读显示
// & & & & & & & & & & & & printf(&\r\n bias:0x%04x& &data:0x%08x&,i,Readbuff[i&&2]);
& & & & & & & &
& & & & & & & & PageAddr=PageAddr+FLASH_PAGE_SIZE;
& & & & & & & & StartWriteOffset=0;
&&return MAL_OK;
/*******************************************************************************
* Function Name&&: MAL_Read
* Description& & : Read sectors
* Input& && && & : None
* Output& && && &: None
* Return& && && &: Buffer pointer
*******************************************************************************/
uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)
&&switch (lun)
& & case 0:
&&& & & && &for( i=0; i & Transfer_L i+=4 )
& & & && &{
& & & & & & & & & & & & //printf(&\r\nReadAddr:0x%08x&&&,FLASH_START_ADDR + Memory_Offset+i);
& && && &Readbuff[i&&2] = ((vu32*)(FLASH_START_ADDR + Memory_Offset))[i&&2];
& & & & & & & & //& & & & printf(&data:0x%08x&&&,Readbuff[i&&2]);
& & & && &}
& & case 1:
& & default:
& && &return MAL_FAIL;
&&return MAL_OK;
/*******************************************************************************
* Function Name&&: MAL_GetStatus
* Description& & : Get status
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
uint16_t MAL_GetStatus (uint8_t lun)
&&if (lun == 0)
&&{& & & & & & & &&&
& && &Mass_Block_Count[0] = FLASH_SIZE/FLASH_PAGE_SIZE;
& && &Mass_Block_Size[0] =&&FLASH_PAGE_SIZE;
& && &Mass_Memory_Size[0] = FLASH_SIZE;
& && &return MAL_OK;
&&return MAL_FAIL;
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
你使用的是WIN8系统吧?
引用的这篇文章是我写的,之前这种方式做过大量的测试了,只有WIN8的系统没有测试,win8系统底层操作有很多奇葩的地方。
你分析的很仔细,如果真如你分析的,起始地址成了5800,那也没关系,把APP程序中偏移量修改为0x8800就可以了:
& & & & NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
& & & & NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8800);
这个要好好学习一下,方法很好!估计以后的芯片都会采用这种方式。
你使用的是WIN8系统吧?
引用的这篇文章是我写的,之前这种方式做过大量的测试了,只有WIN8的系统没有测试 ...
遇到作者了...这个文档看了很久..
不过有一点就是FAT是连续页的.如果改成其他页没试过.很久没试过了..当然希望能最大限度的压缩IAP体积
你使用的是WIN8系统吧?
引用的这篇文章是我写的,之前这种方式做过大量的测试了,只有WIN8的系统没有测试 ...
毕竟U盘地址和ROM内部地址不一样.上位机控制FAT写入的位置更加奇葩.
这太猛了。。
楼主厉害!!
LZ好人,这个必须是个精华帖!!
有IAR的吗?
我将我的IAR工程上传了,你可以参照一下。
我将我的IAR工程上传了,你可以参照一下。
多谢,明白了LZ的意思,感谢LZ。这种方案可以参考,但通用性不强。
学习一下!
mark& &片内FLASH虚拟U盘,iap
U盘 IAP 记号
学习了 谢谢楼主
标记,迟早会使用到。
不错, 支持一下
这个好,谢谢楼主
用这个方式升级很方便
mark& &片内FLASH虚拟U盘,iap
不错,好用
参考一下,谢谢!
我试了,U盘的地址和ROM地址是一致的。
你使用的是WIN8系统吧?
引用的这篇文章是我写的,之前这种方式做过大量的测试了,只有WIN8的系统没有测试 ...
你好。按照你的文档,我成功虚拟成u盘进行更新程序。
但是不知道怎么回事,有次上电之后,USB大容量设备前面有个感叹号,如附件所示。
重新启动或者换台电脑都不行。
但是我下载别的程序也能运行。
能否帮忙答疑下,谢谢。
无法下载,郁闷.....
改成12M晶振,不行了...
无法格式化了....
牛逼叼炸天,一直在找这方面的资料,找了一段时间没找到就放弃了,现在居然无意中发现这个资料
用这个方式升级很方便
mark 虚拟U盘 IAP
这个升级方法太好用了!!!
已经用到自己设计的小玩意上
很方便的升级方式,SD卡和外接FLASH什么的都省了。
非常方便的升级程序。MARK了,
东西看下,不错,准备做stm32项目
你好。按照你的文档,我成功虚拟成u盘进行更新程序。
但是不知道怎么回事,有次上电之后,USB大容量设备 ...
很久没回复帖子了..不知道你解决了问题没有..原因是USB枚举过程的问题,.可能是因为板子美欧加入USB枚举GPIO控制.导致上电的时候,MCU并没有开始初始化USB,电脑收不到枚举信息..为了提高实用性,可以在D+线路上加入USB枚举控制电路
改成12M晶振,不行了...
无法格式化了....
12M晶振请修改PLL信息...USB工作在48M
收藏一下,多谢楼主
12M晶振请修改PLL信息...USB工作在48M
多谢回复哈。
我先是在红牛开发板ZET6,8M晶振上实现的,虚拟成432KFLASH,后来改成自己做的板子VET6上,12M晶振,PLL之类的也改了,死活虚拟不成功,后来我改变了FLASH的起始地址,然后就成功了。
不过只能虚拟成400K。那么问题就是,同样是E系列的处理器,能够虚拟成的flash大小不一样。
为什么我用103VCT6可以枚举出一个U盘,但是WINDOWS总是无法格式化?用的是XP系统
为什么我的STM32F103RGT6的USB使用U盘通信格式,不能在线仿真调试???
结束此帖子
自己解决了问题..
多谢分享。下载下来拜读
楼主,我用STM32f103zet6 也想实现内部Flash虚拟U盘 升级IAP&&我把U盘容量扩大到100k ,实际识别出来的只有76K ,然后那个ApplicationAddress&&该怎么设置啊?
好东西啊,准备弄到f0上去。
顶上& && && && && &
stm32 U盘升级,很酷!!!
顶 准备用这个方案做升级盒
路过顶顶。。
我将我的IAR工程上传了,你可以参照一下。
/thread--1.html ...
很好用 可以正常使用
感谢楼主分享,记号一下
mark~~拜读~~
mark, STM32, IAP, U盘
astankvai 发表于
好东西啊,准备弄到f0上去。
f0移植成功了吗兄弟
f0移植成功了吗兄弟
在F072上做好了.
这个感觉还是有点难用。。
在F072上做好了.
有分享吗?准备移植到F072,到时请教下你啊
连续学习中,哈哈
阿莫电子论坛, 原"中国电子开发网"}

我要回帖

更多关于 空间音乐链接地址 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信