项目(智慧教室)第一部分:cubemx配置,工程文件的移植,触摸屏的检测,项目bug说明
第一章:需求与配置
一。项目需求
二。实现外设控制
注意:
先配置引脚,再配置外设。否则会出现一些不可预料的问题
1.时钟,串口,灯,蜂鸣器配置
(1)RCC配置为外部时钟,修改时钟参数


(2)SWD配置:为了不引脚冲突,使用

(3)串口的使用(USART1,USART3)
<1>USART1
注意:大型项目串口使用中断,因为效率高


<2>USART3
串口3没有使用中断,观察原理图,使用串口母口与电脑通信。

(4)GPIO配置
1.GPIO灯的配置,设置为高电平(初始为灭)
2.GPIO蜂鸣器配置,设置为低电平(初始不响)

(5)LCD的FMSC配置

FMSC的LCD2配置,这是显示页面

(6)GPIO补充配置

(7)SPI的配置
PA5配置spi_sck

配置PB5,PB4

配置PH2为GPIO_OUTPUT

spi配置全双工

(8)Touch配置
设置SPi2,注意:PG15为高电平


设置SPI2

三。Webserver开发
1.SDIO配置
(1)PC12设置为SDIO_CK时钟

D0与D1配置

D2与D3

2.SDIO配置
DMA配置


3.ETH以太网接口
(1)根据原理图配置引脚
注意:有些引脚不需要配置,原因是采用RMII接口(需要看懂原理才可以自己配置)



(2)配置外设


时钟出现错误,修改

四。Freertos配置
1.调整时钟


2.任务的创建
(1)任务优先级的划分

优先级划分:WebServer优先级最高,GUI优先级最低。判断方式,用户体验最佳。
(2)堆栈大小划分

在Freertos中配置堆大小时,需要把上述除以4(原因未知,且不一定除以4,可能就是单纯的分配问题,因为板子内存本来就不多)
Touch

Gui

WebServer

Zigbee

3.其余优先级的配置

五。LWIP配置
(1)使能LWIP。关闭DHCP服务

(2)使能LWIP。关闭展示全部参数

(3)增大池大小

(4)回调函数调用

测试:使用上述回调函数,判断网络连接

if(netif_is_link_up(netif)){printf("netif link is up\r\n");if(!netif_is_up(netif)){netif_set_up(netif);printf("netif is up\r\n");}}else{printf("netif link is down\r\n");}

六。FatFs(文件管理)
1.FatFs配置
(1)配置SD卡(SDIO配置之后才可以配置这个)

(2)设置HEAP堆空间大小

(3)点击生成(会弹出警告,询问是否自动生成代码,点击确定)

2.FatFs文件解释
(1)配置FatFs之后会出现的文件。

具体细节看下面这个图。上述三个文件对应下面的图。通用底层接口,链接机制,DSP驱动。

补充实验1:读写SD卡的内容,使用了usb读写卡,通过他读写SD卡
加入初始化代码,init在Freertos.c中的第一个任务中自动添加。

uint8_t u8chr[] = "hello";
uint32_t u32Wbytes;
/* USER CODE END Variables */
void MX_FATFS_Init(void)
{/*## FatFS: Link the SD driver ###########################*/retSD = FATFS_LinkDriver(&SD_Driver, SDPath); /* USER CODE BEGIN Init */ if(f_mount(&SDFatFS,SDPath,1) == FR_OK){if(f_open(&SDFile,(const char*)"fatfs.txt",FA_CREATE_ALWAYS|FA_WRITE) == FR_OK){if(f_write(&SDFile,u8chr,sizeof(u8chr),&u32Wbytes) == FR_OK){f_close(&SDFile); } } }/* additional user code for init */ /* USER CODE END Init */
}
运行之后,SD卡通过usb转接口连接电脑。里面有fatfs.txt文件,打开里面有Hello字符。
注意:也可以fatfs.txt文件替换成scv文件,这是excel文件后缀名。
3.FatFs函数的参考手册
(1)进入c盘(cubemx的包目录下),找到第三方库存放地(Third_Party)
(2)找到FatFs文件夹中的doc,点击html文件

(3)打开html文件,函数解释都在这里,需要研究英文

4.底层文件的简要介绍
(1)FatFS底层实现

(2)通用底层驱动API

(3)我们应该研究什么东西
这些都是在KEIL工程中
//FatFS 提供的通用驱动文件的实现
ff_gen_drv.c
//针对SD底层驱动实现,封装成为通用的底层驱动API
//如果使能freeRTOS,在read和Write里面,会用到操作系统的消息队列sd_diskio.c
//HAL库的二次封装,把所有基于SD卡的操作都在bsp_driver_sd实现
bsp_driver_sd.c
七。emWin移植
Cubemx配置
(1)使能CRC

