本文目录
[Bonjour STM32] 给萌新们的demo 0.总览
作为最大最肥的鸽子之一,在这之前我几乎从来没在这里写过文,就算水群也当不上龙王。本着“闷声当大鸽”的精神原本可以一直咕咕咕下去,结果有一天夏老师找到我说:“群管理员已经决定了,请我来写demo。”我说我也不是谦虚,还是另请高明吧。当然最后还是自愿被迫来写文了。(念诗什么的,我听不懂啊,你们都别瞎说啊!)
好了扯了这么多,接下来就是正题了。
1.写在前面
此部分的内容紧随在Popo的介绍CubeMX的文章之后,主要是为刚接触CubeMX并建立自己的第一个工程的萌新们提供一些小小的讲解和建议。主要介绍以下几个内容:
- CubeMX生成的工程文件结构
- 如何查找HAL库提供的示例和编程手册
- 使用MDK-ARM开发时的小建议
2.工程文件夹结构讲解
当我们满怀欢喜、踌躇满志地打开刚刚由CubeMX生成的文件夹,想要迫不及待地在工程内实现自己的想法时,结果发现文件夹内只有几个文件夹,以及文件夹内部的许多奇怪名字的c文件:
纳尼!!!我熟悉的main.c呢!?说好的用MDK-ARM来开发呢?于是你灰心丧气,认为单片机的世界和你毫无联系,并最终闷闷不乐的放弃。(恭喜你达成成就:STM32从入门到弃坑)
好了,首先让我们用MDK-ARM来打开整个工程。在这里我们以外部中断程序“GPIO_EXTI”为例。首先打开里面的"MDK-ARM文件夹",可以看到里面有个文件飘着绿色的图标,不要犹豫,遵从直觉直接双击打开。
打开后,我们就看到了MDK-ARM完整的开发界面。然后从"Project"窗口中依次打开“GPIO_EXTI”->"Application/User"->"main.c",这样我们就通过ide打开了main.c文件。其他函数文件也可以按照这种方式打开。
现在我们成功通过IDE打开了“main.c”文件,那么其他文件夹里都是什么呢?
我们首先介绍“Drivers”文件夹:
里面有两个文件夹,我们先打开“CMSIS”文件夹。
CMSIS(Cortex Microcontroller Software Interface Standard,即cortex微控制器软件接口标准)。该文件夹内的文件主要与底层硬件的直接驱动有关,一般情况下我们不需要修改和查看这里的文件。
然后我们打开“STM32F1xx_HAL_Driver”文件夹,里面分为了“Inc”和"Src"两个文件夹,这两个文件夹里的文件是一一对应的,即"Src"里是c文件,“Inc”里是相对应的头文件。我们打开“Src”文件夹:
我们看到里面的文件都有着统一的前缀"stm32f1xx_hal…",这些文件就是我们HAL库的库文件,我们在开发时就是调用里面的库函数来实现功能。以后我们在开发时会经常光顾这些文件,这里我们就不过多介绍了。
现在我们回到顶层文件夹。我们惊奇地发现里面也有“Inc”和"Src"这两个文件夹。我们一定会猜想里面也是一些c文件和对应的头文件。现在我们打开"Src"文件夹:
是的,“main.c”文件和中断程序文件等就储存在这里。以后我们开发时编写的函数文件就可以存放在这里。
我们接下来打开“MDK-ARM”文件夹,里面主要是IDE的一些配置文件和编译时产生的中间文件和hex文件。
最后,我们可以看到一个CubeMX配置文件,打开后我们可以对STM32外设进行重新配置。
3.如何查阅HAL库提供的示例工程和编程手册
我们按照路径“\CubeMX安装路径\Repository\STM32Cube_FW_F1_V1.8.0\”打开文件夹:
里面有ST官方根据STM32官方开发板开发的demo、示例、中间层程序以及驱动程序等文件。有兴趣的可以打开里面的工程文件进行自主学习。
除此之外,我们可以从ST单片机中文网站或ST官网里面找到我们所需的开发软件、datasheet和编程手册(尽管只有部分文件是中文的)。例如我们可以在里面搜索“STM32CubeF1”,
在里面我们可以下载到STM32F1支持的HAL库安装包以及相关的技术文档,我们下载“资源”菜单下的UM1850,在这篇文档中我们可以详细了解到STM32F1HAL库中相关函数的定义。
4.使用MDK-ARM开发时的小建议
4.1如何利用工程文件内部的注释
当我们打开CubeMX建立的工程文件时,我们发现里面不仅有已经配置好的初始化函数,还有许许多多看似有用又似乎没用的注释:
(这告诉我们写一手好注释是多么重要)有的萌新可能为了代码简洁就会一口气把这些看似多余的注释全部删掉(包括当年的我),然后当我们将原来的工程用CUbeMX重新配置一遍后,却突然发现之前写的程序全都不见了。想必那时候的你一定是“玉容寂寞泪阑干,梨花一枝春带雨”,并认为自己当时满腔热血投入学习单片机的行为并不可取,最终之前付出的心血付之一炬。(恭喜你再次达成成就:STM32从入门到弃坑)
那么里面的注释是干什么用的呢?我们仔细阅读就可以发现,ST贴心的把你自己编写的个人代码、函数定义、变量/宏定义的位置标注了出来。
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
/* USER CODE END PFP */
你只需要在恰当的位置像填空题那样填上你需要的代码。这样不仅为你省去注释的烦恼,提高代码可读性,而且在注释之间的代码在再次配置时会被保留。所以下次再遇到自己辛辛苦苦写的代码没了的情况,不要骂ST官方开发的什么SB软件,说不定是你代码写错位置了。
4.2使用MDK-ARM开发的一些小技巧
当我们面对那么多的HAL库文件,却不知道应该用什么函数实现我们的功能,我们应该怎么办呢?
“当然是熟练使用Ctrl+c和Ctrl+v了!”此时正在编辑此文的某只鸽子说道。(打死,拖走)
咳咳,我们当然可以按照上面提到的查找相关手册来选择适当的函数,但1200多页太厚了,找起来又太麻烦。那么我们就可以打开你要操作的外设的HAL库文件,并从侧面的"Functions"找到恰当的函数(毕竟HAL库的函数命名十分规范,依靠函数名来理解函数作用完全没有问题)。例如,我们要翻转某个GPIO口的输出状态,此时我们打开“stm32f1xx_hal_gpio.c”文件,并从侧边"Functions"栏里找到一个叫HAL_GPIO_TogglePin()
的函数,那么双击这个函数名就可以定位到该函数的定义位置,并确定这个函数就是我们需要使用的。
当我们在看别人写的工程时,常常不知道某个函数的定义或者某个变量表示的含义,那么我们应该怎样才能快速准确地找到定义呢?方法很简单。面对需要找到定义的函数或变量名,我们只需要选中该函数名或变量名,然后右键选择“Go To Definition Of …”或按F12就可以跳转到定义位置。对于文件名也可以用类似的方法。
4.3为什么我把程序下载到单片机中却不运行
这时你需要按一下单片机开发板上的复位按键进行复位,当单片机再次上电,就可以运行下载的程序了。
或者你可以在下载之前在IDE中点击“Options for Target”,
选择“Utilities”选项卡,点击“Settings”,
然后勾选上“Reset and Run”,这样下次将程序下载到单片机上时就可以立即运行了。
5.本章结语
这些大概就是萌新在学习STM32时可能遇到的问题,接下来我们就要正式学习STM32的相关操作了。(哎呀终于写完了,咕了咕了\~~)