当前位置: 首页 > news >正文

基于STM32的单片机开发复盘

硬件介绍

  • 底盘:幻尔阿克曼底盘;2个直流霍尔电机、1个PWM舵机
  • 开发板:幻尔Ros Controller V1.2(STM32F407VET6)
  • 电源:因为是学习阶段,没有配电池,使用120W可调电源(3V~12V)
  • 屏幕:0.96存OLED
  • 蓝牙:蓝牙转串口接收器

过程文档及资源

链接说明
https://gitee.com/jori-wang/car-demo.git源代码地址。从SPL -> STM32CubeMX+LL -> STM32CubeMX+LL+FreeRTOS
https://gitee.com/jori-wang/mcu-tool-set.git所有需要用到的软件工具及说明
https://gitee.com/jori-wang/hardware-dataset.git所有用到的资料。开发板说明、芯片手册等

遇到的问题及解决方案

使用UART通信时,设置的波特率和实际值不匹配

进行单片机开发的第一步就是时钟设置。

本人没有进行时钟设置导致实际时钟频率(HSE 16MHz)和代码使用的时钟频率(HSE 25MHz)不匹配,导致上述问题。

所有频率不匹配的问题,几乎都和时钟相关

将printf映射到串口时,重写 fputc 函数导致系统卡死(没进main函数)

使用 printf 需要导入 <stdio.h> 但是单片机没有标准C中的对应实现(硬件不一样),因此有以下三种解决方法:

  • 使用MicroLib
  • 自己实现并覆盖默认实现(void _sys_exit(intx)和定义结构体struct __FILE);
  • 如果使用Keil开发,在 Run-Time Environment 中勾选 STDERR-ITM。将消息重定向到调试面板(debug window)

在这里插入图片描述

调试模式下系统卡死,没有触发断点

默认情况下,进调试模式系统会在 main 函数的最开始触发一个断点,开发者需要手动点击 continue 才能继续执行。

所以如果没有进 main 函数,那就说明代码在启动时就出错了或者触发了死循环。大概率时出错了。

此时可以观察调用栈,断点停留在哪个函数,然后观察寄存器中的数据;同时通过watch功能观察函数体中变量的值,来排查可能的错误。

这种情况,大概率是缺少函数实现(如前面的 stdio 导致的程序卡死)

调试模式代码正常,直接运行系统无反应

排查时钟问题;排查代码报错;排查宏定义值。

调试模式有两点比较特殊:

  1. 人为增加延时。虽然断点停止了代码的执行,但是硬件电路还在实际工作,此时断点人为引入delay;部分场景下会导致报错代码被跳过
  2. 调试模式不一定会重置所有参数值,特别是全局参数;预编译宏等

如果调试模式下,在不是断点的地方触发了断点,大概率是代码出错,IDE自行停在出错的位置方便调试


文章转载自:

http://MReUo0yu.pwLxy.cn
http://IZh6HtPJ.pwLxy.cn
http://PPfuaka3.pwLxy.cn
http://NRGS51qc.pwLxy.cn
http://Sjhlx3Yi.pwLxy.cn
http://s8RWRpBX.pwLxy.cn
http://X9g8GnnU.pwLxy.cn
http://sO7dAu2m.pwLxy.cn
http://MAPj3nmF.pwLxy.cn
http://JGWXw8xn.pwLxy.cn
http://lFFCyTrF.pwLxy.cn
http://zhlE5ibN.pwLxy.cn
http://y2IQoSrz.pwLxy.cn
http://mnGDQEoD.pwLxy.cn
http://XoOYAAIg.pwLxy.cn
http://OdXkjbNu.pwLxy.cn
http://ZygKf88l.pwLxy.cn
http://dW8YTRX5.pwLxy.cn
http://x8O8BN7Q.pwLxy.cn
http://zhTGfkYH.pwLxy.cn
http://f0qawQDQ.pwLxy.cn
http://J8FzC70M.pwLxy.cn
http://h7dXB4ai.pwLxy.cn
http://2A1y7ZGi.pwLxy.cn
http://Ob9P4TqO.pwLxy.cn
http://KdidFodI.pwLxy.cn
http://QOjP0qJj.pwLxy.cn
http://8HfQESWj.pwLxy.cn
http://sesBeQ2e.pwLxy.cn
http://nbj7Oiv8.pwLxy.cn
http://www.dtcms.com/a/379062.html

相关文章:

  • Git 目录详解和基本操作(1)
  • 机器学习之K折交叉验证
  • Android Gradle Project (AGP) gradle-xxxx-src.zip无法正常下载问题解决方法
  • 图观 应用编辑器 产品介绍
  • 探讨Hyperband 等主要机器学习调优方法的机制和权衡
  • Apple产品发布会拆解:体验下放、设计极限、AI 入耳
  • 如何解决 Spring Bean 循环依赖
  • sdio NOT_AUTOGATING
  • 华为X考拉悠然 联合发布悠然智擎城市交通拥堵治理空间智能体方案
  • 《微服务事务管理》
  • CentOS 7 安装 MySQL 详细教程
  • 分布式锁解决集群下一人一单超卖问题
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘sweetviz’问题
  • @DateTimeFormat.fallbackPatterns 详解
  • 使用wavesurfer.js自定义波形绘制,集成频谱、时间轴、缩放、区域选择等插件
  • 数据库主从同步
  • leetcode27(两数之和)
  • Gradio全解11——Streaming:流式传输的视频应用(9)——使用FastRTC+Gemini创建沉浸式音频+视频的艺术评论家
  • 单片机 - I2C 总线
  • EasyExcel 实现国际化导入导出
  • 实现联邦学习客户端训练部分的示例
  • 从互联网医院系统源码到应用:智能医保购药平台的开发思路与实操经验
  • 伽马(gamma)变换记录
  • 第3节-使用表格数据-唯一约束
  • 深入浅出 C++20:新特性与实践
  • Java 面向对象三大核心思想:封装、继承与多态的深度解析
  • 蚁群算法详解:从蚂蚁觅食到优化利器
  • 星链计划 | 只赋能、不竞争!蓝卓“数智赋能·星链共生”重庆站沙龙成功举办
  • JavaScript 数组对象的属性、方法
  • vscode选择py解释器提示环境变量错误