STM32入门指南—新建第一个工程
STM32CubeMX配置
打开软件,通过 File->New Projet... 来新建一个工程。
CubeMX每次使用时都会联网更新一些东西,包括芯片库,板卡库和例程库之类的,若是觉得费时可以直接cancel。
选择芯片
接下来选择你的芯片。你也可以选择一个官方的开发板,或者打开一个例程来开始你项目。
这里我选择比较大众的芯片 STM32F103ZET6 ,然后点击右上角的 Start Project
配置 IO 和其他功能
这里是使用 CubeMX 比较重要的一个环节了,来为你的项目配置IO和其他的一些功能。
左边是根据功能和系统层级来将所有的功能都分类了
在 System Core 中,包括(按字母排序)
- DMA
- GPIO
- IWDG
- NVIC
- RCC
- SYS
- WWDG
每个目录下都有不同的功能可以配置,这个我们按需要了解。
右侧展示芯片的封装及IO配置,所有IO配置都可以直接芯片引脚上左键选择。
SYS 里面有三个可以配置的内容,包括:
- 调试接口(如果不配置调试接口,之后下载程序将会失败,需要把BOOT0 拉高才能正常下载 )
- 系统唤醒功能 (系统进入低功耗模式,可以通过拉高 PA0 引脚来唤醒 MCU )
- 基本时钟源选择(系统基本延时所使用的定时器,保持默认即可)
如果你使用的调试器为ST-Link,需要把调试接口选择为SW(Serial Wire)。
SYS 里面也有三个可以配置的内容,包括:
- HSE(High Speed External,高速外部时钟)
- LSE(Low Speed External,高速外部时钟)
- MCO 主时钟输出
如果你的板子上有外部的晶体的话,请使能他们。
BYPASS Clock Source 旁路时钟源,时钟信号直接从 RCC_OSC_IN 引脚输入
Crystal/Ceramic Resonator 石英/陶瓷晶振,时钟信号通过外部晶体产生
在 Connectivity 里面我们配置一下串口,用来输出一串字符 “Hello World\r\n”。
选中USART1,模式选择为异步方式,不使能硬件流控。其他参数保持默认(波特率默认115200,8个数据位8,无校验位,1个停止位),也不用配置中断的DMA。
PinMap上自动标出了USART1两个IO的位置。
配置时钟
在时钟配置中,非常详细直观的展示了MCU的时钟树结构,将手册上难以琢磨的参数配置形象化。其中高亮的部分就是我们能够修改的地方。
首先是外部时钟频率的设置,包括高速的和低速的。
一般MCU都会有外部的高速晶体,相比于内部的RC振荡器,外部的晶体频率更加准确。根据实际情况填写频率(只有在 RCC 使能外部时钟信号才可以)。
外部低速晶体也是同样如此,只不过低速时钟只用在看门狗和RTC上,很多板子为了节约成本,便是用了内置的低速时钟源。
主系统时钟有三个来源:
- HSI(内部高速时钟)
- HSE(外部高速时钟)
- PLL(HSI 或者 HSE 的倍频)
建议将外部时钟的PLL倍频作为主系统时钟的来源(如图所示),所得频率更佳精准,动态范围也更大。
CSS 是时钟安全机制,当外部时钟出现故障时,如果 CSS 使能,将会产生一个不可屏蔽中断,同时选择内部的时钟作为主系统时钟。
上图右侧也详细展示了各个外设的时钟频率。
配置工程属性
在这个页面主要是配置 CubeMX 生成的工程的一些属性(所有推荐的设置都如图所示)。
从上往下以此为:
- 工程名
- 工程的位置
- 工程的应用结构(无需在意)
- 生成的IDE项目的文件夹位置
- 选择IDE和最小版本
- 堆和栈的大小
- ...
其他的暂时不关注。
这一页有一些生成代码的选项,翻译为:
- STM32Cube MCU包和嵌入式软件包
- 复制所有用到的库到项目文件夹
- 复制仅必须的库文件(推荐,包含了必须的文件,体积较小)
- 在工具链项目文件夹的配置文件中,添加库文件的引用
- 生成文件
- 为每个外设的初始化都添加一对“.c/.h”文件
- 重新生成时,备份先前的文件
- 重新生成时,保留用户代码
- 没有重新生成时,删除先前的已经生成的文件
- HAL 库的设置
- 设置所有没有使用的引脚作为模拟口(为了优化功耗
- 启动断言(HAL的函数会对参数进行检查)
- 模板设置(以后再介绍)
这一页有一些更高级的设置,一般情况下跳过就好了,这里只简单地介绍一下:
上面是驱动库的选择,众所周知,HAL是比较高层次的封装,执行起来效率比较低,堆栈占用比较大,生成代码的速度和体积都比较大。所有就有了另一个选项 LL 库,LL 库更像是标准库,大多操作是基于寄存器的,在对速度有要求的场合下,还是得用 LL 库。这里程序功能比较简单,我们选择 HAL 库。
下面是外设初始化函数有关的,包括初始化的顺序,外设实例的名字,是否不生成函数调用。
右侧是和回调函数有关的,程序完成某一项任务(初始化失败,中断…),会调用相应的回调函数,这些函数有两种形式。一种(Disable)是系统已经定义好的 __weak 类型的函数,用户自己在重新声明便可以使用。另一种(Enable)自己编写函数,初始化时通过函数指针链接上。
生成代码
最后点击 CubeMX 右上角的 GENERATE CODE,生成代码。
MDK编辑
编写代码
打开刚刚生成的工程,可以看到如下所示的目录结构
依次为
- 启动汇编文件
- 用户应用的主要文件
- HAL 库文件
- CMSIS 的头文件
在程序的 main 函数里添加
HAL_UART_Transmit(&huart1,(uint8_t*)"Hello World\r\n",13,1000);
这里调用 HAL 库的串口发送函数,轮询的方式发送字符,并设置了超时时间 1000 ms。
注意这里代码一定要放在注释指明的 BEGIN 和 END之间,否则下次生成代码,在这之外的内容全部消失,推荐新建自己的目录和 .c 和 .h文件,避免在 main.c 添加大量自己的代码,防止重新生成时一无所有。
编译、调试和下载
接下来就是编辑,调试和下载了,Debug 的功力需要各位日积月累。
实际验证
打开串口助手,可以看到结果如图所示。
有一些板子把串口芯片(CH340)的流控位(CTS,RTS)设计成芯片的BOOT0和复位信号,所以在打开关闭串口时就有复位的效果,串口下载也是同样的道理,调试的时候,有这些功能会更加方便一些。
再推荐如下图所示的串口调试助手(当然作者不是我),可以在 Window Store 搜索到,除了绘图部分需要收费以外,其他功能都是免费的,细节也都挺好的。
|