蓝桥杯嵌入式第10届真题(完成) STM32G431

蓝桥杯嵌入式第10届真题(完成) STM32G431

题目

image-20240213154311661

image-20240213154320780

image-20240213154327510

image-20240213154336005

image-20240213154343448

image-20240213154351517

main.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* 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 "key.h"
#include "myadc.h"
#include "stdbool.h"
#include "stdio.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
int8_t upled = 0x01;
int8_t uplednum = 1;
int8_t lowled = 0x02;
int8_t lowlednum = 2;
float upval = 2.4;
float lowval = 1.2;
float val;
uint32_t led1time = 0;
uint32_t led2time = 0;
uint8_t led1enable = 0;//开关
uint8_t led2enable = 0;
uint8_t view = 0;
uint8_t lcdtext[30];
uint8_t status[30];
extern struct Key key[4];
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* 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 */
void led_process(void);
void lcd_process(void);
void adc_process(void);
void key_process(void);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void lcdclear(void)
{
	 LCD_Clear(Black);
   LCD_SetBackColor(Black);
   LCD_SetTextColor(White);
}
/* 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_ADC2_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
		HAL_TIM_Base_Start_IT(&htim2);
    LCD_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

    lcdclear();

   
		led_display(0x00);
    while (1)
    {
			key_process();
			adc_process();
			lcd_process();
			led_process();
    /* USER CODE END WHILE */
		 
    
			
    /* USER CODE BEGIN 3 */
    }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  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_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the peripherals clocks
  */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
  PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
void led_process(void)
{
    static bool led1flag = false;
    static bool led2flag = false;
    uint32_t currentTick = HAL_GetTick(); // 获取当前的系统时刻

    if(led1enable && (currentTick - led1time >= 200))
    {
        led1time = currentTick; // 更新时间戳
        led1flag = !led1flag; // 切换标志状态
        if(led1flag)
        {
            led_display(upled); // 点亮LED
        }
        else
        {
            led_display(0x00); // 熄灭LED
        }
    }

    if(led2enable && (currentTick - led2time >= 200))
    {
        led2time = currentTick; // 更新时间戳
        led2flag = !led2flag; // 切换标志状态
        if(led2flag)
        {
            led_display(lowled); // 点亮LED
        }
        else
        {
            led_display(0x00); // 熄灭LED
        }
    }
}

void lcd_process(void)
{
	switch(view)
	{
		case 0:
		{
			sprintf((char *)lcdtext,"        Main");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext,"  Volt:%.2f",val);
			LCD_DisplayStringLine(Line4,lcdtext);
			sprintf((char *)lcdtext,"  Status:%s",status);
			LCD_DisplayStringLine(Line6,lcdtext);
		}break;
		case 1:
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_DisplayStringLine(Line3,lcdtext);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_DisplayStringLine(Line5,lcdtext);
			sprintf((char *)lcdtext," Upper:LD%d",uplednum);
			LCD_DisplayStringLine(Line7,lcdtext);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_DisplayStringLine(Line9,lcdtext);
		}break;
		case 2://maxval
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line3,lcdtext);
			LCD_SetBackColor(Black);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_DisplayStringLine(Line5,lcdtext);
			sprintf((char *)lcdtext," UpperLD:%d",uplednum);
			LCD_DisplayStringLine(Line7,lcdtext);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_DisplayStringLine(Line9,lcdtext);
		}break;
		case 3://minval
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_DisplayStringLine(Line3,lcdtext);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line5,lcdtext);
			LCD_SetBackColor(Black);
			sprintf((char *)lcdtext," Upper:LD%d",uplednum);
			LCD_DisplayStringLine(Line7,lcdtext);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_DisplayStringLine(Line9,lcdtext);
		}break;
		case 4://led1
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_DisplayStringLine(Line3,lcdtext);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_DisplayStringLine(Line5,lcdtext);
			sprintf((char *)lcdtext," Upper:LD%d",uplednum);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line7,lcdtext);
			LCD_SetBackColor(Black);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_DisplayStringLine(Line9,lcdtext);
		}break;
		case 5://led2
		{
			sprintf((char *)lcdtext,"        Setting");
			LCD_DisplayStringLine(Line1,lcdtext);
			sprintf((char *)lcdtext," Max Volt:%.2f",upval);
			LCD_DisplayStringLine(Line3,lcdtext);
			sprintf((char *)lcdtext," Min Volt:%.2f",lowval);
			LCD_DisplayStringLine(Line5,lcdtext);
			sprintf((char *)lcdtext," Upper:LD%d",uplednum);
			LCD_DisplayStringLine(Line7,lcdtext);
			sprintf((char *)lcdtext," Lower:LD%d",lowlednum);
			LCD_SetBackColor(Green);
			LCD_DisplayStringLine(Line9,lcdtext);
			LCD_SetBackColor(Black);
		}break;
	}
}
void adc_process(void)
{
	
	val = getADcVal(&hadc2);
	if(val>upval)
	{
		led1enable = 1;
		led2enable = 0;
		sprintf((char *)status,"Upper ");
	}else if(val<=upval&&val>=lowval)
	{
		led1enable = 0;
		led2enable = 0;
		led_display(0x00);
		sprintf((char *)status,"Normal ");
	}else{
		led1enable = 0;
		led2enable = 1;
		sprintf((char *)status,"Lower ");
	}
}
void key_process(void)
{
	
	if(key[0].key_single_flag)
	{
		lcdclear();
		key[0].key_single_flag = 0;
		if(view==0)
		{
			view = 1;
		}else if(view==1||view==2||view==3||view==4||view==5)
		{
			view = 0;
		}
	}
	
	if(key[1].key_single_flag)
	{
		lcdclear();
		key[1].key_single_flag = 0;
		if(view==1)
		{
			view = 2;
		
		}else if(view>=2&&view<=5)
		{
			view++;
			if(view>5)
				view = 2;
		}
		
	}
	
	if(key[2].key_single_flag) {
		key[2].key_single_flag = 0; // 清除按键标志位
		
		if(view == 4) { // 选择upled
				uplednum = (uplednum % 8) + 1; // 循环遍历1到8
				upled = 0x01 << (uplednum - 1); // 更新upled位掩码
		} else if(view == 5) { // 选择lowled
				lowlednum = (lowlednum % 8) + 1; // 循环遍历1到8
				lowled = 0x01 << (lowlednum - 1); // 更新lowled位掩码
		}
	}

	if(key[3].key_single_flag) {
			key[3].key_single_flag = 0; // 清除按键标志位
			if(view == 4) { // 选择upled
					uplednum = (uplednum == 1) ? 8 : uplednum - 1; // 反向循环遍历8到1
					upled = 0x01 << (uplednum - 1); // 更新upled位掩码
			} else if(view == 5) { // 选择lowled
					lowlednum = (lowlednum == 1) ? 8 : lowlednum - 1; // 反向循环遍历8到1
					lowled = 0x01 << (lowlednum - 1); // 更新lowled位掩码
			}
	}

	

}
/* 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 */

  /* 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,
       tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */



