【STM32】STM32Cube和HAL库使用初体验

news2025/1/11 3:01:06

1.STM32Cube和HAL库模式开发流程

1、流程介绍

(1)环境搭建:STM32CubeMX安装、STM32xxFW安装、MDK5安装、pack包安装【顺序很重要】

【STM32】STM32的Cube和HAL生态-CSDN博客中的3.STM32CubeMX工具入门
(2)STM32CubeMX中创建工程,选择芯片型号,做图形化配置
(3)生成MDK版project
(4)MDK5中打开project,开始正式开发

2、实战演示

1.new Project

2.选择“MCU”

双击选择芯片

3.显示芯片模型

4.将项目导出称为代码项目

《STM32MP1 M4裸机HAL库开发指南》第十章 STM32CubeMX简介_正点原子官方的技术博客_51CTO博客

注意点:
我们在填写路径和文件名的时候不能输入中文,否则会失败。

5.最终生成的文件

3、几个小细节

(1)自动生成的project目录结构和名称等都是既定的,最好不要改
(2)由CubeMX工程到MDK工程是单向的,不能逆向同步(可以从CubeMX中修改MDK,但是MDK不能修改CubeMX)
(3)最好在CubeMX中一次配完一个模块,再生成MDK工程。因为如果再次生成则会覆盖掉之前生成的MDK工程中同一个模块c文件,这样如果你刚好又已经编辑过了那部分就丢了。
(4)STM32CubeMX工具只是生成工程和外设初始化代码,大量开发工作还是靠自己的。
(5)HAL库是一套体系,有自己的架构,必须理解透彻,否则会有无处下爪的感觉。
(6)因为HAL库很庞大,整个编译一次很久,所以建议要点build而不是rebuild

2.STM32CubeMX生成的工程解读

1、工程目录介绍

drivers

Inc

src

总框架

2、工程配置项细节

3、源码分析与学习方法

(1)先理清条理,搞清楚是怎么从CubeMX配置到MDK工程中的
(2)建立SI(Source Instight)工程,协助分析HAL库源码
(3)先从时钟、GPIO等模块学起,掌握这套体系架构
(4)逐步拓展到其他外设模块,学习HAL库的使用

3.STM32HAL库源码分析1

1、SI工程建立

查看整个文件的目录结构

2、从启动代码开始

起始文件有2个

1个在CMSIS中:\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm

1个在MDK-ARM中:\MDK-ARM

3、main函数分析

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  //将全部的外设进行复位,并且初始化时钟
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  //系统时钟初始化,此函数会覆盖前面初始代码中的“SystemInit”
  //这个才是最后使用的时钟
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

4、HAL_Init函数详解

  SysTick用作HAL_Delay()函数的时基,应用程序需要确保SysTick时基始终设置为1毫秒
 进行正确的 HAL 操作。

__weak:如果没有其他同名函数则使用这个,如果有其他的同名函数则使用另外一个(其实就是覆盖)。

5、SystemClock_Config

覆盖在start文件中的“SystemInit”

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_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
  //调用专门配置时钟模块
  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_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

我们一般不用看的那么详细,因为一般时钟不会出现问题。要重点看什么串口,定时器。

6.MX_GPIO_Init

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  //时钟使能
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  //端口输出
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC14 */
  GPIO_InitStruct.Pin = GPIO_PIN_14;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  //将设置关联起来
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA11 */
  GPIO_InitStruct.Pin = GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

7. HAL_Delay

不管系统时钟怎么设置这个函数都不需要改变
以ms为单位

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
}

6.STM32CubeMX和HAL库点亮LED实战

1、在CubeMX工具中开发

本代码基于STM32F103C8C5

(1)查原理图确定LED对应的GPIO号:随便对应一个


(2)CubeMX新建工程并配置GPIO
(3)配置工程,并生成MDK project【查看上怎么创建文件】

2、在MDK5中开发

(1)找到main函数中的while处
(2)查看GPIO的HAL库函数,添加LED操作代码
(3)精确延时用HAL_Delay函数

3.闪烁代码编写

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  while (1)
  {
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
		HAL_Delay(500);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
		HAL_Delay(500);
  }
  /* USER CODE END 3 */
}

4、烧录到开发板并运行

(1)STLINK接线(SWDIO、SWCLK、GND)


(2)MDK中debug中配置使用stlink调试和下载,注意选择正确的flash烧录算法
(3)烧录并运行,注意板子供电用microusb或电池均可

7、RCC时钟设置

0.注意点

如果我们使用外部晶振(时钟)则一定一定要先使能RCC,才可以进行设置。

1.实验1:更改时钟频率设置

Drivers中的代码是不会被改变。

会被改变的是main中。

