Clion开发STM32之HAL库SPI封装(基础库)

前言

引用参考:

  1. Clion开发STM32之HAL库GPIO宏定义封装(最新版)

头文件

/********************************************************************************  Copyright (c) [scl]。保留所有权利。*     本文仅供个人学习和研究使用,禁止用于商业用途。******************************************************************************/
#ifndef STM32_F1XX_TEMPLATE_BSP_SPI_H
#define STM32_F1XX_TEMPLATE_BSP_SPI_H#include "bsp_include.h"#define SPI_DEFAULT_CNF {\.Mode = SPI_MODE_MASTER, /*主机模式*/\.Direction = SPI_DIRECTION_2LINES, /*全双工*/\.DataSize = SPI_DATASIZE_8BIT,/*数据大小:(字节)*/\.CLKPolarity = SPI_POLARITY_LOW,/*时钟极性, 空闲状态为低*/\.CLKPhase = SPI_PHASE_2EDGE, /*时钟相位, 在第二边沿采集数据*/\.NSS = SPI_NSS_SOFT,/*软件使能*/\.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2,/*波特率分频: 2分频*/\.FirstBit = SPI_FIRSTBIT_MSB,/*数据位传输方式:从高到低*/\.TIMode = SPI_TIMODE_DISABLE, /*TI 模式禁止*/\.CRCCalculation = SPI_CRCCALCULATION_DISABLE,/*CRC校验禁用*/\.CRCPolynomial = 7,/*CRC检验禁用,此值无意义*/\}/*** CPOL: 时钟极性,控制在没有数据传输时,@note 时钟线的电平状态*          0: @note 空闲状态时,时钟线的电平为(低电平)*          1: @note 空闲状态时. 时钟线的电平为 (高电平)* CPHA: 时钟相位,数据采样的位置*          1:@note 在时钟的第2个边沿进行数据采集(CPOL为1: 上升沿采数据,CPOL为0:下降沿采数据)*          0: @note 在时钟的第1个边沿进行数据采集(CPOL为1: 下降沿采数据,CPOL为0: 上升沿采数据)* */
typedef enum {/**模式0 CPOL:0,CPHA:0 ; 时钟空闲状态为(低电平),在第一个时钟边沿采数据(时钟上升沿采数据) */spi_mode_0,/**模式1 CPOL:0,CPHA:1 ; 时钟空闲状态为(低电平),在第二个时钟边沿采数据(时钟下降沿采数据)*/spi_mode_1,/**模式2 CPOL:1,CPHA:0 ; 时钟空闲状态为(高电平),在第一个时钟边沿采数据(时钟下降沿采数据)*/spi_mode_2,/**模式3 CPOL:1,CPHA:1 ; 时钟空闲状态为(高电平),在第二个时钟边沿采数据(时钟上升沿采数据)*/spi_mode_3,
} spi_mode_type;/********************************SPI1 配置**********************************************/
/**SPI1 GPIO ConfigurationPA5     ------> SPI1_SCKPA6     ------> SPI1_MISOPA7     ------> SPI1_MOSI*/
#define SPI1_SCK PA5
#define SPI1_MISO PA6
#define SPI1_MOSI PA7void spi1_gpio_msp_init();void spi1_gpio_msp_de_init();/********************************SPI2 配置**********************************************/
#define SPI2_SCK PB13
#define SPI2_MISO PB14
#define SPI2_MOSI PB15void spi2_gpio_msp_init();void spi2_gpio_msp_de_init();/********************************SPI3 配置**********************************************/
void bsp_SpiHandleInit(SPI_HandleTypeDef *handle, uint32_t BaudRatePrescaler, spi_mode_type mode);#endif //STM32_F1XX_TEMPLATE_BSP_SPI_H

源文件

