云与雾Blog - 📓学习笔记
type: channel
link: https://blog.yunyuwu.cn/category/xxbj/
description: 记录自己的学习日常。
items: MySQL安装配置与常见问题
items: Java基础
items: C语言笔记（8）函数篇
items: C语言笔记---（7）数组篇
items: Docker入门
items: Nodejs的安装与配置(Win)
items: Mysql基础
items: 配置CLion用于嵌入式开发
items: 模拟电路
items: stm32学习笔记

MySQL安装配置与常见问题
type: item
date: 2025-09-19T17:41:50+08:00
description: mysql安装及配置win下安装这边提供一个mysql5.7的安装包：mysql5.7安装包第一步：选项分别为服务器安装、客户端安装、完整安装、自定义安装；这边我们选择安装方式为custom。第二步：依次点开MySQL servers——mysql server——MySQL server5.7——MySQL server5.7.44-X64然后点击绿色箭头将选中的版本移到右边的框里，然后点击选中右侧框中的mysql server 5.7.44-x64，，再点击Advanced Options可以自定义安装路径和数据储存位置；然后点击下一步。上面是安装路径，下方是数据储存位置第三步：点击Execute会开始安装，等待安装完成后点击next。选择安装类型,这边选择Development Computer;然后点击next。Development Computer个人开发学习使用;Server Computer用于FTP,email,web服务器等;Dedicated Computer用作MySQL服务器;第四步：到这里输入root用户密码，重复输入两次；点击next。第五步：到这里，继续next第六步：点击Execute,然后点击等待完成后，点击Finish，然后结束安装。MySQL环境变量复制完整的mysql安装路径及bin目录，如：D:\Program Files\MySQL\MySQL Server 5.7\bin右击此电脑，选择属性，先点击高级系统设置，再点击环境变量；在系统变量中双击Path；点击新建，将MySQL的安装路径粘贴上去，之后点击确定；然后验证mysql是否配置成功，打开cmd窗口，输入以下命令进行验证：mysql -uroot -pyoupassword #youpassword为你安装mysql时设置的root用户密码Linux下安装待补其他问题navicat连接2002 - Can't connect to server on '192.168.27.130' (10061)在mysql安装之后，我们的mysql并不会主动开启mysql远程访问权限，我们如果需要使用navicat来远程连接数据库操作的话，就需要我们主动去开启远程连接权限。这里有两种方法：权限问题 直接赋权法：在MySQL 8.0 及以上版本中，GRANT语句已经不允许直接包含IDENTIFIED BY子句来设置用户密码。mysql -uroot -pyoupassword #youpassword为你数据库root用户密码 GRANT ALL PRIVILEGES ON *.* TO “root”@”%” IDENTIFIED BY '你的root密码' WITH GRANT OPTION;权限问题 新建用户法：进入mysql，输入以下命令检查数据库对不同用户使用的身份验证方法：bashSELECT user,authentication_string,plugin,host FROM mysql.user;这边可以看到root用户的登录方式为auth_socket，并且只能在本地登录，在生产环境中可以新建一个用户并且赋予他相应权限。第一步：查看所有数据库SHOW DATABASES;第二步：切换数据库use mysql;第三步：创建用户new_user,并设置只能本地登录，登录密码为passwordCREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password';第四步：查看不同用户登录验证方式SELECT user,authentication_string,plugin,host FROM mysql.user;这个时候可以看到新建的用户可以使用密码登录，且只能是本地登录。第五步：创建一个新的数据库CREATE DATABASE mydatabase;第六步：设置刚才创建的用户登陆方式update user set host='%' where user='new_user' and host='localhost';第七步：查看不同用户登录验证方式SELECT user,authentication_string,plugin,host FROM mysql.user;可以看到用户的登陆方式切换为了%第七步：授权用户new_user可以在任意主机登录，并且只能对于数据库database_name进行所有操作的权限。GRANT ALL PRIVILEGES ON database_name.* TO 'new_user'@'%';第八步：退出mysqlexit第九步：进入目录/etc/mysql/mysql.conf.d,修改其目录下的文件mysqld.cnfsudo vim…

