- 博客(31)
- 收藏
- 关注
原创 STM32 HAL库 CAN过滤器配置
之前在这篇博文里写了一下配置CAN收发的方法,当时由于并没有使用过滤器的现实需求,所以就也没仔细研究。现在工作中确实需要用到过滤器了,有些项目中控制器和发动机ECU是连接在一路总线的,而发动机ECU会产生大量的报文,这就不得不配置过滤器了。
2025-03-11 15:27:28
1373
原创 winform开发时 屏蔽tabcontrol下面的tabpage
selectedindex是从0开始的,所以“固件更新”是index1。而page是从1开始的,所以“固件更新”是page2!意思就是如果selecting的是page1和page3,就取消这次选择,然后鼠标就永远选不上这两个page了。需求是只想让用户使用“固件更新”,但是保留“参数配置”和“高级模式”。这样就把初始的page设置为“固件更新”了。重写tabcontrol的。
2025-03-03 21:51:55
274
原创 CAN总线上位机与BOOT程序实现更新的通信协议
boot中使用ID为0F0的两个报文进入准备更新状态并发送反馈,然后使用ID为0F1的报文传输数据,最后使用ID为0F2的两个报文将接收的程序写入flash并反馈。使用上位机进行程序更新时,与当前运行的APP和BOOT程序之间需要规定一套通信协议。可以直接使用CANopen,但是感觉仅仅实现一个很简单的功能不妨自己试着写一下。APP中使用ID为0F0的两个报文接收指令和反馈,进行跳转。
2025-01-23 08:27:17
305
原创 STM32F407 内部参考电压校准实现 HAL库
实测下来,以上方法校准VDD用处不大,校准前和校准后基本也就差个0.1%~0.3%,VDD在大部分情况下还是比较准的,不如直接校准零点来的直接。厂家出厂的时候给了一个很精确的3.3V电源作为VDD,并记录了在该精准3.3V下,内部那个精确。首先,这个校准机制校准的是系统中电源电压VDD,不校准的情况下我们默认它是3.3V。在3.3V的电源电压下的ADC采样值记录在了flash地址。
2025-01-22 15:23:46
731
原创 C#上位机通过CAN总线发送bin文件
Array.Copy(binData, i * chunkSize, frameData, 0, currentFrameSize)是将“bindata”这个bin文件的指定位置(i * chunkSize)指定大小(currentFrameSize)的数据复制到framedata中用于发送。其次,Thread.Sleep(1)也是很重要的,250k波特率下每秒can总线发送报文的极限是2000条左右,为了均衡效率和稳定性,我们设置每次发送后延时1ms再继续发送,以避免总线过载或者可能发生的错误。
2025-01-13 15:35:25
660
1
原创 C#上位机通过hex生成bin文件
通过C#写的上位机将hex文件转换为bin文件,然后使用CAN总线往控制器里发送。转换为bin文件时我们只保留数据记录段,这个地方gpt竟然都会犯错!传入hex文件和bin文件的地址即可,
2025-01-13 10:12:05
382
原创 STM32 IAP技术 bootloader设计
这样一个简单的bootloader就算设计完了,当然要实现完整的IAP功能的话还需要上位机程序的配合。如果仅仅是需要单纯的IAP,也可以使用一些可以直接发送bin文件的CAN总线调试程序。可以参考一下STM32的IAP技术,基于CAN总线的STM32F103 BootLoader设计_哔哩哔哩_bilibili这位大佬的教程,介绍的非常详细由于工作需要我还要在上位机中设计一些特定的功能,所以我还需要自己来写(╥╯^╰╥)
2024-12-27 10:06:52
1098
原创 频率传感器计算车速过程
2.然后计算轮胎的转速,一般马达带动的是小齿轮,经过gear box再带动轮胎,所以计算轮胎的转速只要用马达转速除以gear box的传动比:wheel_speed = speed_motor/传动比。3.计算实际车速,就是将计算出的轮胎的速度从 转/分钟 转换到 km/h: speed = wheel_speed*pi*轮胎直径*60/1000。注意:由于单片机更擅长处理整数,所以实际计算时需要在每一步都乘一定的系数,10或者100或者1000,视情况而定。
2024-12-11 08:32:23
384
原创 基于Winform和PCAN的上位机开发
项目需要写上位机用来提供给客户使用,进行MCU中简单的参数调试和标定等功能。与MCU通信的方案选择了CAN总线,因此需要使用PCAN提供的api接收报文。记录一下从创建工程到添加PCANBasic到上位机接受到控制报文的整个过程。1.创建winform工程并把PCANBasic拖到工程目录下创建的是.net framework的窗体应用去pcan官网上把官方提供的开发文档下载下来然后到PCAN-Basic文件夹中的这个路径下把PCAN-Basic.cs复制下来添加到刚刚创建的
2024-12-09 10:58:23
1395
原创 DBC文件编辑、采集和回放/读取
需要从CAN总线上读取如下4个信号进行分析该过程可以分为3个步骤:1.根据上图的通信协议写好dbc文件;2.使用写好的dbc文件和CAN总线采集软件接收并可视化信号;3.将采集到的信号进行保存以及回放对于以上任务,一般工业现场是使用IPE这样的系统化解决方案,但是IPE的软件使用并不习惯,而且经常受到许可证的限制,并且设备贵,使用上有一定的门槛。我个人感觉IPE的这一套解决方案并不好,至少从使用者的角度来讲用起来不舒服也不优雅(仅仅是个人观点!),下面讲一下我采用的方案。
2024-12-04 14:49:59
994
原创 Matlab算法转C语言代码 在keil上运行示例
在①输入执行语句,点击②将自动判断输入数据类型,可以看到已经识别了x的类型为double,尺寸为1×1000,③继续。
2024-12-01 14:49:30
1763
原创 STM32项目开发Flash空间分配
扇区5~6作为主程序存储区,共256KB,大部分项目应该是够用了的,万一不够就把扇区7也分配给主程序,因为APP备份并不是必要的;其中Bootloader分配扇区0~3,共64KB,用于存储启动引导程序;(可选)如有需要可以把扇区7用于备份程序/恢复出厂设置。扇区4分配64KB用于保存需要断电存储的参数;
2024-11-21 13:42:59
729
原创 电控模块故障指示灯闪烁代码
提升器电控模块有任何故障发生时,故障指示灯(红灯)发闪烁代码。每一组闪烁代码(两位数)表示一组故障,多组故障可叠加发闪烁代码。例子:在连接“深度”旋钮的信号线损坏的情况下,错误代码 23 将以如下的次序闪烁:长停-两闪-短停-三闪 (时序图如下)借助故障代码列表确认故障,如果故障消除,故障指示灯熄灭。
2024-11-20 13:54:48
622
原创 KEIL优化optimization不同等级的区别
这个模式优化等级比O0高一点,但对debug界面的影响不是很大,体现在:有些代码处没法加断点,但还是按顺序执行的。这个等级对debug界面是最最友好的,体现在:断点打在哪里都可以;任何变量都可以添加到窗口来监测。这个模式下debug界面基本没法用了,程序到处飞,这个模式下debug界面就不太好用了,代码会乱跳。
2024-11-12 17:59:04
1050
原创 Macbook air 触摸板按压失效解决方案
真的被惊讶到了,这苹果的触控板难道不是纯硬件结构?原来触控板能否按下也是能被软件控制的吗?有一天突然发现mac的触摸板没法按下去了,每一个部位都没法按下,整个触摸板就像固定住了一样。重启电脑尝试解决问题,触摸板任然没反应。重装电脑系统尝试解决问题,任然不能解决。步骤1:长按shift+option+control+开机键。步骤2:保持20秒左右,直至电脑关机后屏幕再亮起。步骤3:松开按键,等待屏幕开机。开机后触控板就恢复正常了!
2024-11-10 11:15:20
1754
原创 keil中Build Target和Rebuild all Target files的区别
一般来说,刚打开keil的时候Rebuild all Target files一次,后面的操作就全部使用Build Target。注意:编译存在问题的时候建议使用Rebuild all Target files。只编译发生改变的文件。如果某个文件没有被修改过,Keil会跳过它的编译。重新编译所有的源文件,无论文件有没有被修改过。
2024-10-31 23:11:22
454
转载 Word打开时提示“很抱歉,此功能看似已中断...”
2.找到以下键值:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Word\Options。在右侧新建DWORD值,取名为NoReReg,并输入数值为1 并确认,关闭注册表编辑器,重新打开Word 即可。1. 按Windows 键+R键,输入“regedit”打开注册表。
2024-10-31 15:40:46
210
原创 STM32 串口不定长数据接收与printf发送重定向
模式选择异步,并开启中断开启发送和接收的DMA传输(接收不定长数据其实只用到了接收的DMA传输,这里既然接收的DMA开了就顺便把发送的DMA也开了哈哈)
2024-10-31 15:28:48
758
原创 STM32 输入捕获模式测量频率和占空比 HAL库
该方法测量频率在10Hz-30KHz范围内误差小于0.2%,在1HZ-60KHz范围内误差小于1%。在频率小于100Hz时,理论上测周法的采样周期大于10ms。但通过flag的设置,可以强行在设置的周期内获取采样值,以保持项目中不同传感器数据更新周期的一致。但此时获取的采样值只是上一时刻未更新的数值,并不是真实的。但是但是!其实实际应用时(作为发动机转速传感器)频率输入低于100Hz的情况几乎很难遇到,而且0.2%也是足够的(很多场景下1%都是可以接受的),所以这种方案是完全能够应对的。
2024-10-15 20:36:38
2919
2
原创 STM32 输入捕获模式测频率 HAL库
上一篇中介绍了PWM输入模式测量频率和占空比的方法,以及该方法的局限性,提出输入捕获模式在实际应用中的优势。下面记录输入捕获模式测频率的方法,使用F407开发板与cubemx进行配置(选择开发板、开启外部时钟和SW调试接口、Project Manager设置相关操作略过)
2024-10-08 15:44:09
983
原创 STM32 PWM输入模式测量频率和占空比 HAL库
最核心的原理就是这张图,简而言之就是使用了定时器的两个通道,IC1(通道1)捕获上升沿时记录CCR1的值并复位计数器,两个通道重新开始计数;IC2(通道2)捕获下降沿时记录CCR2的值,根据设置的定时器主频和两个通道的CCR就能计算出PWM的频率和占空比。(图片来自正点原子STM32F407 开发指南)下面使用Cubemx进行配置并使用keil进行编程,使用开发板为STM32F407(选择开发板、开启外部时钟和SW调试接口、Project Manager设置相关操作略过)
2024-10-08 11:01:57
1177
原创 stm32 使用keil register窗口评估代码运行时间
然后再main函数中写一段延时函数,debug进行测试,如果和设置的延时一致,那么就可以对其他代码进行耗时评估了。这里以我使用的Jlink为例,enable Trace选项并将core clock设置为与单片机的主频统一。在使用keil进行debug时可以通过register窗口下的sec进行代码运行时间评估。在开发时经常需要知道一段程序或者计算的耗时,以免其耗时太长影响整个程序的进行。在进行debug之前需要到调试器中进行设置。
2024-09-30 08:24:43
398
原创 STM32 f407 CAN收发 基于HAL库和Cubemx配置
现在主程序中定义大小为8个字节的全局变量,以便我们在主程序中对CAN1和CAN2接收到的报文进行读取不要忘了在main.h中声明,不然can.c文件无法访问变量重定义消息等待回调函数(即邮箱收到信息等待读取时触发的中断)// FIFO0消息等待回调= HAL_OK);// FIFO1消息等待回调= HAL_OK);使用HAL_CAN_RxFifo1MsgPendingCallback()接收数据后对接收到的数据的IDE进行判断,如果是标准ID则使用标准ID将信息发回,扩展ID则同理。
2024-09-28 17:15:41
3138
3
原创 STM32 f407 多通道ADC采集+DMA传输 基于HAL库和Cubemx配置
很多教程喜欢从HAL_ADC_Start()和HAL_ADC_Start_IT()开始教,这样虽然能让理论知识理解的更加充分,但我觉得不是很有必要。因为其实HAL_ADC_Start_DMA ()内部的实现中是调用了HAL_ADC_Start_IT()的,用多了遇到问题多了自然就会去看内部实现了,然后自然而然就明白了。至于HAL_ADC_Start()这种阻塞式实现,完全不会用的到。先会用,再精通!
2024-09-28 10:40:10
5237
6
原创 STM32 f407 TIM定时器中断 基于HAL库和Cubemx配置
首先判断句柄htim是否来自所需要的中断,然后执行需要的操作(习惯将外设触发的中断回调函数放在外设对应的.c文件中,这里放在tim.c中)
2024-09-27 16:33:36
975
原创 STM32 f407 多通道PWM输出 基于HAL库和Cubemx配置
下面记录一下使用cubemx的配置过程以及HAL库输出PWM的相关代码(选择开发板、开启外部时钟和SW调试接口、Project Manager设置相关操作略过)
2024-09-27 15:47:44
1516
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人