自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 系统定时器

存不住时间,时间转换成对应的数字量,频率和周期的一个关系了,周期是以时间为单位,时间存不住,把周期换成频率SysTick一般用在实时操作系统,为系统提供时钟信号,systick包括俩种时钟源1.FCLK Cortex自由运行时钟(内部时钟)2.cortex系统定时器(外部时钟,进行了八分频)所有中断服务函数都放在stm32f1xx_it.c...

2023-10-27 12:52:20 109

原创 STM32通信方式

串口通信:一位一位传输,一位就需要一根线,不占用大量引脚,传输慢。并行通信:可以一个字节或多个字节,八位就需要八根线,占用引脚(同时导致抗干扰能力弱),传得快,硬件上节约一个资源,必然会导致软件上更复杂...

2023-10-27 12:52:04 109

原创 python中split方法用法

本文实例讲述了python中split方法用法。分享给大家供大家参考。具体分析如下:split 是非常重要的字符串方法,它是join的逆方法,用来将字符串分割成序列>>> '1+2+3+4+5'.split('+')['1', '2', '3', '4', '5']>>> 'usr/bin/env'.split('/')['usr', 'bin', 'env']>>> 'usr/bin/env'.split('/')['usr',

2023-10-27 12:51:21 134

原创 c语言内存布局

环境变量是编译器自动加进来用户代码是自己写的很少一部分更多的内存放系统初始化代码(编译器自动加进来)编译器会根据不同的执行平台

2023-10-27 12:50:56 63

原创 c语言存储区

内存空间:内核空间不能改不能动,栈空间从上往下增长,堆空间从下往上增长,代码段也动不了程序:编译好的二进制编码,一堆指令而已(还未运行起来)进程:程序运行起来后,才叫叫进程...

2023-10-27 12:50:29 19

原创 c语言结构体

注意:struct : 关键字 , 用来告诉编译器 我要声明的东西是一个自定义的类型*(结构体)结构体标签:用来区分不同的结构体类型成员:指结构体内部由哪些基础数据类型所构成, 可以是任何的数据类型//结构体声明,不占用内存空间,但是定义占空间struct 结构名 (数据类型){ 成员列表} ;//定义与初始化int a; //数据类型 变量;struct 结构名 变量={ };成员引用:结构体相当于一个数据的集合, 里面由多个不同类型的数据组合而成,...

2023-10-27 12:49:37 19

原创 RTOS实时操作系统

一般实时操作系统是基于时间片轮转1s分割,多的给优先级高的,1s一个循环的话,如果有10个任务,就相当于10个cpu都在运行linux再裁剪2kw行代码也裁剪不了多少,也会剩很多代码,一般嵌入式产品,低成本的,都不会搭载linux操作系统,搭载的都是实时操作系统,强调的是实时性linux系统开发,多线程:怎么处理线程,比如一个变量被几个线程同时使用,如果不对线程,变量操作的话,如果在一个线程改变变量值,另一个线程也在改变变量,所以进行一次操作后,不知道变量的值是哪个,所以学习多线程的时候,一定会

2023-10-27 12:48:31 36

原创 Linux系统编程

CTRL+ALT+T:打开终端不同颜色代表属性不一样cd / 跟目录是/这相当于跟目录,给一个地址,从这里就能找到 点击电脑,电脑旁边有【/】,进入之后,那么就是根目录。 至于家目录,则在根目录下级,点击home就是家目录,点击用户名就是你的用户家目录。 如果是命令下,右键打开终端,cd /进入根目录,cd ~进入当前用户家目录。根目录,是所有目录的开始目录,家目录,相当于win我的文档。如果难以理解,可以操作一下...

2023-10-27 12:46:49 24

原创 Matlab

1.plot(x,y) //x代表横坐标,y是纵坐标2.相当于将x分割成一堆矩阵,相当于矩阵运算3.4.5.limit 命令的介绍在MATLAB中,提供了一个求符号函数极限的命令为limit,其调用格式为:limit(f,x,a)其中,f 为求极限的函数,x 为变量,a 为一个常数。即求函数f关于变量x在a点的极限。参数a和x都可以省略。若x省略,则采用系统默认的自变量。若省略a,则a默认为0。limit 函数的...

2023-10-27 12:46:21 161

原创 python

用键盘模拟用户输入,判断输入的用户名或密码是否正确,并输出登录信息。如果输入的用户名存在,且密码正确,则输出success如果输入的用户名存在,但密码不正确,则输出password error如果输入的用户名不存在,则输出not found输入格式分两行输入,第一行为用户名,第二行为密码。示例输入zhangsan123456输出success思路:第一步:先判断username是否在users字典中存在。if username not in users,如果成立,则not ..

2023-10-27 12:45:47 32

原创 python的几种输出方式

1.输出百分比方法d = 29.6666print('数据为:%.0f%%' % (d))print('数据为:%.1f%%' % (d))print('数据为:%.2f%%' % (d))结果: 数据为:30% 数据为:29.7% 数据为:29.67%2. print(f “{}”) 的用法a = 27.56b = 28.99c = 29.66print(f"数据为:{a}")print(f"abc的数据分别为:{a},{b},{c}")结果: 数

2023-04-19 09:19:24 3807

原创 C语言学习笔记

在终端下q:退出手册

2022-05-25 11:09:41 163

原创 PID控制算法

二位式控制算法控制系统基本结构 :执行器件:比如说莫斯管/继电器/可控硅之类的开关型器件控制对象:加热器/步进电机/电磁阀等二位式控制:1/0,要么工作要么不工作所以控制对象结果是:要么在100w大功率下工作要么0w的状态下不工作最终的结果会导致一种情况是:我们传感器传回来的温度他总是在设定值100°上下浮动,就是不能够让我们控制对象的温度值正好在100°,在一个小范围波动,产生波动的原因主要是 控制对象(加热器)它本身具有一定的惯性,一般来说我们的控制对象就是有一定的惯性。

2022-05-14 16:12:57 3150

原创 linux返回上一步命令

返回1.ctral+使用上方向键 --->复制上一次命令4.按 Ctrl+P ---->复制上一次命令执行2.按 !! 并回车执行.3.输入 !-1 并回车执行.

2022-05-13 11:15:47 12017

原创 Python关键字

2022-05-11 10:55:12 159

原创 Python中的非法语句——x = (y = z + 1)

语句1:x = (y = z + 1)语句2:x = y = z + 1语句1 —— 非法语句2 —— 合法在语句1中,x被赋值 " y = z + 1 ",但这个所谓的 "y = z + 1"并不返回任何值,所以这是一个错误的赋值语句,这是非法的。在语句2中,先将 "z + 1"赋给"y",再将"y"赋给"x"。...

2022-05-11 09:51:23 6134

原创 PID算法

1、PID算法概念PID算法是工业应用中最广泛算法之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。PID算法已经有100多年历史,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。之前做过循迹车项目,简单循迹摇摆幅度较大,效果如下所示:PID算法优化后,循迹稳定性能较大提升,效果如下所示:PID算法:就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种常见的“保持稳定”控制算法。常规的模..

2022-05-08 19:53:26 7165

原创 python中“end=”

python中“end=”是“print()”函数中的一个参数,会使该函数关闭“在输出中自动包含换行”的默认行为。print默认是打印一行,结尾加换行,end传递一个空字符串,表示这个语句没结束。“end=”作为print()中的一个参数,会使该函数关闭“在输出中自动包含换行”的默认行为。为末尾end传递一个空字符串,这样print函数不会在字符串末尾添加一个换行符,而是添加一个空字符串,其实这也是一个语法要求,表示这个语句没结束。print默认是打印一行,结尾加换行。end=' '意思是末尾不

2022-05-07 19:44:00 11134

原创 python列表添加元素的三种方法

列表是序列的一种,可以使用 + 进行链接,这样相当于在第一个列表的末尾添加了另一个列表。list1 = [1,2,3,4]list2 = ['a','b','c']list3 = list1 + list2print(list3)输出结果: [1,2,3,4,'a','b','c']可以看出使用 + 会生成一个新的列表,但是该方法效率不高第一种方法:append()append()方法用于在列表的末尾追加元素,语法格式:list1.append('a') # 将元素a追加到

2022-05-07 19:29:56 25294 1

原创 列表和元组的区别

一、列表和元组的区别列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数)。元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变。元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问内核去分配内存。这些区别结实率两者在设计哲学上的不同:列表可被用于保存多个互相独立对象的数据集合元组用于描述一个不会改不安的事务的多个属性二、列表(List)列表一旦创建了我们就可以根据自己的需要随意改变它的内容:>>> l = [1, 2, 3, 4

2022-05-07 18:16:37 1834

原创 break和continue的作用和区别

一、break和continue的作用 break和continue都是用来控制循环结构的,主要作用是停止循环。二、break和continue的区别1、break用于跳出一个循环体或者完全结束一个循环,不仅可以结束其所在的循环,还可结束其外层循环。注意:(1)只能在循环体内和switch语句体内使用break。(2)不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。(3)当break出现在循环体中的switch语句体内时,起作用只是跳出该s

2022-05-06 19:47:53 3375

原创 STM32中GPIO的8种工作模式

概念解释:复用功能:即片内外设,包括UART、SPI、CAN、I2C等等,开启这些外设的功能,就是使用了系统的复用功能。复用功能有两种:没有重映像、重映像(包括部分重映像、完全重映像),使用引脚用作AFIO功能,同样需要对其进行配置。通用功能:即GPIO功能,当做普通的I/O引脚使用。复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b,MODEx[1:0]=00b)。 复位后,JTAG引脚被置于输入上拉或下拉模式:PA15:JTDI置于上拉.

