【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S跑LVGL图形demo
【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S屏幕跑LVGL图形demo
- 🎬运行LVGL 按键组件demo

✨基于STM32CubeMX配置工程是因为方便移植,只要是STM32芯片,拿到我的这个工程源码就可以根据自己的stm32芯片,自行通过STM32CubeMX工具软件进行工程配置,并将我的工程中的屏幕驱动文件拷贝到自己的工程目录下,修改2个驱动函数代码就可以轻松点亮。
- 📌相关篇《STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕》
- ✨版本说明:基于LVGL8.3版本裸机移植的。不包含操作OS系统,**当然我会将个人移植成功的源代码工程分享出来。**方便大家移植到自己所使用的芯片上,如果和我使用的屏幕相同那么可以做到无缝对接,如果是其他屏幕需要自行准备屏幕驱动代码,并进行替换。点亮屏幕后在做移植。基于STM32CubeMX配置工程,可以方便统一性,移植更容易简单。

- 🔖工程所使用的是
STM32F103VET6 - ⚡本项目是针对:1.8寸TFT LCD128X160 ST7735S屏幕

🎉折腾了我一天半,大部分时间在找不显示的问题。首先是没有处理好刷屏显示函数(
disp_flush),处理好了,就缺一个可运行的demo.以为LVGL难度不大,只要按照步骤和工程项目结构布局,没有什么难度。
- 📺新手可以看正点原子的LVGL移植视频教程:
第4讲 基础篇-LVGL移植(无操作系统1)
- 📍LVGL在线文档:
https://docs.lvgl.io/8.3/
📋在线文档可以帮助我们快速查阅LVGL的API的使用和参数以及提供了相关的demo案例。直接拷贝到项目中就可以运行验证,根据个人需求可以自定义设计。
📑个人移植工程步骤
- 下载LVGL库。
- 提取必要的LVGL库文件。
- 提前准备好,可以驱动点亮屏幕的工程模版。
- 导入LVGL到现有的工程模版当中。
- 添加源文件以及头文件路径。
- 修改导入的LVGL的配置函数和宏定义。
- 添加LVGL demo函数。
⛳注意事项
-
🍁工程文件架构

-
🌴项目树结构:

-
🔰其他屏幕接口移植,只要能点亮的,目标芯片满足LVGL要求的基本都可以移植,重点和难点就是要对接换LVGL刷屏显示函数(
disp_flush):
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{if(disp_flush_enabled) {/*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/int32_t x;int32_t y;for(y = area->y1; y <= area->y2; y++) {for(x = area->x1; x <= area->x2; x++) {/*Put a pixel to the display. For example:*//*put_px(x, y, *color_p)*/LCD_Fast_DrawPoint(x, y, color_p->full);color_p++;}}}
🛠Keil工程设置
- 🌿屏蔽报警设置:
--diag_suppress=188,546,68,111,1215

- 🌿头文件路径设置

- 🌿勾选C99 Mode选项

🔨项目参数配置
- 🌿在
LV_CONF_h文件中启用相关宏和配置缓冲区大小。(直接关系到编译是否成功,默认LVGL配置的是128U)