Java基础
type: item
date: 2024-03-01T16:51:00+08:00
description: 一、初识Java计算机语言发展历史计算机编程语言的发展，是随着计算机本身硬件发展而发展的。硬件速度越快、体积越小、成本越低，应用到人类社会的场景就会越多，那么所需要的算法就会越复杂，也就要求计算机编程语言越高级。最初重达几十吨但一秒只能运算5000次的ENIAC(世界上第一台计算机)，只能做非常小的应用，比如：某些情况的弹道计算。现在任何一个人的手机运算能力都可以秒杀那个年代地球上所有计算机运算能力的总和。计算机编程语言的发展历经了从低级到高级发展。发展的核心思想就是“让人更容易编程”。越容易使用的语言，就有越多人使用；越多人使用，就有越多协作；越多协作，就可以创造越复杂的物体；计算机语言经历了三代：第一代是机器语言，第二代是汇编语言，第三代是高级语言。所需程序https://www.123pan.com/s/EGKKVv-GLfxh.html 提取码:bKAy常用DOS命令DOS系统Microsoft公司推出的操作系统。（在windows之前的操作系统） DOS是英文"Disk Operating System"的缩写,其中文含意是"磁盘操作系统". DOS是单用户、单任务的操作系统.（只能执行一个任务）DOS命令在windows中，我们通过鼠标菜单等来操作系统，而在dos操作系统中，要通过dos命令来操作系统。 是DOS操作系统的命令，是一种面向磁盘的操作命令，不区分大小写。切换盘符 c: d: e:显示目录下详细信息 dir改变当前目录 cd清屏 cls创建目录 md删除目录 rd复制文件 copy删除文件 delJava入门程序开发开发Java程序，需要三个步骤：编写代码，编译代码，运行代码[x] 编写代码：任何一个文本编辑器都可以些代码，如Windows系统自带的记事本[x] 编译代码：将人能看懂的源代码（.java文件）转换为Java虚拟机能够执行的字节码文件（.class文件）[x] 运行代码：将字节码文件交给Java虚拟机执行第一个java程序public class helloworld(){ public static void main(String[] args){ System.out.println("hello world"); } }注意：文件名称必须与代码中的类名称一致JDK组成JDK由JVM、核心类库、开发工具组成，如下图所示：什么是JVM?答：JDK最核心的组成部分是JVM（Java Virtual Machine），它是Java虚拟机，真正运行Java程序的地方。什么是核心类库？答：它是Java本身写好的一些程序，给程序员调用的。 Java程序员并不是凭空开始写代码，是要基于核心类库提供的一些基础代码，进行编程。什么是JRE?答：JRE（Java Runtime Enviroment），意思是Java的运行环境；它是由JVM和核心类库组成的；如果你不是开发人员，只需要在电脑上安装JRE就可以运行Java程序。什么是开发工具呢？答：Java程序员写好源代码之后，需要编译成字节码，这里会提供一个编译工具叫做javac.exe，编写好源代码之后，想要把class文件加载到内存中运行，这里需要用到运行工具java.exe。 除了编译工具和运行工具，还有一些其他的反编译工具、文档工具等待...JDK、JRE的关系用一句话总结就是：用JDK开发程序，交给JRE运行Java跨平台原理Java跨平台原理：C语言跨平台原理：总结：JVM(Java Virtual Machine)就是一个虚拟的用于执行bytecode字节码的”虚拟计算机”。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。JVM负责将Java字节码解释运行，边解释边运行，这样，速度就会受到一定的影响。不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别，实现了“一次编译，随处运行”。 Java虚拟机是实现跨平台的核心机制。如图所示：我们说的语言跨平台是编译后的文件跨平台，而不是源程序跨平台。接下来我们再比较下两种方式的差异：第一，C语言是编译执行的，编译器与平台相关，编译生成的可执行文件与平台相关；第二，Java是解释执行的，编译为中间码的编译器与平台无关，编译生成的中间码也与平台无关（一次编译，到处运行），中间码再由解释器解释执行，解释器是与平台相关的，也就是不同的平台需要不同的解释器.Java开发工具IDEA想要在IDEA正确的写一个Java程序，必须先认识一下IDEA的管理Java程序的工程结构。第一步：首先得在IDEA中创建一个Project（工程、也叫项目），后面统称为工程。第二步：需要在Project中创建Module（模块），一个工程中可以包含多个模块第三步：需要在Module中新建Packag…