(2)使能FSMC的写

创建有警告,正常
1.emWin的图形文件库的寻找,移植
(1)在stm32的Cubemx的第三方目录的同层文件夹下,有个ST文件夹

(2)ST文件夹下的STemWin就是图形文件库,移植就好(复制粘贴到Cubemx文件工程下面)

(3)移植到keil的工程目录的第三方文件夹下《这是keil项目文件夹中》
2.keil工程的创建工作组
(1)创建工作组

(2)对工作组进行管理

(3)工作组路径与名称的设置

3.添加库,主要包括下面文件

(1)工作组添加存在的库文件

(2)第三方的工程文件

(3)添加emWin的os的GUI文件

(4)GUIconf.c与GUIDRV_Template.c与LCD_Template.c

(5)GUI_X_Touch_Analog.c
这个是触控,自己定义,Ctrl+N创建工程,Ctrl+s保存,在第三方库文件夹下的emWin文件中创建src文件夹。

在文件夹中保存文件

(7)STemWin_CM4_OS_wc16_ot.a
这个文件源码不开放,在Lib中,文件选择.a

注意:Keil是无法识别.a这种文件的,所以需要手动配置

选择library file

4.把移植好的文件(.h)加入工程文件
加入的是上述关联的文件夹


八。对代码的修改
为什么要对这些进行修改?
我们使用的API接口是不统一的,一个是GUI驱动函数,一个是Lcd驱动函数,我们要同时使用他们,需要对双方进行连接,即代码相互调用。(一个驱动对硬件,一个驱动对液晶屏)
1.SD卡的初始化设置

#include "stdio.h"
#include "string.h"uint8_t retSD; /* Return value for SD */
char SDPath[4]; /* SD logical drive path */
FATFS SDFatFS; /* File system object for SD logical drive */
FIL SDFile; /* File object for SD *//* USER CODE BEGIN Variables */char u8chr[] = "hello";uint32_t u32Wbytes;char SensorBuff[100];/* USER CODE END Variables */ void MX_FATFS_Init(void)
{/*## FatFS: Link the SD driver ###########################*/retSD = FATFS_LinkDriver(&SD_Driver, SDPath);/* USER CODE BEGIN Init */if(f_mount(&SDFatFS,SDPath,1) == FR_OK){if(f_open(&SDFile,(const char*)"fatfs.txt",FA_CREATE_ALWAYS|FA_WRITE) == FR_OK){if(f_write(&SDFile,u8chr,sizeof(u8chr),&u32Wbytes) == FR_OK){f_close(&SDFile);}}}//创建文件if(f_open(&SDFile,(const char*)"Sensor.csv",FA_CREATE_ALWAYS|FA_WRITE) == FR_OK){//格式化文件流//创建表头sprintf(SensorBuff, "序号,温度,湿度,光照\r\n");f_write(&SDFile,SensorBuff,strlen(SensorBuff),&u32Wbytes);//循环写入表项for(int i; i < 10; i++){sprintf(SensorBuff, "%d,%d,%d,%d\r\n",i + 1, i + 20, i + 30, i + 40);f_write(&SDFile,SensorBuff,strlen(SensorBuff),&u32Wbytes);//刷新到文件中
// f_sync(&SDFile); }//关闭文件,缓存写入文件内f_close(&SDFile); } /* additional user code for init */ /* USER CODE END Init */
}
2.对GUIconfig.c图形库的设置
(1)对宏定义进行修改

#define GUI_NUMBYTES (512*1024) //定义外部存储器大小
#define GUI_BLOCKSUZE (0X80) //定义最小内存库操作大小
#define SRAM_BANK_ADDR ((U32)0x68000000) //定义外部存储器首地址
(2)对GUI_X_Config的修改

void GUI_X_Config(void) {//// 32 bit aligned memory area//volatile U32* aMemory = (volatile U32*)(SRAM_BANK_ADDR);//// Assign memory to emWin//分配GUI存储器首地址及最小操作内存块大小GUI_ALLOC_AssignMemory((void *)aMemory, GUI_NUMBYTES);GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSUZE);//// Set default font//GUI_SetDefaultFont(GUI_FONT_32_1);
}
3.对GUIDRV_Template.c进行修改
通过这种方式,lcd的驱动与GUI的驱动就连接起来,可以相互配合
(1)加入头文件,lcd.h,原因:GUI图形库与lcd连接,通过找到点 后向lcd拷贝即可

(2)对set与get函数进行处理
set来画点

//添加lcd画点接口LCD_DrawPoint(x,y,PixelIndex);
get来获取点位置

