STM32——串口通信及实验

2023-05-16

目录

1、按照数据传送的方向,分为:

2、按照通信方式,分为:

STM32串口通信基础

串口通信过程

UART(USART)框图

串口通信实验

编程要点

代码分析


通信接口背景知识

设备之间的通信方式

一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是:

串行通信的分类

1、按照数据传送的方向,分为:

  • 单工:数据传输只支持数据在一个方向上传输
  • 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信,它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。
  • 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端

2、按照通信方式,分为:

  • 同步通信:带时钟同步信号传输,比如SPI,I2C通信接口
  • 异步通信:不带时钟同步信号,比如UART(通用异步收发器),单总线

在同步通信中,收发设备上方会用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通信中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样,

在异步通信中不使用时钟信号进行数据同步,他们直接在数据信号中穿插一些用于同步的信号位,或者将主题数据进行打包,以数据帧的格式传输数据。通信中还需要双方约定好数据的传输速率(也就是波特率)等,以便更好地同步。常用的波特率有9600、115200等

在同步通信中,数据信号所传输的内容绝大部分是有效数据,而异步通信中则会包含数据帧的各种标识符,所以同步通信效率高,但是同步通信双方的时钟允许误差小,稍稍始终出错就可能导致数据错乱,异步通信双方的始终允许误差大。

常见的串行通信接口

STM32串口通信基础

STM32的串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器)。而对于大容量的STM32F10x芯片,分别有3个USART和2个UART

UART引脚连接方法:

  • RXD:数据输入引脚,数据接收
  • TXD:数据发送引脚,数据发送 

 对于两个芯片之间的连接,两个芯片GND共地,同时TXD和RXD交叉连接。这里的交叉连接的意思是,芯片1的RXD连接芯片2的TXD,芯片2的RXD连接芯片1的TXD。这样,两个芯片之间就可以进行TTL电平通信了。

 若是芯片与PC机(或者上位机)相连,除了共地之外,就不能这样交叉连接了。尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机通常使用的是RS-232接口(通常为DB9封装),因此不能直接交叉连接。RS-232接口是9针(或引脚),通常是TXD和RXD经过电平转换得到的。故想要使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入与输出端口电平传换成RS232类型,在交叉连接。

经过电平转换之后,芯片串口和RS232的电平标准是不一样的:

  • 单片机的电平标准(TTL电平):+5V表示1,0V表示0
  • RS232的电平标准:+15/+13V表示0,-15/-13表示1

RS232通信协议标准串口的设备间通信结构如下:

所以单片机串口与PC机串口通信就应该遵循下面的连接方式:在单片机串口与上位机给出的RS232口之间,通过电平转换电路(如下图中的Max232芯片)实现TTL电平与RS232电平之间的转换。

 具体要了解RS232串口的,可以直接看链接RS232串口简介

STM32的UART特点:

  • 全双工异步通信
  • 分数波特率发生器系统,提供精确的波特率。发送和接收共用的可编程波特率,最高可达4.5Mbits/S
  • 可编程的数据字长度(8位或者9位)
  • 可配置的停止位(支持1位或者2两位或者0.5或者1.5位)
  • 单独的发送器和接收器使能位
  • 检测标志:1、接收缓冲器 2、发送缓冲器 3、传输结束标志
  • 多个带标志的中断源,触发中断
  • 其他:校验控制,四个错误检测标志

串口通信过程

 STM32中UART参数

串口通信的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口,通信双方的数据包格式要规约一致才能正常收发数据。STM32中串口异步通信需要定义的参数:起始位,数据位(8位或者9位),奇偶校验位,停止位,波特率设置

UART串口通信的数据包以帧为单位,常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。如下图所示:

 奇偶校验位分为奇校验和偶校验两种,是一种简单的数据误码校验方法。奇校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为奇数;偶校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为偶数。

校验方法除了奇校验(odd)、偶校验(even)之外,还可以有:0 校验(space)、1 校验(mark)以及无校验(noparity)。 0/1校验:不管有效数据中的内容是什么,校验位总为0或者1。

UART(USART)框图

这个框图分成上中下三个部分。

框图的上部分,数据从RX进入到接收移位寄存器,后进入到接收数据寄存器,最终供CPU或者DMA来进行读取;数据从CPU或者DMA传递过来,进入发送数据寄存器,后进入发送移位寄存器,最终通过TX发送出去。

然而,UART的发送和接收都需要波特率来进行控制,波特率是怎样进行控制的呢?