C语言笔记（8）函数篇
type: item
date: 2023-10-08T13:26:00+08:00
description: 一、函数C语言里可以对语句进行分组，每个语句分组叫做一个函数一旦函数被调用，会执行该函数所表示的语句分组1.1 函数的定义//此段代码为一个函数用于计算a+b的值 int main (int a,int b) { return a + b; }函数调用 - 使用已经定义好的函数被使用的函数称为被调用函数 - printf函数使用被调用函数的函数被称为调用函数 - main函数函数定义的写法：返回值类型 函数名 (输入参数值)//本行为函数头 { //花括号里边的为函数体 做点什么事情吧 return 返回值; }形参与实参：形参与实参相互独立#include<stdio.h> int add (int a,int b)//此处a,b为形式参数、简称：形参 { return a + b; } int main() { int result; result = add(2,3);//此处为实际参数，简称：实参 printf("%d",result); return 0; }1.2 函数调用的本质三步骤：跳转执行返回（从哪儿跳转，到哪儿返回）1.3 为什么要使用函数明确任何C语言程序都是由两部分组成：一堆的变量（包括数组）和一堆的函数前者负责分配内存，后者负责操作访问内存函数的概念：就是一堆语句的组合，一次写好，到处使用！本质目的：减少开发的工作量，提高代码的可维护性1.4 函数的返回值只能从被调用函数向调用函数传递一个数据，这个数据叫做被调用函数的返回值返回值必须记录在被调用函数的储存区里，编写函数的时候要把这个储存区的类型名称卸载函数名称前面被调用函数里使用return关键字指定作为返回值的数值调用函数里要把整个函数调用该语句当作数字使用，这个数字就是被调用函数的返回值1.5 函数的参数可以从调用函数向被调用函数传递多个数据，这些数据的类型可以不同被调用函数需要为每个传递过来的数据提供一个储存区编写函数的时候需要在函数名称后面的小括号里声明一组变量，这些变量就用来表示前面提到的储存区，这些变量叫做形式参数，小括号里的所有内容叫做形式参数列表调用带有参数的函数时需要在函数调用语句的小括号里为每个形式参数提供一个对应的数字，计算机 会把这些数字记录到对应的形式参数里。被调用函数可以通过形式参数得到这些数字。这些数字叫做实际参数只要能当作数字使用的内容，都可以作为实际参数使用。函数调用过程中通常伴随着两个函数之间的数据传递数据传递存在两个完全相反的方向可以从被调用函数向北调用函数传递数据-参数可以从被调用函数向调用函数传递数据-返回值1.6 函数的声明任何函数都可以分为大括号前面的部分和大括号里面的部分函数大括号前面的部分可以单独写成一条语句，这种语句叫做函数声明语句函数声明语句里可以省略形式参数名称把函数声明语句卸载文件开头叫做函数的显式声明除了主函数以外的所有函数都应该进行显式声明格式：extern 返回值类型 函数名(形参列表)函数的定义在函数的调用前面，可以省略函数声明二、递归函数2.1 什么是递归函数C语言里函数可以调用自己，自己调用自己的函数叫递归函数2.2 递归函数编写步骤单独编写语句解决分解后的每个小问题（假设递归函数已经可以使用了）在递归调用语句前编写分支处理不可分解的情况（这种分支必须要能结束函数）三、作用域和生命周期能使用某个变量的所有语句叫做变量的变量的作用域生命周期是一段时间，在生命周期开始的时候计算机给程序分配储存区，在生命周期结束的时候，计算机把分配给程序的储存区收回3.1 局部变量局部变量是定义在函数内的变量作用域：定义的位置开始到函数结束生命周期：函数某一次执行的时间范围3.2 全局变量全局变量是定义在函数外的变量作用域：从定义的位置开始向下的所有语句生命周期：整个程序的执行时间3.3 作用域和生命周期局部变量（静态局部变量）区别：静态局部变量的生命周期是整个程序的执行时间全局变量（静态全局变量）区别：静态全局变量无法被其他文件调用生命周期：定义变量的时候编译器为其分配存储区，函数结束的时候回收其存储区静态变量的生命周期和作用域与普通变量的不一样，静态变量的生命周期是整个程序执行时间声明静态变量的时候需要使用static关键字没有初始化的静态变量会自动被初始化成0函数结束后，静态局部变量的储存区也还是可以使用静态局部变量的作用域仍然只包含函数里面的所有语句静态变量的初始化只在程序开始的时候执行一次，不论初始化语句写在什么地方静态全局变量的生命周期还是整个程序的执行时间，但是它的作用域只包含声明它的文件里的所有语句（不可以跨文件使用静态全局变量）

