STM32-CAN通讯 一、发送和接收流程 can通讯传输的是一种差分信号,关于具体的硬件电路略。 1、发送流程 前置工作:如时钟的开启、引脚的配置;CAN邮箱和模式等配置参考下面或HAL库选择 选择一个空置的邮箱(判断空置:CAN_TSR的TMEx位); 在这个空置邮箱中按数据帧格式设置ID、数据长度以及要发送的数据; 请求发送(CAN_TIxR的TXRQ=1); 后面的是硬件来实现的(这个过程可以被软件打断): 邮箱挂号(等优先); 预定(等总线); 发送; 空置。 2、接收流程 前置工作略 配置过滤器:给过滤器绑定一个FIFO,之后以FIFO0为例; 硬件自动处理:收到报文后挂...

  w0pCW4weT65e   2024年02月29日   58   0   0 嵌入式

STM32基本定时器 1.时基单元 计数寄存器(TIMx_CNT) 计数器从0累加计数到自动重装载数值(TIMx_ARR寄存器),然后重新从0开始计数并产生一个计数器溢出事件。 预分频寄存器(TIMx_PSC) 它也有缓存,也是在更新事件产生时刷新缓存。 自动重装载寄存器(TIMx_ARR) 设置此值。计数器达到这个值,溢出。 可以给此值设置缓存,这个缓存被称为影子寄存器。当TIMx_CR1的ARPE位为1时,表示有缓存;否则没有。 有缓存时:更新缓存的时机是更新事件(计数器溢出或者TIMx_EGR寄存器的UG位为1)产生时。所以缓存有时不是实时的值。 2.时序中的一些概念 ...

  w0pCW4weT65e   2024年01月19日   25   0   0 嵌入式