这就到了框图的下部分,在接受移位寄存器,发送移位寄存器都还有一个进入的箭头,分别连接到接收器控制,发送器控制。而这两者连接的又是接收器时钟、发送器时钟。也就是说,异步通信尽管没有时钟同步信号,但是在串口内部,是提供了时钟信号来进行控制的。而接受器时钟和发送器时钟是由什么控制的呢?

可以看到,接收器时钟和发送器时钟又被连接到同一个控制单元,也就是说它们共用一个波特率发生器。同时也可以看到接收器时钟(发生器时钟)的计算方法、USARTDIV的计算方法。

这里需要知道一个知识点:

  • USART1的时钟:PCLK2(高速)
  • USART2、USART3、UART4、UART5的时钟:PCLK1(低速)

串口通信实验

实现串口发送数据到上位机以及上位机发送数据到串口后接收到数据,并立马发送回上位机,以及通过发送的信息,控制RGB灯。

首先讲解的是USART的接发通信实验

编程要点

  1. 使能RX和TX引脚GPIO时钟和USART时钟
  2. 初始化GPIO,并将GPIO复用到USART上
  3. 配置USART参数
  4. 配置中断控制器并使能USART接收中断
  5. 使能USART
  6. 在USART接收中断服务函数实现数据接收和发送

代码分析

GPIO和USART宏定义

/*串口1*/
#define DEBUG_USARTx				USART1
#define USART_CLK					RCC_APB2Periph_USART1
#define USART_APBx_Cmd				RCC_APB2PeriphClockCmd
#define USART_BoundRate				115200

/*串口1引脚定义*/
#define USART_GPIO_CLK				RCC_APB2Periph_GPIOA
#define USART_GPIO_APBx_Cmd		    RCC_APB2PeriphClockCmd
#define USART_GPIO_TX_PORT		    GPIOA
#define USART_GPIO_TX_PIN			GPIO_Pin_9
#define USART_GPIO_RX_PORT		    GPIOA
#define USART_GPIO_RX_PIN			GPIO_Pin_10

/*串口1中断*/		
#define USART_IRQ					USART1_IRQn
#define USART_IRQ_Handler			USART1_IRQHandler

使用宏定义方便程序的移植和升级。开发板中的CH340G的收发引脚默认通过跳帽连接到USART1,如果想使用其他串口,也可以通过硬件改变和定义其他串口的宏定义来实现其他串口的作用。

嵌套向量中断控制器

void NVIC_Config(void)
{
	/*定义NVIC初始化结构体*/
	NVIC_InitTypeDef NVIC_InitStruct;
	/*设置优先级分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	/*设置中断源*/
	NVIC_InitStruct.NVIC_IRQChannel	=	USART_IRQ;
	/*中断使能*/
	NVIC_InitStruct.NVIC_IRQChannelCmd	=	ENABLE;
	/*设置中断抢占优先级*/
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority	=	1;
	/*设置中断子优先级*/
	NVIC_InitStruct.NVIC_IRQChannelSubPriority	=	1;
	/*结合初始化函数,设置相关的寄存器*/
	NVIC_Init(&NVIC_InitStruct);
}

USART初始化配置

