STM32复习笔记(一):软件配置工程创建

news2024/11/16 5:34:13

目录

Preface:

Hardware-Configuration & Software-Environment:

(一)新建项目工程

(二)工程配置

(三)配置外设

(四)项目管理

(五)Clion相关配置


Preface:

        呃,首先说点题外话。记得第一次听说stm32这个东西的时候还是在2021年12月左右,当时刚刚自学完了51单片机,参加了个小比赛。然后一个偶然的机会,拿(白嫖)到了一块stm32f4的最小系统板,然后对着某原子的“stm32f4单片机新建工程模板.pdf”捣鼓了一个下午,终于点亮了一颗LED。。后来想去b站找教程,我记得有个up讲51讲得很好(好像叫什么江科大?),但是当时他的stm32版本才只有几集。。。没办法,只能去看某原子的视频教程了,但是那视频质量我只能说懂得都得,然后我又摸了2个月🐟,直到2022年1月又重新从头开始学。但是对当时的我来说,f4实在是太难了,所以就去学了f1,后面也是磕磕绊绊,学习了许许多多的东西。。。一开始还是学的标准库,毕竟那时候网上大多数教程都是用的标准库吧,标准库稳定是稳定,但是代码初始化的过程实在是有一丢丢复杂,我记得当时初始化外设的时候经常漏步骤。

        然后就大概学了半年的标准库,就接触到了HAL库,就是用cubemx来生成代码,初始化的步骤直接变成了图形化界面,瞬间觉得舒服多了,直到现在也是一直在用cubemx,标准库已经在我的工程中消失了hhh(但是还是能用滴,比如说别人的工程用的是标准库,那就只能跟着来用,或者花多点时间移植到HAL库。。)

        写代码的话,老牌的Keil当然是大家入门首选,据说全球有一半以上的MCU都用Keil来开发,可见它有多牛b了,它的调试功能打爆一切对手(个人看法),而Keil作为一个上世纪的产物,虽然现在也在逐步更新,但是它的代码编辑功能真的是一言难尽。刚开始学的时候还是用的Keil,后面就上了vscode的keil-assistant插件+Keil配合使用,vscode负责编辑,keil负责调试,非常好用,谁用谁知道~~~再后来也用过了stm32cubeide,但是个人感觉跟vscode差别不是很大。再后来(直到现在),用的是大佬们用过的CLion+stm32cubemx,用cubemx生成代码,用clion编制+调试,而且clion代码提示能力真的是非常给力,虽然说调试功能可能比不太上keil(maybe),但是个人感觉这点牺牲是值得的。。。当然这个复习笔记里面不会说到环境、工具链配置,网上很多大佬都有写。。。

        最重要的是,从来没有做过一个复习计划,突然就心血来潮想做一个,毕竟后面可能没有这么空闲的时间来整体复习一下stm32了(当然复习笔记只是写给自己看的,以后要是忘了还能回来看~)ok废话不多说,直接开冲


Hardware-Configuration & Software-Environment:

普中-天马F407开发板(主控芯片:STM32F407ZGT6),STLink-V2调试器

STM32CUBEMX版本:v6.9.1

STM32F4 HAL库版本:1.27.1

CLion版本:2023.2

编译器:gcc-arm-none-eabi-10.3-2021.10-win32、MinGW 64

调试器:OpenOCD-20230621-0.12.0


(一)新建项目工程

首先打开clion,找到embedded并选cubemx,然后选择文件路径,最后新建工程:

新建成功之后会弹出下图界面让你选板子配置文件(主要是配置下载、调试的),这里先不选,后面再慢慢选 :

然后,等右下角进度条跑完,在当前页面打开cubemx(没有设置配置文件的话,默认是帮你选好stm32f030f4p6,这个可以进到cubemx里面改):

打开cubemx后,点左上角的stm32f030f4p6,进去修改芯片,选择stm32f407zgt6即可:

