linux/windows上STM32固件烧写工具的开发demo

1.主要实现功能:完成对HEX和DFU文件的烧写,显示烧写的进度等功能
2.开发工具:Qt creator4.9.0
3.开发系统平台:windows系统和linux系统两套平台
4.具体开发步骤:
1)设计整体的界面,包括文件选择界面(dfu和hex文件),擦除和烧写环形进度界面,烧写成功界面
2)由于在公司的电脑系统安装的是linux系统,因此首先考虑的linux平台的开发,移植dfu-util库。
3)移植完成了dfu-util库之后,工具支持了dfu文件的烧写,hex文件的烧写移植了ST官网的hex文件转dfu文件的工具源码(MFC编写的)
4)移植成功后,基本上完成了linux上烧写工具的开发,支持hex/dfu文件烧写,支持环形进度条显示。
5)把Linux系统上的代码移植到windows上面,由于Qt支持跨平台开发,所以需要修改的只是关于libusb相关的方面
6)window系统上USB通信有两种方式,一种是利用libusb-win32库+USB驱动,另一种是利用windows提供的一些列API(如SetupDiEnumDeviceInterfaces等),我开发选择的是第一种(其实是第二种没走通,源码可以参考ST固件烧写工具中的烧写DFU工具)
5.参考源码:
1)dfu-util:http://dfu-util.sourceforge.net(linux)
2)libusb-win32:https://sourceforge.net/projects/libusb-win32/
(windows,这个是libusb0.1分化出来的项目,后来只有维护,所有接口和libusb不太相同)
3)libusb:https://github.com/libusb/libusb/releases(windows和linux好像都可以)
4)QRoundProgressBar:https://sourceforge.net/projects/qroundprogressbar/(windows/linux)
5)ST固件烧写工具:可以自行去ST官网下载(windows,ST的开发工具好像在windows10系统上不太兼容,源码测试的时候一直卡死)
6.参考博客:
1)环形进度条:https://blog.csdn.net/czyt1988/article/details/53422274
2)libusb-win32接口介绍:https://blog.csdn.net/menghun_99/article/details/80634892
3)libusb-win32下的工具介绍:https://blog.csdn.net/weixin_39794563/article/details/79039284
4)libusb-win32连接验证:https://blog.csdn.net/gaoszzzz/article/details/81982384
5)Linux下的libusb库移植开发:https://blog.csdn.net/u012247418/article/details/82960889
6)window下的libusb开发介绍:http://www.joenchen.com/archives/1360
7.libusb-win32驱动工具安装:
1)usb驱动:https://sourceforge.net/projects/libusb-win32/ 安装包里面的/bin/inf-wizard,这个会识别系统的设备,安装完成之后在设备管理器里面可以发现,原来的串口设备被识别成了libusb-win32的端口了,在电脑的系统库中发现libusb0.sys和libusb0_x86.dll已经安装。
2)libusbK下载:https://sourceforge.net/projects/libusbk/ 上面一个功能也可以在这个工具里面完成,安装第二个第三个就行,具体原因参考博客6)
8.开发过程中遇到的问题:
1)libusb是1.0的接口,而libusb-win32的接口是0.1版本的,因此在找设备的过程中libusb是通过libusb_init(libusb_context*)而libusb-win32是通过三个函数usb_find_bus,usb_find_device,usb_init三个函数同时执行才能获取到设备。
2)MFC系统上的BOOL类型是int,DWORD类型是unsigned long(4个字节大小,而不是8个字节,32位系统)移植HEX到DFU代码转换的时候,即MFC到QT时吃了大亏。
9.项目总结:
1)遇到问题找寻资料,看看有没有人做过,如果有人做过,我们就可以直接借鉴移植(跑通功能是第一步,然后再是看代码),效率和成果才是关键。
2)移植的过程中,要多想多思考多观察。不要想当然。
3)查看源码时,从大到小,先框架后具体,可以减轻自己很大的工作量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

338. 比特位计数 golang

Me func countBits(num int) []int {result : make([]int, num1)for i:0; i<num; i {result[i] numberOne(i)}return result }func numberOne(x int) int {if x 0 {return 0}var count intfor x ! 0 {x x & (x - 1)count}return count }

Qt使用qss文件管理stylesheet

内容总结简介&#xff1a; 1&#xff09;使用.qss后缀的文件来管理Qt中每个类的具体组件的stylesheet设置。 2&#xff09;在类中使用具体.qss文件中的设置。 3&#xff09;解决控件中多个相同组件不同设置或者同一个控制不同子控制或者伪状态的问题。 1.新建后缀名为.qss的文…

283. 移动零golang

Me 遍历所有数组&#xff0c;统计0的个数倒着把零写入数组末尾 func moveZeroes(nums []int) {var count, j intfor _, key : range nums {if key 0 {count} else{nums[j] keyj}}for i:len(nums) - count; i < len(nums); i {nums[i] 0} }最优解(快慢指针) 减少了数组…

QT自定义MainWindow

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;自定义边框&#xff0c;标题栏&#xff0c;工具栏&#xff0c;内容栏&#xff0c;状态栏&#xff08;后面三个代码中没有实现实现&#xff09; 2&#xff09;重写鼠标事件…

485. 最大连续1的个数 golang

Me func findMaxConsecutiveOnes(nums []int) int {max : 0for i,j : 0, -1; i < len(nums); i {if nums[i] 0 {j i} else {if max < i -j {max i - j}}}return max }

