蓝桥杯速成教程{三}(adc,i2c,uart)
目录
一、adc
原理图编辑引脚配置
Adc通道使能配置
实例测试
编辑效果显示
案例程序
badc
按键相关函数
测量频率+占空比
main
按键的过程
显示界面的过程
二、IIC通信-eeprom
原理图AT24C02
引脚配置
不可用状态,用的软件IIC
官方库移植
At24c02手册
编辑真题案例
编辑实验现象
案例程序
i2c.c
读的函数
写的函数
main
主函数
按键的过程、参数显示界面
案例显现展示
三、uart
原理图
官方给的代码的测试现象
cube配置
参数设置
波特率设置
编辑中断使能
案例代码呈现
main
主函数
按键设置及界面显示
现象效果展示
一、adc
原理图
引脚配置
Adc通道使能配置
Adc是将一个模拟的值Adc通道使能配置
转化为一个电压的值
ADC2通道使能及模式设置
之后点击生成即可
实例测试
效果显示
显示在第三行
案例程序
badc
/----------------------------badc.h---------------------------------------------/
#ifndef __BADC_H__
#define __BADC_H__#include "main.h"
double getADC(ADC_HandleTypeDef *pin);#endif
/-----------------------------badc.c---------------------------------------------/
#include "badc.h"//读取adc值的函数double getADC(ADC_HandleTypeDef *pin)
{uint adc;//读出的原始值HAL_ADC_Start(pin);//开启adcadc = HAL_ADC_GetValue(pin);return adc*3.3/4096;// 读取到的电压值,均分一个等分看在3.3所占的比例
}
/---------------------------------interrupt.h----------------------------------/
#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__#include "main.h"
#include "stdbool.h"
struct keys
{uchar judge_sta;bool key_sta;bool single_flag;//确认被按下他为1uint key_time; //判断按下的时间,时间比较长uchar long_flag;
};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);#endif
/---------------------------------interrupt.c----------------------------------/
按键相关函数
struct keys key[4] = {0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM4){key[0].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i = 0;i<4;i++){switch (key[i].judge_sta){case 0:{if(key[i].key_sta == 0) //发现按键被按下{ key[i].judge_sta=1;key[i].key_time=0;//将时间清零}}break;case 1:{if(key[i].key_sta ==0)//消抖的过程里面就不能确定他短按键会与长按键冲突{key[i].judge_sta=2;}else key[i].judge_sta=0;}break;case 2:{if(key[i].key_sta==1)//长按{key[i].judge_sta=0; if(key[i].key_time<70){key[i].single_flag = 1;}}else{key[i].key_time++;//在他没有松开的打断时间内if(key[i].key_time>70) key[i].long_flag=1;}}break;case 3:{}break;}}}
}
测量频率+占空比
double ccrl_val1a = 0,ccrl_val2a = 0;
uint ccr1_val1b=0,ccr1_val2b=0;
uint frq1=0,frq2=0; //频率
float duty1=0,duty2=0;//占空比void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM2){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//中段消息来源 选择直接输入的通道{ccrl_val1a= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //计时值hal库的计时函数 直接ccr1_val1b= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); //计时值hal库的计时函数 间接__HAL_TIM_SetCounter(htim,0);//计时值清零frq1=(80000000/80)/ccrl_val1a;//计算频率duty1=(ccr1_val1b/ccrl_val1a)*100;HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);//从小打开定时器HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);//从小打开定时器}}if(htim->Instance==TIM3){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//中段消息来源 选择直接输入的通道{ccrl_val2a= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //计时值hal库的计时函数 直接ccr1_val2b= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); //计时值hal库的计时函数 间接__HAL_TIM_SetCounter(htim,0);//计时值清零frq2=(80000000/80)/ccrl_val2a;//计算频率duty2=(ccr1_val2b/ccrl_val2a)*100;HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);//从小打开定时器HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);//从小打开定时器}}
}
main.h
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "badc.h"
/* USER CODE END Includes *//* USER CODE BEGIN PTD */
void key_proc(void);//按键的过程
void disp_proc(void);//显示界面的过程extern struct keys key[];
extern uint frq1,frq2;//计算的到的回调值
extern float duty1,duty2;
uchar view=0;uchar pa6_duty = 10;
uchar pa7_duty = 10;/* USER CODE END PTD */
main
int main(void)
{/* USER CODE BEGIN 2 */LED_Disp(0x00);//LED初始化LCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);HAL_TIM_Base_Start_IT(&htim4); //定时器中断HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//打开pwm的输出通道HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);//打开pwm的输通道//打开定时器HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); //定时器中断 频率测量捕获定时器开启HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1); //定时器中断/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */key_proc();disp_proc();
// LED_Disp(0x02);
// HAL_Delay(500);
// LED_Disp(0x00);
// HAL_Delay(1000);}/* USER CODE END 3 */
}
按键的过程
/* USER CODE BEGIN 4 */void key_proc(void)//按键的过程
{if(key[0].single_flag ==1){view=!view;key[0].single_flag=0;}if(key[1].single_flag ==1)//按键2按下一次加10%{pa6_duty+=10;if(pa6_duty>=100) pa6_duty=10;__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);//设置比较key[1].single_flag=0;}if(key[2].single_flag ==1)//按键3 按下一次加10%{pa7_duty+=10;if(pa7_duty>=100) pa7_duty=10;__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);//设置比较key[2].single_flag=0;}
}
显示界面的过程
void disp_proc(void)//显示界面的过程
{if(view==0){char text[30];sprintf(text," Data ");LCD_DisplayStringLine(Line1, (uint8_t *)text);sprintf(text," FRQ1=%d ",frq1);LCD_DisplayStringLine(Line2, (uint8_t *)text);sprintf(text," duty1=%.3f ",duty1);LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text," FRQ2=%d ",frq2);LCD_DisplayStringLine(Line4, (uint8_t *)text);sprintf(text," duty2=%.3f ",duty2);LCD_DisplayStringLine(Line5, (uint8_t *)text);//ADC显示 1 测量的是靠左的电位器sprintf(text," V:=%.2f ",getADC(&hadc1));//在mx中配置了LCD_DisplayStringLine(Line6, (uint8_t *)text);//2sprintf(text," V:=%.2f ",getADC(&hadc2));//在mx中配置了LCD_DisplayStringLine(Line7, (uint8_t *)text);}if(view==1)//参数显示界面{char text[30];sprintf(text," Para ");LCD_DisplayStringLine(Line1, (uint8_t *)text);sprintf(text," PA6:%d ",pa6_duty);LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text," PA7:%d ",pa7_duty);LCD_DisplayStringLine(Line4, (uint8_t *)text);//界面清理 sprintf(text," ");LCD_DisplayStringLine(Line2, (uint8_t *)text);sprintf(text," ");LCD_DisplayStringLine(Line5, (uint8_t *)text);}
}/* USER CODE END 4 */
二、IIC通信-eeprom
原理图AT24C02
引脚配置
为什么要配置成output模式因为官方会提供一个i2c的库,可以直接用用的是软件IIC
不可用状态,用的软件IIC
之后直接生成就可
官方库移植
将这两个文件复制到bsp文件下面
At24c02手册
1k,2k是容量
一个总线上可以挂很多很多芯片
真题案例
实验现象
问题 ---按键没有用只显示1038
案例程序
#include "i2c - hal.h"官方给的参考程序的头文件有问题所以要改成这样
I2c.h
#ifndef __I2C_H
#define __I2C_H#include "main.h"void I2CStart(void);
void I2CStop(void);
unsigned char I2CWaitAck(void);
void I2CSendAck(void);
void I2CSendNotAck(void);
void I2CSendByte(unsigned char cSendByte);
unsigned char I2CReceiveByte(void);
void I2CInit(void);
void eeprom_write(uchar addr,uchar dat);
uchar eeprom_read(uchar addr);#endif
i2c.c
读的函数
//读的函数uchar eeprom_read(uchar addr)
{//正常代码
// uchar dat;
// I2CStart();//i2c开启
// I2CSendByte(0xa0);//联系芯片
// I2CWaitAck();
// I2CSendByte(addr);//传递的参数
// I2CWaitAck();
//
// //将真实的数据读回
// I2CStart();
// I2CSendByte(0xa1);
// I2CWaitAck();//发送完等待
// dat=I2CReceiveByte();
// I2CSendNotAck();
// I2CStop();
// return dat;//返回结果uchar dat;I2CStart();//i2c开启I2CSendByte(0xa0);//联系芯片 I2CWaitAck();I2CSendByte(addr);//传递的参数I2CWaitAck();I2CStop();I2CStart();//i2c开启I2CSendByte(0xa1);//联系芯片 I2CWaitAck();dat=I2CReceiveByte();I2CSendNotAck();I2CStop();return dat;//返回结果}
写的函数
void eeprom_write(uchar addr,uchar dat)
{I2CStart();//i2c开启I2CSendByte(0xa0);//联系芯片 I2CWaitAck();//等待应答I2CSendByte(addr);//传递的参数I2CWaitAck();I2CSendByte(dat);//数据发送给芯片I2CWaitAck();I2CStop();
}
main
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "badc.h"
#include "i2c - hal.h"/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
void key_proc(void);//按键的过程
void disp_proc(void);//显示界面的过程extern struct keys key[];
extern uint frq1,frq2;//计算的到的回调值
extern float duty1,duty2;
uchar view=0;uchar pa6_duty = 10;
uchar pa7_duty = 10;/* USER CODE END PTD */
主函数
int main(void)
{
/* USER CODE BEGIN 2 */LED_Disp(0x00);//LED初始化LCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);HAL_TIM_Base_Start_IT(&htim4); //定时器中断HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//打开pwm的输出通道HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);//打开pwm的输通道//打开定时器HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); //定时器中断 频率测量捕获定时器开启HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1); //定时器中断/* USER CODE END 2 *//* USER CODE BEGIN WHILE */while (1){/* USER CODE BEGIN 3 */key_proc();disp_proc();
// LED_Disp(0x02);
// HAL_Delay(500);
// LED_Disp(0x00);
// HAL_Delay(1000);}/* USER CODE END 3 */
}
按键的过程、参数显示界面
/* USER CODE BEGIN 4 */void key_proc(void)//按键的过程
{if(key[0].single_flag ==1){view=!view;key[0].single_flag=0;}if(key[1].single_flag ==1)//按键2按下一次加10%{pa6_duty+=10;if(pa6_duty>=100) pa6_duty=10;__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);//设置比较key[1].single_flag=0;}if(key[2].single_flag ==1)//按键3 按下一次加10%{pa7_duty+=10;if(pa7_duty>=100) pa7_duty=10;__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);//设置比较key[2].single_flag=0;}//显示按键频率 eeprom只能存一个8位,所以要将他拆成高八位和低八位if(key[3].single_flag ==1)//按键3{uchar frq_h = frq1 >> 8;uchar frq_l = frq1 & 0xff;eeprom_write(1,frq_h);//写入高位HAL_Delay(10);//太快会发不出去eeprom_write(2,frq_l);//写入低8位key[3].single_flag = 0;}
}void disp_proc(void)//显示界面的过程
{if(view==0){char text[30];sprintf(text," Data ");LCD_DisplayStringLine(Line1, (uint8_t *)text);sprintf(text," FRQ1=%d ",frq1);LCD_DisplayStringLine(Line2, (uint8_t *)text);sprintf(text," duty1=%.3f ",duty1);LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text," FRQ2=%d ",frq2);LCD_DisplayStringLine(Line4, (uint8_t *)text);sprintf(text," duty2=%.3f ",duty2);LCD_DisplayStringLine(Line5, (uint8_t *)text);//ADC显示 1 测量的是靠左的电位器sprintf(text," V:=%.2f ",getADC(&hadc1));//在mx中配置了LCD_DisplayStringLine(Line6, (uint8_t *)text);//2sprintf(text," V:=%.2f ",getADC(&hadc2));//在mx中配置了LCD_DisplayStringLine(Line7, (uint8_t *)text);uint eep_temp=(eeprom_read(1)<<8)+eeprom_read(2);//读取数据,高8位放第1位,低8位放2为sprintf(text," FRQ_eep=%d ",eep_temp);//将存入的数据显示出来LCD_DisplayStringLine(Line8, (uint8_t *)text);}if(view==1)//参数显示界面{char text[30];sprintf(text," Para ");LCD_DisplayStringLine(Line1, (uint8_t *)text);sprintf(text," PA6:%d ",pa6_duty);LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text," PA7:%d ",pa7_duty);LCD_DisplayStringLine(Line4, (uint8_t *)text);//界面清理 sprintf(text," ");LCD_DisplayStringLine(Line2, (uint8_t *)text);sprintf(text," ");LCD_DisplayStringLine(Line5, (uint8_t *)text);}
}/* USER CODE END 4 */
案例显现展示
三、uart
原理图
2022年1月~2月购买的可能会有硬件故障 --
官方给的代码的测试现象
cube配置
改为异步模式,同步模式其他端口被占用,串口参数设置,如果没有设置lcd的话他会默认PC4和PC5,所以需要手动更改
参数设置
波特率设置
根据题目要求设置
中断使能
之后生成代码即可
案例代码呈现
interrupt同上
main
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "badc.h"
#include "i2c - hal.h"
#include "string.h"/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
void key_proc(void);//按键的过程
void disp_proc(void);//显示界面的过程extern struct keys key[];
extern uint frq1,frq2;//计算的到的回调值
extern float duty1,duty2;
uchar view=0;uchar pa6_duty = 10;
uchar pa7_duty = 10;/* USER CODE END PTD */
主函数
int main(void)
{/* USER CODE BEGIN 2 */LED_Disp(0x00);//LED初始化LCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);HAL_TIM_Base_Start_IT(&htim4); //定时器中断HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//打开pwm的输出通道HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);//打开pwm的输通道//打开定时器HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); //定时器中断 频率测量捕获定时器开启HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1); //定时器中断/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */key_proc();disp_proc();//简单的发送char temp[20];sprintf(temp,"frq=%d\r\n",frq1); //打印频率再电脑HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);HAL_Delay(500);}/* USER CODE END 3 */
}
按键设置及界面显示
/* USER CODE BEGIN 4 */void key_proc(void)//按键的过程
{if(key[0].single_flag ==1){view=!view;key[0].single_flag=0;}if(key[1].single_flag ==1)//按键2按下一次加10%{pa6_duty+=10;if(pa6_duty>=100) pa6_duty=10;__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);//设置比较key[1].single_flag=0;}if(key[2].single_flag ==1)//按键3 按下一次加10%{pa7_duty+=10;if(pa7_duty>=100) pa7_duty=10;__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);//设置比较key[2].single_flag=0;}//显示按键频率 eeprom只能存一个8位,所以要将他拆成高八位和低八位if(key[3].single_flag ==1)//按键3{uchar frq_h = frq1 >> 8;uchar frq_l = frq1 & 0xff;eeprom_write(1,frq_h);//写入高位HAL_Delay(10);//太快会发不出去eeprom_write(2,frq_l);//写入低8位key[3].single_flag = 0;}
}void disp_proc(void)//显示界面的过程
{if(view==0){char text[30];sprintf(text," Data ");LCD_DisplayStringLine(Line1, (uint8_t *)text);sprintf(text," FRQ1=%d ",frq1);LCD_DisplayStringLine(Line2, (uint8_t *)text);sprintf(text," duty1=%.3f ",duty1);LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text," FRQ2=%d ",frq2);LCD_DisplayStringLine(Line4, (uint8_t *)text);sprintf(text," duty2=%.3f ",duty2);LCD_DisplayStringLine(Line5, (uint8_t *)text);//ADC显示 1 测量的是靠左的电位器sprintf(text," V:=%.2f ",getADC(&hadc1));//在mx中配置了LCD_DisplayStringLine(Line6, (uint8_t *)text);//2sprintf(text," V:=%.2f ",getADC(&hadc2));//在mx中配置了LCD_DisplayStringLine(Line7, (uint8_t *)text);串口相关代码///uint eep_temp=(eeprom_read(1)<<8)+eeprom_read(2);//读取数据,高8位放第1位,低8位放2为sprintf(text," FRQ_eep=%d ",eep_temp);//将存入的数据显示出来LCD_DisplayStringLine(Line8, (uint8_t *)text);}if(view==1)//参数显示界面{char text[30];sprintf(text," Para ");LCD_DisplayStringLine(Line1, (uint8_t *)text);sprintf(text," PA6:%d ",pa6_duty);LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text," PA7:%d ",pa7_duty);LCD_DisplayStringLine(Line4, (uint8_t *)text);//界面清理 sprintf(text," ");LCD_DisplayStringLine(Line2, (uint8_t *)text);sprintf(text," ");LCD_DisplayStringLine(Line5, (uint8_t *)text);}
}/* USER CODE END 4 */
现象效果展示
串口数据
lcd显示
相关文章:
蓝桥杯速成教程{三}(adc,i2c,uart)
目录 一、adc 原理图编辑引脚配置 Adc通道使能配置 实例测试 编辑效果显示 案例程序 badc 按键相关函数 测量频率占空比 main 按键的过程 显示界面的过程 二、IIC通信-eeprom 原理图AT24C02 引脚配置 不可用状态,用的软件IIC 官方库移植 At24c02手册 编辑…...
【Agent】Chatbot、Copilot与Agent如何帮助我们的提升效率?
人工智能(AI)技术的迅猛发展正在深刻改变我们的生活和工作方式。你是否曾想过,未来的工作场景会是什么样子?AI的崛起不仅仅是科技的进步,更是我们生活方式的革命。今天,我们将深入探讨三种主要的AI能力&…...
PostgreSQL 数据库连接
title: PostgreSQL 数据库连接 date: 2024/12/29 updated: 2024/12/29 author: cmdragon excerpt: PostgreSQL是一款功能强大的开源关系数据库管理系统,在现代应用中广泛应用于数据存储和管理。连接到数据库是与PostgreSQL进行交互的第一步,这一过程涉及到多个方面,包括连…...
C++ 设计模式:中介者模式(Mediator Pattern)
链接:C 设计模式 链接:C 设计模式 - 门面模式 链接:C 设计模式 - 代理模式 链接:C 设计模式 - 适配器 中介者模式(Mediator Pattern)是行为型设计模式之一,它的主要目的是通过一个中介者对象来…...
计算机网络期末复习
目录 第一章-概述 第二章-物理层 第三章-数据链路层 第四章-网络层 第五章-运输层 第六章-应用层 试卷 郑州轻工业大学--计算机网络(谢希仁-第八版)--期末复习重点题型及试卷 如果有答案错乱或者不对的地方请告知一下,感谢࿰…...
JUC并发工具---线程协作
信号量能被FixedThreadPool代替吗 Semaphore信号量 控制需要限制访问量的资源,没有获取到信号量的线程会被阻塞 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore;public class Sem…...
SkyWalking java-agent 是如何工作的,自己实现一个监控sql执行耗时的agent
Apache SkyWalking 是一个开源的应用性能监控 (APM) 工具,支持分布式系统的追踪、监控和诊断。SkyWalking Agent 是其中的一个重要组件,用于在服务端应用中收集性能数据和追踪信息,并将其发送到 SkyWalking 后端服务器进行处理和展示。 SkyW…...
Linux 常用命令 - pwd 【显示当前工作目录】
简介 pwd 命令来源于 “print working directory”,即“打印当前工作目录”。这个命令的最主要功能就是显示当前用户所在的完整目录路径。在实际工作中我们经常会频繁在各个目录下进行切换,为了快速获取当前我们所在的目录,可以使用该命令进…...
如何在 Ubuntu 上安装 PyTorch
简介 PyTorch 因其易用性、动态计算图和高效性而日益流行,成为实现深度学习模型的首选。如果你想探索这个工具并学习如何在 Ubuntu 上安装 PyTorch,本指南将对你有所帮助! 在本教程中,我们将引导你完成在 Ubuntu 系统上使用 Pip…...
redis优化
在高并发、高性能、高可用系统中,Redis 的优化至关重要。以下是一些在面试中可以详细说明的 Redis 优化策略,以及具体的实践经验和技术亮点: 1. 数据模型与结构设计优化 使用合适的数据结构 :根据业务需求选择合适的 Redis 数据结…...
QT的信号和槽页面的应用
完善对话框,点击登录弹出对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配&…...
Jmeter自学【8】- 使用JMeter模拟设备通过MQTT发送数据
今天使用jmeter推送数据到MQTT,给大家分享一下操作流程。 一、安装JMeter 参考文档:Jmeter自学【1】- Jmeter安装、配置 二、安装MQTT插件 1、下载插件 我的Jmeter版本是5.6.3,用到的插件是:mqtt-xmeter-2.0.2-jar-with-depe…...
深度学习任务中的 `ulimit` 设置优化指南
深度学习任务中的 ulimit 设置优化指南 1. 什么是 ulimit?2. 深度学习任务中的关键 ulimit 设置2.1 max locked memory(-l)2.2 open files(-n)2.3 core file size(-c)2.4 stack size(…...
C++(Qt)软件调试---VS性能探查器(27)
文章目录 [toc]1 概述🐜2 VS工具说明2.1 使用场景2.2 工具适用项目 3 CPU使用率4 内存分析4.1 调试模式下分析内存4.2 非调试模式下分析内存 5 相关地址🐐 更多精彩内容👉内容导航 👈👉C软件调试 👈 1 概述…...
Spring源码_05_IOC容器启动细节
前面几章,大致讲了Spring的IOC容器的大致过程和原理,以及重要的容器和beanFactory的继承关系,为后续这些细节挖掘提供一点理解基础。掌握总体脉络是必要的,接下来的每一章都是从总体脉络中, 去研究之前没看的一些重要…...
【c语言】简单的c程序设计
内存 1byte8bit 1KB1024byte 1MB1024byte 1G1024MB 1T1024G 变量 变量可以由数字、字母和下划线组成且不能以数字开头任何不满足条件的变量都是非法变量,如含有特殊字符的变量等变量不能含有空白字符,如空格、换行符等变量区分大小写变量不能是c语言…...
k8s dashboard可视化操作界面的安装
一、官方安装方法 根据官网的安装配置可以选择如下安装: kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml 二、添加阿里云加速进行安装 #修改recommended.yaml拉取镜像的链接 vim recommended.yam…...
鸿蒙项目云捐助第三十一讲云捐助项目云前台显示商品列表
鸿蒙项目云捐助第三十一讲云捐助项目云前台显示商品列表 前面完成了云数据库后台的商品批量添加,这里需要把数据放在分类导航页面中显示。 一、云前台显示商品列表 这里需要把商品列表显示在MyNavSliderBar的组件中,MyNavSliderBar组件是通过首页路由实现的,在项…...
【rustdesk】客户端和服务端的安装和部署(自建服务器,docker,远程控制开源软件rustdesk)
【rustdesk】客户端和服务端的安装和部署(自建服务器,docker) 一、官方部署教程 https://rustdesk.com/docs/zh-cn/client/mac/ 官方服务端下载地址 https://github.com/rustdesk/rustdesk-server/releases 我用的docker感觉非常方便&am…...
Flink源码解析之:如何根据算法生成StreamGraph过程
Flink源码解析之:如何根据算法生成StreamGraph过程 在我们日常编写Flink应用的时候,会首先创建一个StreamExecutionEnvironment.getExecutionEnvironment()对象,在添加一些自定义处理算子后,会调用env.execute来执行定义好的Flin…...
【Spring MVC 核心机制】核心组件和工作流程解析
在 Web 应用开发中,处理用户请求的逻辑常常会涉及到路径匹配、请求分发、视图渲染等多个环节。Spring MVC 作为一款强大的 Web 框架,将这些复杂的操作高度抽象化,通过组件协作简化了开发者的工作。 无论是处理表单请求、生成动态页面&#x…...
2、Bert论文笔记
Bert论文 1、解决的问题2、预训练微调2.1预训练微调概念2.2深度双向2.3基于特征和微调(预训练下游策略) 3、模型架构4、输入/输出1.输入:2.输出:3.Learned Embeddings(学习嵌入)1. **Token Embedding**2. **Position Embedding**3…...
hadoop搭建
前言 一般企业中不会使用master slave01 slave02来命名 vmware创建虚拟机 打开vmware软件,新建虚拟机 典型 稍后安装系统 选择centos7 虚拟机名称和安放位置自行选择(最小化安装消耗空间较少) 默认磁盘大小即可 自定义硬件 选择centos7的i…...
19_HTML5 Web Workers --[HTML5 API 学习之旅]
HTML5 Web Workers 是一种允许 JavaScript 在后台线程中运行的技术,从而不会阻塞用户界面或其他脚本的执行。通过使用 Web Workers,你可以执行复杂的计算任务而不影响页面的响应速度,提升用户体验。 Web Workers 的特点 Web Workers 是 HTM…...
【PCIe 总线及设备入门学习专栏 5.1 -- PCIe 引脚 PRSNT 与热插拔】
文章目录 OverviewPRSNT 与热插拔PRSNT 硬件设计 Overview Spec 定义的热插拔是把一个PCIe卡(设备)从一个正在运行的背板或者系统中插入/或者移除。这个过程需要不影响系统的其他功能。插入的新的设备可以正确工作。 显然,这里面需要考虑的问…...
使用docker compose安装gitlab
使用docker compose安装gitlab GitLab简介设置GITLAB_HOME路径创建docker挂载目录获取可用的GitLab版本编写docker-compose.yml文件启动docker基础配置 GITLAB_OMNIBUS_CONFIG修改配置 中文设置数据库配置系统邮箱配置 GitLab简介 GitLab是一个基于Git的开源项目,…...
性能中 UV、PV 和并发量的关系
在性能测试中,UV(独立访客数)、PV(页面浏览量)和并发量是重要的指标,用于评估系统的负载能力。它们之间关系紧密,需要通过合理的计算和示例进行说明。 1. 概念解析 UV(Unique Visito…...
Go语言zero项目服务恢复与迁移文档
## 一. 服务器环境配置 在迁移和配置 项目时,首先需要确保服务器环境正确配置。以下是配置步骤: ### 1. 安装 Go 语言环境 首先,确保 Go 语言环境已经安装,并且配置正确。执行以下步骤: # 下载 Go 语言安装包 wge…...
Redis - Token JWT 概念解析及双token实现分布式session存储实战
Token 定义:令牌,访问资源接口(API)时所需要的资源凭证 一、Access Token 定义:访问资源接口(API)时所需要的资源凭证,存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…...
QT中使用OpenGL function
1.前言 QT做界面编程很方便,QTOpenGL的使用也很方便,因为QT对原生的OpenGL API进行了面向对象化的封装。 如: 函数:initializeOpenGLFunctions()...... 类:QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShader…...
STM32-笔记18-呼吸灯
1、实验目的 使用定时器 4 通道 3 生成 PWM 波控制 LED1 ,实现呼吸灯效果。 频率:2kHz,PSC71,ARR499 利用定时器溢出公式 周期等于频率的倒数。故Tout 1/2KHZ;Ft 72MHZ PSC71(喜欢设置成Ft的倍数&…...
MAC M4安装QT使用国内镜像源在线安装
MAC M4安装QT使用国内镜像源在线安装 一、下载安装包1. 访问[https://www.qt.io/](https://www.qt.io/)下载在线安装包2. 下载结果 二、创建QT账户,安装的时候需要三、安装1. 终端打开安装包2. 指定安装源3. 运行安装完的QT 一、下载安装包 1. 访问https://www.qt.…...
go语言中zero框架项目日志收集与配置
在 GoZero 项目中,日志收集和配置是非常重要的,尤其是在分布式系统中,日志可以帮助开发人员追踪和排查问题。GoZero 提供了灵活的日志系统,能够方便地进行日志的配置和管理。 以下是如何在 GoZero 项目中进行日志收集与配置的基本…...
springboot496基于java手机销售网站设计和实现(论文+源码)_kaic
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本手机销售网站就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…...
iClient3D for Cesium在Vue中快速实现场景卷帘
作者:gaogy 1、背景 iClient3D for Cesium是由SuperMap提供的一个前端3D地图客户端,提供了丰富的功能与接口,使得开发者能够在Web应用中快速集成并展现3D地理信息。而在Vue框架中集成iClient3D,不仅可以利用Vue的响应式特性提高开…...
Elasticsearch-索引的批量操作
索引的批量操作 批量查询和批量增删改 批量查询 #批量查询 GET product/_search GET /_mget {"docs": [{"_index": "product","_id": 2},{"_index": "product","_id": 3}] }GET product/_mget {"…...
TVS二极管选型【EMC】
TVS器件并联在电路中,当电路正常工作时,他处于截止状态(高阻态),不影响线路正常工作,当线路处于异常过压并达到其击穿电压时,他迅速由高阻态变为低阻态,给瞬间电流提供一个低阻抗导通…...
反编译APK获取xml资源
第一步去官网下载 jar 包 最新的即可 apktool官网下载地址 下载好重命名一下 改成 apktool.jar 第二步将你的 apk 和 jar 包放在同一个文件夹下面 第三步在该文件夹下打开 命令行 并输入 java -jar apktool.jar d 测试.apk回车后会正在解析 解析完成后,文件夹下…...
C++ 设计模式:装饰模式(Decorator Pattern)
链接:C 设计模式 链接:C 设计模式 - 桥接模式 装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类来包装原始类&…...
排序算法之快速排序、归并排序
目录 快速排序归并排序的意义 快速排序 思维步骤 具体思想 测试样例解释 代码实现 归并排序 思维步骤 具体思想 测试样例解释 代码实现 快速排序归并排序的意义 快速排序和归并排序不仅仅是一种方法,更重要的是其作为一种算法而节省时间,在…...
一文读懂变分自编码(VAE)
一文读懂变分自编码(VAE) 概述 变分自编码器(Variational Autoencoder, VAE)是一种生成模型,用于学习数据的潜在表示并生成与原始数据分布相似的新数据。它是一种概率模型,通过结合深度学习和变分推断的思想,解决了传…...
【每日学点鸿蒙知识】webview性能优化、taskpool、热更新、Navigation问题、调试时每次都卸载重装问题
1、HarmonyOS webview页面第二次,第三次打开感觉和第一次打开速度差不多,有优化吗,或者有没有webview秒开方案之类的? 目前没有webview秒开的方案,针对web场景的优化参考一下文档:https://developer.huawe…...
周记-唐纳德的《计算机程序设计艺术》
用代码生成代码 开发一个协议,字段有些多,每个字段是QT的属性,需要写Q_PROPERTY,一个一个编辑的话比较繁琐,耗费时间。后来就用代码生成了头文件和源文件,get和set还有signal函数,内容基本都是…...
AR 模型的功率谱
功率谱密度(Power Spectral Density, PSD)的表达式是从信号的自相关函数和系统的频率响应推导出来的,特别是对于 AR(Auto-Regressive,自回归)模型。以下是推导的过程: 1. AR 模型的定义…...
抖音小程序登录(前端通过tt.login获取code换取openId)
抖音小程序登录 抖音开放平台小程序登录: https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/tutorial/basic-ability/microapp-login 前端(通过tt.login获取code) 流程 静默登录依赖小程序 API tt.login,把tt.loginsuccess 回调…...
Linux 更改Jenkins使用其他账户启动
Linux 更改Jenkins使用其他账户启动 步骤一:修改 Jenkins 配置文件1. 编辑 Jenkins 的 systemd 服务文件:2. 在编辑器中添加以下内容:3. 保存并退出编辑器 步骤二:更改 Jenkins 目录的权限步骤三:重新加载 systemd 配置…...
117.【C语言】数据结构之排序(选择排序)
目录 1.知识回顾 2.分析 设想的思路 代码 执行结果 编辑 错误排查和修复 详细分析出错点 执行结果 3.正确的思路 4.其他问题 1.知识回顾 参见42.5【C语言】选择排序代码 点我跳转 2.分析 知识回顾里所提到的文章的选择排序一次循环只比一个数字,和本文接下来要…...
读书系列2024
认知类 1、《人生没有太晚的开始》: 作者摩西奶奶。 书中经典语录:“与其着急忙慌地不知从何开始,不如一切都慢慢来,开始并坚持了,总会有结果的那一天。喜欢一件事,你就慢慢去做吧。” 2、《忏悔录》托尔…...
如何快速又安全的实现端口转发【Windows MAC linux通用】
背景 有很多程序是在虚拟机上运行的,返回的url 又是127.0.0.1。在个人电脑上调试需要解决这个问题。端口转发是一个不错的方法 可能的解决办法: 1.修改程序,返回虚拟机的ip (要改代码,换虚拟机还要再改代码…...
OpenGL变换矩阵和输入控制
在前面的文章当中我们已经成功播放了动画,让我们的角色动了起来,这一切变得比较有意思了起来。不过我们发现,角色虽然说是动了起来,不过只是在不停地原地踏步而已,而且我们也没有办法通过键盘来控制这个角色来进行移动…...