C语言笔记---（7）数组篇
type: item
date: 2023-10-07T16:46:00+08:00
description: 一、初识数组1.数组的概念数组是由一系列类型相同的数据对象依次排列组合而成组成数组的数据对象被称作数组的元素重点：依次排列类型相同2.声明数组//格式： 元素类型 数组名[元素数量]； //示例： char c[5]; int n[10]; long l[3]; float f[2]; double df[1];3.数组初始化//格式如下： 元素类型 数组名[元素数量] = {逗号分割的元素内容}; //示例： int arr[10] = {1,2,3,4,5,6,7,8,9,0}； //等号右边被称为初始化列表,初始化列表写明了数组的元素分别需要被初始化为哪些值。注意事项：如果元素内容小于元素数量，那么会被自动填补为0如果元素内容多于元素数量，那么将会无法编译元素数量可以不填写，让初始化列表决定数组长度4.访问数组//格式： 数组名[下标] //示例代码： int arr[10] = {1,2,3,4,5,6,7,8,9,0}; printf("%d\n", arr[0]); printf("%d\n", arr[1]); printf("%d\n", arr[2]); printf("%d\n", arr[3]); printf("%d\n", arr[4]); printf("%d\n", arr[5]); printf("%d\n", arr[6]); printf("%d\n", arr[7]); printf("%d\n", arr[8]); printf("%d\n", arr[9]);注意事项：数组下标是从0开始的，如果有九个元素，那么下标为105.修改数组的值代码示例：int arr[10] = {}; printf("%d\n", arr[5]); arr[5] = 123; printf("%d\n", arr[5]);注意事项：数组越界错误当数组元素有一个固定数量时，请勿访问或修改数组元素内以外的元素。C语言编译器不会检查数组是否越界。数组不一定初始化，但是之后需要赋值，避免使用无意义数值6.数组所占空间大小数组所占的空间 = 单个元素所占空间大小*数组元素个数7.数组的整体赋值数组不能整体赋值，且初始化列表智能存在于初始化。那么如何赋值整个数组的数据呢？有两种方法：使用循环遍历赋值int arr1[]; int arr2[1,2,3,4,5]; for (i=0;i<4;i++); arr1[i]=arr2[i]使用memcpy内存复制函数//memcpy函数格式 memcpy(目标数组, 原始数组, 需要复制多少字节数据); //示例： memcpy(arr1, arr2, sizeof(arr1)); /*注意事项 使用memcpy函数需要引入头文件<memory.h> 假设需要复制的数据字节数为N； 目标数组大小不能小于N，否则没有足够空间存放数据； 原始数组的数据大小不能小于N，否则将复制无意义内容； */8.小练习逆序输出一组数字#include<stdio.h> void main(){ int i; int a[10] = {0}; for(i = 0;i<10;i++){ printf("输入数字："); scanf("%d",&a[i]); } printf("逆序数字排列为："); for(i = 9;i>=0;i--){ printf("%d ",a[i]); } }二、二维数组2.1 二维数组的概念二维数组就是由多个一维数组组成的数组int score[5][10]二维数组的每个元素都是一维数组一维数组的每个元素表示的都是一个储存区在定义一个二维数组的时候，需要提供两个整数前一个整数表示一维数组的个数，后一个整数表示一维数组里的储存区个数数据类型表示的是每个储存区的类型int score[5][10] //定义了1个二维数组，一共分为了5个数组.每个一维数组中有10个int类型的储存区2.2 二维数组的格式//格式： 元素类型 数组名[二维数组长度][一维数组长度] = {{...},{...}...}; 二维数组长度 = 二维数组中有几个一维数组 一维数组长度 = 一维数组中有几个储存区 //举例： int a[3][4] = {{1,2,3,4,},{5,6,7,8},{9,10,11,12}}; //可以把二维数组当作一维数组进行初始化，二维数组本质上还是一维数组 int mat[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int mat[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};2.3 二维数组的使用int mat[3][4] = {{1,2,3,4},[5,6,7,8],[9,10,11,12…

Docker入门
type: item
date: 2023-09-26T16:44:00+08:00
description: 一、Docker基本概念当我们利用Docker安装应用时，Docker会自动搜索并下载应用镜像（image）。镜像不仅包含应用本身，还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境，称为容器（container）。镜像仓库，就是专门保存镜像、管理镜像的地方。Docker官方维护了一个公共仓库：Docker Hub，任何注册了的用户都可以上传镜像到Docker Hub，也可以从上面下载镜像。另外，国内也有很多类似的镜像仓库：比如 网易云镜像仓库、阿里云镜像仓库等。1. Docker是做什么的？Docker可以帮助我们下载应用镜像，创建并运行镜像的容器，从而快速部署应用什么是镜像？将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜像什么是容器?为每个镜像的应用进程创建的隔离运行环境就是容器什么是镜像仓库?存储和管理镜像的服务就是镜像仓库，2. Docker命令docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ mysqldocker run是创建并运行一个容器，-d参数是让容器在后台运行，在关掉终端后也可以运行--name参数是给容器起一个唯一的名字-p参数是设置端口映射，这个选项将容器的3306端口映射到宿主机的3306端口，这样你就可以从宿主机访问到MySQL服务了。-e TZ=Asia/Shanghai \参数是设置环境变量，影响mysql容器的时区设置-e MYSQL_ROOT_PASSWORD=123 \这个选项设置环境变量MYSQL_ROOT_PASSWORD为"123"，这会影响到MySQL的root用户的密码。mysql是要运行的镜像的名字3. Docker镜像命名规范Docker镜像的命名规范主要包括以下几点：使用小写字母和数字：因为Docker镜像名称是大小写敏感的，所以建议使用小写字母和数字来避免混淆。使用短划线(-)或下划线(_)分隔：可以使用短划线或下划线来分隔不同的单词，例如my-image或my_image。以library/project形式命名：镜像名称通常表示其包含的库或项目，因此建议使用library/project的形式来命名镜像，例如ubuntu:18.04或nginx:latest。遵循命名空间规则：如果一个镜像同时包含多个库或项目，可以使用冒号(:)将它们分开，例如redis:6.0.9或node:14.17.0。不要使用特殊字符：尽量避免在镜像名称中使用特殊字符，如空格、斜杠、问号等。这些字符可能会导致镜像名称无法正确解析。使用描述性名称：尽量给镜像起一个描述性的名称，以便于理解它包含的内容。例如，webapp:latest表示一个包含最新版本web应用程序的镜像。二、Docker基础1. 数据卷概念及挂载因为容器与宿主机是隔离的，如果容器删除，容器内的数据会丢失。为了解决这个问题，有了数据卷。在后期宿主机目录发生变更，只要改变数据卷的指向即可。数据卷（volume）是一个虚拟目录，是容器内目录与宿主机目录之间映射的桥梁。它将宿主机目录映射到容器内目录，方便我们操作容器内文件。数据卷创建的默认目录是/var/lib/docker/volumes命令说明docker volume creqate创建数据卷docker volume ls查看所有数据卷docker volume rm删除指定数据卷docker volume inspect查看某个数据卷的详情docker volume prune清除数据卷在执行docker run命令时，使用-v 数据卷:容器内目录 可以完成数据卷挂载在创建容器时，如果挂在了数据卷且数据卷不存在，会自动创建数据卷。2. 本地目录的挂载使用docker run -v命令挂载，具体命令为：docker run -v 本地目录:容器内目录l本地目录必须以“/”或 "./" 开头，如果直接以名称开头，会被识别为数据卷而非本地目录-v mysql : /var/lib/mysql会被识别为一个数据卷叫mysql，运行时会自动创建这个数据卷-v ./mysql : /var/lib/mysql会被识别为当前目录下的mysql目录，如果不存在会自动创建镜像中包含了应用程序所需要的运行环境、函数库、配置、以及应用本身，逐层构建而成。3. 自定义镜像（Dockerfile）镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件按照顺序逐层打包。Dockerfile就是一个文本文件，其中包含一个个的指令(Instruction)，用指令来说…

