尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
STM32U575RIT6(SPI+数码管+LCD)
1.SPI总线简单介绍SPI接口是Motorola首先提出的全双工三/四线同步串行外围接口采用主从模式Master Slave架构。时钟由Master控制在时钟移位脉冲下数据按位传输高位在前低位在后MSB firstSPI接口有两根单向数据线为全双工通信。SPI总线被广泛地使用在FLASH、ADC、LCD等设备与MCU间要求通讯速率较高的场合。SPI总线的拓扑结构SPI总线通常会有四根线分别是时钟线、串行输入输出数据线、片选线。1.SCLK时钟线时钟信号由主机产生2.MOSI主机输出从机输入3.MISO主机输入从机输出4.NSS片选线选择和主机通信的从机低电平有效三线的使用场景在引脚资源受限的情况下单工只保留一根单向的数据线半双工保留一根双向的数据线SPI的字节交换原理主机产生时钟信号并且输送给从机。在SPI通信前主机将要发送的数据写入到发送数据寄存器/数据FIFO数据被传送到发送移位寄存器根据SPI的工作模式在特定的时钟边沿触发数据移位操作。主机通过MOSI引脚将移位寄存器中的数据位逐位发送给从机同时从机通过MISO引脚将自身的数据逐位发送给主机实现主机与从机之间的字节交换。字节交换原理基于位进行交换的。位交换分为了两部分移入和移除。移出把当前移位寄存器的最高位写到信号线上然后整体向左移动一位。移入采样读取信号线上的电平状态然后把读取到的电平状态放到移位寄存器的最低位。移入和移出是主机和从机同时进行的按照时钟线约定好的上升沿和下降沿。SPI的工作模式SPI的工作模式由时钟极性CPOL以及时钟相位CPHA共同决定将SPI分为四种工作模式。主机需要和从机在相同的模式下才能进行工作主机要按照从机支持的模式去配置。采样为字节交换原理中的移入操作1.当CPOL 0CPHA 0空闲状态时钟线为低电平数据在奇数边沿被采样。上降沿被采样下升沿数据发生变化2.当CPOL 1CPHA 0空闲状态时钟线为高电平数据在奇数边沿被采样。下降沿被采样上升沿数据发生变化3.当CPOL 0CPHA 1空闲状态时钟线为低电平数据在偶数边沿进行采样。下降沿被采样上升沿数据发生变化4.当CPOL 1CPHA 1空闲状态时钟线为高电平数据在偶数边沿进行采样。上升沿被采样下降沿数据发生变化2.数码管简单介绍LED数码管LED Segment Displays是由8个发光二极管构成并按照一定的图形及排列封装在一起的显示器件。其中7个LED构成7笔字形1个LED构成小数点有时称为八段数码管。LED数码管有两大类一类是共阴极接法另一类是共阳极接法共阴极就是7段的显示字码共用一个电源的负极是高电平点亮共阳极就是7段的显示字码共用一个电源的正极是低电平点亮。74HC595简单介绍74HC595开发板上的595芯片在我们开发板数码管的旁边有两个级联的595芯片实物图 芯片原理图原理图分析总结一个输入多个输出一脚控多脚串行转并行数码管的连接显示我们本次所使用的是一款四段共阴极八位数码管每个数码管的使能相对独立各个数码管使用对应的三极管NPN进行使能控制。由于数码管所需的管脚较多我们使用SPI总线74HC595芯片实现对数码管的控制。SPI2_SCK:PB13SPI2_MOSI:PB15SPI2_NSS:PB12 outputSPI2_MISO: 不关心MX配置这里注意主机按照从机的模式配置595的工作模式空闲为低电平偶数边沿移除奇数边沿移入函数接口HAL_SPI_Transmit (SPI_HandleTypeDef * hspi, const uint8_t * pData, uint16_t Size, uint32_t Timeout) 功能以阻塞的形式发送一定量的数据 参数句柄 发送的数据 发送的数据的大小 超时检测 返回值不关心 HAL_SPI_Receive (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size, uint32_t Timeout) 功能以阻塞的形式接收一定量的数据 参数句柄 接收的数据存放的位置 数据的大小 超时检测 返回值不关心函数编写如果出现乱码说明通信速率还是太快硬件的SPI/* USER CODE BEGIN 0 */ //定义一个保存了所有数字显示状态的数组 const uint8_t number[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字显示 //定义一个用于保存想要显示的数字的变量 volatile uint16_t show_number 0x1234; //使用volatile使变量不被优化每次都刷新读取 //数码管显示函数 void led_dispaly() { uint8_t which_where_data[2] {0x00, 0x00}; //创建一个用于保存段选与位选的数组 //使用switch进行判断由于一次只能点亮一个需要引入一个变量进行自增循环对应各数码管 static uint8_t choose 0; //用于位循环 switch(choose) { case 0: which_where_data[0] 0x08; //1-4位顺序为 0x01 0x02 0x04 0x08 which_where_data[1] number[show_number 0x000F]; //将想要显示的数字与之相就相当于盖上了其他位 //SPI传输函数参数为使用的SPI通道、要传输的数据、数据长度、超时时间 HAL_SPI_Transmit(hspi2,which_where_data,2,10); //进行锁存操作等效于写入一高一低电平 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(1); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET); choose; //移动至下一位 break; case 1: which_where_data[0] 0x04; //1-4位顺序为 0x01 0x02 0x04 0x08 which_where_data[1] number[show_number4 0x000F]; // 4 取第三位 //SPI传输函数参数为使用的SPI通道、要传输的数据、数据长度、超时时间 HAL_SPI_Transmit(hspi2,which_where_data,2,10); //进行锁存操作等效于写入一高一低电平 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(1); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET); choose; //移动至下一位 break; case 2: which_where_data[0] 0x02; //1-4位顺序为 0x01 0x02 0x04 0x08 which_where_data[1] number[show_number8 0x000F]; //SPI传输函数参数为使用的SPI通道、要传输的数据、数据长度、超时时间 HAL_SPI_Transmit(hspi2,which_where_data,2,10); //进行锁存操作等效于写入一高一低电平 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(1); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET); choose; //移动至下一位 break; case 3: which_where_data[0] 0x01;//1-4位顺序为 0x01 0x02 0x04 0x08 which_where_data[1] number[show_number12 0x000F]; //SPI传输函数参数为使用的SPI通道、要传输的数据、数据长度、超时时间 HAL_SPI_Transmit(hspi2,which_where_data,2,10); //进行锁存操作等效于写入一高一低电平 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(1); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET); choose 0; //移动循环 break; } } /* USER CODE END 0 */封装函数接口/* USER CODE BEGIN 0 */ //定义一个保存了所有数字显示状态的数组 const uint8_t number[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字显示 //数码管显示函数 void led_dispaly(uint8_t wei,uint8_t num) { uint8_t which_where_data[2] {0x00, 0x00}; //创建一个用于保存段选与位选的数组 which_where_data[0] wei; which_where_data[1] number[num]; HAL_SPI_Transmit(hspi2,which_where_data,2,10); //进行锁存操作等效于写入一高一低电平 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(1); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET); } /* USER CODE END 0 */软件SPI/* USER CODE BEGIN 0 */ void led_dispaly (uint8_t Bit,uint8_t Seg)//0x01 0x66 第一个管写4 { //将片选线拉成低电平表示通信的开始 HAL_GPIO_WritePin(GPIOB, SPI2_NSS_Pin, 0); int i0; for(i0;i8;i) { //使用GPIO模拟时钟信号的下降沿 HAL_GPIO_WritePin(GPIOB,SPI2_SCK_Pin,GPIO_PIN_RESET); //循环八次通过三目运算符输出段选传递进来的参数1就是10就是0 HAL_GPIO_WritePin(GPIOB, SPI2_MOSI_Pin, (Bit 0x80) ? 1 : 0); //使用GPIO模拟时钟信号的上升沿 HAL_GPIO_WritePin(GPIOB,SPI2_SCK_Pin,GPIO_PIN_SET); //移位操作输出后面的一位 Bit1; HAL_Delay(1); } for(i0;i8;i) { HAL_GPIO_WritePin(GPIOB,SPI2_SCK_Pin,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, SPI2_MOSI_Pin, (Seg 0x80) ? 1 : 0); HAL_GPIO_WritePin(GPIOB,SPI2_SCK_Pin,GPIO_PIN_SET); Seg1; HAL_Delay(1); } HAL_Delay(1); HAL_GPIO_WritePin(GPIOB, SPI2_NSS_Pin, 1); } /* USER CODE END 0 */3.LCD原理三基色红色、绿色、蓝色RGB565屏幕的介绍ILI9341显示驱动芯片ILI9341是一个支持分辨率为240RGBx320点阵的a-TFT LCD的2621442^18色单片机驱动器。这个单片机驱动器包含了一个720通道的源极驱动器source driver一个320通道的栅极驱动器gate driver172800字节的GRAM用于显示240RGB x 320分辨率的图片一套电源支持电路。ILI9341提供8位/9位16位/18位的并行MCU数据总线6位/16位/18位RGB接口数据总线以及3或4线SPI接口serial peripheral interface。通过窗口地址函数显示区域被指定在GRAM内。这个指定的窗口区域可以被有选择地更新因此显示区域能够同时被显示在静态图像的区域。ILI9341的IO接口电压工作于1.65V-3.3V。一种合并的电压跟随电路用以产生驱动液晶显示器的电压电平。ILI9341支持full color8-color显示模式支持由软件控制的精确电源睡眠模式。这些功能使ILI9341成为类似于移动电话、小电话、MP3等需要电池长效工作的中等或小尺寸便携产品的理想驱动器。原理图SPI1_NSS PA4 SPI1_MISO PA6 SPI1_MOSI PA7 SPI1_SCK PA5 LCD_RST PA8 屏幕的复位引脚 将所有的颜色设置为初始状态 GPIO_Output图片的显示实验MX配置1.打开SPI12.打开复位引脚3.调整时钟频率4.调整输出速度驱动代码的移植1.驱动代码移植2.新建一个分组3.添加好之后编译出现10个错误4.添加宏定义#define LCD_DCX_GPIO_Port GPIOA #define LCD_DCX_Pin GPIO_PIN_4 #define LCD_RST_GPIO_Port GPIOA #define LCD_RST_Pin GPIO_PIN_85.修改驱动文件6.注释掉整个函数7.引用头文件
RELATED

