STM32CubeM的搭建以及基于HAL库实现LED闪烁

2023-11-10

一、STM32的开发环境的搭建

1.安装jdk环境

由于STM32CubeMX是Java实现的,需要安装jdk环境。
小编之前就已安装过jdk环境,安装过程便不做过多说明,就此提供一个jdk下载及安装教程参考链接:
https://blog.csdn.net/huxiansheng__/article/details/106601004
最后记得检验一下jdk环境是否配置成功:
Win+R打开运行窗口,输入cmd
在这里插入图片描述
输入java -version查看运行结果
在这里插入图片描述
若显示“不是内部或外部命令,也不是可运行的程序或批处理文件”,可能是配置环境变量过程中出现了问题,注意仔细看看。

2.安装STM32CubeMX

下载地址:
https://www.st.com/en/development-tools/stm32cubemx.html
安装过程:
进入下载界面,根据自己的需要下载对应的版本
在这里插入图片描述
找到下载路径,对下载的zip压缩包进行解压
在这里插入图片描述
进入解压到的文件夹,点击右键以管理员身份运行SetupSTM32CubeMX-6.3.0-Win.exe,进入到下面的界面,点击next
在这里插入图片描述
点击"I accept the terms of this license agreement",接着选择Next
在这里插入图片描述
选择安装的位置,默认安装在C盘中(注意:安装位置不要出现中文),点击Next
在这里插入图片描述
点击确定

在跳出的页面,点击Next,进行安装
在这里插入图片描述
安装完成后,点击Next
在这里插入图片描述
点击Done就安装完成了
在这里插入图片描述

3.安装固件库

运行STM32CubeMX程序,选择 Help->Manage embedded software packages 安装固件库
在这里插入图片描述
根据自己的芯片类型,选择一个固件库,点击下方的From Local...进行下载,表示从本地安装(已经在本地下载了对应的固件库),Install now是通过网络下载,我这里选择的是在线安装。
在这里插入图片描述
前面的框显示为绿色,表示下载成功
在这里插入图片描述

4.安装MDK5软件

具体安装请参照下面链接:
https://blog.csdn.net/qq_43279579/article/details/108880667

注意:安装过程结束后,要安装对应的固件库才能够做对应STM32的开发。

二、利用工具生成点亮LED灯的代码

包下载好之后,回到home界面,点击ACCESS TO MCU SELECTOR创建新项目
在这里插入图片描述
Part Number处选择芯片,这里以STMC8T6为例,然后点击中间出现的一列芯片的信息,再点击Start Project就行了
在这里插入图片描述
点击System Core,进入里面的SYS,在debug那里选择Serial Wire
在这里插入图片描述
接下来就是配置时钟了,进入上面的RCC,有两个时钟,一个是HSELSE,我们要用是GPIO接口,而这些接口都在APB2
在这里插入图片描述
接下来观察时钟架构,可以看见APB2总线的时钟由HSE控制,同时在这个界面得把PLLCLK右边选上
在这里插入图片描述
所以我们将HSE那里设为Crystal/Ceramic Resonator就行了
在这里插入图片描述
接下来就是设置输出寄存器,进入GPIO界面,点击相应的引脚,选择GPIO_Output在这里插入图片描述
我这里一共选了三个,分别是PA4,PB10,PC14
在这里插入图片描述
在左边的GPIO Mode and Configuration下可以看到刚刚配置的三个引脚
在这里插入图片描述
依次选择PA4,PB10,PC14,将其配置为下图所示
在这里插入图片描述
Project Manager–>Project下,配置好自己的项目名和路径,然后IDE那项改为MDK-ARM,版本根据自己的需求选择
在这里插入图片描述
注意:在创建文件位置时,不能不能不能有中文的路径文件名,包括要放置的目录下 ,所有都创建为英文,否则后面生成的文件不全(不要问为什么,问就是小编略有体会)
进入Code Generate界面,勾选生成初始化.c/.h文件
在这里插入图片描述
最后点击GENERATE CODE,生成代码
在这里插入图片描述

三、MDK5生成.hex文件

进入刚刚选择的路径,打开MDK-ARM子文件夹,通过keil打开刚刚生成的项目
在这里插入图片描述
通过目录找到并打开main.c文件,找到主函数int main(void)那一部分
在这里插入图片描述

/* USER CODE BEGIN /
用户代码
/
USER CODE END*/

