【STM32】两轮自平衡小车学习笔记1


前言

开始学习基于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.cE*.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带过去,烧录说不定会简单多

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值