STM32单片机不同型号之间的HAL库代码移植浅谈(代码解析)

news2024/12/26 22:39:37

在嵌入式系统开发中,STM32HAL库是一种常用的软件开发工具,用于开发STM32系列微控制器的应用程序。由于不同型号的芯片具有不同的硬件架构和外设,因此在将代码移植到不同类型的芯片上时,需要进行一些适配和调整。

首先,需要了解目标芯片的硬件架构和外设资源情况。不同类型的芯片可能具有不同的GPIO、定时器、串口等外设,而且对于每个外设的寄存器和功能可能也会有所不同。因此,在移植代码时,需要根据目标芯片的外设资源和功能,对代码中涉及到的外设进行适配和修改。

其次,需要了解STM32HAL库的API接口。STM32HAL库提供了一套统一的API接口,用于访问芯片上的外设。在移植代码时,可以使用这些API接口来访问目标芯片上的外设。由于不同类型的芯片可能具有不同的外设资源和功能,因此在移植代码时,需要根据目标芯片的外设资源和功能,选择合适的API接口进行使用。

接下来,以使用通用定时器驱动直流电机的例程在F103和F407之间移植的实际代码来说明。

在F103芯片上使用通用定时器4(TIM4)驱动直流电机的代码示例如下:

#include "stm32f1xx_hal.h"

void TIM4_PWM_Init(void)
{
  TIM_HandleTypeDef htim4;
  TIM_OC_InitTypeDef sConfigOC;
  
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 0;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 999;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_PWM_Init(&htim4);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500;  // Set initial duty cycle to 50%
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
}

int main(void)
{
  HAL_Init();
  TIM4_PWM_Init();
  while (1) {
    // Your main code here
  }
}

 在F407芯片上使用通用定时器8(TIM8)驱动直流电机的代码示例如下:

#include "stm32f4xx_hal.h"

void TIM8_PWM_Init(void)
{
  TIM_HandleTypeDef htim8;
  TIM_OC_InitTypeDef sConfigOC;
  
  htim8.Instance = TIM8;
  htim8.Init.Prescaler = 0;
  htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim8.Init.Period = 999;
  htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_PWM_Init(&htim8);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500;  // Set initial duty cycle to 50%
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
}

int main(void)
{
  HAL_Init();
  TIM8_PWM_Init();
  while (1) {
    // Your main code here
  }
}

从上面的代码可以看出,在移植代码时,主要需要修改的是定时器和外设的初始化函数。在F103芯片上使用TIM4定时器,而在F407芯片上使用TIM8定时器。因此,在代码中,需要修改定时器的实例化(Instance)和相关的配置参数。

除了定时器外,其他外设如GPIO、串口等的初始化和配置也需要根据目标芯片的硬件资源和功能进行相应的修改和适配。

在实际的移植过程中,还需要注意一些其他问题,比如中断向量的重新映射、时钟树的配置、外设引脚的映射等。这些细节问题需要根据具体的芯片型号和硬件设计来进行相应的处理。

总之,STM32HAL库代码的移植需要根据目标芯片的硬件架构和外设资源进行适配和调整,主要涉及到外设初始化和配置的修改。通过对代码进行适当的修改和调整,可以实现将代码移植到不同类型的芯片上。

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

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

相关文章

wps中excel如何实现模糊搜索匹配的内容(可以匹配想要的各种格式)

1,在某一列进行搜索-筛选搜索-如包含“XXX信息XX公司XX”这种格式的。 输入 :信息*公司 (1)选择第一种搜索方式代表寻找符合条件: 包含信息和公司两个关键字, 且信息在前公司在后, 且两个词语之…

SIP 抓包后获取媒体内容备忘(解析RTP)

SIP呼叫并抓包 从网上找免费的sip 软中端, 两个转中端建立呼叫且抓包 详情可以参考 https://blog.csdn.net/liuxingrui4p/article/details/96709136?spm1001.2014.3001.5502 使用wireshark检查SIP flow: 点击Telephony > SIP Flows 打开页面如下…

下一代边缘计算技术在哪里?

扫描文末二维码,立刻免费报名 云网一体,超大规模流量下 边缘云的架构与技术揭秘 伴随超高清视频时代的开启,热点赛事、晚会直播等特殊场景的巨大流量对业务的带宽储备、节点资源、流量调度和安全保障能力提出了新的挑战。 火山引擎边缘云基于…

JUC之十一:CompletableFuture用法详解

JUC之十一:CompletableFuture用法详解 文章目录 JUC之十一:CompletableFuture用法详解一、前言二、CompletableFuture类简介三、功能分类3.1、获取结果3.2、依赖关系3.3、and聚合关系3.4、or聚合关系3.5、并行执行3.6、结果处理 四、方法详解4.1、结果转…

【JavaScript】ES6新特性(5)

16. Promise Promise 是异步编程的一种解决方案,比传统的解决方案回调函数, 更合理和更强大 ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象 指定回调函数方式更灵活易懂解决异步 回调地狱 的问题 16.1 回调地狱 当一个回调函数…

Linux 进程管理与调度