对于左边这一列,从上到下依次为:系统内核、模拟、定时器、通信接口、多媒体接口、安全、计算、中间件和软件包;系统内核里面有:DMA(直接存储器存取)、GPIO(通用IO)、IWDG(独立看门狗)、NVIC(嵌套向量中断控制)、RCC(复位和时钟控制)、SYS(系统配置)、WWDG(窗口看门狗);模拟里面有:ADC(模数转换)、DAC(数模转换);定时器里面有:RTC(实时时钟)、TIM1~14(定时器,其中TIM1和TIM8是高级定时器,TIM6和TIM7是基础定时器,其余都是通用定时器);通信接口里面有:CAN(can总线)、ETH(以太网)、FSMC(可变静态存储控制器)、I2C(iic总线)、SDIO(sd卡用)、SPI(串行外设总线)、UART(通用异步串口)、USART(通用同步异步串口)、USB_OTG_FS & USB_OTG_HS(USB总线相关);多媒体接口里面有:DCMI(数字摄像头接口)、I2S(音频接口);安全里面有:RNG(随机数生成器);计算里面有:CRC(循环冗余校验);中间件和软件包里面东西非常非常多,这里只说一些我用过的(没用过也不懂,,,):FATFS(文件分配表类型的文件系统FAT-FS)、FREERTOS(开源、免费的实时操作系统freertos)、X-CUBE-AL(stm32的ai部署软件,对模型数据进行剪枝、压缩,实现边缘计算)、X-CUBE-TOUCHGFX(stm32的GUI设计软件,用来设计图形界面)。


(二)工程配置

一打开cubemx,直奔system core中的SYS,配置调试接口,用来进行代码烧录下载、调试。Debug选择Serial Wire即可;System Wake-up是睡眠的时候唤醒所需要设置的,这里用不到就不用管;Timebase Sorece时基源默认选择SysTick系统滴答计时器即可,用以给HAL库提供标准时基,一般都不用管它,只有在使用操作系统的时候,操作系统默认使用SysTick,那么就要把此处的Timebase Sorece修改为任意一个计时器,因为HAL库的时基与操作系统的时基不同。。。不使用操作系统的时候直接就默认即可。

下一步,打开RCC,给系统配置晶振,HSE(外部高速时钟),LSE(外部低速时钟),Master Clock Out 1 & 2(主时钟输出,也就是单片机通过特定引脚输出时钟给外部)、I2S_CKIN(音频时钟输入,可以输入准确的时钟给I2S,也就是音频协议,能得到更高品质的音频)。HSE和LSE一般选Crystal/Ceramic Resonator(无源石英/陶瓷晶振)即可,HSE是给整个系统提供时钟的,而LSE只给RTC提供时钟(没用到RTC的话就不需要开启),一般HSE取4~25MHz,而LSE取32.768kHz,经过分频后得到准确得1Hz提供给RTC时钟;参数configuration保持默认即可:

下一步,进入时钟配置,主要配置时钟参数,如系统时钟,总线时钟等等;在HSE处根据实际情况输入晶振大小,我板子上的是8M,则输入8,然后HCLK输入168,直接最大频率(如果没有特别需求,比如说某个外设一定要多少频率,或者是要跑低功耗之类的特殊用途,一般系统时钟HCLK设置为最大就行),然后敲两下回车,再回去选择HSE,但是此时发现HCLK变了,那再改回168并回车即可设置成功。


(三)配置外设

 第一个外设毫无疑问就是点灯啦!根据开发板原理图,

就能知道LED0和LED1分别连接在PF9和PF10引脚上,并且为低电平点亮;回到cubemx,因为芯片引脚比较多,所以使用搜索功能(右下角)搜索PF9(可以发现PF9一直在闪烁):

找到PF9后,左键单击点开,选择GPIO_OUTPUT输出功能,再右键单击,选择Enter User Label(输入用户标签),可以给引脚自定义名字,这里设置为LED0;PF10做相同的操作,并设置为LED1:

然后在左边System Core中找到GPIO,选择PF9(PF10一样),进行GPIO参数配置如下:

