蓝桥杯嵌入式学习笔记

用博客来记录一下参加蓝桥杯嵌入式第十六届省赛的学习经历

  • 工具
    • 环境准备
      • cubemx配置
        • 外部高速时钟使能
        • 设置串口
        • 时钟配置
        • 项目配置
      • keil配置
        • 烧录方式
        • 注意
        • 代码规范
        • 头文件配置
  • 模块
    • led
      • cubemx配置
      • keil代码
        • 实现点亮一只灯
        • 实现具体操作的灯,以及点亮还是熄灭
    • 按键
      • cubemx配置
      • keil代码
    • LCD
      • keil代码
      • 引脚冲突问题
    • LED闪烁
      • cubemx配置
      • keil代码
    • 按键长按
      • cubemx配置
      • keil代码
    • LCD高亮显示
      • keil代码
    • PWM输出
      • 计算公式
      • cubemx配置
      • keil代码
    • 输入捕获测量引脚输出PWM波周期
      • 原理图
      • 要求:用PA7来测量PA1生成PWM波的频率
      • cubemx配置
      • keil代码
    • 输入捕获测量555定时器频率
      • 原理图
      • cubemx配置
      • keil代码
    • ADC测量
      • 原理图
      • cubemx配置
      • keil代码
    • 串口发送和接收
      • 原理图
      • cubemx配置
      • keil代码
    • 利用定时器进行串口不定长数据接收
      • 原理
      • cubemx配置
      • keil代码
    • EEPROM读写
      • 原理
      • keil代码

工具

keil5,stm32cube

环境准备

根据赛事方提供的板子来选择cubemx上的器件
。。。

cubemx配置

外部高速时钟使能

外部高速时钟使能

设置串口

在这里插入图片描述

时钟配置

时钟配置为24MHZ因为外部晶振为24MHZ,其余的暂时不清楚原因
在这里插入图片描述

项目配置

配置为MDK
需要注意,固件地址需要设置为下载解压后的文件地址(提前从数据包中下载)
在这里插入图片描述
勾选生成.c.h文件
在这里插入图片描述
注意一下,下载好软件后,要解压固件包,然后在help中设置地址
在这里插入图片描述

keil配置

烧录方式

在这里插入图片描述
烧录设置
在这里插入图片描述
要是没有芯片包,需要从赛事数据包中解压,会自动生成
在这里插入图片描述
keil代码自动补全
点击edit,configraution选择跟编译相关的Text Completion,然后勾线第三个
在这里插入图片描述

注意

代码需要写入begin - end之间

代码规范

新建code文件夹
右键CMSIS,点击Manage Project,新建一个文件夹
在这里插入图片描述
点击魔术棒,c++,include path,添加文件夹路径
在这里插入图片描述
然后添加fun.c,fun.h,headfile.h 三个文件
头文件可能显示不出来,所以需要添加existing file 再勾选all file,即可添加

头文件配置

headfile.h
在这里插入图片描述
fun.h
在这里插入图片描述

fun.c
在这里插入图片描述
main.c
在这里插入图片描述

模块

led

led引脚分配图
通过观察开发板led电路图可以发现,led的的引脚控制由PC8~15低电平点亮,同时PD2锁存器控制开关,需要置高电平

cubemx配置

将PC8~15设置为输出,PD2设置为输出
在GPIO配置中,将引脚全部配置为高电平,使得上电时LED灭
在这里插入图片描述

keil代码

实现点亮一只灯

fun.c主要代码

void led_show()
{HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);}

fun.h代码

void led_show(void);

main.c代码(需要在主函数内)

led_show();
实现具体操作的灯,以及点亮还是熄灭

fun.c代码

void led_show(uint8_t led, uint8_t mode)
{HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);if(mode)HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8 << (led - 1), GPIO_PIN_RESET); //GPIO_PIN_8的二进制代码为0000 0001 0000 0000 GPIO_PIN_9的二进制代码为0000 0010 0000 0000,所以用左移移位符elseHAL_GPIO_WritePin(GPIOC, GPIO_PIN_8 << (led - 1), GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);}