Nodejs的安装与配置(Win)
type: item
date: 2023-09-19T11:41:00+08:00
description: 一、安装进入官网下载安装包，并进行安装，一路打勾选择next即可。https://nodejs.org/zh-cn/download.msi是Windows installer开发出来的程序安装文件，它可以让你安装，修改，卸载你所安装的程序。说白了.msi就是Windows installer的数据包，把所有和安装文件相关的内容封装在一个包里。此外：它还包含有关安装过程自己的信息。例如：安装序列、目标文件夹路径、安装选项和控制安装过程的属性。.zip是一个压缩包，解压之后即可，不需要安装二、配置环境打开安装目录，如：D:\Program Files\nodejs在安装目录下新建两个文件夹node_global和node_cachewin+x打开管理员终端，输入npm config prefix "你的安装路径\node_global"npm config prefix "D:\Program Files\nodejs\node_global"再次输入npm config set cache "你的安装路径\node_cache"npm config set cache "D:\Program Files\nodejs\node_cache"设置环境变量，打开【系统属性】-【高级】-【环境变量】，在系统变量中新建变量名：NODE_PATH变量值：D:\Program Files\nodejs\node_global\node_modules编辑用户变量（环境变量）的 path，将默认的 C 盘下 APPData\Roaming\npm 修改成 D:\Program Files\nodejs\node_global，点击确定编辑【系统变量】-【Path】中，新建一个%NODE_PATH%三、添加国内镜像添加国内镜像源：如果没有梯子的话，可以使用阿里的国内镜像进行加速。npm config set registry https://registry.npm.taobao.org替换命令npm install -g cnpm --registry=https://registry.npmmirror.com

