HAL+M4学习记录_3

news2024/10/10 5:17:41

一、HAL库开发框架

记录HAL学习过程

1.1 CMSIS

CMSIS(Cortex微控制器软件接口标准),用于提供用户和硬件间的接口,用户通过CMSIS标准对Cortex微控制器内部寄存器单元进行读写

CMSIS

1.2 HAL库

HAL(硬件抽象层)为降低直接操作寄存器的成本,推出HAL库,使用HAL库函数完成对寄存器的读写
HAL

1.3 基于CMSIS的应用程序开发框架

基于CMSIS的应用程序开发框架可分为三层

  • 用户程序层:用户自定义的应用程序文件
  • 设备驱动层:HAL库资源
  • CMSIS层:内核相关文件、外设寄存器和中断向量定义层

1.4 编译过程文件

MDK编译过程文件

  • .o文件:可重定向文件
  • .axf文件:可执行对象文件
  • .hex文件:用于下载
  • .map文件:列表文件,用于分析程序存储占用情况
  • 其他:一般用不到

二、GPIO

2.1 功能简介

  • 输入模式
    • 浮空输入
      IC内部上下拉电阻均断开,完全取决于外部电路。
    • 上拉输入
      IC内部上拉电阻使能、下拉电阻断开,在输入高电平信号或无输入信号时,读取到的是高电平;在输入低电平信号时,读取到的是低电平。
    • 下拉输入
      IC内部上拉电阻断开、下拉电阻使能,在输入低电平信号或无输入信号时,读取到的是低电平;在输入高电平信号时,读取到的是高电平。
    • 模拟输入
      外部信号不经过施密特触发器,直接连接内部ADC,输入信号电压范围是 V R E F − ≤ V I N ≤ V R E F + V_{REF-}\leq V_{IN}\leq V_{REF+} VREFVINVREF+
  • 输出模式
    • 开漏输出
      开漏电路相当于一个MOS管的漏极,要得到高电平必须外接上拉电阻,由外部高电平提供驱动能力,可减少IC内部驱动;未接外部上拉电阻时只能输出低电平;可将多个开漏输出连接在一条线上,通过一只上拉电阻实现线与功能。
    • 推挽输出
      推挽电路是两个参数相同的三极管或MOS管以推挽方式组成,工作时每次只有一个开关管导通,既可以向负载灌电流,也可以从负载抽电流,使用IC内部高电平,具有电压驱动能力。
    • 复用开漏输出
      不作为普通IO使用,而是由内部设备直接驱动,特征同开漏输出。
    • 复用推挽输出
      不作为普通IO使用,而是由内部设备直接驱动,特征同推挽输出。

2.2 HAL库配置GPIO

在文件stm32f4xx_hal_gpio.c中提供了GPIO初始化函数和去初始化函数以及操作函数。系统在上电后,引脚默认状态是模拟模式,要使用这一驱动按以下步骤

  • 通过函数__HAL_RCC_GPIOx_CLK_ENABLE()使能AHB时钟
  • 通过函数HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)初始化GPIO
  • 通过函数HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)去初始化GPIO
  • 通过函数HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读取引脚电平
  • 通过函数HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)设置引脚电平

三、通过GPIO点亮LED

这里给出点亮板载电路,两个LED分别在PA6和PA7引脚
板载LED
这里给出驱动代码

  • .c文件如下
/*
*********************************************************************************************************
*	                                   Func Statement
*
*	板载两颗LED,LED1是PA6引脚,LED2是PA7引脚,低电平点亮,高电平熄灭
*********************************************************************************************************
*/
#include "bsp.h"
/* private define */
#define LED_GPIO_CLK_ALLENABLE()	__HAL_RCC_GPIOA_CLK_ENABLE()

#define GPIO_PIN_LED1				GPIO_PIN_6
#define GPIO_PIN_LED2				GPIO_PIN_7

/*
**********************************************************************************
*   @brief   配置板载LED 	
*   @param	 None
*   @return	 None
*   @use	  	
**********************************************************************************
*/
void bsp_InitLed()
{
	GPIO_InitTypeDef GPIO_InitStructure = {0};
	/* 开启GPIO端口时钟 */
	LED_GPIO_CLK_ALLENABLE();
	
	/* 初始熄灭LED */
	bsp_LedOff(1);
	bsp_LedOff(2);
	
	/* 配置LED */
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.Pull = GPIO_NOPULL;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	
	GPIO_InitStructure.Pin = GPIO_PIN_LED1 | GPIO_PIN_LED2;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/*
**********************************************************************************
*   @brief    点亮指定LED
*   @param	  __no:LED序号,范围 1 - 2
*   @return	  None
*   @use	  	
**********************************************************************************
*/
void bsp_LedOn(uint8_t __no)
{
	if(__no == 1)
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_LED1, GPIO_PIN_RESET);
	}
	else if(__no == 2)
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_LED2, GPIO_PIN_RESET);
	}
}

