利用STM32CubeMX创建新的工程,使用vscode进行编码和调试

news/2025/10/3 13:36:53/文章来源:https://www.cnblogs.com/wzzkaifa/p/19124558

一.软件准备

1.STM32CubeMX

生成我们所需要的工程文件

2.STM32CubeCLT

包含cmake等工具包

3.Vscode

对代码进行修改和编写

二.操作过程

首先我们打开STM32CubeMX

在搜索框里面输入STM32F103C8T6这个使我们第一块接触的芯片

双击进入到它的里面

这里我们设置Debug模式

设置成Serial Wire模式,也就是我们常说的SWD模式

具体有关这个模式可以看这个文章深入理解 ARM Serial Wire Debug (SWD) 协议_swd协议-CSDN博客

左键这个芯片图选择芯片的输出模式

这里为了简化我就初始化六个引脚

从上图上可以看出我们的PA6,PA7,PB0被初始化成输出引脚

而我们的PA8,PB15,PB14被初始化成输入引脚

我们可以从输入引脚获取输入信号,例如使用按键控制LED灯,按键就是输入信号

这个是比较简单的

点击这个创建工具生成我们的HAL库代码,在这个里面就完成标准库的初始化

比如我们可能在标准库里写

	/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟//使用各个外设前必须开启时钟,否则对外设的操作无效/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;				//GPIO引脚,赋值为第6和第7号引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);			//将赋值后的构体变量传递给GPIO_Init函数//函数内部会自动根据结构体的参数配置相应寄存器//实现GPIOA的初始化

大概就这这一大堆东西他直接给你写好

然后进入

之后弹出这个直接关闭就行

然后我们进入VScode (如果第一次使用vscode安装Chinese中文包)

在vscode中新建一个配置环境

点击小齿轮

安装STM32Cube for vscode

和c/c++ Extension Pack 和c/c++ Themes

还有CMake工具

然后进入源码

main就是我们标准库中的主函数

找下面的路径

这个就是他给我们生成的代码文件

我们可以发现他给我们初始化好了GPIO

我们可以从这个函数中看出来 MX_GPIO_Init中

static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* USER CODE BEGIN MX_GPIO_Init_1 *//* USER CODE END MX_GPIO_Init_1 *//* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);/*Configure GPIO pins : PA6 PA7 */GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/*Configure GPIO pin : PB0 */GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/*Configure GPIO pins : PB14 PB15 */GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/*Configure GPIO pin : PA8 */GPIO_InitStruct.Pin = GPIO_PIN_8;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN MX_GPIO_Init_2 *//* USER CODE END MX_GPIO_Init_2 */
}

在main中的while(1)中写逻辑

点击下面那个生成就生成工程文件了,就可以烧录到我们的STM32F103C8T6上了

但是这个里面我发现下面的代码

void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}

这个在标准库里面是没有见过的

__disable_irq(); 禁止所有中断

while(1){

} 如果出现错误将会停在这里

但是这里有引入一个新的概念,什么是句柄Handle,什么时候调用句柄,是我们自己调用还是系统自动调用。

在源码中我看到这里调用了句柄

void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}
}

这段代码中调用了这个句柄

看出这个应该是我们自己调用的,而不是系统判断自己调用的

那这个句柄和函数有啥区别呢

在deepseek中我了解到

句柄相当于这个引用type & error 就是一旦出现这个问题就是这个错误

而且句柄在这个函数中有唯一性

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

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

相关文章

网站开发网站维护这行业怎么样wordpress 获取相关文章

来源:AI中国大脑的进化进程持续已久,从5亿年前的蠕虫大脑到现如今各种现代结构。例如,人类的大脑可以完成各种各样的活动,其中许多活动都是毫不费力的。例如,分辨一个视觉场景中是否包含动物或建筑物对我们来说是微不足…

龙岗爱联网站建设app下载app开发公司

第一步 进入百度地图开发平台 百度地图开放平台 | 百度地图API SDK | 地图开发 第二步注册 获取AK秘钥,点击【创建应用】进入AK申请页面,填写应用名称,务必选择AK类型为“浏览器端”,JS API只支持浏览器端AK进行请求与访问 下面…

四川宜宾建设局官方网站曼朗策划网站建设

1.概述 在12.0的系统rom产品定制化开发中,在一些产品核心开发中,第三方app需要开启系统通知权限,然后可以在app中,监听系统所有通知,来做个通知中心的功能,所以需要授权 获取系统通知的权限,然后来顺利的监听系统通知。来做系统通知的功能,首选分析下相关授权通知的功…

DevEco Studio模拟器的采用

DevEco Studio模拟器的采用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

微信网站模版wordpress主题加授权方式

自从电动汽车GB/T32960标准颁布,要求所有电动汽车必须上传数据开始,各车厂就开始花费大量的人力物力,用于数据的上传与存储。同时随着智能化、网联化的趋势,不断丰富上传数据的内容与数量。数据已成为车厂的重要资产,但…