/********************************************************************************  Copyright (c) [scl]。保留所有权利。*     本文仅供个人学习和研究使用,禁止用于商业用途。******************************************************************************/
#include "bsp_spi.h"void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) {if (hspi->Instance == SPI1) {__HAL_RCC_SPI1_CLK_ENABLE();spi1_gpio_msp_init();} else if (hspi->Instance == SPI2) {/* SPI2 clock enable */__HAL_RCC_SPI2_CLK_ENABLE();spi2_gpio_msp_init();} else if (hspi->Instance == SPI3) {}}void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) {if (hspi->Instance == SPI1) {__HAL_RCC_SPI1_CLK_DISABLE();spi1_gpio_msp_de_init();} else if (hspi->Instance == SPI2) {/* SPI2 clock enable */__HAL_RCC_SPI2_CLK_DISABLE();spi2_gpio_msp_de_init();} else if (hspi->Instance == SPI3) {}
}void bsp_SpiHandleInit(SPI_HandleTypeDef *handle, uint32_t BaudRatePrescaler, spi_mode_type mode) {if (handle == NULL) {error_handle();} else {handle->Init.BaudRatePrescaler = BaudRatePrescaler;switch (mode) {case spi_mode_0:handle->Init.CLKPhase = SPI_PHASE_1EDGE;handle->Init.CLKPolarity = SPI_POLARITY_LOW;break;case spi_mode_1:handle->Init.CLKPhase = SPI_PHASE_2EDGE;handle->Init.CLKPolarity = SPI_POLARITY_LOW;break;case spi_mode_2:handle->Init.CLKPolarity = SPI_POLARITY_HIGH;handle->Init.CLKPhase = SPI_PHASE_1EDGE;break;case spi_mode_3:handle->Init.CLKPolarity = SPI_POLARITY_HIGH;handle->Init.CLKPhase = SPI_PHASE_2EDGE;break;}if (HAL_SPI_Init(handle) != HAL_OK) {error_handle();}}
}
/********************************SPI1 配置**********************************************/
__weak void spi1_gpio_msp_init() {stm32_pin_define_mode_set(stm_get_pin(SPI1_SCK), pin_mode_output_af_pp);stm32_pin_define_mode_set(stm_get_pin(SPI1_MISO), pin_mode_input);stm32_pin_define_mode_set(stm_get_pin(SPI1_MOSI), pin_mode_output_af_pp);
}__weak void spi1_gpio_msp_de_init() {stm32_pin_define_reset(stm_get_pin(SPI1_SCK));stm32_pin_define_reset(stm_get_pin(SPI1_MISO));stm32_pin_define_reset(stm_get_pin(SPI1_MOSI));
}/********************************SPI2 配置**********************************************/
__weak void spi2_gpio_msp_init() {stm32_pin_define_mode_set(stm_get_pin(SPI2_SCK), pin_mode_output_af_pp);stm32_pin_define_mode_set(stm_get_pin(SPI2_MISO), pin_mode_input);stm32_pin_define_mode_set(stm_get_pin(SPI2_MOSI), pin_mode_output_af_pp);
}__weak void spi2_gpio_msp_de_init() {stm32_pin_define_reset(stm_get_pin(SPI2_SCK));stm32_pin_define_reset(stm_get_pin(SPI2_MISO));stm32_pin_define_reset(stm_get_pin(SPI2_MOSI));
}

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

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

相关文章

92 | Python 设计模式 —— 工厂模式

文章目录 什么是工厂模式?工厂模式的优点工厂模式的实现方式简单工厂模式(Simple Factory Pattern)抽象工厂模式(Abstract Factory Pattern)Python工厂模式示例1. 简单工厂模式2. 抽象工厂模式总结什么是工厂模式? 在软件设计中,工厂模式是一种创建型设计模式,它提供了…

网络安全---正则回溯