include"Driver_IIC.h" include"Delay.h" / IIC默认地工作于从模式。 生成起始条件后自动地从从模式切换到主模式, 当仲裁丢失或产生停止信号时,从主模式切换到从模式。 从模式用于接收数据;主模式用于发送数据。 / / 初始化 / voidDriver_IIC_Init(void) { /1.时钟控制使能IIC和GPIOB/ RCC->APB1ENR|=RCC_APB1ENR_I2C2EN; RCC->APB2ENR|=RCC_APB2ENR_IOPBEN; /2.配置PB10、PB11为复用开漏/ //PB10和PB11引脚为I2C...

  w0pCW4weT65e   2024年01月18日   21   0   0 嵌入式

STM32 1、keil的配置以及vscode的配置略 2、stm32的命名规则todo以下以stm32lf103ze为例。 3、点亮第一个小灯 ​开启时钟、设置输入/输出模式、给小灯的位赋值0。 开启时钟 开启时钟使用到的寄存器为RCC_APB2ENR,32位,高16位为保留位。 第二位IOPA控制IO端口A的输入输出使能。其他具体每一位什么功能看数据手册。 设置输入/输出模式 用到GPIOA_CRL/GPIOA_CRH。这两个寄存器每个都是32位,每个只能给8个输入/输出设置模式(每4bit给一个输入/输出位设置模式),两个加起来可以给16个输入/输出设置模式 具体使用以及复位值见...

  w0pCW4weT65e   2024年01月16日   22   0   0 嵌入式

51单片机【点阵屏】 ​我们有一个88的点阵屏,里面是64个发光二极管。 ​二极管的阳极我们给它接了74HC595的八个输出引脚,阴极接P00-P07引脚。 ​74HC595的八个引脚控制八个行,P00-P07控制八个列,行为1,列为0对应的那个LED灯会亮,其他的组合不行。 ​如何让74HC595的八个输出引脚输出不同的值,我们需要查看手册。 ​查看手册得知:这个芯片对我们有用的输入管脚有三个,一个SCK当它下降沿时使得移位寄存器右移一位,一个RCK当它下降沿时将移位锁存器里的值放到存储寄存器并输出到引脚上,一个SER将每次右移后前面缺出的位置补上它。移位前,移位寄存器每位都是0,通过SER...

  w0pCW4weT65e   2023年12月25日   26   0   0 嵌入式

51单片机【外部中断、定时器中断、回调函数】 ​这里的外部中断类似监听器,时时刻刻监视某引脚的电平变化;这里的定时器中断类似于定时任务,可以定时执行某函数;这里将回调函数和中断结合起来,案例里有点设计模式的味道(忘了哪个了,也可能就是感觉,关于高层不能调用低层的解决),也有点函数式编程的味道。 1、中断(包括外部中断和定时器中断,串口todo) ​中断可以狭义地看作是监听。它可监听如按钮按下、定时器溢出、CPU内部某值的改变等。 ​以下都是以89C52的某个(大概不是所有)单片机为例,(我也不知道这个是哪个,用哪个就查看哪个的手册)它共有8个中断,这8个中断包含4个外部中断、3个计时器中断、1...

  w0pCW4weT65e   2023年12月24日   29   0   0 嵌入式

51单片机 1、51单片机初始知识 在51单片机里,int为16位。 给单片机写程序的意义就是让输入/输出的高低电平可以动起来。(不写代码的高电平就一直是高电平了,除非拿开关等期间让它改变。) 51有自己的编译器,有些语法和C语言并不相通。 51单片机有256位寻址。即256Byte空间可用。但高128Byte不建议使用,一般用来存放运行时数据栈。低128Byte可供我们用来存储代码和操作代码中的数据。 另外有一些可供操作的寄存器,它们的起始地址为0x80,和高128Byte寻址重合了,所以使用起来语法有些怪异。高128Byte可以用指针访问,但不建议访问它们。寄存器的0x80开始的我们可以如...

  w0pCW4weT65e   2023年12月22日   51   0   0 嵌入式

算法【快速排序】 快速排序。选择一个作为比较的元素,这里我们选择首元素,这个元素我叫他‘比较元素’;前后两个指针(其实是索引变量)同时往后和往前进行遍历,开头的指针遇到比‘比较元素’大的元素停下来(空循环体的循环即可实现),末尾的指针往前遍历,遇到比‘比较元素’小的元素停下来;两个元素都停止后,交换两个元素,交换后通过外面的大循环继续让指针运动起来;当两个指针相遇或交错时,退出大循环;之后将从后面跑来的指针的元素与‘比较元素(首元素)’交换(因为这时这个从后面跑来的指针一定指向小于或等于首元素的元素),这样可以保证后面跑来的这个指针的位置元素,前面都是小于它的元素,后面都是大于它的元素;之后前...

  w0pCW4weT65e   2023年12月08日   69   0   0 C语言

数据结构【动态数组】 在堆中申请数组空间,扩容时realloc,注意不可增删改的情况并处理即可。 以下代码不一定完全正确。 include<stdio.h> include<stdlib.h> / 声明动态数组,并提供相关的函数操作 / //动态数组结构体 typedefstructArray { //动态数组 intelementData; //容量 size_tcapacity; //长度 size_tsize; }DynamicArray; //初始化动态数组 voidinitDynamicArray(DynamicArrayarray,siz...

  w0pCW4weT65e   2023年12月07日   25   0   0 C语言

模数电简要知识 一、模拟电路 1、二极管 特性:正向导通反向截止。电压电流非线性。电流(正电荷)方向是从P流向N。 参数:工作电流。 二极管分类:比如稳压二极管、续流二极管、发光二极管…… 八个发光二极管构成一个表示一位数字的数码管。数码管分为共阴和共阳。 问:共阴和共阳怎么理解? 2、三极管(晶体管) 分类:NPN和PNP两种结构。 特性 放大电路(电流控制电流)todo 开关。NPN型在B极给一个5V信号就能导通;PNP型在B极给一个低信号就能导通。 对于NPN管,当Ube<0.5V,Uce>Ube时,处于截止状态;当0.5V<Ube<0.7V,U...

  w0pCW4weT65e   2023年12月07日   29   0   0 嵌入式

简易计算机的搭建 1、一些无关紧要的前置知识 ​现代计算机类设备的主流架构一般有两种:一为冯诺依曼体系架构;一为哈弗架构。 ​主流计算机采用的架构一般为冯诺依曼体系,是将程序和数据放在一起存储的架构; ​单片机设备一般采用哈弗架构,是将程序与数据分开存储的一种架构。 ​以下基本都是有关冯诺依曼架构的知识 ​冯诺依曼架构提出计算机由四个子系统构成:存储器(寄存器、内存、硬盘)、计算单元(ALU)、控制单元(进行协调各个单元)、输入输出单元(外设)。 ​CPU(中央处理器)是由寄存器、计算单元、控制单元组成。 ​一般64位机的系统为64bit. ​CPU和内存、硬盘、外设等非CPU内部组件连接的中...

  w0pCW4weT65e   2023年12月07日   25   0   0 嵌入式

电路基础 一、电路中的概念 1、能量。 ​能量(Q):某段时间内产生的能量。单位为J。 ​Q=UIt 2、电功率。 ​电功率(P):电产品在某一单位时间作的工(产生的能量,如热能)。单位W。 ​一个电路中,如果电阻很小,电压和电流很大,就会产生很大的热能。 ​P=UI(P->W,U->V,I->A) 3、电压。 ​电压(U):电产品两端的电势差。单位V。 ​U=IR(U->V,R->Ω,I->A) ​1V=电场对1C电荷做1J功 4、电流。 ​电流(I):单位时间内正电荷从高电压位移动到低电压位的个数。单位A。 ​电流就像水流,从高处流向低处。其实是...

  w0pCW4weT65e   2023年12月05日   29   0   0 嵌入式

数据结构【1】 1、数据结构是什么,有什么作用 ​数据结构就是存储数据时,将数据排列的关系。 ​使用数据结构的目的是为了使数据的增删查改更快速便捷。 2、数据之间的关系: ​集合、线性、树形、图形(网状)。 ​集合之间的数据基本没有什么关系。 ​线性关系是数据间是一条线或几条线这样存储。 ​树形结构是以一对多形式存储的结构。 ​图形(网状)结构是多对多形式存储的结构。 3、数据结构的第一种分类 ​线性结构:如线性表、栈、队列、数组、字符串、广义表等。 ​非线性结构:如树、图等。 4、数据结构的第二种分类 ​在内存(物理)层面分为两类:连续存储(叫法为顺序结构)和分散存储(叫法为链式结构)。 ​...

  w0pCW4weT65e   2023年12月01日   72   0   0 C语言

C语言【几个关于字符串/字符的函数的使用以及几个特殊的】 //将info的值从第一个空格或换行处截取赋给指针,空格或换行也不要了。 sscanf(info,"%s",指针); scanf("%s",指针);//从控制台输入到指针,空格或换行处截取,不要空格或换行 scanf("%c",变量); //可以接收一个字符,该字符可以是'\n'。等同于变量=getchar(); fget(指针,字节长度,stdin); //将字符串从控制台输出到指针,连带'\n'也一并放进去。 关于,编译器会作一些处理(根据编译器不同),如下为gcc编译出来的结果: intk=1; intj=k+k; //j...

  w0pCW4weT65e   2023年11月28日   23   0   0 C语言

C语言【文件操作】 1、输入/输出流的定义。 ​C语言中,文件输入/输出以流的方式进行。 ​读还是写,输入还是输出,是站在内存(程序)的角度来看的。从程序(内存)向数据源(如文件、网络等)传递数据的过程叫做读数据,读数据使用的路径叫做输入流,一般读数据的过程是一个解码的过程;从数据源(如文件、网络等)向内存(程序)传递数据的过程叫做写数据,写数据使用的路径叫做输出流,一般写数据的过程是一个编码的过程。 ​编码和解码使用的字符集不一致时会出现乱码。 2、标准输入输出(一般指从键盘输入,从控制台输出) scanf(...)和printf(...)略 //getchar用于从标准输入流(通常是键盘...

  w0pCW4weT65e   2023年11月27日   24   0   0 C语言

C语言【自定义数据类型、typedef、动态内存分配】 一、自定义数据类型。 ​关于下面讲到的所有自定义数据类型(enum、struct、union),有一点要说的是:定义类型不是声明变量,做这步操作时不分配内存,也不能在定义类型时赋值(枚举那个不是赋值,是做一个限定,赋值时赋限定之外的值也不报错。)。 1、typedef(给类型起别名的关键字) //C语言中给数据类型起别名的同时不能声明变量。 //一个错误的示范://typedefintIntegeri; //不能在这里声明i。自定义数据类型同理。 //给指针类型起别名 typedefintintptr; typedefcharStrin...

  w0pCW4weT65e   2023年11月25日   28   0   0 C语言

C语言【预处理器】 1、一些关于预处理的知识 ​C代码中,一般带的都是预处理指令,包括宏替换、文件包含、条件编译等。 ​为兼容一些老编译器,前后一般不写空格 ​预处理指令后面不加分号。 2、宏定义 //格式如下 define宏名称(替换文本) //这个替换文本记得加上括号,因为是直接文本替换,可能会由于优先级而混乱 //这个替换文本可以是字面量、表达式、函数等 //带参数的宏。举个例子 defineprint_int(n)printf("%d\n",n) voidmain(){ //宏的使用 inta=10; print_int(a); } //宏可嵌套 definePI3.14 de...

  w0pCW4weT65e   2023年11月24日   30   0   0 C语言

C语言【函数、作用域、常用系统函数】 一、函数 1、函数的声明 //函数声明格式 intadd(intx,inty); //或 intadd(int,int); ​自定义函数如果放在main函数之后,需要声明函数才可以访问到。如果未声明,则编译器会自动补一个返回类型未int类型的声明,这样以来,如果自定义函数返回值不为int,会报错。 ​结论:记得加函数声明。 2、函数的传值和传址。todo 3、函数的名称即代表函数的地址。 4、C语言不支持函数的嵌套声明和定义。 5、形参和实参的区分:调用其他函数时,传递的参数叫实参。形参和实参数量要一致。 6、函数中声明了返回值类型,但没写return:...

  w0pCW4weT65e   2023年11月22日   29   0   0 C语言

C语言【数组】 一、数组的一些零碎的知识 1、数组在内存中的空间是连续的,数组下标从0开始; 数组中存储的类型是一致的(只能存储同一类型,这样可以快速定位某元素) 2、指针可看作存储地址的变量,数组名可看作地址那个常量,所以数组名不可修改。可以改的是数组元素:a[0]或a 二、一维数组 1、整型数组的定义 ​第一种。声明后定义。声明后数组的值是随机的。 intarr1[3]; ​第二种。声明的同时赋初始。这种情况赋值个数--少补0,多报错 intarr2[3]={4,5,6}; ​第三种。不指定元素个数,直接初始化。 intarr3[]={4,5,6}; 2、数组越界问题 ​C语言的数组...

  w0pCW4weT65e   2023年11月20日   64   0   0 C语言

C语言【控制语句】 一、分支控制语句 1、if语句略。 2、switch...case如下 switch(表达式){ case常量1: //... break; case常量2: //... break; defaule: //... break; } 注意:switch括号里的表达式只能存在整数计算或能表达整数的计算,不能出现浮点数的计算。 case的判断条件或的表示方法如下: switch(xxx){ case1: case2: case3: //... break; } 注意:如果case的代码里不加break;则它会匹配到第一个满足条件的case后进入,然后无条件执行下面的语句,...

  w0pCW4weT65e   2023年11月19日   27   0   0 C语言
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~