如果要在STM32CubeMX生成的工程中添加代码,要在提示 /* USER CODE BEGIN* /和/* USER CODE END*/之间添加代码,这样STM32CubeMX重新生成代码时才不会将自己添加的代码删除掉。此外,注意使用CubeMX配置生成的工程中的注释最好不要随便删除掉。
while循环的/* USER CODE BEGIN 3 /和/ USER CODE END 3 */之间插入以下代码:

	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
	HAL_Delay(500);//延时0.5s
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
	HAL_Delay(500);//延时0.5s		
	  
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);//PB10亮灯
	HAL_Delay(500);//延时0.5s
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);//PB10熄灯
	HAL_Delay(500);//延时0.5s
		
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//PC14亮灯
	HAL_Delay(500);//延时0.5s
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯
	HAL_Delay(500);//延时0.5s

在这里插入图片描述

编译运行程序无报错且生成相应的.hex文件
在这里插入图片描述
在文件夹MDK-ARM下,打开与工程名相同的子文件夹可以看到生成的.hex文件
在这里插入图片描述

四、程序烧录

烧录过程的操作和软件下载可参考链接:https://blog.csdn.net/qq_54496810/article/details/120777279
在这里插入图片描述
程序烧录成功。

五、运行结果

运行结果如下:
在这里插入图片描述
可以看见红、绿、黄LED灯间隔闪烁,实验成功。

六、MDK5模拟示波器

在没有示波器条件下,可以使用MDK5的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点,因此可以用MDK5的软件仿真观察3个GPIO端口的输出波形。
1.设置options for target
在这里插入图片描述
Target的设置:
在这里插入图片描述
Target界面中,选择正确的晶振大小,我使用的是8MHz的外部晶振。这个选项在软件仿真中起到很重要的作用,如果选择错误,那么波形一定是错误的,因为时间不准确。不过这个参数只在软件仿真中起作用,当程序在硬件中运行并没有影响。
Dubug的设置:
在这里插入图片描述
首先应该选择Use Simulator,其次是Run to main()选项打√,然后分别修改上图中的 4和5处,注意,DARMSTM.DLLTARMSTM.DLL在STM32的单片机中应该都是固定的,Paramter是跟所采用的具体芯片是对应的,应与TargetSTMicroelectronics 保持一致。
2.参数设置完毕,点击Debug,进入调试界面
在这里插入图片描述
3.选择逻辑分析仪Logic Analyer
在这里插入图片描述
4.选择要观察的引脚
①点击Setup Logic Analyzer
在这里插入图片描述
②添加要观察的引脚
在这里插入图片描述
(引脚添加:如PA4可直接输入PORTA.4即可)
图中选择的三个引脚分别是PA4、PB10和PC14,GPIOA对应的为PORTA,那么GPIOB对应的也应该写成PORTB,以此类推。其中PORTA & 0x00001000后再右移4位也就把PA4的状态获取出来,1就是高电平,0就
是低电平。PB10和PC14同理。一定要选择Bit,颜色是为了区分不同的引脚,根据需要配置即可。设置完成后退
出,就可以在后续的操作中观察到波形。
注意:如果上述步骤1中的Debug中的4、5没有正确设置,那么在添加引脚的时候就会出现报错:Unknown Signal !
5.运行程序
在这里插入图片描述
6.观察波形,把光标移动到逻辑分析仪显示波形的区域,上下滚动滑轮,就可以放大和缩小波形
在这里插入图片描述
这样就可以直观的看出各个引脚的波形图,从而知道它们的区别。

七、小结

与前一次实验STM32F103寄存器方式点亮LED流水灯相比较,使用STM32CubeMX自动生成代码并点亮LED灯是非常简单的,通过这次实验,让我明白了合理使用工具的“快乐”,能使我们更快的编写代码,提高工作效率。
在过程中,遇到了代码没问题、接线也正确,但是最小系统板并没有正确执行程序这个问题,最后通过询问同学还是得以解决。
在日常工作中,逻辑分析仪和示波器是MCU工程师必不可少的工具,有时候程序有BUG的时候就需要用到这些工具看波形,从而更快地定位到问题所在,进而解决问题。另外除了成本外,我们也不可能时时刻刻把示波器带在身边,所以keil的软件仿真功能中的逻辑分析仪在这个时候就是一个不错的选择。

八、参考文献