(1)先备份原来的main.c和其他时钟相关部分
(2)更改
主时钟到80MHz并重新生成工程,重新编译烧录运行看效果
(3)对比新生成的时钟部分代码和以前的
(4)额外实验:可以在main.c的while循环中各部分添加些自定义代码,看哪些不会被覆盖【只有在begin和end中编写的代码才不会被修改】

2、实验2:使用外部晶振

(1)打开HSE实验
(2)打开LSE实验

1)注意点:

如果我们想要使用哪一个模块应该先使能这个外设。

2)HSE和LSE默认是关闭的--》节省GPIO,节省性能

1.接入外部时钟

2.接入外部晶振

3.测试

8.STM32CubeMX和HAL库GPIO实战

1、HAL库中gpio驱动详解

在【stm32f1xx_hal_gpio.c

2、GPIO实战

(1)保存初始mdk工程
(2)查原理图确定其余2个LED的引脚
(3)在CubeMX中配置
(4)重新生成MDK project
(5)对比新生成的gpio部分代码和以前的
(6)编译烧录执行验证

  while (1)
  {
    // 把GPB2设置为低电平
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
		HAL_Delay(500);
		// 把GPB2设置为高电平
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
		HAL_Delay(500);
  }
  /* USER CODE END 3 */
}

9.HAL库体系的头文件包含

1、从main包含的头文件说起

第一条线:main.c中包含stm32f1xx_hal.h【唯一需要进行包含的】,再包含了stm32f1xx_hal_conf.h【模块的定义】,然后再包含了各个模块的hal库头文件。
第二条线:只要包含了stm32f1xx.h,就会间接包含到所对应系列型号的stm32f103xx.h


stm32f1xx_gpio.h->stm32f1xx_hal_def.h->stm32f1xx.h->stm32f103xx.h

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

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

相关文章

跟着openai学编程

装饰者模式 class Component:def operator(self):passclass ConcreteComponent(Component):def operator(self):return "ConcreteComponent operator"class Decorator(Component):def __init__(self, component) -> None:super().__init__()self.component compo…

MySQL最新2023年面试题及答案,汇总版(4)【MySQL最新2023年面试题及答案,汇总版-第三十四刊】

文章目录 MySQL最新2023年面试题及答案&#xff0c;汇总版(4)01、一个6亿的表a&#xff0c;一个3亿的表b&#xff0c;通过外键tid关联&#xff0c;你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录&#xff1f;02、SQL语句优化的一些方法有哪些&#xff1f;03…

机器人入门(五)—— 仿真环境中操作TurtleBot

仿真环境中操作TurtleBot 一、实操1.1 查看姿态信息1.2 控制turtlebot移动的三种方式1.2.1 命令行发布指令1.2.2 键盘操控1.2.3 Python脚本控制1.2.4 使用rqt工具界面&#xff0c;发布运动指令 二、里程计(odometry)TurtleBot3 仿真 进行实操之前&#xff0c;先准备环境 $ sud…

【每日OJ——21. 合并两个有序链表(链表)】

每日OJ——21. 合并两个有序链表&#xff08;链表&#xff09; 1.题目&#xff1a;21. 合并两个有序链表 &#xff08;链表&#xff09;2.方法讲解&#xff1a;2.1.解法一&#xff1a;递归2.1.1.图文解析2.1.2.代码实现2.1.3.提交通过展示 2.2.解法二&#xff1a;迭代(无哨兵位…

网络运维Day09

文章目录 环境准备ssh远程管理远程管理进阶MobaXterm远程工具 环境准备 远程管理linux主机 环境准备如下方表格(主机名IP)使用CentOS7.9克隆一台新的机器 主机名IP地址som.tedu.cn192.168.4.7/24pc207.tedu.cn192.168.4.207/24 将虚拟机A、B的网络模式选择为vmnet1 真机网络…

Hololens开发笔记

1、关闭阴影 2、将相机渲染改为后向。因为默认是Forward&#xff0c;当在场景里面想使用点光源时&#xff0c;运行起来三角面会翻倍&#xff0c;影响软件运行流畅度。 3、第三人称同步相关。开启Host/Sever/Client前&#xff0c;需要将所有挂有NetworkObject/NetworkTransfor…

ai批量剪辑矩阵无人直播一站式托管系统源头技术开发

1.全店IP形象打造----剪辑 全店IP打造模式为场景组合&#xff0c;需要在每个场景内按照顺序分别上传短视频素材&#xff0c;会与选中的音乐、标题文案组合生成有逻辑顺序的视频。可调配标题字号大小、音频音量大小。如想要携带团购地址可设置POI。可开启团购引导动画、镜头转场…

HTML页面模拟了一个类似Excel的表格在线diy修改表格内容

html实现在线表格编辑&#xff0c;可以修改每个表格内容&#xff0c;并且可以添加行和列 这个HTML页面模拟了一个类似Excel的表格&#xff0c;可以添加和删除行和列&#xff0c;并且可以编辑每个表格的内容。通过点击按钮可以添加新的行和列&#xff0c;通过按钮可以删除最后一…