- 🌿在屏幕显示源文件
lv_port_disp_template.c中设置屏幕像素和刷屏显示函数
#ifndef MY_DISP_HOR_RES#warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen width, default value 320 is used for now.#define MY_DISP_HOR_RES 160
#endif#ifndef MY_DISP_VER_RES#warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen height, default value 240 is used for now.#define MY_DISP_VER_RES 128
#endif
/*Flush the content of the internal buffer the specific area on the display*You can use DMA or any hardware acceleration to do this operation in the background but*'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{if(disp_flush_enabled) {/*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/int32_t x;int32_t y;for(y = area->y1; y <= area->y2; y++) {for(x = area->x1; x <= area->x2; x++) {/*Put a pixel to the display. For example:*//*put_px(x, y, *color_p)*/LCD_Fast_DrawPoint(x, y, color_p->full);color_p++;}}}// LCD_Color_Fill(area->x1, area->y1, area->x2, area->y2,color_p);/*IMPORTANT!!!*Inform the graphics library that you are ready with the flushing*/lv_disp_flush_ready(disp_drv);
}
📝主程序代码
/* USER CODE BEGIN Header */
/********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "spi.h"
#include "tim.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#include "lcd.h"
#include "lv_port_disp_template.h"
//#include "lv_port_indev.h"// 输入设备初始化(如果没有实现就注释掉)
#include "lvgl.h"
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
uint16_t cnt = 0;
/* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
// static uint32_t time = 0;if (htim->Instance == TIM6) // 定时器6基地址{lv_tick_inc(1);//lvgl 的 1ms 心跳cnt++;}__HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
}/*
static void lv_ex_label(void)
{static char *STR = "Perseverance51";lv_obj_t *label = lv_label_create(lv_scr_act());lv_label_set_recolor(label, true);lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); //Circular scrolllv_obj_set_width(label, 160);lv_label_set_text_fmt(label, "Gitee: %s",STR);lv_obj_align(label, LV_ALIGN_CENTER, 0, 10);lv_obj_t *label2 = lv_label_create(lv_scr_act());lv_label_set_recolor(label2, true);lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR); //Circular scrolllv_obj_set_width(label2, 160);lv_label_set_text_fmt(label2, "Hello world!");lv_obj_align(label2, LV_ALIGN_CENTER, 0, -10);
}
*/
static lv_style_t style_btn;
static lv_style_t style_btn_pressed;
static lv_style_t style_btn_red;static lv_color_t darken(const lv_color_filter_dsc_t * dsc, lv_color_t color, lv_opa_t opa)
{LV_UNUSED(dsc);return lv_color_darken(color, opa);
}static void style_init(void)
{/*Create a simple button style*/lv_style_init(&style_btn);lv_style_set_radius(&style_btn, 10);lv_style_set_bg_opa(&style_btn, LV_OPA_COVER);lv_style_set_bg_color(&style_btn, lv_palette_lighten(LV_PALETTE_GREY, 3));lv_style_set_bg_grad_color(&style_btn, lv_palette_main(LV_PALETTE_GREY));lv_style_set_bg_grad_dir(&style_btn, LV_GRAD_DIR_VER);lv_style_set_border_color(&style_btn, lv_color_black());lv_style_set_border_opa(&style_btn, LV_OPA_20);lv_style_set_border_width(&style_btn, 2);lv_style_set_text_color(&style_btn, lv_color_black());/*Create a style for the pressed state.*Use a color filter to simply modify all colors in this state*/static lv_color_filter_dsc_t color_filter;lv_color_filter_dsc_init(&color_filter, darken);lv_style_init(&style_btn_pressed);lv_style_set_color_filter_dsc(&style_btn_pressed, &color_filter);lv_style_set_color_filter_opa(&style_btn_pressed, LV_OPA_20);/*Create a red style. Change only some colors.*/lv_style_init(&style_btn_red);lv_style_set_bg_color(&style_btn_red, lv_palette_main(LV_PALETTE_RED));lv_style_set_bg_grad_color(&style_btn_red, lv_palette_lighten(LV_PALETTE_RED, 3));
}/*** Create styles from scratch for buttons.*/
void lv_example_get_started_2(void)
{/*Initialize the style*/style_init();/*Create a button and use the new styles*/lv_obj_t * btn = lv_btn_create(lv_scr_act());/* Remove the styles coming from the theme* Note that size and position are also stored as style properties* so lv_obj_remove_style_all will remove the set size and position too */lv_obj_remove_style_all(btn);lv_obj_set_pos(btn, 10, 10);lv_obj_set_size(btn, 120, 50);lv_obj_add_style(btn, &style_btn, 0);lv_obj_add_style(btn, &style_btn_pressed, LV_STATE_PRESSED);/*Add a label to the button*/lv_obj_t * label = lv_label_create(btn);lv_label_set_text(label, "Button");lv_obj_center(label);/*Create another button and use the red style too*/lv_obj_t * btn2 = lv_btn_create(lv_scr_act());lv_obj_remove_style_all(btn2); /*Remove the styles coming from the theme*/lv_obj_set_pos(btn2, 10, 80);lv_obj_set_size(btn2, 120, 50);lv_obj_add_style(btn2, &style_btn, 0);lv_obj_add_style(btn2, &style_btn_red, 0);lv_obj_add_style(btn2, &style_btn_pressed, LV_STATE_PRESSED);lv_obj_set_style_radius(btn2, LV_RADIUS_CIRCLE, 0); /*Add a local style too*/label = lv_label_create(btn2);lv_label_set_text(label, "Button 2");lv_obj_center(label);
}
/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI2_Init();MX_TIM6_Init();/* USER CODE BEGIN 2 */
// 清除定时器初始化过程中的更新中断标志,避免定时器一启动就中断__HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
// 使能定时器6更新中断并启动定时器HAL_TIM_Base_Start_IT(&htim6);LCD_Init();lv_init(); // lvgl初始化,如果这个没有初始化,那么下面的初始化会崩溃lv_port_disp_init(); // 显示器初始化lv_example_get_started_2(); // demo函数,显示2个按键,测试LVGL是否成功/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
// LCD_Clear(WHITE);
// HAL_Delay(1000);
// LCD_Draw_Circle(50,50,45,RED);
// HAL_Delay(1000);
// LCD_Clear(RED);
// HAL_Delay(1000);
// Demo_Menu();lv_task_handler(); // 运行所有lvgl的timerif (cnt > 1000){cnt = 0;HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);}}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
📚工程源码(包含LVGL 8.3库)
复制这段内容后打开百度网盘手机App,操作更方便哦
链接: https://pan.baidu.com/s/1f_P8bEqrT7-AN2L9NVMynA
提取码: w7ck
相关文章:
【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S跑LVGL图形demo
【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S屏幕跑LVGL图形demo🎬运行LVGL 按键组件demo ✨基于STM32CubeMX配置工程是因为方便移植,只要是STM32芯片,拿到我的这个工程源码就可以根据自己的stm32芯片,自…...
写给20、21级学生的话
写给20、21级学生的话前言一、关于招聘变招生,你怎么看?二、对于即将实习/已经实习的学生,你有什么建议?1.学习方面2.提升方面三、思想成年真的很重要前言 最近,有一些同学遇到的实习问题,我统一回复下&…...
功能测试用例多次录制后,我丢掉了selenium,选择龙测AI-TestOps云平台
目录一、如何使用龙测AI-TestOps云平台1、进入龙测AI-TestOps云平台2、新建项目3、新建流程图4、创建任务5、查看任务状态6、查看报告、图片7、下载流程图、测试报告、excel用例二、龙测AI-TestOps云平台AI功能介绍1、NLP2、视频AI转流程图三、总结功能测试用例多次录制后&…...
【C++知识点】C++20 常用新特性总结
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...
数据库体系结构概念--集中式数据库、分布式数据库
数据库模式 前言: 平时我们接触的‘数据库’一般指的是DBMS,数据库管理系统,DBMS是软件如:mysql、oracle、dm等等都是集中式数据库,但它们不能代表整个数据库,只是通过这些软件来管理相应的数据内容&#…...
PyQt5数据库开发2 5.2 QSqlRelationalTableModel
目录 一、Qt窗体设计 1. 新建Qt项目 2. 添加组件 3. 添加资源 4. 添加Action 5. 添加工具栏 6. 添加菜单项 7. 添加退出功能 二、SQL Server下建表插数据 1. 建立表 2. 插入数据 3. 单表数据 4. 联合查询 三、代码实现 1. 新建项目目录 2. 编译窗体文件和资…...
树莓派——智能家居第一步
辛辛苦苦配了成功让树莓派开始工作了,开始搞智能家居!大体思路:基于工厂模式,分模块来实现上图分为三部分:主控、外设、控制主控我采用的是树莓派的4b4G版本,外设包括四个区域的灯(我的和上图有…...
【Golang】Golang基础入门级教程 -- 0基础安装搭建Go语言开发环境
目录 安装和下载GO语言 下载 下载地址 版本的选择 安装 Windows安装 Linux下安装 Mac下安装 检查 GOROOT和GOPATH GOPROXY Go开发编辑器 VS Code介绍 下载与安装 配置 Go扩展 第一个Go程序 Hello World go mod init 编写 编译 VSCode切换默认终端 本篇文章…...
MATLAB | 如何解决实验数据散点图重叠问题(overlap)
本期部分实验效果: 这期讲一下如果数据重合严重该咋办(overlap),事先说明,本文中的绘图均使用一个几行的简单小代码进行了修饰: function defualtAxes axgca;hold on;box on ax.XGridon; ax.YGridon; ax.XMinorTickon; ax.YMinor…...
Kubernetes 一键部署利器:kubeadm
文章目录集群部署痛点kubeadm 的工作原理kubeadm init 的工作流程kubeadm join 的工作流程kubeadm 的部署配置参数集群部署痛点 Kubernetes 的部署一直以来都是挡在初学者前面的一只“拦路虎”。尤其是在 Kubernetes 项目发布初期,它的部署完全要依靠一堆由社区维护…...
[jS 事件循环理解] 主线程 宏任务 微任务 - 执行顺序优先级理解
最近看了一个帖子 事件循环机制-宏任务-微任务 把js单线程中 , 主线程 | 宏任务 | 微任务 的调用顺序讲解的很直白精巧 , 记录一下以供查阅 1.主线程, 可以理解为从上到下顺序执行的一个js线程 2. 宏任务 script / setTimeOut /setInterval等 3. 微任务主要有promise等 4. 热…...
顺序表和链表的比较
这两个结构各有优势,相辅相成。 顺序表: 优点: 1.支持随机访问。 2.CPU高速缓存命中率更高。(物理空间连续) 缺点: 1.头部和中部插入和删除时间效率低(O(n))。 2.连续的物理空间,空间不够后需要增容:…...
Java为什么只能单继承???
目录 先屡清楚继承和实现的区别: 分析原因: 多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面: (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该…...
数据安全-分类分级 调研分析报告
目录 前言一、数据分类分级概述1.数据分类2.数据分级二、数据分类分级原则三、数据分类分级的框架和方法1.数据分类分级的框架2.分类标准分类常见的方法2.1 MECE2.2 线分法和面分法及混合分法2.3 数据主题域2.4 技术选型维度2.5 以业务应用维度2.6 信息安全隐私方面的分类法3.分…...
浏览器对象详解
文章目录浏览器对象详解一、参考资料二、认识浏览器运行态下的 js1.问:是否了解浏览器的执行态(分层设计)?2.BOM1.[location](https://developer.mozilla.org/zh-CN/docs/Web/API/Location)拓展方向:2.[History](https…...
异步电路后端实现流程(cdc signOff 后端做什么)
一种后端异步电路的signOff流程同步电路和异步电路分别signOff对于同步电路,后端会分析sta setup/hold,这里不在赘述。在该scenario下 异步电路是不会分析,也不会关注异步电路之间的走线在cdc scenario(mode)下sdc有一下设置:将所…...
Linux网络编程实战介绍
文章目录 前言一、Linux网络编程介绍二、文章目录总结前言 本专栏将为大家讲解Linux网络编程的知识,本专栏只需要有C语言基础即可学习,学习本专栏将大大提高你的C语言水平,当然了我也还会在ARM板子上进行实验将Linux驱动也和网络编程联系起来,方便大家去实现自己的项目。我…...
C++概述 课堂笔记
函数的重载在C语言中函数名是唯一的,不可以重复定义,当我们利用函数执行,功能相似的函数,我们也不能使用同一个函数,比如说,求整型的函数,不能用来求浮点型、字符型。在C中引入函数重载的概念&a…...
一文读懂SpringBoot整合Elasticsearch(一)
(本篇文章主要介绍Spring Boot如何整合Elasticsearch,包括基本配置、数据操作、搜索功能等方面。) 一、前言 Elasticsearch是一款全文搜索引擎,可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…...
(数论)(枚举)(前缀和)1230. K倍区间
目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 ~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水&…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