fun.h代码(需要加上那个头函数)

#include "stm32g4xx.h"                  // Device headervoid led_show(uint8_t led, uint8_t mode);

main.c代码(灯1, 4,8亮)

		led_show(1, 1);led_show(4, 1);led_show(8, 1);

按键

原理图,如图,需要将PB0~2,PA0配置为上拉输入模式。按下为低电平,松开为高电平
在这里插入图片描述

cubemx配置

,PA0

keil代码

fun.c代码

void key_scan()
{B1_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);B2_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);B3_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);B4_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);if(B1_state == 0 && B1_last_state == 1)//°´¼üB1°´ÏÂ{led_show(1, 1);}if(B2_state == 0 && B2_last_state == 1)//°´¼üB1°´ÏÂ{led_show(1, 0);}if(B3_state == 0 && B3_last_state == 1)//°´¼üB1°´ÏÂ{led_show(2, 1);}if(B4_state == 0 && B4_last_state == 1)//°´¼üB1°´ÏÂ{led_show(2, 0);}B1_last_state	= B1_state;B2_last_state	= B2_state;B3_last_state	= B3_state;B4_last_state	= B4_state;}

fun.h代码

void key_scan(void);//里面没有这个void会有waring,但影响似乎不大

main.c代码
同样放入while循环中
在这里插入图片描述

LCD

首先在赛事方提供的数据包中找到液晶驱动参考程序,HAL库版本,找到lcd.c,font.h,lcd,h,复制到code文件夹,打开keil工程文件,添加这三个文件
在这里插入图片描述
初始准备
main.c函数
在这里插入图片描述
headfile.h函数
在这里插入图片描述

keil代码

实现了在第一行显示字符,按键按下时,第三行数字变化的功能
fun.c代码

#include "headfile.h"int count = 0;void led_show(uint8_t led, uint8_t mode)
{HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);if(mode)HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8 << (led - 1), GPIO_PIN_RESET);elseHAL_GPIO_WritePin(GPIOC, GPIO_PIN_8 << (led - 1), GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);}uint8_t B1_state;
uint8_t B1_last_state;
uint8_t B2_state;
uint8_t B2_last_state;
uint8_t B3_state;
uint8_t B3_last_state;
uint8_t B4_state;
uint8_t B4_last_state;void key_scan()
{B1_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);B2_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);B3_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);B4_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);if(B1_state == 0 && B1_last_state == 1)//°´¼üB1°´ÏÂ{count ++;}if(B2_state == 0 && B2_last_state == 1)//°´¼üB1°´ÏÂ{count --;}if(B3_state == 0 && B3_last_state == 1)//°´¼üB1°´ÏÂ{led_show(2, 1);}if(B4_state == 0 && B4_last_state == 1)//°´¼üB1°´ÏÂ{led_show(2, 0);}B1_last_state	= B1_state;B2_last_state	= B2_state;B3_last_state	= B3_state;B4_last_state	= B4_state;}char text[20]; //linemax = 20void lcd_show()
{sprintf(text, "zlfsgdsg");//¿ÉÒÔµ÷Õû×Ö·û´®Î»Ö㬵«ÊÇ×î¶à20¸ö×Ö·ûLCD_DisplayStringLine(Line0, (uint8_t *)text);sprintf(text, "     count: %d     ", count);LCD_DisplayStringLine(Line3, (uint8_t *)text);}

fun.h代码

#ifndef _fun_h
#define _fun_h#include "stm32g4xx.h"                  // Device headervoid led_show(uint8_t led, uint8_t mode);void key_scan(void);void lcd_show(void);#endif

main.c代码

在这里插入图片描述

引脚冲突问题

lcd和led的引脚有冲突
在这里插入图片描述
解决办法:将PD2引脚提前置低电平,这样数据就不能传入led,led就不会点亮了,但是下次点亮led时依旧会出现这样的问题,所以需要将所有用到的LCD.C函数加上

uint16_t temp = GPIOC->ODR;
GPIOC->ODR = temp;

解决方法如下
main.c (在初始化部分)

	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);