/*
**********************************************************************************
*   @brief    熄灭指定LED
*   @param	  __no:LED序号,范围 1 - 2
*   @return	  None
*   @use	  	
**********************************************************************************
*/
void bsp_LedOff(uint8_t __no)
{
	if(__no == 1)
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_LED1, GPIO_PIN_SET);
	}
	else if(__no == 2)
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_LED2, GPIO_PIN_SET);
	}
}

/*
**********************************************************************************
*   @brief    翻转指定LED
*   @param	  __no:LED序号,范围 1 - 2
*   @return	  None
*   @use	  	
**********************************************************************************
*/
void bsp_LedToggle(uint8_t __no)
{
	if(__no == 1)
	{
		GPIOA->ODR ^= GPIO_PIN_LED1;
	}
	else if(__no == 2)
	{
		GPIOA->ODR ^= GPIO_PIN_LED2;
	}
}
  • .h文件如下
#ifndef __BSP_LED_H
#define __BSP_LED_H

/* public statement */
void bsp_InitLed();
void bsp_LedOn(uint8_t __no);
void bsp_LedOff(uint8_t __no);
void bsp_LedToggle(uint8_t __no);

#endif

  • main文件如下
#include "bsp.h"

/* public statement */
static void PrintInfo();

/* public define */
uint32_t sys_clk = 0;

int main()
{
	bsp_Init();
	//PrintInfo();			/* 打印开发板信息 */
	while(1)
	{
		bsp_LedOff(1);
		bsp_LedOn(2);
		bsp_DelayMs(200);
		bsp_LedOn(1);
		bsp_LedOff(2);
		bsp_DelayMs(1000);
	}
}

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

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

相关文章

加固与脱壳04 - 一些简单的脱壳方法

这里只讨论一些简单壳的脱壳方法及其原因。 FRIDA-DEXDump https://github.com/hluwa/FRIDA-DEXDump 适用于不需要研究那些被强保护起来的代码,只是想单纯的看看某个地方的业务逻辑。 原理: 对于完整的 dex,采用暴力搜索 dex035&#xf…

云栖实录 | Hologres3.0全新升级:一体化实时湖仓平台

本文根据2024云栖大会实录整理而成,演讲信息如下: 演讲人: 姜伟华 | 阿里云智能集团资深技术专家、Hologres 负责人 丁 烨 | 阿里云智能集团产品专家、Hologres 产品负责人 活动: 2024 云栖大会 - 商用大数据计算与分析平台论…

基于Arduino的超声波和舵机模块集成使用

一.超声波模块和舵机模块集成使用 超声波模块:HC-SR04舵机模块:SG90目的:通过Arduino UNO核心板控制舵机旋转到不同位置,同时获取不同位置超声波模块和障碍物间的距离,配合控制算法,进行基于超声波智能避障…

需求10——通过改一个小bug来学习如何定位问题

在浏览我之前完成的一些小需求时,我发现了一个非常有价值的需求。这个需求可以让我深入了解系统中关于故障上报的功能。通过完善这个需求,我能够全面掌握整个故障上报的流程。 这个需求主要是关于故障上报流程中出现的问题。当前的流程如下:…

ML 系列:机器学习和深度学习的深层次总结(16) — 提高 KNN 效率-使用 KD 树和球树实现更快的算法

一、说明 在机器学习系列的第 16 节,我们重点介绍了提高 K 最近邻 (KNN) 算法的效率,这是一种广泛用于分类和回归任务的方法。虽然 KNN 简单有效,但对于大型数据集来说,其计算成本可能会令人望而却步。为了…

基于SpringBoot问卷调查系统小程序【附源码】

基于SpringBoot问卷调查系统小程序 效果如下: 管理员登录界面 管理员功能界面 调查人管理界面 问卷调查管理界面 问卷题目管理界面 用户登录界面 APP首页界面 公告信息界面 研究背景 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨&…

组织病理学图像中的再识别|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Re-identification from histopathology images 组织病理学图像中的再识别 01 文献速递介绍 在光学显微镜下评估苏木精-伊红(H&E)染色切片是肿瘤病理诊断中的标准程序。随着全片扫描仪的出现,玻片切片可以被数字化为所谓…