/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

key.c

#include "key.h"

struct Key key[4]={0,0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2)
	{
		key[0].key_gpio = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		key[1].key_gpio = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[2].key_gpio = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[3].key_gpio = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
		for(int i = 0;i<4;i++)
		{
			switch(key[i].key_status)
			{
				case 0:
				{
					if(key[i].key_gpio==0)
					{
						key[i].key_status = 1;
					}
				}break;
				case 1:
				{
					if(key[i].key_gpio==0)
					{
						key[i].key_single_flag = 1;
						key[i].key_status = 2;
					}else{
						key[i].key_status = 0;
					}
				}break;
				case 2:
				{
					if(key[i].key_gpio==1)
					{
						key[i].key_status = 0;
					}
				}break;
			}
		}
	}
}


led.c

#include "led.h"


void led_display(uint8_t led)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOC,led<<8,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

myadc.c

#include "myadc.h"
float getADcVal(ADC_HandleTypeDef *hadc)
{
	float val;
	HAL_ADC_Start(hadc);
	val = HAL_ADC_GetValue(hadc);
	return val*3.3f/4096;

}


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux---守护进程

运行的这个进程&#xff0c;它的pid和gpid(进程组ID)一样&#xff0c;它是自成一组的。 这就是一个进程组。 进程组和任务有什么关系&#xff1f; 将任务指派给进程组。任务都是由进程组去完成的。 可以发现&#xff0c;这三个进程的会话id1351都是一样的&#xff0c;多个任…

windows10|音视频剪辑|FFMPEG录屏和网络推流源初步的生成

前言&#xff1a; FFMPEG的功能强大是毋庸置疑的&#xff0c;那么录屏的需求大家在某些时候大家可能是非常需要的&#xff0c;例如&#xff0c;现有的项目需要演示&#xff0c;因此录制一段演示视频&#xff1b;亦或者做内容分发直播的&#xff0c;比如游戏主播&#xff0c;需…

使用word2vec+tensorflow自然语言处理NLP

目录 介绍&#xff1a; 搭建上下文或预测目标词来学习词向量 建模1&#xff1a; 建模2&#xff1a; 预测&#xff1a; 介绍&#xff1a; Word2Vec是一种用于将文本转换为向量表示的技术。它是由谷歌团队于2013年提出的一种神经网络模型。Word2Vec可以将单词表示为高维空间…

987. 二叉树的垂序遍历 - 力扣(LeetCode)

题目描述 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言&#xff0c;其左右子结点分别位于 (row 1, col - 1) 和 (row 1, col 1) 。树的根结点位于 (0, 0) 。 二叉树的 垂序遍历 从最左边的列开始直到…

VM和Linux安装

VM和Linux安装 一、下载VM 1.官网地址&#xff1a;https://www.vmware.com/cn.html 2.其他地址&#xff1a;http://ww7.nocmd.com/windows/740.html 许可证这个&#xff0c;大家可以自己上网搜索&#xff0c;很容易就搜索到就可以使用了 上面内容就是安装VM的步骤 安…

LeetCode、1318. 或运算的最小翻转次数【中等,位运算】