Mysql基础
type: item
date: 2023-09-06T21:12:00+08:00
description: 一、数据库基本概念（1）数据 所谓数据（Data）是指对客观事物进行描述并可以鉴别的符号，这些符号是可识别的、抽象的。它不仅仅指狭义上的数字，而是有多种表现形式：字母、文字、文本、图形、音频、视频等。现在计算机存储和处理的数据范围十分广泛，而描述这些数据的符号也变得越来越复杂了。（2）数据库数据库（Database，DB）指的是以一定格式存放、能够实现多个用户共享、与应用程序彼此独立的数据集合。 （3）数据库管理系统数据库管理系统（Database Management System，DBMS）是用来定义和管理数据的软件。如何科学的组织和存储数据，如何高效的获取和维护数据，如何保证数据的安全性和完整性，这些都需要靠数据库管理系统完成。目前，比较流行的数据库管理系统有：Oracle、MySQL、SQL Server、DB2等。 （4）数据库应用程序数据库应用程序（Database Application System，DBAS）是在数据库管理系统基础上，使用数据库管理系统的语法，开发的直接面对最终用户的应用程序，如学生管理系统、人事管理系统、图书管理系统等。（5）数据库管理员数据库管理员（Database Administrator，DBA）是指对数据库管理系统进行操作的人员，其主要负责数据库的运营和维护。（6）最终用户最终用户（User）指的是数据库应用程序的使用者。用户面向的是数据库应用程序（通过应用程序操作数据），并不会直接与数据库打交道。 （7）数据库系统数据库系统（Database System，DBS）一般是由数据库、数据库管理系统、数据库应用程序、数据库管理员和最终用户构成。其中DBMS是数据库系统的基础和核心。 二、数据库类型和常见的关系型数据库1、数据库类型数据库经过几十年的发展，出现了多种类型。根据数据的组织结构不同，主要分为网状数据库、层次数据库、关系型数据库和非关系型数据库四种。目前最常见的数据库模型主要是：关系型数据库和非关系型数据库。1.关系型数据库关系型数据库模型是将复杂的数据结构用较为简单的二元关系（二维表）来表示，如图所示。在该类型数据库中，对数据的操作基本上都建立在一个或多个表格上，我们可以采用结构化查询语言（SQL）对数据库进行操作。关系型数据库是目前主流的数据库技术，其中具有代表性的数据库管理系统有：Oracle、DB2、SQL Server、MySQL等。PS：关系=二维表2.非关系型数据库NOSQLNOSQL（Not Only SQL）泛指非关系型数据库。关系型数据库在超大规模和高并发的web2.0纯动态网站已经显得力不从心，暴露了很多难以克服的问题。NOSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战，尤其是大数据应用难题。常见的非关系型数据库管理系统有Memcached、MongoDB，redis，HBase等。2、常见的关系型数据库虽然非关系型数据库的优点很多，但是由于其并不提供SQL支持、学习和使用成本较高并且无事务处理，所以本书的重点是关系型数据库。下面我们将介绍一下常用的关系型数据库管理系统。OracleOracle数据库是由美国的甲骨文（Oracle）公司开发的世界上第一款支持SQL语言的关系型数据库。经过多年的完善与发展，Oracle数据库已经成为世界上最流行的数据库，也是甲骨文公司的核心产品。 Oracle数据库具有很好的开放性，能在所有的主流平台上运行，并且性能高、安全性高、风险低；但是其对硬件的要求很高、管理维护和操作比较复杂而且价格昂贵，所以一般用在满足对银行、金融、保险等行业大型数据库的需求上。DB2DB2是IBM公司著名的关系型数据库产品。DB2无论稳定性，安全性，恢复性等等都无可挑剔，而且从小规模到大规模的应用都可以使用，但是用起来非常繁琐，比较适合大型的分布式应用系统。SQL ServerSQL Server是由Microsoft开发和推广的关系型数据库，SQL Server的功能比较全面、效率高，可以作为中型企业或单位的数据库平台。SQL Server可以与Windows操作系统紧密继承，无论是应用程序开发速度还是系统事务处理运行速度，都能得到大幅度提升。但是，SQL Server只能在Windows系统下运行，毫无开放性可言。MySQLMySQL是一种开放源代码的轻量级关系型数据库，MySQL数据库使用最常用的结构化查询语言（SQL）对数据库进行管理。由于MySQL是开放源代码的，因此任何人都可以在General Public License的许可下下载并根据个人需要对其缺陷进行修改。由于MySQL数据库体积小、速度快、成本低、开放源码等优点，现已被广泛应用于互联网上的中小型网站中，并且大型网站也开始使用MySQL数据库，如网易、新…

配置CLion用于嵌入式开发
type: item
date: 2023-07-28T15:55:00+08:00
description: 一、STM32环境1. 所需环境软件环境：STM32CubeMX（用于生成工程）Clion（编写代码）MinGW（编译C语言代码）OpenOCD（debug）arm-none-eabi-gcc（编译单片机上运行程序的编译器）硬件环境：开发板下载器2. 工具安装2.1 STM32CubeMX直接到官网下载最新版安装，然后登陆账号，有些芯片资源需要登陆后下载。官网链接：https://www.st.com/en/development-tools/stm32cubemx.html#get-software2.2 OpenOCD也是一样直接到官网下载，下载的文件为压缩包文件，解压出来放到自己能记得住的合适位置即可官网链接：https://gnutoolchains.com/arm-eabi/openocd/2.3 MinGW下载MinGW程序，并进行解压，放到自己记得住合适的位置。下载地址：https://sourceforge.net/projects/mingw-w64/files/官网有些慢 蓝奏云链接：https://yunyuwu.lanzouv.com/i8aD8xq4muf然后我们点击：此电脑——属性——高级系统设置——环境变量，点击系统环境变量中的Path。接着重启电脑后，摁住win+R键输入cmd，在cmd控制台输入下方代码并回车，当输出结果如图所示就是成功了gcc -v -E -x c++ -2.4 arm-none-eabi-gcc下载安装完成后记得勾选下方倒数的三个选项添加到环境变量中，可以省去自己去手动配置环境变量。下载地址：https://launchpad.net/gcc-arm-embedded/+download安装完成后重启电脑 执行下方语句，若有输出则成功arm-none-eabi-gcc -v2.5 clion新建一个项目，选择路径后创建。点击 文件——设置——嵌入式开发——选择安装的路径自己的路径，不是必须一致。二、51环境打开clion软件，安装platformio插件，然后将clion进行重启创建新项目，选择platformio，点击install guide会跳转到浏览器网页点击Instsallation Methods 再点击 Local Download（macos/linux/windows）右击get-platformio.py 在新窗口打开右击鼠标，另存为get-platformio.py下载python环境并添加到环境变量在对应文件位置输入python get-platformio.py 耐心等待下载完成C:\Users\xiaobei\.platformio\penv\Scripts将下载的模块添加到环境变量中，我给的路径只是举例，具体看自己，然后重启clion。2.1 配置1每次新建项目都需要配置新建51单片机项目，选择platformio选择项目路径，点击任意位置输入你的芯片信息，点击创建。打开CMakeListsPrivate.txt将下列代码复制粘贴到下一行include_directories("${ENV_HOME_PATH}/.platformio/packages/toolchain-sdcc/include")点击 文件——重新加载 CMake 项目2.2 配置2只需要配置一次双击main.c，然后添加以下代码#include "mcs51/8052.h"鼠标放到8052.h上，摁住ctrl，点击鼠标左键；将<>修改为""；并添加以下代码#include "lint.h"鼠标放到8051.h上，摁住ctrl，点击鼠标左键，跳转到8051.h文件，添加以下代码：#include "lint.h"2.3 编译上传到单片机右上角选择配置，选择上传，然后点击绿色三角形编译，等待出现Cycling power: done时，点击启动电源。

