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);
}

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

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

相关文章

51c自动驾驶~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/11638131 #端到端任务 说起端到端&#xff0c;每个从业者可能都觉得会是下一代自动驾驶量产方案绕不开的点&#xff01;特斯拉率先吹响了方案更新的号角&#xff0c;无论是完全端到端&#xff0c;还是专注于planner的模型&a…

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器&#xff0c;将OpenCV中lib库里的o…

蓝牙音响音频功放:【矽源特HAA9809 AB+D类自动切换】

目录 1&#xff1a;HAA9809特性 2&#xff1a;典型应用电路 3&#xff1a;CTRL管脚控制信息 4&#xff1a;一线脉冲控制方式 5&#xff1a;输入电阻&#xff0c;调节放大增益 6&#xff1a;输入电容&#xff0c;调节频响 7&#xff1a;总结 矽源特ChipSourceTek-HAA9809…

大语言模型安全,到底是什么的安全

什么是AI安全 自ChatGPT问世以来&#xff0c;市场上涌现出了众多大型语言模型和多样化的AI应用。这些应用和模型在为我们的生活带来便利的同时&#xff0c;也不可避免地面临着安全挑战。AI安全&#xff0c;即人工智能安全&#xff0c;涉及在人工智能系统的开发、部署和使用全过…

云岚到家 秒杀抢购

目录 秒杀抢购业务特点 常用技术方案 抢券 抢券界面 进行抢券 我的优惠券列表 活动查询 系统设计 活动查询分析 活动查询界面显示了哪些数据&#xff1f; 面向高并发如何提高活动查询性能&#xff1f; 如何保证缓存一致性&#xff1f; 数据流 Redis数据结构设计 如…

餐饮点餐系统(2)

今天我们继续完成我们的项目&#xff0c;本次的目标是为每一个分支选项&#xff0c;创建菜单。 分析&#xff1a;1.首先我们要为每一个分支选项创建一个函数 2.其次是调用我们创建的函数 3.最后创建的自定义函数中会用到&#xff0c;while语句&#xff0c;switch语句&#xff…

某军工变压器企业:通过集团级工业IOT平台,实现数字化转型

概述 近年来&#xff0c;随着全球电力需求的增长和智能电网的推进&#xff0c;变压器市场规模持续扩大。2023年&#xff0c;全球配电变压器市场规模达到143.21亿美元&#xff0c;同比增长8.12%。中国配电变压器市场规模在2023年达到194.35亿元&#xff0c;同比增长14.53%‌。此…

caozha-CEPCS(新冠肺炎疫情防控系统)

caozha-CEPCS&#xff0c;是一个基于PHP开发的新冠肺炎疫情防控系统&#xff0c;CEPCS&#xff08;全称&#xff1a;COVID-19 Epidemic Prevention and Control System&#xff09;&#xff0c;可以应用于单位、企业、学校、工业园区、村落等等。小小系统&#xff0c;希望能为大…

第8章利用CSS制作导航菜单

8.1 水平顶部导航栏 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><center><h3>简单水平菜单导航栏</h3></center><hr /><nav><ul&g…

《青牛科技GC6150:摇头机驱动芯片的卓越替代品,超越 TMI8150》

在终端工程师们精心打造的科技世界里&#xff0c;摇头机的性能优化一直是关注焦点。今天&#xff0c;我们要向各位终端工程师介绍一款具有革命性的驱动芯片 —— 芯麦 GC6150&#xff0c;它宛如一颗耀眼的明星&#xff0c;在摇头机驱动领域绽放光芒&#xff0c;并且能够完美替代…

C++转义序列

\b \b是一个退格符&#xff08;backspace character&#xff09;&#xff0c;它的作用是将光标向左移动一个位置&#xff0c;但并不会删除光标位置上的字符。这个行为在某些情况下可能会导致视觉上的字符“消失”&#xff0c;但实际上这些字符仍然存在于输出缓冲区中&#xf…

Chrome DevTools Protocol 入门:快速开始

Chrome DevTools Protocol&#xff08;CDP&#xff09; 是一套开放协议&#xff0c;允许外部程序通过 Chrome 浏览器提供的接口与其进行交互。CDP 提供了丰富的功能&#xff0c;使开发者可以远程控制 Chrome 浏览器&#xff0c;包括操作 DOM、监控网络请求、调试代码、截取屏幕…

TCP协议详解

一、整体抓包情况 192.168.111.1:53965请求向192.168.111.128:80发起TCP连接。 注意&#xff1a;TCP连接是TCP端口向TCP端口的连接。 二、TCP连接请求&#xff08;三次握手&#xff09; 此处为简洁隐去端口号。 &#xff08;1&#xff09;192.168.111.1——>192.168.11…

vue+Springboot实现简单文件上传到本地

实现效果 点击上传文件按钮后&#xff0c;选择需要上传的文件&#xff0c;如果是图片的话&#xff0c;上传成功后可以直接在下面预览。 前端页面 <template><div class"file-upload"><el-upload:headers"getUploadConfig(token).headers"…

闯关leetcode——3206. Alternating Groups I

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/alternating-groups-i/description/ 内容 There is a circle of red and blue tiles. You are given an array of integers colors. The color of tile i is represented by colors[i]: colors[i…

QT Unknown module(s) in QT 以及maintenance tool的更详细用法(qt6.6.0)

不小心接了同事的委托&#xff0c;帮改一个qt的工程代码。然后出事了&#xff0c;那个proj是qt5.9版本的吧&#xff0c;搞到6.6版本的环境中各种问题。至少有3个是这样的&#xff1a; :-1: error: Unknown module(s) in QT: multimedia 直接百度&#xff0c;好像很简单&#x…

Springboot苍穹外卖实战:四、分页查询(PageHelper实现、日期格式转换)

分页查询 使用PageHelper插件实现。其实可以升级为MybatisPlus的。 接口设计 设计DTO类 com.sky.dto.EmployeePageQueryDTO 已设计好&#xff0c;为EmployeePageQueryDTO&#xff1b; 封装PageResult com.sky.result.PageResult com.sky.result.Result 已封装好&#xff0…

0x00基础算法 -- 0x03 前缀和与差分

1、前缀和 对于一个给定的数组A&#xff0c;它的前缀和数列S是通过递推求得的&#xff1a;//A[]和S[]的有效数据从下标1开始&#xff0c;方便后续计算 s[0] 0; for (int i 1; i < n; i) {s[i] s[i - 1] A[i]; } 作用&#xff1a;用于快速求得某一部分的和&#xff1a;对…

四焦距聚焦型光场计算成像系统的设计

摘要: 光场相机是一种在图像传感器前增加微透镜阵列的新型相机结构&#xff0c;除了记录不同位置下光的强度及颜色外&#xff0c;也记录不同位置下光线的方向信息&#xff0c;从而能够计算目标场景的深度图和高阶相位图。该技术由于景深和分辨率相互制约&#xff0c;获得大景深…

ubuntu18.04 配置安卓编译环境

目前有个项目&#xff0c;验收时有个要求是在linux中进行编译打包生成apk文件。我平时都是在windows环境android studio中进行打包的&#xff0c;花了半天时间研究了一下&#xff0c;记录如下&#xff1a; 安装安卓sdk cd /opt wget https://dl.google.com/android/reposito…