QTextEdit实现图片和文本同行显示

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;实现图片和文本在同一行显示&#xff0c;且能够设置字体大小和颜色 2&#xff09;能够手动设置行的宽度和间距 3&#xff09;设置字体样式&#xff0c;然后添加图片&#…

3. 无重复字符的最长子串 golang

官解 func lengthOfLongestSubstring(s string) int {n : len(s)ans : 0subMap : make(map[byte]int)for i, j : 0, 0; j < n; j {if v, ok : subMap[byte(s[j])]; ok {if i < v {i v}}if ans < (j - i 1) {ans j - i 1}subMap[byte(s[j])] j 1}return ans }

QQuickWidget + QML编程实现酷炫动态动画效果

1.具体需求&#xff1a;当Qt开发项目中需要实现简单的动态酷炫动画效果时&#xff0c;我们可以使用Qt中的QQuickWidget来实现&#xff0c;同时还可以使用QML编程来实现具体的动画效果&#xff0c;具体实现的效果如下所示&#xff1a; 2.具体操作和实现效果图&#xff1a; 1&am…

Qt中的四种信号与槽的连接方式

1. UI界面右键点击控件&#xff0c;选择“转到槽“&#xff0c;系统会在cpp中自动添加这个组件对应的槽函数 2.在Ui界面的下面 siga如l & slot editor栏中手动添加 3.在代码中使用connect显示添加 4. 使用on_对象名_事件名隐式连接&#xff0c;以QPushButton为例 QPushBut…

20. 有效的括号 golang 堆栈

借用arraystack的包完成 import "github.com/emirpasic/gods/stacks/arraystack"func isValid(s string) bool {stack : arraystack.New()for _, c : range s {if c ( {stack.Push())} else if c [ {stack.Push(])} else if c { {stack.Push(})} else {if stack.…

215. 数组中的第K个最大元素 golang

Me func findKthLargest(nums []int, k int) int {sort.Ints(nums)return nums[len(nums)-k] }golang实现快排和冒泡排序 1. bubbleSort // method2 func swap(a *int, b *int) {temp : *a*a *b*b temp }func bubbleSort(nums []int) {for i:0; i < len(nums); i {for…

Qt实现对json文件的解析

json是一种轻量级的数据结构&#xff0c;其内部的结构是一种键值对(key-value)的组合&#xff0c;最外层是{ }。key是带双引号的字符串常亮&#xff0c;用于获取和存储&#xff1b;value的值可以是bool变量&#xff0c;字符串常量&#xff0c;对象或数组(也是一个key-value的组…

解决QTreeWidget中item无法整行同时显示相同颜色

对于QTreeWidget来说&#xff0c;继承自QTreeView&#xff0c;因此设计QTreeWidget中的样式设计&#xff0c;归根结底是对QTreeView的样式设计&#xff0c;而对于QTreeView中item样式设计&#xff0c;可以分为对branch和item设计&#xff0c;另外QT Style Sheet可以通过设置sho…

279. 完全平方数 golang

Me func checkRecord(s string) bool {return !(strings.Count(s, "A") > 1 || strings.Contains(s, "LLL")) }golang的string用法 func EqualFold func EqualFold(s, t string) bool 判断两个utf-8编码字符串&#xff08;将unicode大写、小写、标题…

Qt自定义对话框中边框阴影实现

1. 对于Window系统或者Unix系统&#xff0c;QDialog有一个默认的边框(样式看起来有点复古)&#xff0c;不过Qt可以提供自定义的边框设计&#xff0c;通过设置对话框相关属性&#xff1a; setWindowFlags(Qt::Dialog | Qt:: FramelessWindowHint); //设置不适应默认边框 setAt…

344. 反转字符串 golang

Me 双指针操作。首指针和尾指针 func reverseString(s []byte) {left,right:0,len(s)-1for left < right && len(s) ! 0 {s[left],s[right]s[right],s[left]leftright--} }

Qt自定义数据类型注册meta-object system

在Qt项目开发过程中&#xff0c;有时候会碰到需要使用自定义数据类型作为信号或者槽的参数进行数据传输&#xff0c;由于信号或者槽中的参数必须为Qt meta-object 系统中能够识别的参数&#xff0c;但是自定义数据类型仅仅只是程序代码编写者自己知道&#xff0c;编译器在编译的…

Qt使用invokeMethod反射机制实现线程间的通信

对于Qt来说&#xff0c;UI线程是主线程&#xff0c;对于同一UI线程中对象的通信可以通过connect进行信号与槽关联来实现&#xff0c;但是当UI中对象A中的子线程B需要和另外UI对象C进行通信的时候&#xff0c;如果这个时候使用connect来进行通信的话,需要B对象和A对象进行关联将…

Qt eventFilter实现信号与槽

对于Qt来说&#xff0c;信号与槽机制是其通信的一大亮点&#xff0c;但是Qt中也提供了其他的方法实现数据间的通信&#xff0c;如invokeMethod反射机制实现通信(https://blog.csdn.net/xx18030637774/article/details/105017306),另外Qt还提供了使用eventFilter来实现数据通信&…

318. 最大单词长度乘积 golang

question 给定一个字符串数组 words&#xff0c;找到 length(word[i]) * length(word[j]) 的最大值&#xff0c;并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词&#xff0c;返回 0。 示例 1: 输入: [“abcw”,“baz”,“foo”,“…