模拟电路
type: item
date: 2023-07-20T10:59:00+08:00
description: 一、什么是电流1.1 原子一切都是原子构成，一个简单的原子模型可以简化成带正电荷的原子核在中央，周围环绕有若干个带负电的电子。同性相斥，异性相吸。1.2 原子与电荷原子核带正电，吸引带负电的电子，电子带负电之间又互相排斥。绝大多数固体材料，他们的原子核和电子靠的近是稳定的。但是在金属固体里面，比如铜，电子离原子核远，是可以自由移动的。原子核原地不动，保持着材料的结构稳定，但是电子可能会在原子之间跳动。1.3 电流的产生如果一个电子不老实进行移动，那么附近的电子就会像多米诺骨牌一样不断移动。他们之间不断推着挤，就产生了电流。1.4 电流的单位 安培1000ma=1A1.5 电路与电池电路就是电流导通的道路，电池是一种特殊的通过化学反应产生能量的装置，电池正极吸收电子，电池负极发送电子。1.6 电流方向传统电学：电流从正极流向负极真实世界：电流从负极流向正极1.7 交流电(AC)与直流电(DC)AC(交流电)交流电的电流方向随时间变化电荷会在正、负两个方向上流动，周期性的交替反向交流电通常是通过电网供应的电力用于各种大型较大功耗的电气设备和机械设备如电视、电冰箱、微波炉DC(直流电)直流电是指电流方向不变的电流电荷始终在同一个方向上流动直流电源通常由电池或者其他直流电源供应直流电常用于需要稳定电压和恒定方向的小型设备中如手机、电动车直流交流电的对比1.8 开路与闭路开路与闭路的区别在于电路中开关的状态是否闭合，这直接影响了电路中的电流是否能够流通，从而影响电路中的电气设备是否能够正常工作。开路当电路中的开关处于断开状态，电路就处于开路状态。在这种状态下，电流无法流通，电路中的电气设备也无法工作。闭路当电路中的开u按处于闭合状态，电路就处于闭路状态。在这种状态下，电流可以在电路中流通，电器设备也可以正常工作。二、什么是电压2.1 电压电压就是电势能什么是势能？势能是物理学描述的能量类型，说明物体具备的能量。电压，电势能是指在电子在电路中的动能。单位通常为伏特(V)。电压是电力系统中的一种重要概念，它决定着电流流动的强度。电压越高，电子移动的越快，电流就会越大；而电压越低，电流就会越小。三、电阻和欧姆定律电压产生电势差，推动电流的流动3.1 电阻电压产生电势差，推动电流的流动电阻是电子学中的基本概念，它是指电流经过导体时阻碍电流流动的程度、电阻的单位是欧姆。电压、电阻和电流之间的关系3.2 欧姆定律欧姆定律是电学中的基本定律之一他描述了电流和电压之间的关系。欧姆定律的公式为I=U/R，其中I是电流，U是电压。R是电阻。这个公式表面，在电阻不变的情况下，电压和电流成正比欧姆定律的重要参数I 电流单位 安 AU 电压单位 伏 VR 电阻单位 欧姆 R3.3 欧姆定律的计算串联电路并联电路串并联电路的计算四、常见元器件4.1 电阻器作用就是阻碍电流的流动电阻器的分类电阻器的作用电阻器是一种电子元器件，它可以提供一定的电阻，限制电流的流动。电阻器是由导体材料制成的，通过将导体材料绕制成螺旋状或折叠装，并将两端引出，形成一个固定电阻值的器件。4.1.1 电阻的分类基于功能和制作工艺划分。普通电阻：普通电阻是一种最基本的电阻器，通常由一根或多根绕在绝缘体上的金属丝或碳膜组成，可以提供固定的电阻值，适用于各种电路中。薄膜电阻：薄膜电阻是一种由金属或合金薄膜制成的电阻器，可以提供高精度和稳定性的电阻值，常用于精密仪器、测量仪器等高要求的场合。光敏电阻：光敏电阻是一种电阻值受光照强度影响的电阻器，常用于光敏电路和光控系统中。金属薄膜电阻：金属薄膜电阻器是一种由金属薄膜制成的电阻器，具有较高的精度和稳定性，适用于高精度电路中。电位器：电位器是一种可调电阻器，通常由一个旋转或滑动的电阻器件和一个旋钮或滑动器组成，可以提供可调的电阻值，常用于电路的调节和控制。旋钮可调电阻：旋钮可调电阻是一种可调电阻器，与电位器类似，但是旋钮可调电阻通常是用旋钮来改变电阻值，通常用于电子设备的调节和控制。热敏电阻：热敏电阻是一种电阻值随温度变化而变化的电阻器，通常用于温度测量和控制系统中。压敏电阻：压敏电阻是一种电阻值随压力变化而变化的电阻器，通常用于压力传感器和压力测量等应用场合。高精度电阻：高精度电阻是一种精度较高的电阻器，通常具有稳定的电阻值和温度系数，适用于高精度仪器和精密测量仪器等场合。4.1.2 电阻的数据手册电阻我们主要关心：封装、标称、额定功率封装：看电阻是什么样的，直插还是贴片的，大小是多大标称：看电阻表的电阻阻值是多少，精确度是多少，精度越高越贵额定功率：额定功率计算公式为：P=I*I*R=I*U，额定功率其实决定了耐压值。电阻能通过的最大电流是固定的，额定功率越高，耐压值就越高，超过了电阻的耐压值会导致电阻烧毁。4.2 电容器电容就是装电的容器，主要防止…