GPIO output level:GPIO输出电平,因为LED低电平点亮,所以先输出高让它灭,在需要时再点亮;GPIO mode:GPIO模式,选择推挽输出,增强驱动电流能力;GPIO Poll-up-Pull-down:GPIO上下拉,选择上拉,也就是空闲时候默认高电平;Maximum output speed:最大输出速度,速度越快,功耗越大,点灯这种不需要高速的操作就选low可以了。


(四)项目管理

进入Project Manger,首先,用Clion生成的项目保存的时候必须与Clion同名并且在同一个目录下才能被找到,IDE选STM32CubeIDE,堆、栈大小保持默认即可:

然后,文件生成勾选如图所示,生成每个外设对应的.c和.h文件,方便项目管理:

最后点击右上角生成代码,弹出提示框,选择yes同意覆盖,等待代码生成成功后,点close即可:

(五)Clion相关配置


 接下来进入clion中,依然选择跳过配置文件,稍后自己配置:

等待右下角进度条跑完,进入编辑界面:

接下来,配置编译器、调试器工具链(具体如何下载安装就不说了,主要是篇幅太长了,下载安装的话网上有许多教程可以去找); 左上角File->Setting->Toolchains,新建一个MinGW编译选项,Toolset选择MinGW,C Compiler(C编译器)选择arm-none-eabi-gcc.exe,C++ Compiler(C++编译器)选择arm-none-eabi-g++.exe,点击应用即可:

然后配置CMake(构建、编译、链接工具),工具链选择刚刚配置好的MinGW,名字任取,如下图:

最后,配置OpenOCD调试工具,点击下图中的配置,进入配置界面,点击左上角+号,往下找到OpenOCD并选择,然后需要选择板子的配置文件(这就是前面一直说的配置文件),再选择可执行的二进制文件,最后点击Apply+OK即可:

配置文件内容如下:

# choose st-link/j-link/dap-link etc.
#adapter driver cmsis-dap
#transport select swd
source [find interface/stlink.cfg]
transport select hla_swd
source [find target/stm32f4x.cfg]
# download speed = 10MHz
adapter speed 10000

 然后点击右上角编译,等待编译成功:

然后输入点灯函数(tips:代码必须写在沙箱注释中,否则下次用cubemx生成代码的时候会被覆盖掉),编译:

最后点击下载,下载成功!可以看到板子上的灯如预期所亮:

还有调试功能也是杠杠的:

调试过程看外设寄存器的值,导入D:\Keil\Keil\STM32F4xx_DFP\2.17.0\CMSIS\SVD\STM32F407.svd文件(因为相关的配置信息在keil中已有,所以直接load进来即可):


工程链接:https://pan.baidu.com/s/1RTHqNqyEWAeSOndfi1BtNQ 
提取码:0xFF

以上均为个人学习心得,如有错误,请不吝赐教~

THE END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qml保姆级教程二:qml基本数据类型

💂 个人主页:pp不会算法v 🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 QML系列教程 QML教程一:布局组件 文章目录 boolrealdouble…

Jmeter如何做压力测试

1.哪些业务需要做压力测试? 比较常用的业务场景或功能模块 单业务场景或多业务场景 项目要求做的业务场景 2.压力测试的并发数是多少? 有预期的数值?100 200 300一次性达到还是逐次增加?参照上次性能测试的结果 3.关注哪些参…

【代码随想录】LC 704. 二分查找

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 三、知识风暴 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。 一、题目 1、原题链接 704. 二分查找 2、题目描述 二…

cmake安装

Windows下安装Cmake教程 注意下载二进制版本的:

将3D MAX设计模型导入NX1988

将3D MAX设计模型导入NX1988 概述导入流程导出喜欢的模型对模型进行修改模型贴图 概述 一般家装设计都不会用NX之类的产品设计软件,也没有通用的文件格式可以互相转换,本文的目的是将从网上下载的一些设计较好的3D MAX模型导入到NX软件中借用&#xff0…

【11】c++设计模式——>单例模式