2022-04-16 17:17:13 142

原创 PWM

PWM指的是脉冲(P)宽度(W)调制(M) //day9一个周期就是一个脉冲,宽度就是高电平宽度,可以通过控制高电平时间来达到控制外设的目的所以一个周期就是20ms只在给的参数内才会响应,超过后(3ms)就不会响应舵机正转:增大占空比舵机正转:减小占空比选PWM模式就是再调脉宽,也就是占空比CNT不会数到CCR就不数了,他会数到ARR里面的数就会停止外设到底是和哪个定时器的哪个通道连接在一起的? 参考芯片数据手册和原理图...

2022-04-16 17:13:20 414

原创 STM32高级定时器

STM32中提供了TIM1和TIM8高级定时器,相比于其他定时器而言,高级定时器增加了带可编程死区控制的互补输出、重复计数器、断路输入功能(一般用于控制工业中的高精度电机),但是如果作为定时功能来说,和其他的定时器没啥区别。...

2022-04-16 13:08:28 630

原创 STM32通用定时器

通用定时器可以用一个定时器控制另一个定时器。相比较基本定时器,增加了输入比较以及输出比较功能。并且通用定时器具有独立通道,就可以吧GPIO引脚连接到某个通道,利用通道进行输入检测以及脉冲信号输出。如图下通用定时器挂在APB1下递增/递减计数也就是库函数中的中心对齐TIM2~TIM5的计数方式有多种可以选择,分别为递增计数、递减计数、递增/递减计数。递增计数:计数器从 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新从 0...