void USART1_Config(void)
{
	/*定义串口1的初始化结构体*/
	USART_InitTypeDef USART_InitStruct;
	GPIO_InitTypeDef	GPIO_InitStruct;
	
	/*打开串口外设时钟*/
	USART_APBx_Cmd(USART_CLK,ENABLE);
	
	/*打开GPIO外设时钟*/
	USART_GPIO_APBx_Cmd(USART_GPIO_CLK,ENABLE);
	
	/*将USART的TX配置为复用推挽输出*/
	GPIO_InitStruct.GPIO_Mode		= 	GPIO_Mode_AF_OD;
	GPIO_InitStruct.GPIO_Pin		=	USART_GPIO_TX_PIN;
	GPIO_InitStruct.GPIO_Speed	    = 	GPIO_Speed_50MHz;
	GPIO_Init(USART_GPIO_TX_PORT,&GPIO_InitStruct);
	
	/*将USART的RX配置为浮空输入*/
	GPIO_InitStruct.GPIO_Mode		=		GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin		=		USART_GPIO_RX_PIN;
	GPIO_Init(USART_GPIO_RX_PORT,&GPIO_InitStruct);
	
	/*配置USART的参数设置*/
	
	/*USART的波特率设置为115200*/
	USART_InitStruct.USART_BaudRate	=	USART_BoundRate;
	/*配置USART的模式为TX和RX*/
	USART_InitStruct.USART_Mode		=	USART_Mode_Tx | USART_Mode_Rx;
	/*配置USART为1位停止位*/
	USART_InitStruct.USART_StopBits	=	USART_StopBits_1;
	/*配置USART的字长为8位字长*/
	USART_InitStruct.USART_WordLength	=	USART_WordLength_8b;
	/*配置USART的校验为无校验*/
	USART_InitStruct.USART_Parity		=	USART_Parity_No;
	/*配置USART的硬件控制流为None*/
	USART_InitStruct.USART_HardwareFlowControl	=	USART_HardwareFlowControl_None;
	/*结合USART的初始化函数,设置USART的寄存器*/
	USART_Init(DEBUG_USARTx,&USART_InitStruct);
	
	
	/*配置USART的中断优先级*/
	NVIC_Config();
	
	/*使能串口发送中断*/
	USART_ITConfig(DEBUG_USARTx, USART_IT_TXE,ENABLE);
	USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE,ENABLE);

		/*使能串口*/
	USART_Cmd(DEBUG_USARTx,ENABLE);

}

使用GPIO_InitTypeDef和USART_InitTypeDef构体定义一个GPIO初始化变量以及一个USART初始化变量,这两个结构体这里不再赘述。

字符发送

/*设置单字节发送函数*/
void USART_SendByte(USART_TypeDef* pUSARTx,uint8_t Data)
{
	USART_SendData(pUSARTx, Data);
	/*等待发送完成*/
  while((USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE)) == RESET);

}

/*设置双字节发送函数*/
void USART_SendTwoByte(USART_TypeDef* pUSARTx,uint16_t Data)
{
	uint8_t temp_h,temp_l;
	temp_h = (Data&0xff00)>>8;
	temp_l = (Data&0xff);
		
	USART_SendData(pUSARTx, temp_h);
  while((USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE)) == RESET);
	
	USART_SendData(pUSARTx, temp_l);
  while((USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE)) == RESET);

}

/*设置多字节数组发送*/
void USART_SendArray(USART_TypeDef* pUSARTx,uint8_t *array,uint8_t num)
{
	uint8_t i;
	for(i=0;i<=num;i++)
	{
	USART_SendByte(pUSARTx, *(array++));
	}
	/*等待发送完成*/
  while((USART_GetFlagStatus(pUSARTx, USART_FLAG_TC)) == RESET);


}

/*设置字符串发送*/
void USART_SendString(USART_TypeDef* pUSARTx,char *str)
{
	for(;*str!='\0';str++)
	{
		USART_SendByte(pUSARTx, *str);
	}
  while((USART_GetFlagStatus(pUSARTx, USART_FLAG_TC)) == RESET);

}

USART中断服务函数

void USART_IRQ_Handler(void)
{
	uint8_t temp;
	if( (USART_GetITStatus(DEBUG_USARTx, USART_IT_TXE) != RESET) )
	{
		LED_B(ON);
		delay(0XFFFFFF);
		LED_B(OFF);
		USART_ITConfig(DEBUG_USARTx,USART_IT_TXE,DISABLE);
	}
	if( (USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE) != RESET) )
	{
		temp	=	USART_ReceiveData(DEBUG_USARTx);
		USART_SendData(DEBUG_USARTx, temp);
		
	}

}

主函数

int main(void)
{
	uint8_t a[10] = {65,66,67,68,69,70,71,72,73,74};
	GPIO_LED_Config();
	USART1_Config();
	USART_SendByte(DEBUG_USARTx,0x63);
  USART_SendTwoByte(DEBUG_USARTx,0x4344);
	USART_SendArray(DEBUG_USARTx,a,10);
  USART_SendString(DEBUG_USARTx, "\n欢迎来到学习STM32的世界\n");
	printf("串口测试输出\n");
	while(1)
	{
	
	
	}	
	
	
}

USART1指令控制RGB彩灯实验

编程要点

  1. 初始化配置RGB彩色灯GPIO
  2. 使能RX和TX引脚GPIO时钟和USART时钟
  3. 初始化GPIO,并将GPIO复用到USART上
  4. 配置USART参数
  5. 使能USART
  6. 获取指令输入,根据指令控制RGB彩色灯

与上一个实验不同,这里我们不再使用接收中断,而是直接靠查询标志位的方式来实现接收。