//添加lcd读取点接口PixelIndex = lcd_read_gram(x,y);
4.对LCDConf_FledColor_Templae.c进行修改
(1)屏幕大小,屏幕上下左右的AD值,触摸屏的处理

#define XSIZE_PHYS 480 // 屏幕X坐标长度
#define YSIZE_PHYS 272 // 屏幕Y坐标长度#define GUI_TOUCH_AD_Y_TOP 170 // 屏幕X0点坐标AD值
#define GUI_TOUCH_AD_Y_BOTTOM 1900 // 屏幕X480点坐标AD值
#define GUI_TOUCH_AD_X_LEFT 100 // 屏幕Y0点坐标AD值
#define GUI_TOUCH_AD_X_RIGHT 1930 // 屏幕Y272点坐标AD值
(2)Config配置函数处理

void LCD_X_Config(void) {//// Set display driver and color conversion//设置成自己的API接口GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0);//// Display driver configuration, required for Lin-driver// 显示尺寸配置LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);////触摸笔的校准GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 480, GUI_TOUCH_AD_X_LEFT , GUI_TOUCH_AD_X_RIGHT);GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 272, GUI_TOUCH_AD_Y_TOP, GUI_TOUCH_AD_Y_BOTTOM);
}
(3)在驱动中写如lcd初始化
加入#include "lcd.h",自写的文件可以直接写到最顶上