目录 一、题目引入 二、举出回溯例子进行分析 第一步: 正则往前匹配 第二步:匹配到头 第三步:往回匹配 第四步:直到分号结束 (匹配上) 原因: 三、进入正题一(分析题型&#x…

【人工智能概述】python妙用 __str__()

【人工智能概述】python妙用 str() 文章目录 【人工智能概述】python妙用 __str__()一.python内置函数__str__() 一.python内置函数__str__() 通过自定义__str__()函数可以打印对象中相关的内容。 class Person(object):def __init__(self, name tom, age 10):self.name n…

MongoDB创建用户 、数据库、索引等基础操作

MongoDB的权限认证是相对来说比较复杂的,不同的库创建后需要创建用户来管理。 本机中的MongoDB是docker 启动的,所以先进入docker的镜像中 docker exec -it mongodb bash 这样就进入到了镜像MongoDB中,然后输入命令连接MongoDB数据库 注…

有效管理IT问题的5个原则

问题管理就是发现未知的、隐藏的问题,这是根本原因, 这是您 IT 帮助台无穷无尽的工单来源。当您实施有效的 问题管理,您的 IT 团队可以超越消防模式,专注于战略 IT 目标。以下是可以帮助您实现一流问题管理的五个原则:…

网络安全 Day30-运维安全项目-堡垒机部署

运维安全项目-堡垒机部署 1. 运维安全项目-架构概述2. 运维安全项目之堡垒机2.1 堡垒机概述2.2 堡垒机选型2.3 环境准备2.4 部署Teleport堡垒机2.4.1 下载与部署2.4.2 启动2.4.3 浏览器访问teleport2.4.4 进行配置2.4.5 安装teleport客户端 2.5 teleport连接服务器 1. 运维安全…

二叉树的前中后序遍历(Leetcode 94144145)

题目 ​​​​​​144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历 代码 分为三种方法1&#xff09;递归遍历&#xff1b;2&#xff09;迭代遍历&#xff1b;3&#xff09;统一迭代遍历 递归遍历 public List<Integer> preorderTraversal(TreeNod…

中介者模式(Mediator)

中介者模式是一种行为设计模式&#xff0c;可以减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个封装了对象间交互行为的中介者对象来进行合作&#xff0c;从而使对象间耦合松散&#xff0c;并可独立地改变它们之间的交互。中介者…

开源语言模型的历史和重要性;Edge浏览器将推出Bing AI重写文本功能

&#x1f989; AI新闻 &#x1f680; 微软即将推出桌面版Microsoft Edge浏览器的Bing AI重写文本功能 摘要&#xff1a;微软最近在桌面版Microsoft Edge浏览器中引入了一个新功能&#xff0c;允许用户使用Bing AI重写文本。用户可以选择不同的语气、格式和长度&#xff0c;然…

SpringMVC的架构有什么优势?——异常处理与文件上传(五)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

oracle不小心将表update修改了如何回滚

oracle提供了一种闪回的方法&#xff0c;可以将某个时间的数据给还原回来 SELECT* FROMT_DIS_EVENT_RELATION_TYPE AS OF TIMESTAMP TO_TIMESTAMP (2023-08-08 15:31:00,yyyy-mm-dd hh24:mi:ss); T_DIS_EVENT_RELATION_TYPE 是误操作&#xff0c;需要闪回的表 2023-08-08 15…

java面试---字符串相关内容

字符串 1. 什么是Java中的字符串池&#xff08;String Pool&#xff09;&#xff1f;2. String、StringBuilder和StringBuffer之间的区别是什么&#xff1f;3. 如何比较两个字符串的内容是否相等&#xff1f;4、equals和的区别5. String类有哪些常用的方法&#xff1f; 1. 什么…

Android T 窗口层级相关的类(更新中)

窗口在App端是以PhoneWindow的形式存在&#xff0c;承载了一个Activity的View层级结构。这里我们探讨一下WMS端窗口的形式。 窗口容器类 —— WindowContainer类 /*** Defines common functionality for classes that can hold windows directly or through their* children …

(十二)大数据实战——hadoop集群之HDFS高可用自动故障转移

前言 本节内容主要介绍一下hadoop集群下实现HDFS高可用的自动故障转移&#xff0c;HDFS高可用的自动故障转移主要通过zookeeper实现故障的监控和主节点的切换。自动故障转移为 HDFS 部署增加了两个新组件&#xff1a;ZooKeeper 和 ZKFailoverController &#xff08;ZKFC&…

SolidUI社区-通用Prompt技巧

背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…

Spring Boot统一处理功能——拦截器

1.用户登录权限校验 ⽤户登录权限的发展从之前每个⽅法中⾃⼰验证⽤户登录权限&#xff0c;到现在统⼀的⽤户登录验证处理&#xff0c;它是⼀个逐渐完善和逐渐优化的过程。 1.1最初用户登录 我们先来回顾⼀下最初⽤户登录验证的实现⽅法&#xff1a; RestController RequestMap…

W6100-EVB-PICO作为TCP Client 进行数据回环测试(五)

前言 上一章我们用W6100-EVB-PICO开发板通过DNS解析www.baidu.com&#xff08;百度域名&#xff09;成功得到其IP地址&#xff0c;那么本章我们将用我们的开发板作为客户端去连接服务器&#xff0c;并做数据回环测试&#xff1a;收到服务器发送的数据&#xff0c;并回传给服务器…

uniapp使用命令创建页面

package.js下创建命令 "scripts": {"add": "node ./auto/addPage.ts" } package.js同级目录创建auto/addPage.ts addPage.ts代码如下 const fs require(fs) const path require(path) const targetPath process.argv[2];// 要创建的目录地…

JavaWeb学习|JSP相关内容

1.什么是JSP Java Server Pages: Java服务器端页面&#xff0c;也和Servlet一样&#xff0c;用于动态Web技术! 最大的特点: 。写JSP就像在写HTML 。区别: 。HTML只给用户提供静态的数据 。JSP页面中可以嵌入JAVA代码&#xff0c;为用户提供动态数据 JSP最终也会被转换成为一…

Java基础六 - Collection集合List、Set、Queue,Map

1. List - ArrayList、LinkedList、Vector ArrayList 1. 可以有重复元素 2. 超出后自动增加大小&#xff0c;增加一半。会自动重新分配更大的数组&#xff0c;并将元素复制到新数组中 3. 通过索引保存值&#xff0c;访问可以通过索引访问&#xff0c;更加高效。但是添加/删除…