lcd.c (部分代码)
在这里插入图片描述
在这里插入图片描述
问题成功解决!

LED闪烁

两个重要参数:PSC,ARR
其中系统频率f为80MHZ,如果要让T=1,则可令ARR = 9999,PSC = 7999;即可确定定时周期为1
在这里插入图片描述
初始化
在headfile.h文件中添加tim.h文件头
在这里插入图片描述
main.c
在这里插入图片描述

cubemx配置

需要配置定时器,正常使用通用定时器TIM2即可,重点是修改PSC和ARR
在这里插入图片描述
在这里插入图片描述
生成代码后可发现多了tim.c函数,找到stm32g4xx_hal_tim.h文件里面的call_back回调函数
在这里插入图片描述
将其复制到fun.c中

keil代码

在fun.c中定义一个变量

uint8_t led_mode;

在这里插入图片描述

按键长按

原理,用一个计数器cnt(取10000)计时1s,20000对应2s,5000对应0.5s来计时,达到识别按键长按的目的

cubemx配置

此时TIM3不使能!!
在这里插入图片描述

keil代码

fun.c代码

uint8_t B1_state;
uint8_t B1_last_state;
uint8_t B2_state;
uint8_t B2_last_state;
uint8_t B3_state;
uint8_t B3_last_state;
uint8_t B4_state;
uint8_t B4_last_state;void key_scan()
{B1_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);B2_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);B3_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);B4_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);if(B1_state == 0 && B1_last_state == 1)//°´¼üB1°´ÏÂ{TIM3->CNT = 0;}else if(B1_state == 0 && B1_last_state == 0) //°´¼üB1Ò»Ö±°´ÏÂ{if(TIM3->CNT >= 10000)//°´¼üB1³¤°´{count++;}}else if	(B1_state == 1 && B1_last_state == 0)//°´¼üB1ËÉ¿ª{if(TIM3->CNT < 10000)//°´¼üB1¶Ì°´{count += 2;}}if(B2_state == 0 && B2_last_state == 1)//°´¼üB1°´ÏÂ{count --;}if(B3_state == 0 && B3_last_state == 1)//°´¼üB1°´ÏÂ{led_show(2, 1);}if(B4_state == 0 && B4_last_state == 1)//°´¼üB1°´ÏÂ{led_show(2, 0);}B1_last_state	= B1_state;B2_last_state	= B2_state;B3_last_state	= B3_state;B4_last_state	= B4_state;}

main.c代码
需要注意!给TIM3使能,但因为不是中断,是定时器,所以不用IT
在这里插入图片描述

LCD高亮显示

其实就是调用 LCD_SetBackColor(Color);这个函数,把背景颜色改成黄色

keil代码

定义变量

uint8_t lcd_highshow;

按键b1按下时

			lcd_highshow ++;lcd_highshow %= 3;	

逻辑流程
应该蛮简单的,就不写注释了

void lcd_show()
{sprintf(text, "zlfsgdsg");//¿ÉÒÔµ÷Õû×Ö·û´®Î»Ö㬵«ÊÇ×î¶à20¸ö×Ö·ûLCD_DisplayStringLine(Line0, (uint8_t *)text);if(lcd_highshow == 0){LCD_SetBackColor(Yellow);sprintf(text, "     count: %d     ", count);LCD_DisplayStringLine(Line3, (uint8_t *)text);LCD_SetBackColor(Black);sprintf(text, "     txysgdmn     ");LCD_DisplayStringLine(Line4, (uint8_t *)text);sprintf(text, "     baozi     ");LCD_DisplayStringLine(Line5, (uint8_t *)text); }else if(lcd_highshow == 1){sprintf(text, "     count: %d     ", count);LCD_DisplayStringLine(Line3, (uint8_t *)text);LCD_SetBackColor(Yellow);sprintf(text, "     txysgdmn     ");LCD_DisplayStringLine(Line4, (uint8_t *)text);LCD_SetBackColor(Black);sprintf(text, "     baozi     ");LCD_DisplayStringLine(Line5, (uint8_t *)text); }

PWM输出

一般要求:让PA1输出频率为1000HZ,占空比为50%的方波

计算公式

在这里插入图片描述

cubemx配置

在这里插入图片描述

keil代码

在生成代码后,发现一个问题:文件中没有头文件!
后面找到解决办法, 编译之后,就能知道每个文件依赖于哪些头文件!还是第一次遇到这种问题
先在main.c函数中将定时器使能

这个函数在头文件里找–stm32g4xx_hal_tim.h

	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);