1.https://blog.csdn.net/weixin_52288941/article/details/120841800?spm=1001.2014.3001.5501
2.https://blog.csdn.net/junseven164/article/details/120807138?spm=1001.2014.3001.5501

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeM的搭建以及基于HAL库实现LED闪烁 的相关文章

  • Pandaboard 交叉编译 Qt

    我花了几周的时间尝试为我的 Panda 板交叉编译 Qt 但没办法 我无法通过 configure 如果有人能给我帮助 我将不胜感激 我的主机系统是Ubuntu 13 04 86 64位 在Virtualbox中运行 我的目标系统是 Pan
  • 为什么 ARM 使用两条指令来屏蔽一个值?

    对于以下功能 uint16 t swap const uint16 t value return value lt lt 8 value gt gt 8 为什么带 O2 的 ARM gcc 6 3 0 会产生以下程序集 swap unsig
  • ARM NEON:如何实现 256 字节查找表

    我正在使用内联汇编将我编写的一些代码移植到 NEON 我需要的一件事是将范围 0 128 的字节值转换为表中采用完整范围 0 255 的其他字节值 该表很短 但其背后的数学并不容易 因此我认为不值得每次 即时 计算它 所以我想尝试查找表 我
  • 通用 ELF 中的重定位(EM:40)

    我尝试从 Ubuntu 交叉编译到Friendly arm 但出现了奇怪的错误 root kevin VirtualBox home kevin Desktop makef make ARCH arm CROSS COMPILE arm n
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 将 ZeroMQ 交叉编译为 ARM,以便在 MonoTouch iPhone 应用程序配置设置中使用

    我正在尝试在使用 MonoTouch 用 C 开发的 iPhone 应用程序中使用 ZeroMQ 库 我几乎解决了所有的问题 却在最后一道坎倒下了 我正在使用 ZeroMQ 2 1 10 和 C CLR 绑定 包装器 并在 Mac OS X
  • ARM 的启动过程是怎样的?

    我们知道 对于X86架构 按下电源按钮后 机器开始执行0xFFFFFFF0处的代码 然后开始执行BIOS中的代码以进行硬件初始化 BIOS 执行后 它使用引导加载程序将操作系统映像加载到内存中 最后 操作系统代码开始运行 对于ARM架构 使
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • 使用 ARM NEON 内在函数添加 alpha 和排列

    我正在开发一个 iOS 应用程序 需要相当快地将图像从 RGB gt BGRA 转换 如果可能的话 我想使用 NEON 内在函数 有没有比简单分配组件更快的方法 void neonPermuteRGBtoBGRA unsigned char
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • Qemu flash 启动不起作用

    我有一本相当旧的 2009 年出版 嵌入式 ARM Linux 书 其中使用u boot and qemu 的用法qemu与u boot书中对二进制的解释如下 qemu system arm M connex pflash u boot b