文章目录 前言LeetCode、1318. 或运算的最小翻转次数【中等&#xff0c;位运算】题目链接与分类题解位运算 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领…

线性代数的本质 2 线性组合、张成的空间、基

一种新的看待方式 对于一个向量&#xff0c;比如说&#xff0c;如何看待其中的3和-2&#xff1f; 一开始&#xff0c;我们往往将其看作长度&#xff08;从向量的首走到尾部&#xff0c;分别在x和y上走的长度&#xff09;。 在有了数乘后&#xff0c;我们可以将其视为对向量进行…

【心得】调试SPI+DMA的一点心得

由于项目需要&#xff0c;STM32F303跟STM32F405之间要用到DMASPI口来估大量数据传输&#xff0c;实现两边的数据收发。 开始只用到MISO&#xff0c;MOSI&#xff0c;跟CLK三个信号&#xff0c;STM32F303配置成主机&#xff0c;18M的波特率&#xff0c;用DMA发4K的Buffer的数据…

蓝牙BLE学习-安全

1.基本概念 蓝牙标准规定了5种基本的安全服务 身份验证:根据通信设备的蓝牙地址验证其身份。蓝牙不提供本地用户身份验证。保密性:确保只有授权的设备才能访问和查看传输的数据&#xff0c;防止窃听造成的信息泄露。授权(Authorization):在允许设备使用某项服务之前&#xff…

探索Gorm - Golang流行的数据库ORM框架

&#x1f3f7;️个人主页&#xff1a;鼠鼠我捏&#xff0c;要死了捏的主页 &#x1f3f7;️系列专栏&#xff1a;Golang全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…

Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)

文章目录 题面链接题意题解代码总结 题面 链接 C. Kefa and Park 题意 求叶节点数量&#xff0c;叶节点满足&#xff0c;从根节点到叶节点的路径上最长连续1的长度小于m 题解 这道题目主要是实现&#xff0c;当不满足条件时直接返回。 到达叶节点后统计答案&#xff0c;用…

kali系统概述、nmap扫描应用、john破解密码、抓包概述、以太网帧结构、抓包应用、wireshark应用、nginx安全加固、Linux系统加固

目录 kali nmap扫描 使用john破解密码 抓包 封装与解封装 网络层数据包结构 TCP头部结构​编辑 UDP头部结构 实施抓包 安全加固 nginx安全 防止缓冲区溢出 Linux加固 kali 实际上它就是一个预安装了很多安全工具的Debian Linux [rootmyhost ~]# kali resetkali …

spring boot自动装配原理

spring boot自动装配是通过启动类SpringBootApplication默认扫描本包极其子包&#xff0c;要想扫描外部文件需要在启动类上加相应注解

【Spring MVC篇】Cookie和Session的获取 Header的获取

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; Cookie是客户端保存用…

Vue--》深入学习Tailwind CSS掌握优雅而高效的前端样式开发

Tailwind CSS是一个非常强大且灵活的CSS框架&#xff0c;适用于开发者希望高度定制化界面样式的项目。今天博主就 Tailwind CSS 做一个简单介绍以及案例讲解&#xff0c;争取读者阅读文章后入门。 仅靠一篇文章博主也不可能将Tailwind CSS所有内容讲解的面面俱到&#xff0c;在…

算法学习——LeetCode力扣二叉树篇5

算法学习——LeetCode力扣二叉树篇5 513. 找树左下角的值 513. 找树左下角的值 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 示例 1: 输入: r…

CorelDRAW2024国内专业个人免费版下载

CorelDRAW是一款屡获殊荣的图形和图像编辑软件&#xff0c;包含两个绘图应用程序&#xff1a;一个用于矢量图及页面设计&#xff0c;另一个用于图像编辑。自1989年进入中国市场以来&#xff0c;CorelDRAW不断推出新的版本和功能&#xff0c;以满足用户不断变化的需求。 CorelD…

力扣面试题 16.21. 交换和(哈希表)

Problem: 面试题 16.21. 交换和 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.分别求取array1与array2数组每一个元素的和&#xff08;sum1与sum2&#xff09;并同时将array2的元素存入一个set集合中&#xff1b; 2.如果sum1和sum2的和为奇数&#xff0c;则不…

Redis相关介绍

概念 Redis&#xff1a;非关系型数据库&#xff08;non-relational)&#xff0c;Mysql是关系型数据库(RDBMS) Redis是当今非常流行的基于KV结构的作为Cache使用的NoSQL数据库 为什么使用NoSQL 关系型 数据库无法应对每秒上万次 的读写请求 表中的存储记录 数量有限 无法简单…

【JavaEE】_JavaScript基础语法

目录 1. JavaScript概述 1.1 JavaScript简介 1.2 HTML、CSS、JavaScript的关系 1.3 JavaScrip的组成 2. JavaScript的书写形式 2.1 内嵌式 2.2 行内式 2.3 外部式 3. 输出 3.1 alert 3.2 console.log 4. 变量的使用 4.1 创建变量 4.1.1 使用var 4.1.2 使用let …
最新文章