文章目录
前言
开始学习基于STM32CubeMX和Keil-MDK的两轮自平衡小车,之前做物理科技创新竞赛中有用到STM32系列,所以还是比较熟悉,但是之前做项目都是直接对用相关的硬件例程进行修改,没有系统的教学过,也没有用到STM32CubeMX这个软件,所以还是有好多东西得学习
提示:以下是本篇文章正文内容,下面案例可供参考
一、安装环境
首先的工作是配置编程环境,注意的是安装路径不要有中文,安装STM32CubeMX需要电脑先有JAVA环境。
二、使用步骤
1.STM32CubeMX新建工程
首先打开STM32CubeMX,点击
ACCESS TO MCU SELECTOR
稍等片刻进入设置界面
先在左上角①处输入芯片型号,我们这里用的是STM32F103C8Tx(输入F103C8也能找到)
然后右侧就会出现我们所要的芯片,双击②所选范围进入下一阶段
先选择 Pinout & Configuration→System Core
其中的SYS和RCC如图配置
然后选择时钟配置Clock Configuration
②中输入72或者64(我们这里输入64),回车,跳出的界面选OK
进入Project Manager的Project,注意要将③中的Toolchain/IDE换成MDK-ARM(这个很重要,一开始没有注意到这点,导致创建的文件夹里都没有需要的工程文件)
最后选择Code Generator,把Genearted files的第一个选择项选上,然后点击右上角的GENERATE CODE 就新建好工程了
点击出现的Open Folder打开目标文件、Open Project则打开工程文件(已安装keil)
2.根据需求改STM32CubeMX配置
根据项目的需求在 Pinout & Configuration这里点击PA8选择GPIO_Input,右键选择Enter User Label改名字为Button
然后左边点击GPIO将下面的状态改成如图,点击右上角的GENERATE CODE 就配置完成,然后进入工程文件
3.按键消抖代码编写
STM32CubeMX 已经默认设置 Systick 为 1ms 中断,那么我们可以直接利用起来。打开 MDK-ARM 工程,按下组合键 Ctrl+N(按住 Ctrl 键再按 N 键),新建一个文件,再按下组合键 Ctrl+S,文件名改为 button.c,保存到 MiaowLabs-DEMO 的 Src 文件夹里。来到这里,我们虽然新建了button.c 源文件,但是还没有把该文件加入到 MDK-ARM 工程里。我们
在 MDK-ARM 工程界面左侧 Project 栏目双击 Application/User 文件夹,把 button.c 加进来。
双击 button.c 文件,把下面代码敲进去。
#include "button.h"
#include "main.h"
#include "stm32f1xx_it.h"
#include "stm32f1xx_hal_gpio.h"
int iButtonCount;//i代表int型变量,ButtonCount表示按键计数变量
int iButtonFlag;//i代表int型变量,ButtonFlag表示重按键标志,1代表重新按键,0为没有重新按键
int g_iButtonState;//g是globle代表全局变量,会在其他地方引用;i代表int型变量,ButtonState表示按键标志,1代表按下,0代表松开
void ButtonScan(void) {
if( HAL_GPIO_ReadPin(Button_GPIO_Port,Button_Pin) == GPIO_PIN_RESET )//如果引脚检测到低电平
{
iButtonCount++; //按键按下,计数iButtonCount加1
if(iButtonCount>=30) //1ms中断服务函数里运行一次,iButtonCount大于等于30,即按键已稳定按下30ms
{
if(iButtonFlag==0) //判断有没有重按键,1为有,0为没有
{
g_iButtonState=1; //设置按键标志
iButtonCount=0;
iButtonFlag=1; //设置重按键标志
}
else //如果重按键,则重新计数
iButtonCount=0;
}
else //如果没有稳定按下30ms,则代表没有按下按键
g_iButtonState=0;
}
else //如果一直无检测到低电平,即一直无按键按下
{ iButtonCount=0; //清零iButtonCount
g_iButtonState=0; //清除按键标志
iButtonFlag=0; //清除重按键标志
}
if(g_iButtonState == 1) {
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//翻转LED引脚(PB12)的电平
}
}
其中这段代码的意思就是:如果按键状态标志为 1 ,则代表按键被按下了,这时候进行 LED 电平翻转
if(g_iButtonState == 1) {
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//翻转LED引脚(PB12)的电平
}
再新建一个文件 button.h 头文件,把文件保存到 Inc 文件夹。然后,把下面代码敲进去。
#ifndef __BUTTON_H
#define __BUTTON_H
extern int g_iButtonState;//声明外部变量,方便其他地方引用
void ButtonScan(void);//声明按键扫描函数
#endif
打开 stm32fxx_it.c 文件,在 /* USER CODE BEGIN Includes / 与 / USER CODE END Includes */ 之间加入 #include “button.h”。
在 stm32fxx_it.c 文件里面 SysTick_Handler() 函数里加入按键扫描函数 ButtonScan()。
代码已经编写好了。这时候,点击编译按钮,会提示没有错误和警告。把代码烧录进 MiaowLabs-STM32F1-Micro 核心板,然后按下用户按键,可以发现按一下 LED 会亮,再按一下 LED 就会灭掉。就这样,我们实现了通过按键控制 LED 亮灭的功能。
4.烧录代码
之前做物创的时候烧录用的是ST-Link,但是今天教我们用的是mcuisp烧录,个人感觉还是ST-Link比较方便。
其中mcuisp也有几个要注意的点在图中标注出来了
三、遇到的问题
一开始我把PA8命名为Botton_Pin,但是在函数HAL_GPIO_ReadPin()里面调用的时候用了botton_Pin,大小写不同导致找不到这个变量,刚开始还以为是没有调用定义的头函数,但是还是报错。
然后我就去gpio.c文件里面查命名,果然
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = Button_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(Button_GPIO_Port, &GPIO_InitStruct);
看样子之后还是要多多注意大小写,细节还是得注意
四、编程环境配置
代码自动补全
Edit->Configuration
代码格式化
使用AStyle进行代码格式化
添加Astyle菜单的方法:
1:uVision4中单击Tools菜单—Customize Tools Menu
2:添加Astyle All Files 和Astyle Current File菜单(自定义菜单名,可以使用中文)
我在这里添加了两个菜单,分别是格式化当前文件和格式化project中的所有文件。
3:添加Command命令:单击…按钮,选择Astyle.exe。
4:Arguments:
Astyle Current File菜单填写 !E
Astyle All Files菜单填写 “
E
∗
.
c
"
"
E*.c" "
E∗.c""E*.h”
注:!E 表示的是当前获得焦点且正在编辑的文件。
E
∗
.
c
和
E*.c和
E∗.c和E*.h代表当前获得焦点且正在编辑文件所在目录下所有.c和.h文件(参考keil uVision的帮助文档)
使用的是Astyle默认格式来格式化文件,另外也可以自定义格式,自定义格式参考Astyle的帮助文档。默认格式化后,会备份原文件为源文件名.orig。如果不想让Astyle备份文件,可以使用-n参数。 如:-n !E (表示格式化当前文件,不备份)
在keil中的使用效果:生成的菜单出现在Tools的下拉菜单中,Astyle的运行结构出现在keil的Build Output窗口中。
格式化前
格式化后
软件及资料
两轮自平衡小车开发指南
链接:https://pan.baidu.com/s/1GjvfL4zJHQ64QzSt_wK7HA
提取码:fjfr
开发工具安装包
链接:https://pan.baidu.com/s/1KXs3KADFWl12llTiz_Q4cw
提取码:5pw3
代码格式化插件下载地址:http://download.csdn.net/download/xinxinsky/10231382
总结
以上就是今天学的内容总结了,STM32CubeMX真的算是很好用,之前不知道有这个软件,写东西就只能改例程,然后每一次新建工程文件都十分的复杂,阿巴阿巴阿巴……
下次把ST-Link带过去,烧录说不定会简单多