最近用到USB,后来发现了STM32F103可以程序实现DFU,在网上搜到代码对比官方文件发现是大容量FLASH的DFU,我用的是STM32F103C8T6,属于中容量。自己对着官方例程修改了网友的代码,改成中容量后可以使用DFU更新固件。修改过程中要注意几点
1.在库函数“void SystemInit (void)”结尾处添加向量表偏移量,开全局中断(在dfu中关闭了中断,在此处打开)。如下图
2.修改MDK app程序偏移量,如下图:(预留了20K FLASH给USB DFU使用,所以APP代码起始地址0x8005000)
3.APP修改完成后,需要在DFU代码中修改APP跳转地址,如下图:
修改完成后,使用官方的“DfuSe_Demo_V3.0_Setup.exe”软件下载即可。
应用环境:下位机-STM32F103C8T6
DFU代码长度16K
APP代码长度27K(基于USB-HID类的发卡器)
上位机-win7 旗舰版64位
DfuSe_Demo_V3.0_Setup.exe
关键字:STM32 USB DFU功能
引用地址:
STM32 USB的DFU功能
推荐阅读最新更新时间:2024-03-16 15:36
STM32启动文件初探之startup_stm32f10x_hd.s(Reset_Handler函数)
该文件主要实现目的: 设置初始SP 设置初始PC=Reset_Handler 设置向量表入口地址,并初始化向量表 调用SystemInit,把系统时钟配制成72M,SystemInit在库文件system_stm32f10.c定义 调转到标号_main,最终来到C程序文件 ; Reset handler Reset_Handler PROC EXPORT Reset_Handler IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0
[嵌入式]
STM32的ADC1+ADC3 16路采集 DMA传输 数据不错位
1) ADC多通道采集:(多通道采集必须用扫描模式,扫描模式时规则组的通道共用一个寄存器,so必须用DMA传输;为防止数据错位,不能用连续模式,而应在查询或中断中先关闭ADC转换,再开启ADC转换)so应采用扫描、非连续的方式、DMA正常模式,DMA的EOC中断或查询; 上述的配置下,ADC运行流程如下: 每个规则通道采集之后,每个ADC_DR会更新,这个更新会启动一次DMA,同时会产生EOC,然后DMA会传输此数据,DMA的传输会清除EOC标志,然后DMA的传输量计数器--,so,每一组规则通道转换完成后也不会产生EOC(详情看英文版STM32手册V15版本-Page220,而非V9版本),so利用这个EOC产生ADC中断或查询
[单片机]
USB软件狗的设计及反破解技术
摘要: 介绍了软件狗技术的发展,提出了一种改进的低成本USB软件狗的设计方案,分析了常见的加解密技术,并据此提出了一系列反破解措施。
关键词: USB 软件狗 加解密技术 反破解
1 软件狗技术
近年来,软件狗技术在保护软件开发者利益、防止软件盗版方面起了很大作用。软件狗技术属于硬加密技术,它具有加密强度大、可靠性高等特点,已广泛应用于计算机软件保护。软件狗技术的发展经历了多次更新换代。第一代软件狗通过短接并行口的某两根线,或者再加上些电阻、电容、二极管等实现;第二代软件狗采用逻辑门电路跨接在开行口上,并采取适当的措施尽量避免软件狗和打印机之间的相互干扰;第三代软件狗的核心芯片是EEPROM
[应用]
STM32之关于USART以及波特率的一些思考
一、UART与USART? UART:通用异步收发器 USART:通用同步和异步收发器 同步:发送端发送数据后,接收端回应后才发下一个数据包,是为阻塞模式 异步:发送端发送收据后,不需要等待接收端回应,接着发送下一个数据包,是为非阻塞模式 半双工:允许数据在两个方向上传输,但是某一时间,只允许数据在一个方向上传输 全双工:允许数据同时在两个方向上传输 SPI为同步全双工通信、IIC为同步半双工通信,UART为异步全双工通信、USART为同步或异步通信 UART数据格式: 数据帧格式:开始位、数据位、奇偶校验位、停止位 起始位:开始发送一个字节数据,数据线为逻辑0状态
[单片机]
stm32使用MDK开发中的一些常见问题
1. 解决:keil报错invalid redeclaration of type name s32 答案:一般在Target Options C/C++选项卡里的Include Paths 里要添加几个固定的头文件路径, ..CMSISCM3CoreSupport ..CMSISCM3DeviceSupportSTSTM32F10x ..STM32F10x_StdPeriph_Driverinc ..userinc 是头文件路径问题,KEIL只要有一个头文件找不到,就会自已从本身的INC文件夹找头文件,结果就会出现以上错提示。把老版的头文件改为STM32F10X.H. 新的库已经把.CONF.MAP.TYPE
[单片机]
STM32 IO寄存器操作
STM32的IO端口有八种模式: 1、输入浮空 5、开漏输出 2、输入上拉 6、推挽输出 3、输入下拉 7、推挽复用 4、模拟输入 8、开漏复用 每个IO口都有七个寄存器来控制: CHL、CHR :端口配置寄存器(32位) IDR、ODR :数据寄存器(32位) BSRR :置位/复位寄存器(32位) BRR :复位寄存器(16位) LCKR :所存寄存器(32位) 其中,比较常用的IO端口寄存器为CRL,CRH,IDR,ODR 低配置寄存器CRL: 该寄存器复位值为0x4444 4444。即
[单片机]
STM32单片机的ADC多通道采样
一 单通道采样 参考资料: 《STM32库开发实战指南》 原理性质的东西还是少讲,因为上面那本书里面讲解的很详细了,直接来看硬件电路图 这里使用的是3362电位器(10K),即用STM32来测量PB0和GND两端的电压,这样的电路设计比较简单也容易理解,但是存在一定的弊端,下面给出《STM32库开发实战指南》上面配套的硬件电路图 如果设计电路图的话,可以参考这种思路。 我的收获 1 引脚初始化的时候需要注意 每一个ADC通道都对应一个GPIO引脚,看图中的ADC123_IN10,表示这个引脚(PC0)可以配置为ADC1的通道10,或者是ADC2的通道10,或者是ADC3的通道10,这个地方非常重要,涉及到后面ADC初
[单片机]
如何有效地使用串口通讯接收数据
引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口中断,在中断中读取数据就行了! 中断就是打断程序正常运行,怎么能保证高效呢?经常把主程序打断,主程序还要不要运行了? 同学B:串口可以配置成用DMA的方式接收数据,等接收完毕就可以去读取了! 这个同学是对的,我们可以使用DMA去接收数据,不过DMA需要定长才能产生接收中断,如何接收不定长的数据呢? DMA简介 题外话:其实,上面的问题是很有必要思考一下的,不断思考,才能进步。 什么是DMA DMA :全称Direct Memory Access,即直接存储器访问
[单片机]