公司网站建设一般多少钱网站通内容管理系统

SPSSAU共提供两种文本聚类方式,分别是按词聚类和按行聚类。按词聚类是指将需要分析的关键词进行聚类分析,并且进行可视化展示,即针对关键词进行聚类,此处关键词可以自由选择。按行聚类分析是指针对以‘行’为单位进行聚类分析&…

怎么用wordpress修改网站源码网站建设违约合同

本期复刻效果: 感觉出的聚类分析树状图绘制工具也不少了,未来可能会统一整理为一个工具包?(任重道远,道阻且长): 代码讲解 0 数据设置 写了比较多的注释应该比较易懂: clc; clear; close all% 样品起名s…

实用指南:基于I.MX6ULL的Linux C多线程物联网网关+STM32+Qt上位机+Linux C++多线程服务器(含web)的多种无线通信系统的智慧农场

实用指南:基于I.MX6ULL的Linux C多线程物联网网关+STM32+Qt上位机+Linux C++多线程服务器(含web)的多种无线通信系统的智慧农场2025-10-03 13:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !imp…

网站建设制作与运营wordpress模板制作软件

使用Proteus仿真软件设计一个开机登录程序,单片机选用ATmegga48. 基础要求: 1.程序启动后在LCD1602液晶屏上提示用户通过独立按键输入密码(6位)。 2.密码输入错误则在屏幕上提示密码错误,密码输入正确则在屏幕上提示密 码正确后等待约3秒后进入主界面,在屏幕中央显示HelloWorld…

康桥网站建设html做一个登录注册页面

看到的实用资料记录网址: 1、技术学习网站: http://www.ixpub.net/forum.php 2、禅道项目管理软件(ZenTaoPMS)是一款国产的,基于LGPL协议,开源免费的项目管理软件,它集产品管理、项目管理、测试管理于一体,…

英雄联盟视频网站源码免费稳定的云服务器

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句。不能用循…

pthread_create详解:打开多线程编程的大门 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做模具行业的网站wordpress怎么找模板

Tags : jstack日志发表时间:2019-03-17 23:53:19在分析线上问题时常使用到jstack 命令将当时Java应用程序的线程堆栈dump出来。面对jstack 日志,我们如何查看?首先要清楚线程的状态线程的状态有:new、runnable、running、waiting、…

唐山制作网站软件Wordpress点金

项目结构创建&提交到码云 数据库初始化 保持docker数据库一直打开 docker update redis --restartalways 连不上了,发现配置文件错了 换了一个配置文件。 快速开发 使用开源的脚手架 人人开源 (gitee.com) 使用renren-fast作为后台开发,使用…

南京网站设计 联络南京乐识广州建站平台哪家好

文章目录 递归与树的深度优先搜索:探索它们之间的关系递归的基本概念树的深度优先搜索递归与树的深度优先搜索的关系反转链表合并两个有序链表 总结 递归与树的深度优先搜索:探索它们之间的关系 递归是一种强大而优雅的编程技术,它允许我们通过将问题分…

网站地图怎么做html百度助手安卓版下载

场景 按规定尽可能减少开放到外网的端口,所以需要将多个服务部署到一个ip一个端口上。 方案 使用ng实现请求转发。根据http请求中的host与ng配置文件中的server_name匹配,转发到对应的机器上。 在docker上部署三个容器,每个容器中启动一个…

手机端网站开发书籍校园网站的建设作用

一、选择行 1. 简单的SELECT 语句 SELECT 字段名1 [AS] 字段名1 解释 FROM table; 2. 处理NULL NVL函数可把NULL转换成其它类型的符号 编程技巧: NVL函数在多条件模糊查询的时候比较有用 NVL函数可返回多种数据类型: 返回日期 NVL(start_date,2002-02-01) 返回字符串 NVL(title…

2025 年地坪研磨机公司推荐榜单:盘点 TOP 品牌的格力,宁德时代等标杆客户合作案例

引言随着城市更新与工业园区升级加速,环氧地坪、固化抛光混凝土等项目对研磨精度与效率的要求持续提升,地坪研磨机市场需求年均复合增长率达 3.5%。但市场中设备质量参差不齐,部分产品存在动力不足、操控精度低、故…

Python 新手入门:从零开始学习 Python 的 10 个关键步骤

Python 是一种非常流行的编程语言,以其简洁的语法和强大的功能而受到开发者的喜爱。无论你是编程新手还是有一定经验的开发者,Python 都是一个值得学习的语言。今天,就让我们一起从零开始,学习 Python 的 10 个关键…

EPL S22 Stage 2 赛前前瞻

Stage 1 似乎爆冷不断,所以来介绍一下 Stage 2 的队伍。 这篇文章在描述队伍组成时会将指挥放在第一位,而狙击手放在第二位,教练在最后一位。 Inner Circle 队员组成:onic / Flierax / cairne / nifee / Dawy / jR…