5.GUI_X_Touch_Analog.c(这是自写的文件)
#include "GUI.h"
#include "Touch.h"void GUI_TOUCH_X_ActivateX(void)
{}void GUI_TOUCH_X_ActivateY(void)
{}//获取X坐标AD值
int GUI_TOUCH_X_MeasureX(void)
{return XPT_Read_XY(CMD_RDX);
}//获取Y坐标AD值
int GUI_TOUCH_X_MeasureY(void)
{ return XPT_Read_XY(CMD_RDY);
}
6.Freertos.c中
#include "GUI.h"
void Touch_Task(void const * argument)
{/* init code for LWIP */MX_LWIP_Init();/* init code for FATFS */MX_FATFS_Init();GUI_Init();GUI_SetBkColor(GUI_BLUE);GUI_SetFont(GUI_FONT_32_1);GUI_SetColor(GUI_YELLOW);GUI_Clear(); /* USER CODE BEGIN Touch_Task */GUI_PID_STATE State; printf("system is runing!\r\n");/* Infinite loop */for(;;){//执行触摸笔检测GUI_TOUCH_Exec(); //获取触摸笔状态值GUI_TOUCH_GetState(&State);//是否按下if(State.Pressed){//打印触摸笔坐标信息GUI_DispStringAt("X:",0,0);GUI_DispDecAt(State.x,32,0,4);GUI_DispStringAt("Y:",0,24);GUI_DispDecAt(State.y,32,24,4); }osDelay(10);}/* USER CODE END Touch_Task */
}
运行结果:

下一节补充
本人暂时遇到的BUG,stm32刷新速度很慢,非常慢。发现串口循环打印,暂用资源,ping命令ping不通。
相关文章:
项目(智慧教室)第一部分:cubemx配置,工程文件的移植,触摸屏的检测,项目bug说明
第一章:需求与配置 一。项目需求 二。实现外设控制 注意: 先配置引脚,再配置外设。否则会出现一些不可预料的问题 1.时钟,串口,灯,蜂鸣器配置 (1)RCC配置为外部时钟,修…...
Springboot集成redis--不同环境切换
1.单机配置 spring:redis:mode: singletonhost: 127.0.0.1port: 6379lettuce:pool:max-active: 8 #连接池最大阻塞等待时间(使用负值表示没有限制max-idle: 2 #连接池中的最大空闲连接min-idle: 1 #连接池最大阻塞等待时间(使用负值表示没有限…...
稀疏数组的实现
文章目录 目录 文章目录 前言 一 什么是稀疏数组? 二 稀疏数组怎么存储数据? 三 稀疏数组的实现 总结 前言 大家好,好久不见了,这篇博客是数据结构的第一篇文章,望大家多多支持! 一 什么是稀疏数组? 稀疏数组(Sparse Array)是一种数据结构&a…...
表达式语言的新趋势!了解SPEL如何改变开发方式
文章首发地址 SpEL(Spring Expression Language)是一种表达式语言,由Spring框架提供和支持。它可以在运行时对对象进行解析和计算,用于动态地构建和操作对象的属性、方法和表达式。以下是SpEL的一些特性和功能: 表达式…...
一套成熟的实验室信息管理系统(云LIS源码)ASP.NET CORE
一套成熟的实验室信息管理系统,集前处理、检验、报告、质控、统计分析、两癌等模块为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。 LIS把检验、检疫、放免、细菌微生物及科研使用的各类分析仪器,通过计算机联…...
NPM使用技巧
NPM使用技巧 前言技巧全局模块位置PowerShell报错安装模块冲突 NPM介绍NPM命令使用方法基本命令模块命令查看模块运行命令镜像管理 常用模块rimrafyarn 前言 本文包含NodeJS中NPM包管理器的使用技巧,具体内容包含NPM介绍、NPM命令、常用模块等内容,还包…...
java学习一
目录 Java 与 C 的区别 Java程序是编译执行还是解释执行 编译型语言 解释型语言 Java 与 C 的区别 Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object,C 兼容 C ,不但支持面向对象也支持面向过程。Java 通过虚拟机从而实现…...
PV PVC in K8s
摘要 在Kubernetes中,PV(Persistent Volume)和PVC(Persistent Volume Claim)是用于管理持久化存储的重要资源对象。PV表示存储的实际资源,而PVC表示对PV的声明性要求。当应用程序需要使用持久化存储时&…...
SAP-PP:基础概念笔记-5(物料主数据的MRP1~4视图)
文章目录 前言一、MRP1视图Base Unit of Measure(UoM)MRP 组采购组ABC 指示器Plant-Specific Material Status 特定的工厂物料状态MRP 类型 MRP TypeMRP 类型 MRP TypeMaster Production Scheduling(MPS) 主生产计划基于消耗的计划(CBP)再订货点Reorder-…...
【C语言】初阶测试 (带讲解)
目录 ① 选择题 1. 下列程序执行后,输出的结果为( ) 2. 以下程序的输出结果是? 3. 下面的代码段中,执行之后 i 和 j 的值是什么() 4. 以下程序的k最终值是: 5. 以下程序的最终的输出结果为ÿ…...
用huggingface.Accelerate进行分布式训练
诸神缄默不语-个人CSDN博文目录 本文属于huggingface.transformers全部文档学习笔记博文的一部分。 全文链接:huggingface transformers包 文档学习笔记(持续更新ing…) 本部分网址:https://huggingface.co/docs/transformers/m…...
unity 物体至视图中心以及新对象创建位置
如果游戏对象不在视野中心或在视野之外, 一种方法是双击Hierarchy中的对象名称 另一种是选中后按F 新建物体时对象的位置不是在坐标原点,而是在当前屏幕的中心...
船舶稳定性和静水力计算——绘图体平面图,静水力,GZ计算(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Python 网页爬虫的原理是怎样的?
网页爬虫是一种自动化工具,用于从互联网上获取和提取信息。它们被广泛用于搜索引擎、数据挖掘、市场研究等领域。 网页爬虫的工作原理可以分为以下几个步骤:URL调度、页面下载、页面解析和数据提取。 URL调度: 网页爬虫首先需要一个初始的U…...
python技术面试题合集(二)
python技术面试题 1、简述django FBV和CBV FBV是基于函数编程,CBV是基于类编程,本质上也是FBV编程,在Djanog中使用CBV,则需要继承View类,在路由中指定as_view函数,返回的还是一个函数 在DRF中的使用的就是…...
【linux命令讲解大全】089.使用tree命令快速查看目录结构的方法
文章目录 tree补充说明语法选项列表选项文件选项排序选项图形选项XML / HTML / JSON 选项杂项选项 参数实例 从零学 python tree 树状图列出目录的内容 补充说明 tree 命令以树状图列出目录的内容。 语法 tree [选项] [参数]选项 列表选项 -a:显示所有文件和…...
【C++】—— 单例模式详解
前言: 本期,我将要讲解的是有关C中常见的设计模式之单例模式的相关知识!! 目录 (一)设计模式的六⼤原则 (二)设计模式的分类 (三)单例模式 1、定义 2、…...
TheRouter 框架原理
TheRouter 框架入口方法 通过InnerTheRouterContentProvider 注册在AndroidManifest.xml中,在应用启动时初始化 <application><providerandroid:name"com.therouter.InnerTheRouterContentProvider"android:authorities"${applicationId}.…...
系列十二、Java操作RocketMQ之带标签Tag的消息
一、带标签的Tag消息 1.1、概述 RocketMQ提供消息过滤的功能,通过Tag或者Key进行区分。我们往一个主题里面发送消息的时候,根据业务逻辑可能需要区分,比如带有tagA标签的消息被消费者A消费,带有tagB标签的消息被消费者B消费&…...
Java面向对象学习笔记-1
前言 “Java 学习笔记” 是为初学者和希望加深对Java编程语言的理解的人们编写的。Java是一门广泛应用于软件开发领域的强大编程语言,它的语法和概念对于初学者来说可能有些复杂。这份学习笔记的目的是帮助读者逐步学习Java的基本概念,并提供了一系列示…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