stm32学习笔记
type: item
date: 2023-07-11T17:12:00+08:00
description: 一、单片机简介1.1 单片机是什么单片机：Single-Chip Microcomputer,单片微型计算机，是一种集成电路芯片电脑VS单片机1.2 单片机的特点体积小 <5mm*5mm功耗低 mA级集成度高 IO/TIM/AD/DA使用方便 C/Debug扩展灵活 ICC/SPI/FSNC1.3 单片机的使用场景仪器仪表——电源/示波器/焊台家用电器——空调/冰箱/洗衣机工业控制——机器人/PLC/电梯汽车电子——GPS/ABS/胎压监测1.4 单片机的发展历程1.5 CISC VS RISC对比项复杂指令集计算机(CISC)精简指令集计算机(RISC)目的为了便于编程和提高储存器的访问效率为了提高处理器运行速度指令特点1. 指令多，模式多，格式可变2.指令的执行需要的时钟周期差距很大3. 无流水线或流水线程度较低4. 指令由微带码翻译执行1. 指令少，模式少，格式固定2. 大多数指令只需1个时钟周期3. 流水线结构4. 指令直接由硬件执行优点1. 指令丰富、功能强大2.寻址方式灵活1. 指令精简，易于设计，使用率均衡2.程序执行效率高缺点1. 指令使用率不均衡2. 不利于采用先进结构提高性能3. 结构复杂不利于超大规模集成电路实现1. 指令数较少，功能不及CISC强大2. 寻址方式不够灵活CISC和RISC举例冯诺依曼结构 VS 哈佛结构1.6 总结二、Cortex-M系列2.1 ARM公司ARM公司：只做内核设计和IP授权，不参与芯片设计2.2 ARM架构为什么能风靡全球2.3 Cortex内核分类及特征对比项Cortex-ACortex-RCortex-M特点高时钟频率，长流水线，高性能较高时钟频率，较长的流水线，实时性强时钟频率较低，通常较短的流水线，超低功耗应用场景移动计算，智能手机，平板电脑，数字电视军工，汽车电子，无线基带，硬盘控制器工控、传感器、消费电子、家用电器、医疗器械2.4Cortex-M3/4/7介绍类别Cortex-M3Cortex-M4Cortex-M7核心版本ARMv7-MARMv7E-M 指令系统Thumb/Thumb-2 DSP指令扩展无有有浮点单元无单精度浮点单元可选单/双精度浮点单元流水线3级3级+分支预测6级+分支预测中断NVIC，NMI + 1~240物理中断源，8~256个中断优先级 系统定时器24位系统滴答定时器 睡眠模式集成WFI和WFE指令以及退出睡眠功能 调试可选JTAG和SWD调试接口 内存保护可选8个区域MPU可选8个区域MPU可选8、16个区域MPUDMIPS/MHz1.251.252.14CoreMark®/MHz3.343.435.012.5总结三、初识STM323.1 STM32是什么STM32ST：意法半导体 M：MCU/MPU 32：32位3.2 STM32芯片分类ST中文社区网 ST官网五大类3.3 STM32命名规则3.4 STM32选型由高到低（性能），由大到小（内存，闪存）3.5 总结四、查看数据手册4.1 芯片的基本参数主频/FLASH/SRAM工作电压/最大电流IO引脚接入电压范围单个IO引脚最大电流4.2 最小系统最小系统：保证MCU正常工作的最小电路组成单元芯片电源电路复位电路晶振电路Boot启动电路下载调试电路其他电路