单例模式是什么 在一个项目中,全局范围内,某个类的实例有且仅有一个(只能new一次),通过这个唯一的实例向其他模块提供数据的全局访问,这种模式就叫单例模式。单例模式的典型应用就是任务队列。 为什么要使…

Java新特性中的Preview功能如何运行和调试

在每个Java新版本发布的特性中,都会包含一些Preview(预览)功能,这些功能主要用来给开发者体验并收集建议。所以,Preview阶段的功能并不是默认开启的。 如果想体验某个Java版本中的Preview功能,您还需要做一…

C# 集合

C# 集合 集合集合接口和类型列表队列栈链表有序表字典LoopupHashSet位数组 集合 数组的大小是固定的。如果元素个数是动态的,就应使用集合类。List 和 ArrayList 是与数组相当的集合类。还有其他类型的集合:队列、栈、链表和字典。 集合接口和类型 集…

FL Studio21.1.0水果中文官方网站

FL Studio 21.1.0官方中文版重磅发布纯正简体中文支持,更快捷的音频剪辑及素材管理器,多样主题随心换!Mac版新增对苹果M2/1家族芯片原生支持。DAW界萌神!极富二次元造型的水果娘FL chan通过FL插件Fruity Dance登场,为其…

数据结构-----平衡二叉树

目录 前言 1.平衡二叉树 1.1概念与特点 1.2与二叉排序树比较 1.3判断平衡二叉树 2.平衡二叉树的构建 2.1平衡因子 BF 2.2 LL型失衡(右旋) 2.3 RR型失衡(左旋) 2.4 LR型失衡(先左旋再右旋) 2.5 RL…

springboot 集成 PageHelper 分页失效

前言 项目启动初期,在集成mybatis的分页插件,自定义封装了一个分页的工具类,方便后期项目的扩展。部分的代码如下: /*** 分页查询* 进行count计算** param pageNum 页数* param pageSize 每页数量* param supplier 查询操作* re…

Redis相关概念

1. 什么是Redis?它主要用来什么的? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提…

基于Java的毕业设计选题管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

44 二叉搜索树中第K个小的元素

二叉搜索树中第K个小的元素 题解1 中序遍历题解2 AVL(手撕平衡二叉树:谢谢力扣官方) 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数&#xf…

免杀对抗-成品EXE免杀-反特征码-通用跳转

一、exe程序生成 1.使用如下shellcode加载器&#xff0c;生成c/c语言的exe程序 加载器&#xff1a;1.c #include <Windows.h> #include <stdio.h>#pragma comment(linker,"/section:.data,RWE")unsigned char shellcode[] 生成的shellcode;int main() { …

【一、灵犀考试系统项目设计、框架搭建】

一、创建数据库 1、打开power designer&#xff0c;新建数据库模型 2、新建数据表&#xff0c;以及关系 【注意】 图片的类型有两种&#xff1a;varbinary 和 image varbinary : 二进制字节流&#xff0c;可以自动控制长度 image : 最大可放2G图片 3、创建数据库&#…

基于郊狼优化的BP神经网络(分类应用) - 附代码

基于郊狼优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于郊狼优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.郊狼优化BP神经网络3.1 BP神经网络参数设置3.2 郊狼算法应用 4.测试结果&#xff1a;5.M…

国庆假期作业day2

作业&#xff1a;创建一个双向链表&#xff0c;将26个英文字母通过头插的方式插入到链表中&#xff0c;通过尾删的方式将数据读取出来并删除 #ifndef _TEXT_H #define _TEXT_H #include<myhead.h> typedef int datatype; typedef struct dblist {union {datatype data;/…

逆强化学习

1.逆强化学习的理论框架 1.teacher的行为被定义成best 2.学习的网络有两个&#xff0c;actor和reward 3.每次迭代中通过比较actor与teacher的行为来更新reward function&#xff0c;基于新的reward function来更新actor使得actor获得的reward最大。 loss的设计相当于一个排序问…

Java基于SSM的校园一卡通系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…