STM32 HAL库常用功能封装

devtools/2024/9/20 7:14:27/ 标签: stm32, 单片机, 嵌入式硬件

关中断

/*** @brief       关闭所有中断(但是不包括fault和NMI中断)* @param       无* @retval      无*/
void sys_intx_disable(void)
{__ASM volatile("cpsid i");
}

开中断

/*** @brief       开启所有中断* @param       无* @retval      无*/
void sys_intx_enable(void)
{__ASM volatile("cpsie i");
}

进入待机模式

/*** @brief       进入待机模式* @param       无* @retval      无*/
void sys_standby(void)
{__HAL_RCC_PWR_CLK_ENABLE();    /* 使能电源时钟 */SET_BIT(PWR->CR, PWR_CR_PDDS); /* 进入待机模式 */
}

设置栈顶指针

/*** @brief       设置栈顶地址* @note        左侧若出现红X, 属于MDK误报, 实际是没问题的* @param       addr: 栈顶地址* @retval      无*/
void sys_msr_msp(uint32_t addr)
{__set_MSP(addr);    /* 设置栈顶地址 */
}

进入低功耗模式

/*** @brief       执行: WFI指令(执行完该指令进入低功耗状态, 等待中断唤醒)* @param       无* @retval      无*/
void sys_wfi_set(void)
{__ASM volatile("wfi");
}

系统软复位 (第一种)

/*** @brief       系统软复位* @param       无* @retval      无*/
void sys_soft_reset(void)
{NVIC_SystemReset();
}

系统软复位 (第二种)

/*!
* @brief ARM 软重启 
* @retval: 无
*/
#define SCB_AIRCR             (*(unsigned long *)0xE000ED0C)      //Reset control Address Register
#define SCB_RESET_VALUE       0x05FA0004                          //reset value ,write to SCB_AIRCR  can reset cpu
void Reset_System(void)
{SCB_AIRCR=SCB_RESET_VALUE;
}

GPIO初始化封装

/*** @brief 初始化GPIO* @note   * @retval */
void MX_GPIOX_PIN_Init(GPIO_TypeDef *GPIOx,uint32_t GPIO_PIN_x,uint32_t GPIO_MODE_x,uint32_t Speed_x)
{GPIO_InitTypeDef GPIO_InitStruct = {0}; /* gpio初始化 */GPIO_InitStruct.Pin = GPIO_PIN_x; // 设置GPIO_PinGPIO_InitStruct.Mode = GPIO_MODE_x; // 设置模式为输入GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用上拉或下拉GPIO_InitStruct.Speed = Speed_x;HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); // 初始化GPIOX的GPIO_Pin
}

开启GPIOx相应时钟

/*** @brief 开启对应GPIO Port时钟* @note   * @retval */
void MX_GPIOX_Clock_Enable(GPIO_TypeDef *GPIOx) {/* 确保GPIOx是有效的GPIO口 */if (GPIOx == GPIOA) {__HAL_RCC_GPIOA_CLK_ENABLE();} else if (GPIOx == GPIOB) {__HAL_RCC_GPIOB_CLK_ENABLE();} else if (GPIOx == GPIOC) {__HAL_RCC_GPIOC_CLK_ENABLE();} else if (GPIOx == GPIOD) {__HAL_RCC_GPIOD_CLK_ENABLE();} else if (GPIOx == GPIOE) {__HAL_RCC_GPIOE_CLK_ENABLE();} else if (GPIOx == GPIOF) {__HAL_RCC_GPIOF_CLK_ENABLE();} else if (GPIOx == GPIOG) {__HAL_RCC_GPIOG_CLK_ENABLE();} else if (GPIOx == GPIOH) {__HAL_RCC_GPIOH_CLK_ENABLE();} else if (GPIOx == GPIOI) {__HAL_RCC_GPIOI_CLK_ENABLE();}
}

SP330协议转换芯片配置接口封装

sp330.h

