STM32 极速入门第一天基础拓展 驱动i2c屏幕 ( 使用PlatformIO开发STM32单片机 )
输入输出模式解析
输出模式
在输出模式下,通常不需要设置上下拉电阻.
输出电平由
LL_GPIO_SetOutputPin
和LL_GPIO_ResetOutputPin
函数直接控制。
输入模式
在输入模式下,设置上下拉电阻是非常重要的.
输入引脚悬空时可能会导致不确定的电平,从而引起误触发或噪声。
初始设置相关资料
- 引脚模式:输入、输出、复用功能等。
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_INPUT); //输入
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_OUTPUT);//输出
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_ALTERNATE);//复用
1. 复用功能(Alternate Function)
复用功能允许GPIO引脚用于外设的功能,例如USART、SPI、I2C等。每个GPIO引脚可以配置为多种复用功能之一。
假设我们要将GPIOA第9引脚配置为USART1的TX引脚:
// 使能GPIOA时钟
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);// 配置GPIOA第9引脚为复用功能模式
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_9, LL_GPIO_MODE_ALTERNATE);// 设置引脚速度为高速
LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_9, LL_GPIO_SPEED_FREQ_HIGH);// 设置引脚输出类型为推挽输出
LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_9, LL_GPIO_OUTPUT_PUSHPULL);// 设置引脚上拉/下拉电阻为无
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_9, LL_GPIO_PULL_NO);
- 输出类型:推挽、开漏等。
LL_GPIO_SetPinOutputType(GPIOC, LL_GPIO_PIN_13, LL_GPIO_OUTPUT_PUSHPULL); //推挽
LL_GPIO_SetPinOutputType(GPIOC, LL_GPIO_PIN_13, LL_GPIO_OUTPUT_OPENDRAIN);//开漏
推挽输出(Push-Pull)
- 特点:引脚可以输出高电平和低电平。
- 用途:适用于大多数通用输出场景。
开漏输出(Open-Drain)
- 特点:引脚只能输出低电平,高电平需要外部上拉电阻。
- 用途:适用于需要外部上拉电阻的场景,如I2C通信。
- 速度:低速、中速、高速、非常高速等。
LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_13, LL_GPIO_SPEED_FREQ_LOW);//低
LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_13, LL_GPIO_SPEED_FREQ_MEDIUM);//中
LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_13, LL_GPIO_SPEED_FREQ_HIGH);//高
LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_13, LL_GPIO_SPEED_FREQ_VERY_HIGH);//非常高
速度解析
低速(Low Speed)
- 特点:最低的输出速度,适用于低频信号。
- 用途:适用于对速度要求不高的场景。
中速(Medium Speed)
- 特点:中等的输出速度。
- 用途:适用于一般的输出场景。
高速(High Speed)
- 特点:较高的输出速度。
- 用途:适用于对速度有一定要求的场景。
非常高速(Very High Speed)
- 特点:最高的输出速度。
- 用途:适用于对速度要求很高的场景。
- 上下拉电阻:上拉、下拉、无等。
LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_13, LL_GPIO_PULL_UP);//上拉
LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_13, LL_GPIO_PULL_DOWN);//下拉
LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_13, LL_GPIO_PULL_NO);//无上下拉 可忽略
- 中断和事件:配置中断和事件触发条件
// 使能GPIOC时钟 LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);// 配置GPIOC第13引脚为输入模式 LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_INPUT);// 设置上拉电阻 LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_13, LL_GPIO_PULL_UP);// 使能外部中断线 LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_13);// 选择GPIOC第13引脚作为外部中断源 LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTC, LL_SYSCFG_EXTI_LINE13);// 使能NVIC中断 NVIC_EnableIRQ(EXTI15_10_IRQn);// 设置中断优先级 NVIC_SetPriority(EXTI15_10_IRQn, 1);// 中断服务例程 void EXTI15_10_IRQHandler(void) {if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_13) != RESET) {// 清除中断标志LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_13);// 处理中断// ...} }
驱动i2c屏幕
可能是有什么问题没有调试通代码放在这里坐等有人解答!
#include <stm32f1xx_hal.h>
#include <stm32f1xx_hal_gpio.h>
#include <stm32f1xx_hal_spi.h>
#include <stm32f1xx_hal_rcc.h>SPI_HandleTypeDef hspi1; // SPI句柄
const char *s;// 初始化序列
// 初始化序列
uint8_t init_sequence[] = {0xAE, // 关闭 OLED 显示面板0x15, 0x00, 0x7F, // 设置列地址范围,起始值为 0,结束值为 1270x75, 0x00, 0x7F, // 设置行地址范围,起始值为 0,结束值为 1270x81, 0x80, // 设置对比度控制,对比度值为 1280xA0, 0x51, // 段重映射,设置段重映射方式0xA1, 0x00, // 设置显示起始行,起始行地址为 00xA2, 0x00, // 设置显示偏移,偏移值为 00xA4, // 设置正常显示模式0xA8, 0x7F, // 设置多路复用比率,多路复用比率为 1270xB1, 0xF1, // 设置相位长度0xB3, 0x00, // 设置 DCLK,设置 DCLK 为 100 Hz0xAB, 0x01, // 启动内部振荡器0xB6, 0x0F, // 设置相位长度0xBE, 0x0F, // 设置 VCOMH 电压0xBC, 0x08, // 设置预充电周期0xD5, 0x62, // 设置显示时钟分频0xFD, 0x12, // 设置命令锁存0xA0, 0x51, // 再次设置扫描方式,设置扫描方式从左往右,从上到下0xAF, // 打开 OLED 显示面板
};void spiinit()
{// 第一步开启时钟__HAL_RCC_SPI1_CLK_ENABLE(); // SPI1__HAL_RCC_GPIOA_CLK_ENABLE(); // PA// 第二步设置引脚GPIO_InitTypeDef GPIO_InitStructure; // GPIO初始化结构体// MOSIGPIO_InitStructure.Pin = GPIO_PIN_5;GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;GPIO_InitStructure.Pull = GPIO_NOPULL;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);// MISOGPIO_InitStructure.Pin = GPIO_PIN_6;GPIO_InitStructure.Mode = GPIO_MODE_INPUT;GPIO_InitStructure.Pull = GPIO_NOPULL;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);// NSSGPIO_InitStructure.Pin = GPIO_PIN_4;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Pull = GPIO_PULLDOWN;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);// 第三步设置SPIhspi1.Instance = SPI1; // SPI1hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 双线模式hspi1.Init.Mode = SPI_MODE_MASTER; // 主机模式hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 8位hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // 低电平hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // 上升沿hspi1.Init.NSS = SPI_NSS_SOFT; // 软件片选hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 100MHzhspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // 高位在前hspi1.Init.TIMode = SPI_TIMODE_DISABLE; // 硬件模式hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // CRC校验hspi1.Init.CRCPolynomial = 7; // CRC校验if (HAL_SPI_Init(&hspi1) != HAL_OK){// 初始化失败处理while (1);}__HAL_SPI_ENABLE(&hspi1); // 使能SPI
}void spi_select()
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 选择从设备
}void spi_deselect()
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 取消选择从设备
}uint8_t spi_write(uint8_t data)
{uint8_t rdata;HAL_SPI_Transmit(&hspi1, &data, 1, 1000);return rdata;
}int main()
{spiinit(); // 初始化s = "hello world";// 发送初始化序列for (int i = 0; i < sizeof(init_sequence) / sizeof(init_sequence[0]); i++){spi_select();spi_write(init_sequence[i]);HAL_Delay(10);spi_deselect();HAL_Delay(10);}while (*s){spi_deselect();HAL_Delay(10);spi_write(*s);s++;spi_select();HAL_Delay(10);}while (1);
}
相关文章:
STM32 极速入门第一天基础拓展 驱动i2c屏幕 ( 使用PlatformIO开发STM32单片机 )
输入输出模式解析 输出模式 在输出模式下,通常不需要设置上下拉电阻. 输出电平由 LL_GPIO_SetOutputPin 和 LL_GPIO_ResetOutputPin 函数直 接控制。 输入模式 在输入模式下,设置上下拉电阻是非常重要的. 输入引脚悬空时可能会导致不确定的电平…...
【WPF】Prism学习(五)
Prism Commands 1.错误处理(Error Handling) Prism 9 为所有的命令(包含AsyncDelegateCommand)提供了更好的错误处理。 避免用try/catch包装每一个方法根据不同遇到的异常类型来提供特定的逻辑处理可以在多个命令之间共享错误处…...
RabbitMQ的基本概念和入门
RabbitMQ 的基本概念和入门 RabbitMQ 是一款流行的开源消息队列中间件,实现了高级消息队列协议(AMQP)。它使用Erlang语言编写,具备高可用性、可扩展性和易用性等特点,广泛应用于各种分布式系统中。本文将详细介绍Rabb…...
Shell脚本6 -- 条件判断if
声明: 本文的学习内容来源于B站up主“泷羽sec”视频【shell编程(4)脚本与用户交互以及if条件判断】的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题,…...
经验笔记:从生成 SSH 密钥到成功连接测试(以Gitee为例)
从生成 SSH 密钥到成功连接测试的经验笔记(以Gitee为例) 1. 生成 SSH 密钥对 选择合适的加密算法 ED25519: 密钥长度:私钥 256 位(32 字节),公钥 256 位(32 字节)&#…...
Object.defineProperty和响应式
Object.defineProperty()是一个监听对象属性变化的方法。一般情况下我们是不会直接使用的,或者说我们遇到的场景还没有这么高级。 最有名的例子就是Vue2的响应式实现,就是通过这个方法来实现的。 用起来不难,就是个API,只是用的…...
前端web
题目:制作带有下拉悬停菜单的导航栏 效果图 一、先制作菜单栏 <body> <div id"menu"> <div id"container"> <div class"item">游戏1 <div cla…...
DDNet 服务器配置教程 Linux 环境
DDNet 服务器配置教程 Linux 环境 配置之前可以参考一下官方网址给出的内容 官方网址:DDNet官方 环境说明 OS: Debian 11 安装 可以直接从官网下载,也可以使用这个链接: Linux_DDNet 下载链接 上文中给的链接会因为更新而出现版本落后的情况&#x…...
Vue 2 —监视器实现动态切换表单属性值
目录 一、需求背景 二、监视器语法 三、实例展示 1、HTML部分 2、JS部分 四、使用场景总结 1. 表单验证 2. 动态更新 UI 3. 数据同步 4. 计算属性的替代方案 计算属性的优势 : 简洁性: 监视器的优势 : 灵活性: 多属性依赖: 副…...
Qt_day10_程序打包(完结)
目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的,用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包,用户直接下载并安装即可使用…...
golang通用后台管理系统09(系统操作日志记录)
1.日志工具类 package log/**** 日志记录 wangwei 2024-11-18 15:30*/ import ("log""os""path/filepath""time" )// 获取以当前日期命名的日志文件路径 func getLogFilePath() string {currentDate : time.Now().Format("2006-…...
如何确保爬取的数据准确性和完整性?
在数据驱动的业务环境中,爬虫程序的准确性和完整性至关重要。本文将探讨如何使用Java编写爬虫程序,并确保其在爬取数据时的准确性和完整性。 1. 精确的HTML解析 确保数据准确性的第一步是精确地解析HTML。Jsoup是Java中常用的HTML解析库,它提…...
【java】JDK安装
Java Downloads | Oracle 中国 next 注意安装的路径 环境变量...
科技改变工作方式:群晖NAS安装内网穿透实现个性化办公office文档分享(1)
文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 本文将详细介绍如何在群晖NAS上安装Synology Office和Synology Drive Server,并利用Cpolar内网穿透工具为本地文档配置固定的公网…...
基于Java Springboot甘肃旅游管理系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
03-axios常用的请求方法、axios错误处理
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
《天体》游戏配置要求介绍
《天体》是一款太空探索和基地建造生存游戏,而游戏的画面表现非常不错,需要的配置要求也不算高,CPU最低只需要英特尔的酷睿i3 4XXX 系列或者AMD的Ryzen 3 2.6ghz处理器。 天体要什么配置最低配置: 需要 64 位处理器和操作系统 操作系统 *: …...
【企业级分布式系统】 Kafka集群
文章目录 KafkaKafka 概述使用消息队列的好处 Kafka 的特性Kafka 系统架构Kafka 的应用场景Kafka 的优缺点 Kafka 集群部署下载安装包安装 KafkaKafka 命令行操作Kafka 架构深入 FilebeatKafkaELK 部署指南~部署 ZookeeperKafka 集群部署 Filebeat部署 ELK(Logstash…...
MySQL 中有哪几种锁?
在 MySQL 中,锁(Locks)是为了保证数据的一致性和完整性而设计的机制。常见的锁可以从粒度和操作类型两个角度分类。以下是详细介绍: 按 粒度 分类 1. 全局锁 描述:锁定整个数据库实例。用途:主要用于备份…...
kafka中节点如何服役和退役
节点服役(添加新节点) 1.准备新节点: 安装 Kafka 和相关依赖。 配置 Kafka Broker 的 server.properties 文件,确保 broker.id 是唯一的,并且配置正确的 zookeeper.connect 地址。 重启网卡 2.启动新节点ÿ…...
HTML5实现剪刀石头布小游戏(附源码)
文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…...
集群聊天服务器(3)muduo网络库
目录 基于muduo的客户端服务器编程 muduo只能装在linux中,依赖boost库 客户端并不需要高并发 基于muduo的客户端服务器编程 支持epoll线程池,muduo封装了线程池 而且还有完善的日志系统 使用muduo库代码非常固定,基本就只有chatserver的类名…...
解决在Ubuntu 20.04中使用PyCharm时无法输入中文的问题
解决在Ubuntu 20.04中使用PyCharm时无法输入中文的问题 要解决在Ubuntu 20.04中使用PyCharm时无法输入中文的问题,特别是当使用IBus作为输入法框架时,我们需要通过设置适当的环境变量来确保PyCharm可以正确调用IBus输入法。下面将详细说明原因及解决步骤…...
【jvm】HotSpot中方法区的演进
目录 1. 说明2. JDK1.6及以前3. JDK1.74. JDK1.8及以后 1. 说明 1.在HotSpot虚拟机中,方法区(Method Area)的演进是一个重要的内存管理优化过程。2.从JDK1.6到JDK1.8,HotSpot虚拟机中的方法区经历了从永久代到元空间的重大变化。…...
Win10/11 安装使用 Neo4j Community Edition
如果你下载的是 Neo4j Community Edition 的压缩包,意味着你需要手动解压并配置 Neo4j。以下是详细的使用步骤: 0. 下载压缩包 访问Neo4j官网,找到 Community Edition 版本并选择 4.x 或者 5.x 下载:https://neo4j.com/deployme…...
Ubuntu 22.04 上快速搭建 Samba 文件共享服务器
Samba 简介 Samba 是一个开源软件,它扮演着不同操作系统间沟通的桥梁。通过实现 SMB(Server Message Block)协议,Samba 让文件和打印服务在 Windows、Linux 和 macOS 之间自由流动。 以下是 Samba 的特点: 跨平台兼…...
JQuery 基础知识学习(详尽版)2024.11.17
一、jQuery简介及使用详解 1.1 jQuery简介 写更少的代码,做更多的事;jQuery可以做:HTML 元素选取 , HTML 元素操作 ,CSS 操作 ,HTML 事件函数 ,JavaScript 特效和动画 ,HTML DOM 遍…...
Spring Validation参数校验
Validation Validation是Spring提供的一个参数校验框架,使用预定义的注解完成参数校验 使用步骤 引入Spring Validation起步依赖在需要校验的参数所在的类上添加Validated注解在需要校验的参数前面加上Pattern注解 <!--参数校验依赖--><dependency>&l…...
高斯数据库Postgresql死锁和锁表解决方法
解决死锁进方法: 查询死锁进程列表 select * from pg_stat_activity where waiting‘t’ 发现有好几条挂起的记录,记录下所有或需要解锁的pid 解决死锁进程 select pg_cancel_backend(‘pid值’) 解决完后,刷新后测试,恢复正…...
【设计模式】模板方法模式 在java中的应用
设计模式: 设计模式是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由Erich Gamma等人在1995年的书《设计模式:可复用面向对象软件的基础》中首次引入的。设计模式可以加快开发过程&#x…...
网站建设的关键问题/站长之家seo概况查询
http://www.jiawin.com/pace-js-automatic-page-load-progress-bar转载于:https://www.cnblogs.com/liuqiuchen/p/4674234.html...
微信是哪个公司开发的软件/上海seo网络优化
1 基于80x86的Linux分段机制 80386的两种工作模式:80386的工作模式包括实地址模式和虚地址模式(保护模式)。Linux主要工作在保护模式下。 在保护模式下,80386虚地址空间可达16K个段,每段大小可变,最大达4…...
dedecms wordpress/网站推广计划书范文
2019独角兽企业重金招聘Python工程师标准>>> 0.前言 本人14年12月份,从网站开发组转到了移动开发组,自己的java两年半工作经验变成了objective-c零经验。2015年1月份新启动了一个移动项目,年后因为人事变动,自己从辅助…...
wordpress支持大文件上传/免费b站动漫推广网站2023
本文实例为大家分享了HTML5图片在线预览的具体代码,供大家参考,具体内容如下HTML5图片预览.hide{display:none;}请选择一张JPG/GIF的图片$("#file0").change(function(){var objUrl getObjectURL(this.files[0]) ;console.log("objUrl …...
南京网站建设开发公司/百度关键词收录
词性标注 标注语料库; 各词性标注及其含义 自动标注器; 默认标注器;正则表达式标注器;查询标注器; N-gram标注器; 一元标注器;分离训练和测试数据;一般的N-gram的标注࿱…...
太原工程建设招投标信息网站/推广优化网站排名
1.Entity位于类名前;指出该Java类为实体类,并且将映射到指定的数据库表;比如:Emp类前名加上该注解后,就可以和配置的数据库中的emp表相互映射了;2.Table位于类名前当实体类名和映射的表名不一致时ÿ…...