相关推荐

护理学论文工具怎么配?一张临床护理写作清单请收好

护理学论文工具怎么配?一张临床护理写作清单请收好

护理学论文要写临床护理案例,从护理评估、案例数据整理到参考文献,工具到底该怎么配?本文把护理论文全流程拆成一张可落地的写作清单:文献检索、案例表格、初稿撰写、查重降重,每个环节配什么工具、怎么用,…

📅 2026/9/15 9:39:36
2026资产管理系统选型对比:部署方式与集成难度如何权衡

2026资产管理系统选型对比:部署方式与集成难度如何权衡

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/15 9:39:36
快递代领系统毕业设计全攻略:从需求分析到技术架构与答辩要点

快递代领系统毕业设计全攻略:从需求分析到技术架构与答辩要点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/15 9:34:35
MORE NEWS

更多资讯

📰

2026年Java学习路线:云原生与虚拟线程实战指南

1. 为什么2026年的Java学习路线需要更新?Java作为一门诞生于1995年的编程语言,在2026年依然保持着强大的生命力。但学习Java的方式和十年前相比已经发生了翻天覆地的变化。我作为从业15年的Java开发者,见证了从Java 5到Java 21的演进历程&…

📰

Matlab多自由度振动仿真参数化框架

简介:本资源是一套面向计算机、电子信息工程及数学等专业本科生的Matlab动力学与振动分析实践代码包,聚焦课程设计、期末大作业与毕业设计中的建模、仿真与参数化求解需求。压缩包共36个文件,含32个核心m文件(实现单/多自由度系统…

📰

C++ Builder 256色BMP图像处理实战指南

简介:这是一套基于C Builder开发的256色BMP图像处理完整工程源码,面向图形学初学者与C桌面应用开发者,聚焦位图文件解析、调色板管理及基础图像变换等核心能力训练。资源包含88个文件,主体为39个头文件(h)与…

📰

数字符号“99999999999”的文化与技术解析

1. 数字符号的现代文化解读"99999999999"这个由11个9组成的数字串,在当代互联网文化中具有多重象征意义。从表面看,它只是一个简单的数字重复,但在不同语境下却承载着丰富的社会文化内涵。这种超长数字串最早出现在网络聊天和社交媒…

📰

Ubuntu安装Docker与Compose全攻略:从零到排错实操笔记

Ubuntu 安装 Docker 和 Docker Compose:从零到能用的完整实操笔记不知道你是不是和我一样,每次拿到一台全新的 Ubuntu 服务器或者重装完虚拟机,第一件事就是装 Docker。按理说这应该是个几分钟搞定的活,但实际执行起来总是会遇到各…

📰

智能家居与物联网实战:Zigbee掉线先别换网关:用一轮对照实验找出干扰与摆放问题

智能家居与物联网实战:Zigbee掉线先别换网关:用一轮对照实验找出干扰与摆放问题 [!NOTE] 无线故障最怕同时换信道、换网关、移设备,最后恢复了却不知道哪一步有效。本课把 Zigbee 排查变成可复盘的对照实验:固定设备和业务操作,每轮只改变一个因素,记录成功率与延迟分布。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