设置占空比

	TIM2->CCR2 = 50;

原理图(抄袭版),不懂的话看嵌入式的书去
在这里插入图片描述

输入捕获测量引脚输出PWM波周期

原理图

在这里插入图片描述

要求:用PA7来测量PA1生成PWM波的频率

需要用杜邦线连接PA7和PA1.

cubemx配置

这里PA7用TIM17或者TIM2都行,我就根据视频来了
在这里插入图片描述
使能定时器
在这里插入图片描述

keil代码

为了省事,将code文件复制到这个工程目录下,记得在main.c文件中添加头文件定义
在这里插入图片描述
main.c函数
使能中断17

	HAL_TIM_IC_Start_IT(&htim17, TIM_CHANNEL_1);

fun.c代码
参考着原理图一起理解

#include "headfile.h"char	text[20]; uint32_t fre, capture_value;void lcd_show()
{sprintf(text, "zlfsgdsg");//¿ÉÒÔµ÷Õû×Ö·û´®Î»Ö㬵«ÊÇ×î¶à20¸ö×Ö·ûLCD_DisplayStringLine(Line0, (uint8_t *)text);sprintf(text, "   fre:%d   ", fre);LCD_DisplayStringLine(Line3, (uint8_t *)text);}void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM17){capture_value = TIM17->CCR1;TIM17->CNT = 0;fre = 80000000/(80*capture_value);}}

main.c代码
注意不要忘记了给LCD初始化

  /* USER CODE BEGIN 2 */LCD_Init();LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);TIM2->CCR2 = 50;HAL_TIM_IC_Start_IT(&htim17, TIM_CHANNEL_1);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){lcd_show();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

输入捕获测量555定时器频率

实现效果:能测量出两个信号发生器输出的PWM波的频率,两个频率可以通过R39,和R40调节

原理图

在这里插入图片描述

cubemx配置

将PA15设置为TIM2_CH1,PB4设置为TIM16_CH1;
分别将两个定时器设置为输入捕获模式,PCC设置为80-1,并且使能
在这里插入图片描述
在这里插入图片描述

keil代码

main.c
需要注意,不要忘记了LCD初始化,不要忘记了中断使能,不要忘记了把lcd_show函数放到循环里

  /* USER CODE BEGIN 2 */LCD_Init();LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim16, TIM_CHANNEL_1);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){lcd_show();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

&&& 不要忘记了添加头文件!

#include "headfile.h"

fun.c函数
具体逻辑,我现在看是蛮简单的,不管了,吃饭去了,自己悟去吧

#include "headfile.h"char	text[20]; uint32_t fre1, capture_value1, fre2, capture_value2 ;void lcd_show()
{sprintf(text, "zlfsgdsg");//¿ÉÒÔµ÷Õû×Ö·û´®Î»Ö㬵«ÊÇ×î¶à20¸ö×Ö·ûLCD_DisplayStringLine(Line0, (uint8_t *)text);sprintf(text, "   R39_fre1:%d   ", fre1);LCD_DisplayStringLine(Line2, (uint8_t *)text);sprintf(text, "   R40_fre2:%d   ", fre2);LCD_DisplayStringLine(Line4, (uint8_t *)text);}void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM16)// R39{capture_value1 = TIM16->CCR1;TIM16->CNT = 0;fre1 = 80000000/(80*capture_value1);}if(htim->Instance == TIM2)//R40{capture_value2 = TIM2->CCR1;TIM2->CNT = 0;fre2 = 80000000/(80*capture_value2);}}

ADC测量

原理图

通过R37和R38两个旋钮,测量AD的电压值
在这里插入图片描述

cubemx配置

分别对引脚PB15和PB12进行配置。
在这里插入图片描述

在这里插入图片描述

keil代码

记得在headfile.h文件中添加ADC头文件
	在这里插入图片描述
fun.c代码

#include "headfile.h"char text[20];	
void lcdshow()
{sprintf(text, "      zlfsgdsg      ");LCD_DisplayStringLine(Line0, (uint8_t *)text);HAL_ADC_Start(&hadc1); uint32_t	adc_value =  HAL_ADC_GetValue(&hadc1); //R38sprintf(text, "     value:%d      ", adc_value);LCD_DisplayStringLine(Line3, (uint8_t *)text);}

main.c
记得将LCD初始化,然后在主函数中调用lcdshow();

在这里插入图片描述
即可在lcd中实时读取adc1的值

keil代码2
若是要读取两个ad的电压值
fun.c代码

#include "headfile.h"char text[20];	
void lcdshow()
{sprintf(text, "      zlfsgdsg      ");LCD_DisplayStringLine(Line0, (uint8_t *)text);sprintf(text, "     R37_volt:%.2f      ", get_vol(&hadc2));LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text, "     R38_volt:%.2f      ", get_vol(&hadc1));LCD_DisplayStringLine(Line5, (uint8_t *)text);}double get_vol(ADC_HandleTypeDef *hadc)
{HAL_ADC_Start(hadc); uint32_t	adc_value =  HAL_ADC_GetValue(hadc); //R38return	3.3*adc_value/4096; //因为AD是12位,所以ad最大值是4096}

fun.h

void lcdshow(void);double get_vol(ADC_HandleTypeDef *hadc);

串口发送和接收

原理图

在这里插入图片描述

cubemx配置

在这里插入图片描述
在这里插入图片描述

keil代码

串口发送
main.c代码
记得在前面添加头文件

  while (1){char text01[20];sprintf(text01, "zlfsgdgs\r\n");HAL_UART_Transmit(&huart1, (uint8_t *)text01, sizeof(text01), 50);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

串口接收
fun.c代码

#include "headfile.h"uint8_t rec_data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){HAL_UART_Transmit(huart, &rec_data, 1, 50);HAL_UART_Receive_IT(huart, &rec_data, 1);}}

fun.h代码
加一个外部变量定义

extern uint8_t rec_data;

main.c代码
在这里插入图片描述

利用定时器进行串口不定长数据接收

原理

在这里插入图片描述

cubemx配置

主要是把波特率设置为9600
在这里插入图片描述
在这里插入图片描述

keil代码

main.c
把定时器使能!!!&&调用函数
在这里插入图片描述
fun.c函数

#include "headfile.h"char	send_buff[20];
uint8_t rec_data, count;
uint8_t	rec_flag;
uint8_t	rec_buff[20];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){//HAL_UART_Transmit(huart, &rec_data, 1, 50);TIM4->CNT = 0;rec_flag = 1;rec_buff[count]	= rec_data;count ++;HAL_UART_Receive_IT(huart, &rec_data, 1);}}void	uart_data_rec()
{if(rec_data){if(TIM4->CNT > 15){if(rec_buff[0] == 'z'	&& rec_buff[1] == 'l' && rec_buff[2] == 'f'){sprintf(send_buff, "zlf\r\n");HAL_UART_Transmit(&huart1, (uint8_t *)send_buff, sizeof(send_buff), 50);}else if(rec_buff[3] == 's'	&& rec_buff[4] == 'g' && rec_buff[5] == 'd'){sprintf(send_buff, "sgd\r\n");HAL_UART_Transmit(&huart1, (uint8_t *)send_buff, sizeof(send_buff), 50);}else if(rec_buff[6] == 's'	&& rec_buff[7] == 'g'){sprintf(send_buff, "sgd\r\n");HAL_UART_Transmit(&huart1, (uint8_t *)send_buff, sizeof(send_buff), 50);}else{sprintf(send_buff, "error\r\n");HAL_UART_Transmit(&huart1, (uint8_t *)send_buff, sizeof(send_buff), 50);}rec_flag = 0;for(int	i=0; i<count; i++)rec_buff[i] = 0;count	= 0;}}}

fun.h
在这里插入图片描述
headfile.h
要添加usart.h的头文件
在这里插入图片描述

EEPROM读写

原理

原理就不说了,学嵌入式I2C的时候学了挺久

keil代码

i2c_hal_c

void eeprom_write(uint8_t addr, uint8_t data)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CSendByte(data);I2CWaitAck();I2CStop();HAL_Delay(20);}uint8_t eeprom_read(uint8_t addr)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CStop();I2CStart();I2CSendByte(0xa1);I2CWaitAck();uint8_t data = I2CReceiveByte();I2CSendNotAck();I2CStop();return	data;
}

i2c_hal_h代码
主要就是添加两个文件

void eeprom_write(uint8_t addr, uint8_t data);
uint8_t eeprom_read(uint8_t addr);

main.c代码
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

体育比分网站开发避坑指南:如何选择靠谱的数据服务商?(10年行业经验总结,避免踩坑!)

作为一家专业的体育比分数据服务商&#xff0c;我们接触过大量客户&#xff0c;发现很多人在开发体育比分网站或接入数据API时&#xff0c;由于选择不靠谱的服务商&#xff0c;导致项目延期、数据延迟、售后无响应、隐性收费等问题&#xff0c;最终影响运营效果&#xff0c;甚至…

VLAN综合实验二

一.实验拓扑&#xff1a; 二.实验需求&#xff1a; 1.内网Ip地址使用172.16.0.0/分配 2.sw1和SW2之间互为备份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通过DHCP获取IP地址 5.ISP只能配置IP地址 6.所有…

ABAP FPM

1.效果 2.查询条件的feed class SE11创建feed class数据的结构 ZCL_FPM_FIFO_SEARCH GET_DEFINITION方法代码 METHOD if_fpm_guibb_search~get_definition.eo_field_catalog_attr ? cl_abap_structdescr>describe_by_name( ZSS_FIFO_DATA ).ENDMETHOD. PROCESS_EVENT代码…

某大麦手机端-抢票

引言 仅供学习研究&#xff0c;欢迎交流 抢票难&#xff0c;难于上青天&#xff01;无论是演唱会、话剧还是体育赛事&#xff0c;大麦网的票总是秒光。作为一名技术爱好者&#xff0c;你是否想过用技术手段提高抢票成功率&#xff1f;本文将为你揭秘大麦手机端抢票的核心技术…

【免费】2007-2019年各省地方财政文化体育与传媒支出数据

2007-2019年各省地方财政文化体育与传媒支出数据 1、时间&#xff1a;2007-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政文化体育与传媒支出 4、范围&#xff1a;31省 5、指标说明&#xff1a;地方财政在文化、…

Playwright从入门到实战:比Selenium更快的数据爬取案例实战

摘要 Playwright 是微软开源的下一代浏览器自动化工具&#xff0c;凭借其高性能、跨浏览器支持和现代化设计&#xff0c;迅速成为 Web 自动化领域的热门选择。本文将从 安装配置 开始&#xff0c;通过 实战演练 展示其核心功能&#xff0c;并与 Selenium 深度对比&#xff0c;…

音频知识 参数分析

通道布局 参考 通过pcm音频数据计算分贝 理解FFT和信号加窗原理及意义 dts音效大师教程

《STL 六大组件之容器探秘:深入剖析 vector》

目录 一、vector 简介二、vector 的常用接口1. 构造函数&#xff08;constructor function&#xff09;2. 与迭代器相关的接口&#xff08;iterator&#xff09;3. 与容量相关的接口&#xff08;capacity&#xff09;4. 与访问和修改有关的接口&#xff08;access、modify&…

基于深度学习的手势识别系统设计

目录 背景与分析&#xff1a; 基于深度学习的手势识别系统设计 课题要求 技术分析&#xff1a; 技术点概述&#xff1a; 过程&#xff08;主体展示为主&#xff0c;部分功能不一一展示&#xff09;&#xff1a; 数据集&#xff08;17个G&#xff09;&#xff1a; 源码、…

【SpringCloud】Eureka的使用

3. Eureka 3.1 Eureka 介绍 Eureka主要分为两个部分&#xff1a; EurekaServer: 作为注册中心Server端&#xff0c;向微服务应用程序提供服务注册&#xff0c;发现&#xff0c;健康检查等能力。 EurekaClient: 服务提供者&#xff0c;服务启动时&#xff0c;会向 EurekaS…

构建大语言模型应用:简介(第一部分)

本专栏聚焦大语言模型&#xff08;LLM&#xff09;相关内容的解析&#xff0c;通过检索增强生成&#xff08;RAG&#xff09;应用的视角来进行。 本系列文章 简介&#xff08;本文&#xff09;数据准备句子转换器向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模…

Python:日志模块操作及基本配置,日志格式化输出

logger(日志管理器)&#xff1a;用户默认是root&#xff0c;其配置步骤为&#xff1a; 1.初始化对象 2.设置级别 3.定义handler(控制台或文件显示) 4.格式化输出 import logging #创建log文件并设置级别 logging.basicConfig(filenametext.log, levellogging.DEBUG) #在文…

The selected directory is not a valid home for Go SDK

安装完毕Go和GoLand之后&#xff0c;重新配置GoLand的GOROOT时&#xff0c;可能会报错 The selected directory is not a valid home for Go SDK 需要找到安装Go的目录&#xff0c;我的目录如下 D:\SoftFolder\Go\src\runtime\internal\sys 进入到sys文件下&#xff0c;找到…

pycharm找不到conda可执行文件解决办法

配置一个新项目&#xff0c;需要使用远程服务器环境的时候&#xff0c;找不到anaconda里面的python可执行文件&#xff0c;怎么都解决不了&#xff0c;很尴尬&#xff0c;看了很多&#xff0c;终于找到一个博客有用&#xff1a; https://blog.csdn.net/weixin_43912188/articl…

Blender多摄像机怎么指定相机渲染图像

如题目所说&#xff0c;当blender的场景里面有摄像机的时候&#xff0c;按F12可以预览渲染结果&#xff0c;但是当有多个摄像机的时候就不知道使用哪个进行渲染了。 之前在网上没有找到方法&#xff0c;就用笨方法&#xff0c;把所有的摄像机删除&#xff0c;然后设置自己需要…

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 Maven打包失败

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 解决办法 勾上这个&#xff0c;打包时跳过测试代码

CKS认证 | Day3 K8s容器运行环境安全加固

一、最小特权原则&#xff08;POLP&#xff09; 1&#xff09;最小特权原则 (Principle of least privilege&#xff0c;POLP) &#xff1a; 是一种信息安全概念&#xff0c;即为用户提供执行其工作职责所需的最 小权限等级或许可。 最小特权原则被广泛认为是网络安全的最佳实…

项目-苍穹外卖(十七) Apache POI+导出数据

一、介绍 二、入门案例 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.io.FileNotFoundException; import jav…

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…

Cannot find a valid baseurl for repo: centos-sclo-sclo/x86_64

​ rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-latest-5.0.el7.noarch.rpmyum clean allyum macache fast​ 编辑配置文件 /etc/yum.repos.d/zabbix.repo and enable zabbix-frontend repository. [zabbix-frontend]...enabled1... 下载相关…