上面的宏定义以及USART的配置不在赘述。

重定向printf函数和scanf函数

/*重定向C库函数printf到串口,重定向后可以使用printf函数*/
int fputc(int ch,FILE *f)
{
	/*发送一个字节数据到串口*/
	USART_SendData(DEBUG_USARTx,(uint8_t) ch);
	/*等待发送完毕*/
	while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_TXE) == RESET);
	
	return(ch);

}

/*重定义C库函数scanf到串口,重定向后可以使用scanf函数*/
int fgetc(FILE *f)
{
	/*等待串口输入数据*/
	while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_RXNE) == RESET);
	
	return (int)USART_ReceiveData(DEBUG_USARTx);

}

主函数

int main(void)
{
//	uint8_t a[10] = {65,66,67,68,69,70,71,72,73,74};
	uint8_t ch;
	extern uint8_t temp;
	ch = temp;
	GPIO_LED_Config();
	USART1_Config();
//	USART_SendByte(DEBUG_USARTx,0x63);
//  USART_SendTwoByte(DEBUG_USARTx,0x4344);
//	USART_SendArray(DEBUG_USARTx,a,10);
//  USART_SendString(DEBUG_USARTx, "\n欢迎来到学习STM32的世界\n");
	printf("串口测试输出\n");
	printf("temp=%d\n",temp);
	while(1)
	{
		//ch = scanf("%d",&temp);
		//printf("ch=%c\n",ch);
		//printf("ch=%d\n",ch);

		switch(temp)
		{
			case 0x1:LED_R(ON);
				break;
			case 0x2:LED_B(ON);
			break;
			case 0x3:LED_G(ON);
			break;
			default:LED_ALLOFF;
			break;
		
		}
	
	}	
	
	
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32——串口通信及实验 的相关文章

  • Airsim_API

    AirSim API 参考自知乎大佬https www zhihu com column multiUAV 讲的非常好 xff01 无人机姿态角 pitch是俯仰角 xff0c 是 点头 yaw是偏航角 xff0c 是 摇头 roll是旋转
  • Apollo自动驾驶入门课程第①讲—无人驾驶概览

    目录 1 全面了解自动驾驶主要模块 2 了解无人车的运作方式 3 开放式软件栈 4 本节其他重点 本文转自微信公众号 xff1a Apollo开发者社区 原创 xff1a 阿波君 Apollo开发者社区 8月1日 在Apollo 3 0发布
  • mavsdk_api

    MAVSDK中offboard一些API Value 其中是offboard需要用到的一些参数定义 offboard PositionNedYaw class mavsdk offboard PositionNedYaw north m e
  • strstr()函数的使用说明(C语言)

    头文件 lt string h gt 函数作用 xff1a 1 strstr 函数搜索一个字符串在另一个字符串中的第一次出现 2 找到所搜索的字符串 xff0c 则该函数返回第一次匹配的字符串的地址 xff1b 3 如果未找到所搜索的字符串
  • Linux硬件信息查看命令

    查看磁盘 df 查看CPU信息 cat proc cpuinfo 查看显卡 lspci grep VGA 查看OS采用核心号 lsb release cs Linux查看当前操作系统版本信息 cat proc version Linux查看
  • DockerFile的使用

    DockerFile的使用 一 DockerFile构建过程解析1 1 Dockerfile内容基础知识1 2 Docker执行Dockerfile的大致流程 二 DockerFile常用保留字指令三 DockerFile案例3 1 先准备
  • myeclipse2019 4.0配置tomcat9的两个问题

    myeclipse2019 4 0配置tomcat9的两个问题 问题一 xff1a myeclipse配置tomcat端口无效 图中提示Tomcat的一个或多个端口无效 xff08 并非占用 xff0c 端口占用看问题二 xff09 出现这
  • MySQL-约束(三)

    MySQL 约束 约束的定义常见的约束类型表级约束与列级约束例子非空约束 NOT NULL 唯一约束 UNIQUE 联合唯一约束 默认约束 DEFAULT 主键约束 PRIMARY KEY 复合主键约束复合主键与联合主键 外键约束 FORE
  • 双系统之kali

    双系统之kali 所用工具制作kali的引导盘硬盘分区安装kali设置启动引导设置root密码U盘恢复 下面文章多为图片形式 xff0c 每个图片中包含详细的步骤 所用工具 16G的U盘一个 xff0c 电脑一台 所有的软件均已上传至百度网
  • 连接GitHub提示远程主机关闭连接

    连接GitHub提示远程主机关闭连接 发现问题排查问题反思 错误代码 xff1a kex exchange identification Connection closed by remote host 发现问题 今天晚上使用git连接了G
  • Linux - Nginx安装

    Linux Nginx安装 下载 amp 配置启动优化nginx添加新模块 本文由于是学习 xff0c 所以使用tar包安装 xff0c Linux版本CentOS7 xff0c nginx 1 20 2 xff0c 本次安装路径为 usr
  • 异常记录-3

    异常记录 3 异常类名描述问题原因解决方案异常重现 异常类名 org springframework beans BeanInstantiationException 描述 Failed to instantiate javax servl
  • 异常记录-22

    异常记录 22 异常描述问题原因解决方案异常重现 异常 ssl SSLEOFError EOF occurred in violation of protocol ssl c 997 描述 urllib3 exceptions MaxRet
  • Linux - RabbitMQ部署

    Linux RabbitMQ部署 准备部署账户创建使用 准备 span class token function cat span etc redhat release 查看自己的服务器什么版本的 xff0c 本人使用的CentOS8 安装
  • Linux - MongoDB部署

    MongoDB部署 准备部署mongoDB部署 启动优化角色 参考 准备 MongoDB下载 官方下载 选择自己需要的版本 xff0c 以及服务器版本 xff0c 以及安装方式 xff0c 本篇文章我们安装6 0MongoDB使用CentO
  • 异常记录-23

    异常记录 23 异常描述问题原因解决方案异常重现 异常 64 WebFilter 描述 Java 过滤器 64 WebFilter不起作用 问题原因 64 WebFilter需要注册到Bean中 xff0c 只写注解不起作用的 解决方案 在
  • Vscode黑色主题很难看到鼠标

    Vscode黑色主题很难看到鼠标 xff0c 像瞎了一样 xff0c 找半天不知道鼠标在哪里 xff0c 解决办法 xff1a 控制面板 鼠标 指针 看 自定义 选择 文本选择 点击 浏览 选择 beam r xff0c 这个是光标周围带白
  • python中变量前面加单下划线和双下划线的区别&python的私有属性

    一 在py文件中 变量名字前面加单下划线和双下划线都是对变量的保护 xff0c 一种约定 xff0c 用来指定变量私有 程序员用来指定私有变量的一种方式 不能用from module import 导入 xff0c 其他方面和公有一样访问
  • APM、PIXHAWK、PX4的关系

  • QT小记:QT程序异常结束的可能原因

    一 问题 xff1a 程序异常结束 二 解决 1 解决思路 xff08 1 xff09 QT程序异常结束的原因之一可能引用了某个库 xff0c 但是某个库QT找不到 xff0c 就会出现崩溃的问题 解决 xff1a 1 检查pro文件是否正

随机推荐

  • C语言:十进制转换成十六进制字符串和数组

    1 十进制转换成十六进制字符串 include lt stdio h gt 函数 xff1a 将十进制数字转换为十六进制 xff0c 并将转换后的数字存储在字符串中并输出 void dec2hex int n char str 100 in
  • 【统计计算】课程总结笔记

    传统的主成分分析法 xff08 PCA xff09 缺陷在于 xff1a 对于 小样本问题 xff08 样本维数d远大于样本个数N xff09 xff0c 样本协方差矩阵规模 d d 太大了 xff0c 在后续求特征值问题中计算量较大 于是
  • ros --- 双目相机内参与外参标定

    ros 双目相机内参与外参标定 小觅相机直接获取参数手动重新标定1 双目相机内外参标定生成标定板录制 stereo calibra bag标定标定结果标定验证 2 双目 43 imu外参标定录制 stereo 43 imu calibra
  • RT-Thread之入门跑代码

    本文将讲述如何在window10中利用tensorflow跑代码 xff0c 并且编译成bin文件 xff0c 最后在k210中运行 一 在window上安装tensorflow框架 xff08 python3 7 xff09 1 安装An
  • keil5的基本使用

    项目文件后缀 硬件下载 1 编译 2 下载 软件仿真 一 基本知识 1 选择软件仿真选项 2 编译 3 启动软件仿真 4 运行代码 二 软件仿真的具体使用 1 我们想运行到 哪一步就在那一步添加断点 xff08 在左边的空白处左键点一下就可
  • pytorch之池化层

    实际图像里 xff0c 我们感兴趣的物体不会总出现在固定位置 xff1a 即使我们连续拍摄同一个物体也极有可能出现像素位置上的偏移 这会导致同一个边缘对应的输出可能出现在卷积输出 Y中的不同位置 xff0c 进而对后面的模式识别造成不便 在
  • 串口通信协议

    通信协议的基本概念 用于定义通信过程及细节规则的协议称为通信协议 xff0c 通信系统之间为了完成通信所必须遵循的规则和约定 xff08 数据包格式 字段的内容 字段的含义 发送的时间 接收的时间等细节 xff09 个人理解 xff1a 就
  • gazebo的安装

    安装ros 1 1设置软件源 xff1a 清华源或者阿里都可 sudo sh c 39 etc lsb release amp amp echo 34 deb Index of ros ubuntu 清华大学开源软件镜像站 Tsinghua
  • 驱动开发基础

    1 Hello驱动 我们应用程序使用open函数的时候 xff0c 会调用内核的sys open函数 xff0c 然后接下来 1 然后打开普通文件的话会使用文件系统操作硬件 xff0c 2 要是打开驱动文件 xff0c 会使用驱动程序对应的
  • ARM架构与编程 · 基于IMX6ULL

    一 嵌入式系统硬件介绍 cpu 43 RAM xff08 内存 xff09 43 FALSH 集成 xff08 flash存储设备 xff09 61 MCU 单片机 AP MPU 进化之后可以外接内存和存储设备 跑复杂的操作系统 xff0c
  • 嵌入式常用算法

    1 冒泡排序 1 两两之间对比 xff0c 要是顺序排 xff0c 一轮过后最大的就是最后一个 2 下一轮参加排序的数比上一轮少一个 include lt iostream gt using namespace std void paixu
  • 实习面试的总结

    2023 4 3 阿凡达机器人 驱动开发实习生 1 怎么注册一个字符设备 注销 1 注册一个设备号 2 设备号加载进内核 3 创建类 4 创建设备 注销 1 从内核中删除 2 删除设备 3 删除类 2 怎么将新加入的网络设备加入到内核中去
  • 字符设备结构体与probe函数

    1 设备结构体 设备结构体 struct ap3216c dev dev t devid 设备号 主设备号 43 次设备号 struct cdev cdev cdev 字符设备对象 xff0c 字符设备驱动的一种结构体类型 struct c
  • SLAM --- VIO 基于 EKF 开源

    1 VIO based on EKF 已知一致性的Visual Inertial EKF SLAM 实现添加链接描述
  • 暗夜精灵7 linux

    Ubuntu18 04 安装nvidia显卡驱动 distro non free 小乌坞的博客 CSDN博客 注意在关闭显示界面的时候需要输入密码 xff0c 不然会一直卡着 在验证是否屏蔽驱动的时候 xff0c 要先重启一下 cuda L
  • linux应用编程

    项目内容 开发板内部使用c语言调用硬件驱动实现各种测试功能 xff0c 保存测试结果 外部程序通过socket接口使用tcp协议与开发板通信进行信息传输 xff0c 最后使用python GUI构造一个界面按照测试顺序逐步显示出各个模块的测
  • NUC10快乐装机

    NUC10装机 由于为了RoboMaster比赛 xff0c 身为全队唯一一个视觉队员兼队长的我 xff0c 经过疫情期间的再三斟酌 xff0c 最后决定工控机选择为nuc10 为什么选择nuc10 作为第一年参赛的新队伍 xff0c 视觉
  • 什么是PID?讲个故事,通俗易懂

    什么是PID xff1f PID xff0c 就是 比例 xff08 proportional xff09 积分 xff08 integral xff09 微分 xff08 derivative xff09 xff0c 是一种很常见的控制算
  • C语言对寄存器的封装

    目录 1 封装总线和外设基地址 2 封装寄存器列表 3 修改寄存器的位操作的方法 把变量的某位清零 把变量的某几个连续位清零 对变量的某几位进行赋值 对变量的某位取反 1 封装总线和外设基地址 在编程上为了方便理解和记忆 xff0c 我们把
  • STM32——串口通信及实验

    目录 1 按照数据传送的方向 xff0c 分为 xff1a 2 按照通信方式 xff0c 分为 xff1a STM32串口通信基础 串口通信过程 UART xff08 USART xff09 框图 串口通信实验 编程要点 代码分析 通信接口