随机推荐

  • Apollo Cyber RT学习手册(基于Ubuntu18.04、Apollo 6.0_edu)

    本文全部内容源自赵虚左老师的 百度Apollo智能驾驶课程 如有侵权请联系 本文内容为作者手敲 禁止任何形式转载 谢谢 第一章 Cyber RT概述与环境搭建 1 1Cyber RT简介 Apollo项目源于2017年7月首次推出 标志着汽
  • 接入网络技术

    接入网络 是实现网络边缘的端系统与网络核心连接与接入的网络 常见有以下几类 1 电话拨号接入 这类接入方式在早期接入网络中主要用于家庭接入 利用了电话网络覆盖广泛的优点 能够方便地实现分散的家庭用户接入网络 但是这种接入方式的接入链路带宽有
  • VM虚拟机桥接无法获取IP

    VM虚拟机桥接无法获取IP 出现情况 Linux虚拟机网络配置桥接但无法获取IP ifconfig a 查看网卡设备名 sudo ifconfig 网卡设备名 up 激活网卡设备 sudo dhclient 网卡设备名 指定网卡获取IP
  • 多线程相关实例

    文章目录 一 多线程案例 1 单例模式 1 1 饿汉模式 1 2 懒汉模式 1 3 两个模式的线程安全问题 1 4 用锁来解决懒汉模式的非原子操作 1 5 解决第二次调用getInstance的锁的问题 1 6 用volatile解决懒汉模
  • 断言语法disable iff

    full write assert property posedge clk i disable iff rst ni full o gt push i else fatal 1 Trying to push new data althou
  • Vue中使用echarts实现仪表盘

    实现效果 echarts使用说明请查看 Vue中使用echarts实现常用图表总结 option配置 option tooltip formatter a br b c toolbox feature restore saveAsImage
  • @@位运算

    定义 将整数转换为二进制 按二进制位进行运算 运算符号 按位与 按位或 按位异或 lt lt 左移 gt gt 右移 14 gt 01110 19 gt 10011 14 19 00010 2 0则0 14 19 111111 31 1则1
  • 概率统计及其应用第三章知识总结_数学篇:概率论复习规划

    终于到了第一轮最后一个环节 概率论复习规划 复习到这里 我们接下来会面临3个困难 1 6月份期末考试 与复习时间会有冲突 2 捡芝麻丢西瓜 复习概率论 却忘了前面的知识 3 二战考生忙毕业 问题一 期末考试的目标 情况一 不保研 不出国 不
  • 计算机网络基础(十二)---网络层-外部网关路由协议

    文章内容概览 BGP协议 BGP Border Gateway Protocol 边际网关协议 BGP协议是运行在自治系统 AS 之间的一种协议 在一个网络管理机构下边的网络 都可以看做是一个AS 比如 公司网络 学校网络 为什么在AS之间
  • vue3 element plus 设置默认时间,全局挂载时间格式化方法

    首先是在工具包里封装时间格式化的方法 全局挂载时间格式化的方法 export function formatter thistime any fmt string var this new Date thistime var o any M
  • 【python】 无符号int、float、double与16进制字符串的互相转换 有符号int与16进制字符串的相互转换

    一 无符号int float double与16进制字符串的互相转换 import struct def intToHex num int转16进制 return hex num 2 upper def hexToInt hexString
  • 小程序中半屏打开其他小程序,开发者工具调试半屏

    前言 有需要是在当前小程序中 点击操作时 如果他没有注册会员 则强制去另一个小程序去注册会员 注册成功在返回 在这期间 打开另一个小程序是半屏来展示的 实现效果 在a小程序中半屏展示b小程序 半屏上方展示b小程序信息 打开的vconsole
  • Cocos2d-x 2.2.3 Android部署

    今天总结出来的部署流程 已经成功把自己的项目编译到android真机上 省去了安装ndk等步骤 环境 win7 64位 1 导入项目到eclipse 2 导入libcocos2dx 例子 C cocos2d x 2 2 0 cocos2dx
  • 【mac解决办法】PytorchStreamReader failed reading zip archive: failed finding central directory

    错误说明 预训练模型下载中断 导致模型不完整 不能正确读取 解决办法 将下载的不完整的模型文件删除 重新执行代码 自动将重新下载 注意 自己下载的模型导入该文件夹是不管用的 每次执行都会不同结尾的文件名 模型保存路径 Users 用户名 c
  • 软件测试项目【金融、银行、电商、商城】

    项目经验 案例一 项目时间 2016 08 2017 07 项目名称 小花钱包 Web 项目描述 项目介绍 这个产品产是互联网金融理财服务平台 既可以发起投标 也可以借款 提供定期理财 活期理财等多种产品 平台主要有投资人 借款人 系统录入
  • 【虹软24届校招正式批】本周算法&;开发第二波笔试来袭

    今日更新提醒 看过了招聘信息 快来用牛客直投官网吧 打call 一键直投 给自己多一次面试机会 赞 移动端 https mnowpick nowcoder com m m 立得空间 C 开发技术面 1 项目中的线程池问题2 指针引用区别3
  • 1.fastadmin之Log日志使用

    要开始用fastadmin做小程序的后台 怎么说 这个框架封装的很好 对于我这种新手渣渣不太友好 惆怅 首先来谈谈日志的使用吧 如何打个log 一 概念 1 在控制器中声明 use think Log 2 log的方法 一般我使用log w
  • Spring Cloud获取本机IP地址

    最新的Spring Cloud获取本机的IP地址的配置文件如下 eureka instance hostname spring cloud client ip address lease renewal interval in second
  • 用Langchain构建一个阅读助手

    LangChain 是一个强大的框架 可以简化构建高级语言模型应用程序的过程 01 什么是Langchain LangChain是一个强大的框架 旨在帮助开发人员使用语言模型构建端到端的应用程序 它提供了一套工具 组件和接口 可简化创建由大
  • STM32CubeM的搭建以及基于HAL库实现LED闪烁

    文章目录 一 STM32的开发环境的搭建 1 安装jdk环境 2 安装STM32CubeMX 3 安装固件库 4 安装MDK5软件 二 利用工具生成点亮LED灯的代码 三 MDK5生成 hex文件 四 程序烧录 五 运行结果 六 MDK5模