写在前面的话:
此系列文章主要记录以下问题:
(1) 没有跑操作系统的软件框架怎么搭建。
(2) 一套代码怎么适配所有产品。
(3) IAP升级,bootloader和上位机怎么。
(4) 链接地址怎么改,怎么添加自己的段。
(5) 支持上位机或手机标定功能的代码怎么写。
(6) 电机驱动和控制。
(7) 产品怎么实现量产。
(8) 怎么做知识产权保护,让别人无法**芯片。
(9) 怎么用git进行多人协作开发。
(10) 工作和生活的一些感悟。
一切都是站在面向对象和状态机的角度思考问题…

2.1. 介绍

很多产品都需要使用到电池,有了电池,就有BMS相关的东西。这里所介绍的电池是36V给助力车使用的。

电池的BMS是做在电池里面的,把电池拆开,可以看到有很多的电芯和一块电路板,电路板上也有一块MCU。封装好的电池会向外界暴露电源线和地线。还有4根通信线,GND、+5V、TX和RX;虽然BMS是非常专业的领域,但作为电池的使用者,我们只需要知道BMS的通信协议就可以和我们的核心板进行通信。这个工程主要用于和电池通信。

(1) 通信协议:串口,波特率:9600。

(2) 命令:命令有很多,这里仅仅列举最常用的三条,读总电压,读实时电流,读电池内部温度。

2.2. 新建工程

在STM32CubeIDE上新建一个工程,就可以看到STM32F103RBT6所支持的资源。

(1) 点击new STM32 project之后,可以看到下图配置界面。
2.工程一:BMS通信
2.工程一:BMS通信

从上图也可以看出,STM32F103RBT6这块MCU有128KB的Flash代码,20KB的静态RAM的大小。一共有51根IO引脚。

(2) 点击next。

(3) 输入工程的名字。
2.工程一:BMS通信

(4) 点击next。
2.工程一:BMS通信

注意:我这里使用的STM32固件包是V1.7.0版本的。

(5) 点击finish。看到弹出的对话框之后,再点击yes。
2.工程一:BMS通信

点击之后可以看到以下配置界面。
2.工程一:BMS通信

STM32CubeIDE最好用的地方就是可以图形化配置芯片的资源/驱动,把我们从驱动中解救出来。在实际项目中,驱动是最没有价值的,也是最无聊的,项目的价值在于业务逻辑和整体框架。我们把寄存器的配置交给工具,我们自己只专注于业务逻辑代码的开发。

点击左边的选项,可以看到这款MCU所支持的资源。
2.工程一:BMS通信
2.工程一:BMS通信

从原理图可以知道,核心板有一个LED,现在先配置LED的所在的引脚(PA1)。
2.2.1. 配置PA1为输出模式

按照下图数字的操作顺序配置即可。
2.工程一:BMS通信
2.2.2. 配置调试模式
2.工程一:BMS通信

这里必须选择Serial Wire,否则将不能使用SWD调试器进行调试。
2.2.3. 配置串口1
2.工程一:BMS通信

为什么不需要使能中断?

在实际项目中,中断是非常宝贵的资源,一般只有实时性要求非常高的地方才会使用中断,譬如在电机控制器领域。为了不过多占用CPU资源而影响系统实时性,这里不需要配置串口接收和发送中断,都是使用查询方式处理。
2.2.4. 配置时钟

按下图所示配置好时钟。
2.工程一:BMS通信

虽然核心板有外部时钟,但在实际项目中,外接一个晶振会增加PCB成本,处于成本考虑,这里使用的是MCU内部时钟;内部时钟在绝大多数的产品中已经够用了。
2.2.5. 配置项目

勾选数字3所指的选项。
2.工程一:BMS通信
2.2.6. 保存配置

(1) 保存/ctrl s

(2) 点击弹出的对话框中的yes。
2.工程一:BMS通信

可以看到生成的工程目录如下:
2.工程一:BMS通信

添加LED闪烁的代码。
2.工程一:BMS通信

2.3. 运行

2.工程一:BMS通信

这里必须选择第二项,否则运行失败。
2.工程一:BMS通信

点击ok。

2.4. 结果

程序运行之后,发现led不闪烁,检测配置,发现将PA1误配成了输入模式。这里需要修改为输出模式。
2.工程一:BMS通信

保存之后再运行代码,可以看到led闪烁。

工作两年再学嵌入式系列文章:目录
上一篇:1.搭建STM32开发环境 - 从工具到软件,从0到1
下一篇:3.使用状态机编写通信代码

相关文章: