- 博客(11)
- 收藏
- 关注
原创 #4 使用QT制作单片机bootloader上位机实现IAP
首先了解一下HEX文件的格式含义,这类文章很多就不再赘述,主要记录一下分解HEX的思路。将HEX的每一行都读入一个二维数组,一维是HEX数据,二维是总的HEX行数,然后将不需要的数据删掉,例如冒号,最后两位校验码(因为要加入自定义指令所以用自己封装的校验函数计算校验码),然后将需要的信息例如地址段,data长度,data都提取出来顺便再加入自定义指令。首先想要开发上位机,需要先熟悉一下QT的基本操作,例如UI布局,控件的功能,以及一些C++的基础语法,对象,class,class中的成员权限,虚函数等。
2024-11-11 10:46:11
1247
原创 #3 KEIL无法生成bin文件而是文件夹以及用hex文件实现串口IAP
在上期文章中用bin文件实现串口IAP后,发现有一个问题,BAT32的FLASH中会在一个固定地址写入option byte(选项字节)来对系统的时钟频率,看门狗,低电压复位,FLASH保护寄存器等进行配置,这样会导致程序中选项字节所处的地址和app程序起始地址不连续,因此KIEL无法生成单个bin文件而是借助SCT文件进行不同地址数据的链接,但是编写SCT脚本疑似需要汇编语言,因此放弃bin文件而用hex进行IAP。
2024-11-07 14:18:14
450
原创 #2 国产芯片BAT32使用KEIL生成bin文件实现IAP
在跳转app前需要先设置MCU的MSP寄存器(主堆栈寄存器)起始地址和VTOR寄存器(中断向量表)起始地址,然后指定app程序开始的地址(即复位后程序的起始地址),app起始地址在在m0+内核中是MSP起始地址向后偏移4位,设置好之后就可以让程序执行这个地址的程序了。如果bootloader有用到中断,记得在跳转函数里先关闭中断防止出错,app里也要打开相应的中断,否则app中的中断是不会响应的。在KEIL中默认是无法生成bin文件的,需要配置魔术棒里USER里的指令,如图。
2024-10-29 08:09:58
622
原创 #1国产芯片BAT32不用中断实现定时器模拟串口发送
我给TIM3分配64Mhz的主频,那每计数1次就是1/64000000 = 15.625ns,而当UART波特率设置为9600时,每一帧数据的延迟时间为104us,那实现us级延迟就需要算出1us需要多少次计数时间,查阅BAT32A233可知TIM3的最大计数值为65535,向上计数,那么延迟函数中1us * 1000 / 15.625 = 64次/us,然后开启计数器,while中读取计数值直到超出x us对应的x次,然后停止计数器,这样就完成了精准延迟,最后根据UART电平协议拉低或拉高引脚就行了。
2024-10-28 12:10:52
426
原创 #3_记录KEIL5报错extraneous “(”
这里其实少了一个括号,当放在if()中时就会导致语法错误,所以使用宏定义时一定要小心!因为宏定义没有语法检查,尽量使用enum或const来代替宏定义吧,,原因是使用宏定义时,宏定义的逻辑出现问题,例如。
2024-10-09 15:52:44
420
原创 #2关于更换芯片开发的经验记录,KEIL汇编语句报错
原因是使用__ASM编译语法和KEIL编译器版本不兼容(汇编这一块我完全不懂,就不细说了),version 6以上的编译器和version5不一样,需要用符合前者的ASM指令才能识别到对应的汇编文件,否则会报错提示找不到汇编语句里的变量之类。还是BAT32芯片,查看DEMO时有一段汇编写的硬件错误处理中断服务函数,编译这一段出错。具体可以自查KEIL编译器不同版本对于汇编指令的规定。
2024-09-30 13:53:29
288
原创 #1关于更换芯片开发的经验,更改KEIL的CMSIS PACK 版本
在尝试更换CMSIS包时又出现问题,在下载完官网5.8.0芯片包后点击安装提示错误,需要先在KEIL安装文件路径中的CMISIS中创建对应版本的文件夹,例如5.8.0,才可以安装,随后移除原本的6.1.0CMSIS包,打开keil提示是否更新pack,更新后就完成CMSIS pack版本的替换了。最后自己定位到是CMSIS包的问题,因为BAT32系列用的都是5.8.0版本CMSIS,但我装的是6.1.0,其中cortexM0+内核的头文件差别导致的这次错误。
2024-09-29 10:41:44
1832
原创 KEIL编译报错expected member name or ‘;‘ after declaration specifiers
在结构体中声明一个成员时报错expected member name or ‘;发现是直接用数字开头声明变量了,很低级的语法错误。不能用数字开头声明变量哦。
2024-09-03 16:21:30
607
原创 KEIL编译报错initializer element is not a compile time constant
编译原理要求在对结构体或数组成员初始化时必须要用编译时常量;而即使用const修饰结构体或数组并进行初始化,它们也属于运行时常量,即数值并非在编译时确定而在程序运行时确定,所以编译器会报错。我用一个const修饰的结构体实例成员对另一个结构体成员进行初始化时提示initializer element is not a compile time constant.所以只能用宏定义、const修饰的全局变量、魔法数字来进行结构体或数组的初始化。
2024-09-03 16:15:22
1082
原创 KEIL警告Warning: variable length array folded to constant array as an extension
嘤嘤嘤
2024-08-20 13:08:05
418
原创 Keil报错undefined symbol且不可跳转到出错位置
实际是因为在path里设置了该C文件的头文件路径导致可以引用header但没有C文件实际定义,最后在项目中加入该C文件就好了。编译时即使引入header,函数依旧提示undefined symbol,并且不能跳转到错误位置,但出错函数可以跳转。
2024-08-13 11:19:17
481
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人