#define USE_SP330	1 //使用sp330
/* sp330 configure begin */
#if USE_SP330
#define U1_SP330_SLEW_Pin GPIO_PIN_15
#define U1_SP330_SLEW_GPIO_Port GPIOA
#define U1_SP330_SHDN_Pin GPIO_PIN_12
#define U1_SP330_SHDN_GPIO_Port GPIOC
#define U1_SP330_DE_Pin GPIO_PIN_0
#define U1_SP330_DE_GPIO_Port GPIOD
#define U1_SP330_RE_Pin GPIO_PIN_1
#define U1_SP330_RE_GPIO_Port GPIOD
#define U1_SP330_HALE_FULL_Pin GPIO_PIN_2
#define U1_SP330_HALE_FULL_GPIO_Port GPIOD
#define U1_SP330_MODE_Pin GPIO_PIN_5
#define U1_SP330_MODE_GPIO_Port GPIOD#define U4_SP330_DE_Pin GPIO_PIN_6
#define U4_SP330_DE_GPIO_Port GPIOD
#define U4_SP330_RE_Pin GPIO_PIN_7
#define U4_SP330_RE_GPIO_Port GPIOB
#define U4_SP330_HALE_FULL_Pin GPIO_PIN_8
#define U4_SP330_HALE_FULL_GPIO_Port GPIOB
#define U4_SP330_MODE_Pin GPIO_PIN_9
#define U4_SP330_MODE_GPIO_Port GPIOB
#define U4_SP330_SLEW_Pin GPIO_PIN_0
#define U4_SP330_SLEW_GPIO_Port GPIOE
#define U4_SP330_SHDN_Pin GPIO_PIN_1
#define U4_SP330_SHDN_GPIO_Port GPIOE/* sp330模式 */
typedef enum
{RS232_MODE = 232,RS422_MODE = 422,RS485_MODE = 485
}SP330_MODE;/* sp330通信方式 */
typedef enum
{HALF_DUPLEX = 11,FULL_DUPLEX = 22 //全双工
}SP330_COMM_MODE;/* 配置结构体 */
typedef struct
{uint16_t SP330_Work_Mode;   //取值范围为SP330_MODE枚举uint16_t SP330_Comm_Mode;   //SP330_COMM_MODEuint16_t SP330_DE_GPIO_Pin; //发送脚uint16_t SP330_RE_GPIO_Pin; //接收脚uint16_t SP330_MODE_GPIO_Pin; //模式配置uint16_t SP330_SLEW_GPIO_Pin; //限摆率设置uint16_t SP330_SHDN_GPIO_Pin; //功耗模式设置:uint16_t SP330_HALE_FULL_GPIO_Pin; //双工模式GPIO_TypeDef *SP330_RE_GPIOx;GPIO_TypeDef *SP330_DE_GPIOx;GPIO_TypeDef *SP330_SLEW_GPIOx;GPIO_TypeDef *SP330_SHDN_GPIOx;GPIO_TypeDef *SP330_MODE_GPIOx;GPIO_TypeDef *SP330_HALE_FULL_GPIOx;   
}Sp330_Configure;void Sp330_Init(Sp330_Configure *sp330); //sp330初始化
void Uart_Sp330_Configure(void); //sp330配置
/* sp330 configure end */
#endif

sp330.c