近日的ChatGPT宕机事件,竟是黑客组织的蓄谋攻击!?还声称要教训OpenAI和奥特曼

作者 | 王二狗 想必大家都知道了&#xff0c;近日无论是ChatGPT还是其API服务都出现了长时间的线上崩溃&#xff01; Sam Altman还下场亲自道歉说是因为太受欢迎导致服务器负载超荷。 大模型研究测试传送门 GPT-4传送门&#xff08;免墙&#xff0c;可直接测试&#xff0c;遇…

【算法与数据结构】131、LeetCode分割回文串

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题仍然使用回溯算法的一般结构。加入了一个判断是否是回文串的函数&#xff0c;利用起始和终止索引进…

YOLOv8模型ONNX格式INT8量化轻松搞定

ONNX格式模型量化 深度学习模型量化支持深度学习模型部署框架支持的一种轻量化模型与加速模型推理的一种常用手段&#xff0c;ONNXRUNTIME支持模型的简化、量化等脚本操作&#xff0c;简单易学&#xff0c;非常实用。 ONNX 模型量化常见的量化方法有三种&#xff1a;动态量化…

智慧工地源码:助力数字建造、智慧建造、安全建造、绿色建造

智慧工地围绕建设过程管理&#xff0c;建设项目与智能生产、科学管理建设项目信息生态系统集成在一起&#xff0c;该数据在虚拟现实环境中&#xff0c;将物联网收集的工程信息用于数据挖掘和分析&#xff0c;提供过程趋势预测和专家计划&#xff0c;实现工程建设的智能化管理&a…

类与对象(2)

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;2023年11月11日 &#x1f4e8; 博主码云地址&#xff1a;博主码云地址 &#x1f4d5;参考书籍&…

HaaS510开板式DTU真机连云:上报监测数据至阿里云物联网平台

背景 HaaS: Hardware as a Service。 HAAS510 是一种开板式 DTU &#xff0c;旨在为用户已开发好的设备快速增加 4G 连云能力的 4G CAT1 数传模块。它通过将模组与用户设备集成到一个外壳内&#xff0c;既保持设备的一体性&#xff0c;又降低重新开发 PCB 的时间消耗和模组开…

canvas 简单直线轨迹运动与线性插值计算

canvas 简单直线轨迹运动与线性插值计算 一、canvas 直线轨迹运行 添加 canvas 语法提示 通过/** type {HTMLCanvasElement} */代码块 来添加canvas的语法提示 <body><canvas id"canvas"></canvas> </body> <script>/** type {HTM…

区块链探秘:从基础到深度,全面解读区块链技术与应用

1.区块链基本概念 1.发展历史 比特币诞生&#xff1a; 2008年&#xff0c;化名为中本聪的人发表了论文《Bitcoin&#xff1a;A Peer-to-Peer Electronic Cash System》 2009年1月3日&#xff0c;中本聪开发运行了比特币客户端程序并进行了首次挖矿&#xff0c;获得了第一批…

进阶课6——基于Seq2Seq的开放域生成型聊天机器人的设计和开发流程

情感聊天机器人通常属于开放领域&#xff0c;用户可以与机器人进行各种话题的互动。例如&#xff0c;微软小冰和早期的AnswerBus就是这种类型的聊天机器人。基于检索的开放领域聊天机器人需要大量的语料数据&#xff0c;其开发流程与基于任务型的聊天机器人相似&#xff0c;而基…

4面百度软件测试工程师的面试经验总结

没有绝对的天才&#xff0c;只有持续不断的付出。对于我们每一个平凡人来说&#xff0c;改变命运只能依靠努力幸运&#xff0c;但如果你不够幸运&#xff0c;那就只能拉高努力的占比。 2023年7月&#xff0c;我有幸成为了百度的一名测试工程师&#xff0c;从外包辞职了历经100…

解决Scrapy爬虫多线程导致抓取错乱的问题

目录 一、概述 二、问题分析 三、解决方案 四、案例分析 五、总结 一、概述 Scrapy是一个流行的Python爬虫框架&#xff0c;可以轻松地抓取网页数据并对其进行解析。然而&#xff0c;在抓取过程中&#xff0c;如果使用多线程进行并发处理&#xff0c;可能会遇到数据抓取错…

TCP触发海康扫码相机S52CN-IC-JQR-NNN25

PC环境设置 为保证客户端正常运行以及数据传输的稳定性&#xff0c;在使用客户端软件前&#xff0c;需要对 PC 环境 进行设置 关闭防火墙 操作步骤如下&#xff1a; 1. 打开系统防火墙。 2. 在自定义设置界面中&#xff0c;选择关闭防火墙的对应选项&#xff0c;并单击…