2022-04-16 10:15:14 1617

原创 STM32基本定时器

高级定时器(TIM1和TIM8)的主要功能不在于定时,而是主要控制工业方面的电机基本定时器只能定时(没有通道,不能控制电机) //day7//day5图片时钟树分析CNT计数的有缓冲就是影子作用...

2022-04-15 22:52:48 134

原创 STM32参数说明

简约注释函数注释主要包含函数简介(@brief)、参数说明('@param')、返回说明(@return)和返回值说明(@retval)四部分。/** * @brief 函数简介 * * @param 形参 参数说明 * @param 形参 参数说明 * @return 返回说明 * @retval 返回值说明 */详细注释可以根据需要添加详细说明(@detail)、注解(@note)、注意(@attention)、警告(@warning)或者异常(@exce...

2022-04-15 21:33:30 908 1

原创 EXTI与NVIC

EXTI外部中断控制器(中断和事件)NVIC嵌套向量控制器如果用到中断,才会用NVIC有关系:用这根线产生中断,exti用到中断没关系:这根线只产生事件,不产生中断NVIC作用:打开中断的开关,设置中断的优先级同时,中断必须写一个死循环,不能让程序退出(主程序退出就相当于,人死了还做什么手术)向量表黑色的属于内核中断,无法屏蔽。白色是可屏蔽中断,M4内核中有240个外部中断,而EXTI只是240个的其中20多个,240个包括串口中断,EXTI中断,定时器中断,看门狗中断等定时

2022-04-12 15:24:40 2003

原创 51单片机特殊功能寄存器sfr和sbit介绍

"sfr"指令:用来直接描述硬件地址。小白先解成一组IO口的起始地址中数据 sfr P0 = 0x80; P0=0;//也就是对P0口全部给0"sbit"指令:对应可位导址空间的一个位,小白先理解成"一个IO口/针脚"的地址中的数据。sbit是用来给特殊寄存器某个位取一个名字。sfr就是特殊寄存器。下图就是51单片机所有的特殊寄存器每个寄存器的位我们都可以给它取一个名字,专业术语叫标识符,通过这个标识符可以操作对应的数据。每个寄存器的位也都拥有一个地址,通过寄存器的地址也可以访问到.

2022-04-09 21:34:30 7895

原创 C语言和STM32

栈内存系统在用堆空间是用户使用汇编语言也称为符号语言,他将不同的0和1用不同的符号表示出来所以要掌握硬件开发,汇编语言也要学linux内核90%用c语言写的剩下10%用汇编语言写的用汇编语言就得用汇编指令,汇编指令可以在STM32->参考手册->ARM指令速查手册后期工作三年到五年升职加薪靠算法(涉及到数据结构以及高等数学(三剑客高数,线代,微积分))队列:排队的,先来的先走栈:理解为瓶子,先放的后倒出来,所以学的时候有一个栈顶,还要用一个指针指向栈顶栈和队列的区别:抗

2022-04-06 22:22:57 1185

原创 STM32(寄存器)

W/R // 可写/可读寄存器地址=外设基地址+总线相对于外设基地址的偏移量+寄存器组(端口)相对总线的便宜量+寄存器相对于寄存器组的偏移量因为后面操作的时候用了接引用和强制转换指针,所以这里只是地址数据或也相当于相加//低电平置0不改变原来的位//高电平置1不改变原来的位总结:简言之,就是教我们怎么给一整个字节里的单独某一位赋值这个列表成员列表都是连续,每一个占用四个字节,和c语言之间的结构体一样所以这个寄存器的地址不用每次都定义,我们...

2022-04-03 12:12:07 939

原创 宏定义

条件编译在宏定义中,字符串内的形参通常要用括号括起来以避免出错。一上例中的宏定义中 (y)*(y)表达式的y 都用括号括起来,因此结果是正确的。如果去掉括号,含义有可能改变应该为((y)*(y))他仅仅是替换!!!!文件包含3.文件包含中的文件名可以用双引号括起来,也可以用尖括号括起来。例如以下写法都是允许的: #include <stdio.h> #include “stdio.h” 但是这两种形式是有区别的:使用尖括号表示在包含文件目录中区查找(包含目录是由用户在设置环境时设

2022-04-01 23:50:29 856

原创 二级(多级)指针

int **p;认知与一级指针一样。差别就是保存的是指针变量的地址。8.在6(里面数组是int型)的基础上,加*变成了指针,里面的数组都是(int *型)

2022-04-01 21:17:21 29

原创 指针数组和数组指针的区别

int *p1[5];int (*p2)[5];首先,对于语句“int*p1[5]”,因为“[]”的优先级要比“*”要高,所以 p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,而“int*”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,如图 1 所示,因此,它是一个指针数组。 其次,对于语句“int(*p2)[5]”,“()”的优先级比“[]”高,“*”号和 p2 构成一个指针的定义,指针变量名为 p2,而 int ...

2022-04-01 17:27:49 40

原创 指针xx

指针数组int (*p)[4]; //数组指针 []运算级高于*int *p[4]; //指针数组,是一个数组,指向指针(地址),用来存放地址的。有着四个指针指针函数

2022-04-01 17:24:35 28

原创 指针(函数指针)

1.定义,数组名就是地址,类似函数名=地址2.如何定义一个函数指--跟普通变量一样ag:int a;int *p;char b;char *p;int GetData(int a,int b);int (*p)(int a,int b); //(正确写法) int(*p)[4]; []优先级高于*所以用括号括起来表示他是指针变量int* p(int a,int b); //指针函数,p是一个函数,这个函数返回指针,返回结果是一个地址..

2022-03-30 20:09:14 1108

原创 指针4(二维数组)

组名=地址int a[3][4]; //一个占4个字节父数组=a(是名字也是地址) //行地址子数组=a[0] a[1] a[2] a[3] //列地址,这里的123代表1名字,而一维数组里的123代表大小a+1面向行地址(取决于有多少列,二维,+16(4*4)),a[0]+1面向列(一维+4)就相当于 int *p 和char *p 当他们偏移p++时;int型和char型相加量不同(char只有一个...

2022-03-30 15:48:53 546

原创 指针3

取内容:数组下表法指针当数组名,可以下表法访问数组名和指针的区别:*arr++(不能使用)与*p++(可以取内容)ag:int arr[3]={1,2,3};int *p;printf("%d",*p++) //指针变量(保存的地址可改)可以运行printf("%d",*arr++) //指针常量编译不过...

2022-03-30 11:07:25 210

原创 字符串赋值给字符指针

字符串赋值给字符指针(char *a="hello")的正确理解方式 - clemente - 博客园

2022-03-30 11:06:49 186

原创 指针2

指针==地址指针变量==存放地址的变量int *p; //这里的*是标识符,告诉系统说这是一个指针变量(指针变量就是用来存放地址)int a;prinf("地址访问a:%d",*(&a));//这里的*为取值运算符,将后面跟着的内存地址中的数据取出来变量访问有俩种:变量名访问和间接访问(指针)%x和%p区别32位系统下寻址能力(地址空间)是4G Bytes(0~2^32-1)二进制表示长度为32bits(也就是4Bytes), unsigned int类型也正好如此取..

2022-03-28 23:27:39 43

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除