/*** @brief sp330配置函数* @note   * @retval */
void Uart_Sp330_Configure(void)
{/* 配置结构体定义 */Sp330_Configure u1_sp330; Sp330_Configure u4_sp330; u1_sp330.SP330_DE_GPIOx = U1_SP330_DE_GPIO_Port;u1_sp330.SP330_DE_GPIO_Pin = U1_SP330_DE_Pin;u1_sp330.SP330_RE_GPIOx = U1_SP330_RE_GPIO_Port;u1_sp330.SP330_RE_GPIO_Pin = U1_SP330_RE_Pin;u1_sp330.SP330_SHDN_GPIOx = U1_SP330_SHDN_GPIO_Port;u1_sp330.SP330_SHDN_GPIO_Pin = U1_SP330_SHDN_Pin;u1_sp330.SP330_SLEW_GPIOx = U1_SP330_SLEW_GPIO_Port;u1_sp330.SP330_SLEW_GPIO_Pin = U1_SP330_SLEW_Pin;u1_sp330.SP330_MODE_GPIOx = U1_SP330_MODE_GPIO_Port;u1_sp330.SP330_MODE_GPIO_Pin = U1_SP330_MODE_Pin;u1_sp330.SP330_Work_Mode = RS422_MODE; //422模式u1_sp330.SP330_Comm_Mode = FULL_DUPLEX; //全双工Sp330_Init(&u1_sp330); //初始化uart1 sp330u4_sp330.SP330_DE_GPIOx = U4_SP330_DE_GPIO_Port;u4_sp330.SP330_DE_GPIO_Pin = U4_SP330_DE_Pin;u4_sp330.SP330_RE_GPIOx = U4_SP330_RE_GPIO_Port;u4_sp330.SP330_RE_GPIO_Pin = U4_SP330_RE_Pin;u4_sp330.SP330_SHDN_GPIOx = U4_SP330_SHDN_GPIO_Port;u4_sp330.SP330_SHDN_GPIO_Pin = U4_SP330_SHDN_Pin;u4_sp330.SP330_SLEW_GPIOx = U4_SP330_SLEW_GPIO_Port;u4_sp330.SP330_SLEW_GPIO_Pin = U4_SP330_SLEW_Pin;u4_sp330.SP330_MODE_GPIOx = U4_SP330_MODE_GPIO_Port;u4_sp330.SP330_MODE_GPIO_Pin = U4_SP330_MODE_Pin;u4_sp330.SP330_Work_Mode = RS422_MODE; //422模式u4_sp330.SP330_Comm_Mode = FULL_DUPLEX; //全双工Sp330_Init(&u4_sp330); //初始化uart4 sp330	
}void Sp330_Init(Sp330_Configure *sp330)
{
#if 0 //mx生成时已初始化引脚,不在这里再次初始化了/* 开启GPIO时钟 */MX_GPIOX_Clock_Enable(sp330->SP330_DE_GPIOx);MX_GPIOX_Clock_Enable(sp330->SP330_RE_GPIOx);MX_GPIOX_Clock_Enable(sp330->SP330_SLEW_GPIOx);MX_GPIOX_Clock_Enable(sp330->SP330_SHDN_GPIOx);MX_GPIOX_Clock_Enable(sp330->SP330_HALE_FULL_GPIOx);MX_GPIOX_Clock_Enable(sp330->SP330_MODE_GPIOx);/* 初始化GPIO */MX_GPIOX_PIN_Init(sp330->SP330_DE_GPIOx,sp330->SP330_DE_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);MX_GPIOX_PIN_Init(sp330->SP330_RE_GPIOx,sp330->SP330_RE_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);MX_GPIOX_PIN_Init(sp330->SP330_SLEW_GPIOx,sp330->SP330_SLEW_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);MX_GPIOX_PIN_Init(sp330->SP330_SHDN_GPIOx,sp330->SP330_SHDN_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);MX_GPIOX_PIN_Init(sp330->SP330_HALE_FULL_GPIOx,sp330->SP330_HALE_FULL_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);MX_GPIOX_PIN_Init(sp330->SP330_MODE_GPIOx,sp330->SP330_MODE_GPIO_Pin,GPIO_MODE_OUTPUT_PP,GPIO_SPEED_LOW);
#endif /* 模式配置 RS485 \RS422 \RS232设置*/if(sp330->SP330_Work_Mode == RS232_MODE)HAL_GPIO_WritePin(sp330->SP330_MODE_GPIOx,sp330->SP330_MODE_GPIO_Pin,GPIO_PIN_RESET);else if(sp330->SP330_Work_Mode == RS422_MODE || sp330->SP330_Work_Mode == RS485_MODE)	{HAL_GPIO_WritePin(sp330->SP330_MODE_GPIOx,sp330->SP330_MODE_GPIO_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(sp330->SP330_DE_GPIOx,sp330->SP330_DE_GPIO_Pin,GPIO_PIN_SET);//使能发送HAL_GPIO_WritePin(sp330->SP330_RE_GPIOx,sp330->SP330_RE_GPIO_Pin,GPIO_PIN_RESET); //使能接收}/* 通信方式设置  全双工、半双工设置*/if(sp330->SP330_Comm_Mode == HALF_DUPLEX) HAL_GPIO_WritePin(sp330->SP330_HALE_FULL_GPIOx,sp330->SP330_HALE_FULL_GPIO_Pin,GPIO_PIN_SET);else if(sp330->SP330_Comm_Mode == FULL_DUPLEX) HAL_GPIO_WritePin(sp330->SP330_HALE_FULL_GPIOx,sp330->SP330_HALE_FULL_GPIO_Pin,GPIO_PIN_RESET);/* 限摆率设置 */HAL_GPIO_WritePin(sp330->SP330_SLEW_GPIOx,sp330->SP330_SLEW_GPIO_Pin,GPIO_PIN_SET); /*无限制*//* 低功耗设置 */HAL_GPIO_WritePin(sp330->SP330_SHDN_GPIOx,sp330->SP330_SHDN_GPIO_Pin,GPIO_PIN_SET); /* 关闭低功耗 */}

http://www.ppmy.cn/devtools/97230.html

相关文章

【MATLAB机器人系统工具箱】【manipulatorRRT规划器】属性和方法解析

启用了连接启发式(heuristic)后,双向快速扩展随机树(RRT)算法会在以下情况下忽略 MAXCONNECTIONDISTANCE 的限制:当两棵树(起始树和目标树)之间的节点距离足够接近时,算法…

计算机Java项目|基于SpringBoot的大学生一体化服务平台的设计与实现

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

【1】开源!移植OpenHarmony轻量系统到雅特力AT32F437ZMT MCU

笔者最近将OpenHarmony轻量系统移植到AT32F437 MCU,移植架构采用Board与SoC分离方案,使用arm gcc工具链Newlib C库,并且提供了相应的样例应用代码(样例代码持续更新中) 移植 基于雅特力科技官方开发板 AT-START-F437 …

flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案

flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案 一、背景二、分析tmp文件三、定位原因四、解决方法一、背景 flume没有关闭生成的tmp文件临时解决方案是批量关闭tmp文件下一步深入定位分析原因二、分析tmp文件 观察tmp文件,发现tmp文件的时间点…

Linux Bridge VLAN

一、Linux Bridge VLAN (1)是什么? Bridge 是什么 VLAN 是什么 LINUX BRIDGE VLAN又是什么?——> (2)解决什么问题?【应用场景】 应用背景 已一个实际问题引出 【应用场景】: 【…

武汉流星汇聚:西班牙时尚消费高涨,中国商家借亚马逊平台拓商机

在2024年第二季度的亚马逊西班牙站,一场前所未有的时尚盛宴正悄然上演。销售额同比高增长TOP10品类榜单的揭晓,不仅揭示了西班牙消费者对于时尚品类的狂热追求,更为亚马逊平台上的中国商家开启了一扇通往新蓝海的大门。其中,男士拳…

SSH协议与OpenSSH配置详解(配置密钥对验证实验)

文章目录 SSH 协议与 OpenSSH 配置详解1. SSH 协议概述2. OpenSSH 概述3. 配置SSH(sshd_config文件)3.1 配置服务监听选项3.2 配置用户登录控制(黑白名单)3.3 配置登录验证方式(密钥对验证)3.4 常用的配置项…

PHP中如何限制PDF文件大小的简单示例

例如,如果我们希望限制PDF文件的大小不超过5MB,我们可以将这两个配置项都设置为5M。 upload_max_filesize 5M post_max_size 5M接下来,在PHP脚本中,我们可以通过检查$_FILES全局数组来获取上传文件的大小,并作出相应…

【5.0】vue请求函数和路由

【5.0】vue请求函数和路由 此处是与后端交互发送请求拿到数据,和vue自己中的页面跳转路由 【一】axios使用 【1】安装 终端命令 npm install axios -S【2】基本语法 axios.get(后端地址(django)).then(res > {console.log(res.data.res…

ArrayList详解

简介 【概述】 List的主要实现类,底层使用Object[]存储,适用于频繁的查找工作,线程不安全。 【特点】 增删慢:每次删除元素,都需要更改数组长度、拷贝以及移动元素位置;查询快:由于数组在内…

SSM学生社团管理系统—计算机毕业设计源码20360

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

YouTube最好用的翻译插件

相信很多同学和我一样,想看YouTube视频时发现基本上都说英文,以我的英文水平🤣去观看真是一言难尽,所以就想着看能不能在谷歌浏览器上找一个插件来进行翻译,结果还真让我找到了一个不错的Youtube翻译插件,它…

AI大模型高效题库生成:业务人效提升的强大助力

一 现状问题 1、培训考核涉及的文件数量较多 当前,京东航空公司维修部门面临着人员规模的快速增长和持续的培训需求。根据民航局的规定,维修培训必须确保所有维修人员都能够完成对飞机维修相关文件的学习,这包括维修方案、维修工程管理手册…

Anaconda环境迁移之conda pack

目录 1. conda pack安装2. 环境打包3. 拷贝环境包到目标电脑4. 激活环境5. 大功告成 1. conda pack安装 源电脑安装conda pack conda install conda-pack2. 环境打包 假如环境名为test,那么打包命令如下: conda pack -n test -o test.tar.gz打包后的…

使用Python+MoviePy给视频添加字幕或水印

一、使用CompositeVideoClip将使用TextClip创建文字类与视频叠加在一起,给视频添加字幕或水印 from moviepy.editor import *# 从本地载入视频myHolidays.mp4,并截取00:00:50 - 00:00:60部分 clip VideoFileClip("/home/Download/Mojito.mp4"…

如果忘记了 Apple ID 密码,如何重设

“我忘记了我的 Apple ID 密码,如何恢复我的帐户?”为了方便用户,Apple 允许每个人使用唯一的 Apple ID 和密码激活设备并访问所有 Apple 服务。然而,实际上,手动选择某项并忘记它似乎很容易。例如,许多 Ap…

带你速通C语言——指针(10)

指针是C语言中最强大但也最容易引起困惑的概念之一。它们直接关联内存管理,使得程序员可以高效地操作数据和内存。下面我将尽量以简单明了的方式介绍指针的基本概念。 1.指针基础 指针本质上是存储内存地址的变量,这个地址指向一个值。通过指针&#xf…

Vue中调整组件的高度及其他样式

在Vue组件中&#xff0c;如果想让一个组件如<MapContainer />变长&#xff0c;你可以使用CSS来调整它的高度。以下是一些可能的方法&#xff1a; 设置固定高度&#xff1a;直接给<MapContainer />组件设置一个高度值。 .MapContainer {height: 300px; /* 你可以根据…

论文中绘制神经网络工具汇总

论文中绘制神经网络工具汇总_convnetdraw-CSDN博客 这哥们总结的还是比较全面的&#xff01;

MongoDB如何实现大于小于查询

MongoDB是一个高性能、开源、无模式的文档型数据库&#xff0c;它使用BSON&#xff08;Binary JSON&#xff09;作为存储格式&#xff0c;支持丰富的查询语法&#xff0c;包括大于&#xff08; g t &#xff09;、小于&#xff08; gt&#xff09;、小于&#xff08; gt&#x…