一、前言 本篇文章是对Liunx的进程管理调度的实验过程记录,读者可以通过这篇文章加深对Liunx中进程管理和调度的理解,本文所使用的操作系统为RHEL 8.0版本,为在Vmware workstation中运行的虚拟机。 二、实验目的 ① 掌握linux进程相关操作 ②…

RabbitMQ学习笔记9 TTL死信队列+延迟队列实战

我们去新建一个交换机: 然后我们再用这种方法直接创建一个队列: 点击bind这样我们的交换机和队列就绑定到一起了。 然后我们要新建普通队列,设置过期时间,指定死信交换机。 发布一条消息。 它会把队列传递到死信队列中去。

Openlayers实战:overlay上播放视频

在企业或者城市等的宣传上,视频能很好的传达出一些信息。 那么在openlayer中如何展示视频呢, 可以通过overlay的方式,点击某一个点,弹出overlay层,展示出视频,并自动播放。下面的实战就能够达到这种效果。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还…

记忆——记忆宫殿——数字编码

数字编码 数字编码相对简单,与乘法口诀的工作量类似。如果想要达到高手的水平,熟练程度也需要达到乘法口诀的程度。 数字编码的方式是直接创造出数字与形象的唯一的对应关系,然后熟记。 0-9,00-99是什么 最常用的编码是将0-9和…

【C++11】lambda表达式 的定义、性质和用法

定义 Lambda表达式是C11引入的一种函数对象的匿名表示方法。它可以用于定义轻量级的、临时的、内联的函数对象,通常用于函数式编程的场景。 语法结构 Lambda表达式的 基本语法 如下: lambda表达式书写格式:[capture-list] (parameters) m…

java8 新特性 —— Lambda 表达式

我们来看一段老版本的示例代码,其对一个含有字符串的集合进行排序:(示例代码创建了一个匿名内部类作为入参。) // Collections 工具类提供了静态方法 sort 方法,入参是一个 List 集合,和一个 Comparator 比…

C++栈和队列(详解+刷题)

👂 爱要坦荡荡 - 萧潇 - 单曲 - 网易云音乐 👂 武侯祠 - 闫东炜 - 单曲 - 网易云音乐 👂 You Are My Sunshine - Angelika Vee - 单曲 - 网易云音乐 (๑•̀ㅂ•́)و✧ O(∩_∩)O (ง •_•)ง (~﹃~)~zZ …

微鳄三六五软件,企业实现数字化转型仅需2万

关键词:OA办公系统、知识管理系统、群晖NAS 编者按: 疫情对全球经济有着巨大冲击,有调查表明80%的中小企业营收下滑,有30%的中小企业营收减半。天翎特此推出万元即可实现数字化管理方案,为企业提供办公管理、项目管理、…

Canvas.arcTo() 的使用,画一条带圆角的线段,画一个思维导图一基础

Canvas.arcTo() 的使用,画一条带圆角的线段,画一个思维导图一基础 一、方法定义 canvas.arcTo 这个方法还是比较难理解的。因为它不是直观的绘制路径,而是间接的。 它的参数是这样的。 canvas.arcTo(ax,ay,bx,by,radius)它是由两个点和一个…

密码学学习笔记(十):Digital Signatures - 数字签名1

什么是数字签名? 想象一下一下情景: Alice生成两个密钥:一个公钥𝑃𝐾𝐴 & 对应的密钥𝑆𝐾𝐴, 发布公钥,保留密钥然后Alice使用𝑆&#x1d4…

ARG DEBIAN_FRONTEND=noninteractive作用说明

使用 在Dockerfile中使用ARG指令定义变量并为其指定一个默认值。ARG指令用于在构建过程中传递变量的值。 对于DEBIAN_FRONTENDnoninteractive,它定义了一个名为DEBIAN_FRONTEND的变量,并将其默认值设置为noninteractive。在这个上下文中,no…

【uniapp开发h5】点击复制微信号并自动打开微信应用,类似可以唤起淘宝、知乎应用等

效果展示: 准备工作: 引用jquery.js 和 clipboard.min.js jQuery就不用多说了,而clipboard.min.js 是一个 JavaScript 库,用于实现网页上的复制到剪贴板功能。它提供了一种简单的方式来处理复制操作,无需使用浏览器原…

Ubuntu 包管理的 20 个“apt-get”命令

动动发财的小手,点个赞吧! 在引入 apt 命令之前,apt-get 命令是基于 Debian 的 Linux 发行版中使用的主要包管理命令。 使用 apt-get 命令,您可以在系统上安装、删除、升级、搜索和管理软件包。然而,从 Ubuntu 16.04 和…

22运动估计(matlab程序)

1.简述 实验目的 熟悉运动估计的块匹配(BMA)算法原理,编程实现全搜索算法(三步搜索或钻石搜索算法),了解运动估计在混合编码器中的作用。 实验内容 1)编写全搜索算法函数,将运动矢量…

使用Llama.cpp在CPU上快速的运行LLM

大型语言模型(llm)正变得越来越流行,但是它需要很多的资源,尤其时GPU。在这篇文章中,我们将介绍如何使用Python中的llama.cpp库在高性能的cpu上运行llm。 大型语言模型(llm)正变得越来越流行,但是它们的运行在计算上是非常消耗资源…