怎么在单片机裸机程序中移植EasyLogger?

1、介绍 EasyLogger 是一款超轻量级、高性能的C日志库,非常适合对资源敏感的软件项目。例如:IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C日志库,EasyLogger的功能更加简单,提供给用户的接口更少,但…

肺腺癌预后新指标:全切片图像中三级淋巴结构密度的自动化量化|文献精析·24-10-09

小罗碎碎念 本期这篇文章,我去年分享过一次。当时发表在知乎上,没有标记参考文献,配图的清晰度也不够,并且分析的还不透彻,所以趁着国庆假期重新分析一下。 这篇文章的标题为《Computerized tertiary lymphoid structu…

基于springboot vue 校园失物招领平台的设计与实现

博主介绍:专注于Java(springboot ssm springcloud等开发框架) vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

【AIGC】OpenAI API在快速开发中的实践与应用:优化ChatGPT提示词Prompt加速工程

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯使用最新型号确保最佳实践利用最新模型进行高效任务处理为什么要选择最新模型?结论 💯指令与上下文的分隔最佳实践分隔指令和上下文的重要性使用符…

叉车毫米波雷达防撞技术,保护叉车作业安全

在叉车作业频繁的仓库与物流中心,安全隐患往往隐藏于细微之处,稍有不便可能引发重大事故。我们的叉车毫米波防撞系统方案,正是针对这一痛点而精心设计的创新之作。该系统通过集成的毫米波雷达技术,实现了对叉车周边环境的实时、精…

【动态规划】dp之斐波那契数列模型

学习编程就得循环渐进,扎实基础,勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第N个泰波那契序数 思路: 代码实现: 三步问题 思路: 代码实现: 使用最小花费爬楼梯 思路…

C语言 | 第十三章 | 二维数组 冒泡排序 字符串指针 断点调试

P 120 数组应用案例 2023/1/29 一、应用案例 案例一&#xff1a;创建一个char类型的26个元素的数组&#xff0c;分别 放置’A’-Z‘。使用for循环访问所有元素并打印出来。提示&#xff1a;字符数据运算 ‘A’1 -> ‘B’ #include<stdio.h>void main(){/*创建一个c…

【优选算法之BFS】No.15--- 经典BFS解决FloodFill算法和解决最短路问题

文章目录 前言一、BFS解决FloodFill算法示例&#xff1a;1.1 图像渲染1.2 岛屿数量1.3 岛屿的最⼤⾯积1.4 被围绕的区域 二、BFS解决最短路问题2.1 迷宫中离⼊⼝最近的出⼝2.2 最⼩基因变化2.3 单词接⻰2.4 为⾼尔夫⽐赛砍树 前言 &#x1f467;个人主页&#xff1a;小沈YO. &a…

Linux高级编程_31_消息队列

文章目录 消息队列作用&#xff1a;特点&#xff1a;消息队列限制值&#xff1a;注意&#xff1a;命令&#xff1a;ftok函数作用&#xff1a;语法&#xff1a; msgget函数作用&#xff1a;语法&#xff1a; msgsnd函数作用&#xff1a;语法&#xff1a; msgrcv函数作用&#xf…

QT实现QInputDialog中文按钮

这是我记录Qt学习过程心得文章的第三篇&#xff0c;主要是为了方便QInputDialog输入框的使用&#xff0c;通过自定义的方式&#xff0c;按钮中文化&#xff0c;统一封装成一个函数&#xff0c;还是写在了Skysonya类里面。 实现代码&#xff1a; //中文按钮文本输入对话框 QSt…

【gRPC】1—gRPC是什么

gRPC是什么 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; &#x1f4d6;RPC专栏&#xff1a;https://b…

鸿蒙--播放器状态控制

各个页面共享同一个播放状态&#xff0c;而且可以互相控制&#xff0c;如果传递来传递去会非常的麻烦&#xff0c;但是他们都是Tabs组件内的&#xff0c;我们在index页面提供一个状态&#xff0c;在各个组件接收即可 创建两个子组件&#xff0c;一个是播放控制的子组件&#xf…

1. Oracle 安装报错——环境变量过长

文章目录 1. 报错详细信息2. 解决方案2.1 方案一&#xff1a;修改配置文件cvu_prereq.xml2.2 方案二&#xff1a;修改环境变量配置 1. 报错详细信息 安装 Oracle 过程中&#xff0c;在执行 “先决条件检查” 时报错&#xff1a; 报错内容&#xff1a; This test checks wheth…