5. STM32——串口发送字符、字符串 + printf 的重定向

2023-05-16

STM32——串口发送字符、字符串 + printf 的重定向

  • 基本框架
    • 1. 配置时钟:配置GPIO时钟、窗口时钟、引脚复用时钟
    • 2. 配置GPIO结构体
      • 在 stm32f10x_gpio.h 头文件中查找相关函数函数
    • 3. 配置串口结构体
      • 在 stm32f10x_usart.h 头文件中查找相关函数
    • 4. 串口的发送
      • STM32 串口通信中 USART_FLAG_TC 与 USART_FLAG_TXE 区别
      • 在 stm32f10x_usart.h 头文件中查找相关函数
    • 基本框架整合代码
      • usart.c
      • usart.h
      • main.c
  • 串口发送字符、字符串
    • 1. 串口发送字符
    • 2. 串口发送字符串
    • 串口发送字符、字符串 代码整合
      • usart.c
      • usart.h
      • main.c
  • printf 的重定向
    • fputc
    • fgetc
    • usart.c
    • usart.h
    • main.c

基本框架

1. 配置时钟:配置GPIO时钟、窗口时钟、引脚复用时钟

//1.配置时钟
		
//1.1配置GPIOA、串口时钟、复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
		

2. 配置GPIO结构体

在 stm32f10x_gpio.h 头文件中查找相关函数函数

//2.配置GPIOA结构体
GPIO_InitTypeDef 	gpioInitStructure;
		
//2.1 A9 TX (发送)
gpioInitStructure.GPIO_Mode		= GPIO_Mode_AF_PP; //复用推挽输出
gpioInitStructure.GPIO_Pin		= GPIO_Pin_9;
gpioInitStructure.GPIO_Speed	= GPIO_Speed_50MHz;
		
GPIO_Init(GPIOA, &gpioInitStructure); //初始化A9
		
//2.2 A10 RX (接收)
gpioInitStructure.GPIO_Mode		= GPIO_Mode_IN_FLOATING; //浮空输入
gpioInitStructure.GPIO_Pin		= GPIO_Pin_10;
		
GPIO_Init(GPIOA, &gpioInitStructure); //初始化A10

3. 配置串口结构体

在 stm32f10x_usart.h 头文件中查找相关函数

//3.配置串口结构体

usartInitStructure.USART_BaudRate				=	115200; //波特率 115200
usartInitStructure.USART_HardwareFlowControl	=	USART_HardwareFlowControl_None; //无硬件数据流控制
usartInitStructure.USART_Mode					=	USART_Mode_Tx | USART_Mode_Rx; //收发模式
usartInitStructure.USART_Parity					=	USART_Parity_No; //无奇偶校验位
usartInitStructure.USART_StopBits				=	USART_StopBits_1; //1位停止位
usartInitStructure.USART_WordLength				=	USART_WordLength_8b; 字长为 8 位数据格式
		
USART_Init(USART1, &usartInitStructure); //初始化串口
USART_Cmd(USART1, ENABLE); //使能串口(比GPIO多了一步)

4. 串口的发送

在这里插入图片描述

STM32 串口通信中 USART_FLAG_TC 与 USART_FLAG_TXE 区别

在这里插入图片描述

在 stm32f10x_usart.h 头文件中查找相关函数

int main()
{
	USART_SendData( USART1, 'O'); //发送 ‘0’
	while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET ); //判断 '0' 是否已被发送出去
	USART_SendData( USART1, 'K'); //发送 ‘1’
	while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET ); //判断 '1' 是否已被发送出去
	delay(1000);
}

基本框架整合代码

usart.c

#include "usart.h"
#include "stm32f10x.h"

void usart_init()
{
		GPIO_InitTypeDef 	gpioInitStructure;
		USART_InitTypeDef	usartInitStructure;
		
		//1.配置时钟
		
		//1.1配置GPIOA、串口时钟、复用时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
		
		//2.配置GPIOA结构体
		
		//2.1 A9 TX
		gpioInitStructure.GPIO_Mode		= GPIO_Mode_AF_PP;
		gpioInitStructure.GPIO_Pin		= GPIO_Pin_9;
		gpioInitStructure.GPIO_Speed	= GPIO_Speed_50MHz;
		
		GPIO_Init(GPIOA, &gpioInitStructure);
		
		//2.2 A10 RX
		gpioInitStructure.GPIO_Mode		= GPIO_Mode_IN_FLOATING;
		gpioInitStructure.GPIO_Pin		= GPIO_Pin_10;
		
		GPIO_Init(GPIOA, &gpioInitStructure);

		//3.配置串口结构体
		usartInitStructure.USART_BaudRate				= 115200;
		usartInitStructure.USART_HardwareFlowControl	= USART_HardwareFlowControl_None;
		usartInitStructure.USART_Mode					= USART_Mode_Tx | USART_Mode_Rx;
		usartInitStructure.USART_Parity					= USART_Parity_No;
		usartInitStructure.USART_StopBits				= USART_StopBits_1;
		usartInitStructure.USART_WordLength				= USART_WordLength_8b;
		
		USART_Init(USART1, &usartInitStructure);
		USART_Cmd(USART1, ENABLE);
		
}

usart.h

#include "stm32f10x.h"

void usart_init(void);

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "shake.h"
#include "relay.h"
#include "exti.h"
#include "usart.h"

void delay(uint16_t time)
{
	uint16_t i=0;
	
	while(time--)
	{
		i=10000;
		while(i--);
	}
}

int main()
{
	USART_SendData( USART1, 'O'); //发送 ‘0’
	while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET ); //判断 '0' 是否已被发送出去
	USART_SendData( USART1, 'K'); //发送 ‘1’
	while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET ); //判断 '1' 是否已被发送出去
	delay(1000);
}


串口发送字符、字符串

1. 串口发送字符

void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{
	USART_SendData( USARTx, Data);
	while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET ); //判断 Data 是否已被发送出去
}

2. 串口发送字符串

void USARTSendStr(USART_TypeDef* USARTx, char* str)
{
	uint16_t i=0;
	
	while( *(str+i) != '\0' )
	{
		/*
		USART_SendData( USARTx, *(str+i));
		while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
		*/
			
		USARTSendByte(USARTx, *(str+i) );
		i++;
	}
	
	while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET ); //判断 str 是否已被(全部!!!)发送出去
}

串口发送字符、字符串 代码整合

usart.c

#include "usart.h"
#include "stm32f10x.h"

void usart_init()
{
		GPIO_InitTypeDef 	gpioInitStructure;
		USART_InitTypeDef	usartInitStructure;
		
		//1.配置时钟
		
		//1.1配置GPIOA、串口时钟、复用时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
		
		//2.配置GPIOA结构体
		
		//2.1 A9 TX
		gpioInitStructure.GPIO_Mode		= GPIO_Mode_AF_PP;
		gpioInitStructure.GPIO_Pin		= GPIO_Pin_9;
		gpioInitStructure.GPIO_Speed	= GPIO_Speed_50MHz;
		
		GPIO_Init(GPIOA, &gpioInitStructure);
		
		//2.2 A10 RX
		gpioInitStructure.GPIO_Mode		= GPIO_Mode_IN_FLOATING;
		gpioInitStructure.GPIO_Pin		= GPIO_Pin_10;
		
		GPIO_Init(GPIOA, &gpioInitStructure);

		//3.配置串口结构体
		usartInitStructure.USART_BaudRate				= 115200;
		usartInitStructure.USART_HardwareFlowControl	= USART_HardwareFlowControl_None;
		usartInitStructure.USART_Mode					= USART_Mode_Tx | USART_Mode_Rx;
		usartInitStructure.USART_Parity					= USART_Parity_No;
		usartInitStructure.USART_StopBits				= USART_StopBits_1;
		usartInitStructure.USART_WordLength				= USART_WordLength_8b;
		
		USART_Init(USART1, &usartInitStructure);
		USART_Cmd(USART1, ENABLE);
		
}

void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data) //一个一个字符发送
{
		USART_SendData( USARTx, Data);
		while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
}

void USARTSendStr(USART_TypeDef* USARTx, char* str) //字符串发送
{
		uint16_t i=0;
		
		while( *(str+i) != '\0' )
		{
				/*
				USART_SendData( USARTx, *(str+i));
				while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
				*/
				
				USARTSendByte( USART1, *(str+i) );
				i++;
		}
		
		while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}

usart.h

#include "stm32f10x.h"

void usart_init(void);

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "shake.h"
#include "relay.h"
#include "exti.h"
#include "usart.h"

void delay(uint16_t time)
{
	uint16_t i=0;
	
	while(time--)
	{
		i=10000;
		while(i--);
	}
}

int  main()
{
		usart_init();
		
//		USARTSendByte(USART1, 'O');
//		USARTSendByte(USART1, 'K');
		USARTSendStr(USART1, "Yinyuer is a pretty girl!");
		
		while(1)
		{
				
		}
}

printf 的重定向

在这里插入图片描述

fputc

int fputc(int ch, FILE* f)
{
	USART_SendData(USART1, (uint8_t) ch);
	while( USART_GetFlagStatus(USART1, USART_TXE) == RESET );
	
	return ch;
}

fgetc

int fgetc(FILE* f)
{
	while( USART_GetFlagStatus(USART1, USART_RXNE) == RESET )
	
	return (int) USART_ReceiveData(USART1);
}

usart.c

#include "usart.h"
#include "stm32f10x.h"

void usart_init()
{
		GPIO_InitTypeDef 	gpioInitStructure;
		USART_InitTypeDef	usartInitStructure;
		
		//1.配置时钟
		
		//1.1配置GPIOA、串口时钟、复用时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
		
		//2.配置GPIOA结构体
		
		//2.1 A9 TX
		gpioInitStructure.GPIO_Mode		= GPIO_Mode_AF_PP;
		gpioInitStructure.GPIO_Pin		= GPIO_Pin_9;
		gpioInitStructure.GPIO_Speed	= GPIO_Speed_50MHz;
		
		GPIO_Init(GPIOA, &gpioInitStructure);
		
		//2.2 A10 RX
		gpioInitStructure.GPIO_Mode		= GPIO_Mode_IN_FLOATING;
		gpioInitStructure.GPIO_Pin		= GPIO_Pin_10;
		
		GPIO_Init(GPIOA, &gpioInitStructure);

		//3.配置串口结构体
		usartInitStructure.USART_BaudRate				= 115200;
		usartInitStructure.USART_HardwareFlowControl	= USART_HardwareFlowControl_None;
		usartInitStructure.USART_Mode					= USART_Mode_Tx | USART_Mode_Rx;
		usartInitStructure.USART_Parity					= USART_Parity_No;
		usartInitStructure.USART_StopBits				= USART_StopBits_1;
		usartInitStructure.USART_WordLength				= USART_WordLength_8b;
		
		USART_Init(USART1, &usartInitStructure);
		USART_Cmd(USART1, ENABLE);
		
}

void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{
		USART_SendData( USARTx, Data);
		while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
}

void USARTSendStr(USART_TypeDef* USARTx, char* str)
{
		uint16_t i=0;
		
		while( *(str+i) != '\0' )
		{
				/*
				USART_SendData( USARTx, *(str+i));
				while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
				*/
				
				USARTSendByte( USART1, *(str+i) );
				i++;
		}
		
		while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}

int fputc( int ch, FILE* f )
{
		USART_SendData( USART1, (uint8_t) ch );
		while( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
	
		return ch;
}

int fgetc(FILE* f)
{
//		USART_ReceiveData(USART1);
		while( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET );
		
		return (int) USART_ReceiveData(USART1);
}

usart.h

#include "stm32f10x.h"
#include <stdio.h> //记得包含库函数

void usart_init(void);
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data);
void USARTSendStr(USART_TypeDef* USARTx, char* str);

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "shake.h"
#include "relay.h"
#include "exti.h"
#include "usart.h"

void delay(uint16_t time)
{
	uint16_t i=0;
	
	while(time--)
	{
		i=10000;
		while(i--);
	}
}

int  main()
{
		usart_init();
		
//		USARTSendByte(USART1, 'O');
//		USARTSendByte(USART1, 'K');
		printf("Yinyuer is a pretty girl!");
		
		while(1)
		{
				
		}
}

实验结果

在这里插入图片描述

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

5. STM32——串口发送字符、字符串 + printf 的重定向 的相关文章

  • 解决Ubuntu没有wifi图标的问题

    在配置过程中输入命令后就没有wifi图标了 xff0c 不能上网了 xff08 可能是删除了网卡驱动 xff09 后续使用命令查询网卡 hardware of Internet 状态 lshw C network 查看网卡状态发现 无线网被
  • 2022-11-15日Linux安装csitools问题及解决办法

    问题一 xff1a 执行完这三步后电脑没有wifi图标了 xff0c 不能联网了 sudo modprobe r iwldvm iwlwifi mac80211 sudo modprobe r iwlwifi mac80211 cfg802
  • win10扩展c盘容量(2022-11-17)亲测可用

    个人经验 xff1a 想要通过右键我的电脑 管理 磁盘管理 xff0c 将紧挨着C盘的E盘压缩一100G扩展给C盘 这种做法试了不行 xff0c 即使让可用空间挨着C盘 xff0c C盘的扩展卷选项也是灰色的 解决 xff1a 下载傲梅分区
  • S-V信道模型理解

    Saleh和Valenzuela提出的S V信道模型是基于大量室内信道测试构建的 xff0c 更加符合室内真实路径的传播规律 xff0c 可以用来进行信道建模与仿真 下图显示了具有多簇射线的S V信道模型 xff0c 该模型中多径以簇形式达
  • wifi收发数据包分析

    根据802 11n协议WIFI每次发送64字节数据 Intel5300网卡接收的数据包大小为213字节或者393字节或者573字节 说明接受的数据包包含多个发送的包 猜想每个数据包是由多个主体重复加上固定的标志位组成 x 61 1 2 3
  • 清华大学 | 摄像头-激光雷达的时空在线集成标定方法

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 后台回复 多模态综述 获取论文 xff01 后台回复 ECCV2022 获取ECCV2022所有自动驾驶方向论文 xff01 后台回复 领域综述
  • 操作系统-硬件结构(小林coding笔记)

    控制和管理整个计算机系统的硬件和软件资源 xff1b 提供给用户和其他软件方便的接口和环境 xff1b 主要包括进程管理 内存管理 文件系统 设备管理和网络系统 图灵机的工作方式 基本思想就是用机器模拟人类用纸笔进行数学运算的过程 主要包含
  • 操作系统-三、操作系统结构(小林coding笔记)

    3 1Linux内核和Windows内核 Windows和Linux是常见的两款操作系统 xff0c 操作系统最核心的东西就是内核 内核 内核作为应用连接硬件设备的桥梁 内核的四个基本功能 xff1a 进程调度 内存管理 硬件通信 系统调用
  • 操作系统-四、内存管理(小林coding笔记)

    虚拟内存 防止内存运行多个程序时崩溃 把进程所使用的地址隔离开 xff0c 让操作系统为每个进程分配一套独立的虚拟地址 操作系统会提供一种机制 xff0c 将不同进程的虚拟地址和不同内存的物理地址映射起来 内存分段 程序时由若干逻辑分段组成
  • libcurl库

    目录 1 libcurl简介2 libcurl的使用3 libcurl的安装Libcurl库等第三方库的通用编译方法 3 调用libcurl访问百度主页4 libcurl 相关API解读1 curl global init 2 curl g
  • ERROR: cannot launch node of type: rplidar_ros

    1首先使用rospack find 命令查找该功能包 xff0c 如果输出功能包路径则该功能包存在 xff0c 如果提示没有则说明我们需要下载一个rplidar ros rospack find rplidar ros 2使用sudo ap
  • 【jetson nano】jetson nano环境配置+yolov5部署+tensorRT加速模型

    目录 jetson nano环境配置 43 yolov5部署 43 tensorRT加速模型致谢主机和jetson nano环境jetson系统开机烧录 系统设置 换源python环境配置conda环境yolov5环境matplotlib和
  • MDK仿真出现NOT IN SCOPE(不在范围内)

    这两天刚拿到一套GD32F1系列的开发板 xff0c 想着测试一下 xff0c 看和STM32的有啥不同 xff0c 自己仿真时候 xff0c 想要在窗口观察一下数值 xff0c 结果总是提示NOT IN SCOPE没办法 xff0c 就查
  • Keil调试局部变量显示“not in scope“的问题解决

    Keil调试局部变量显示 34 not in scope 34 的问题解决 参考文章 xff1a xff08 1 xff09 Keil调试局部变量显示 34 not in scope 34 的问题解决 xff08 2 xff09 https
  • MPU6050可以读取ID值,温度值和原始数据值为零问题解决

    MPU6050可以读取ID值 xff0c 温度值和原始数据值为零问题解决 参考文章 xff1a xff08 1 xff09 MPU6050可以读取ID值 xff0c 温度值和原始数据值为零问题解决 xff08 2 xff09 https w
  • 英伟达Jetson Xavier NX部署YOLO5

    1 查看JetPack版本 新到手的NX首先需要确定一下JetPack的版本 xff1a sudo apt span class token operator span cache show nvidia span class token
  • 史上最全 | BEV感知算法综述(基于图像/Lidar/多模态数据的3D检测与分割任务)...

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心技术交流群 后台回复 BEV综述 获取论文 xff01 后台回复 ECCV2022 获取ECCV2022所有自动驾驶方向论文
  • matlab-字符串的处理操作

    建立一个字符串向量 xff0c 然后对该向量做如下处理 xff1a 取第1 5个字符组成的子字符串 将字符串倒过来重新排列 将字符串中的小写字母变成相应的大写字母 xff0c 其余字符不变 统计字符串中小写字母的个数 代码 ch 61 39
  • curl发送带有Authorization的POST请求

    一 参数说明 格式 xff1a curl H 请求头 d 请求体 X POST 接口地址 参数内容格式 H header 请求头 Content Type application json d请求内容 remote host 10 163
  • AStar寻路算法 (C#)

    一 介绍 A星算法其实并不是最短路径算法 xff0c 它找到的路径并不是最短的 xff0c 它的目标首先是能以最快的速度找到通往目的地的路 B星实际上是A星的优化 但是B星的缺点是不能向后查找 所以会有问题 还有一种D星的可以用来找最短路径

随机推荐

  • 深度相机介绍(TOF、RGB双目、结构光参数对比)

    一 深度相机的介绍 随着计算机视觉与人工智能技术的飞速发展 xff0c 采用深度相机进行场景三维重建 目标检测 环境感知等应用越来越广泛 xff0c 与传统的2D相机不同 xff0c 深度相机可以通过拍摄空间来获得景深信息 xff0c 从而
  • 网络编程——UDP

    目录 UDP的服务器端 UDP的echo客户端代码 UDP的echo服务器端代码 UDP的服务器端 先运行服务器端 xff0c 再运行客户端 服务端 xff1a 开发者 xff1a Virtuous 开发版本 xff1a 1 0 开发时间
  • HTTP 完全解析

    Http 详解 HTTP 的定义 HTTP即是 xff1a Hypertext Transfer Protocol xff0c 超文本传输协议 xff0c 种 络传输协议 xff0c 位于 TCP IP 协议族的最顶层 应 层 URL 说到
  • STM32 自定义串口协议

    STM32 自定义串口协议 1 串行通信1 1 原理与优缺点1 2 分类1 2 1 按通信方向1 2 2 按通信方式 1 3 异步串行引脚连接1 3 1 串口外设之间1 3 2 ARM与PC之间 1 4 字符帧格式1 5 串口通信过程1 6
  • 无人机——电机篇(一)

    文章目录 1 电机的定义 2 电机的分类 3 电机的参数 4 电机效率 5 电机的选择 1 电机的定义 电机俗称 马达 是无人机的动力来源 无人机通过改变电机的转速来改变无人机的飞行状态 即改变每个电机的速度 使得无人机能够盘旋空中 上升或
  • HTTP请求/响应报文结构

    HTTP请求报文 一个HTTP请求报文由四个部分组成 xff1a 请求行 请求头部 空行 请求数据 1 请求行 请求行由 请求方法字段 URL字段 和 HTTP协议版本字段 3个字段组成 xff0c 它们用空格分隔 比如 GET data
  • AStar寻路算法

    概述 AStar算法是一种图形搜索算法 xff0c 常用于寻路 他是以广度优先搜索为基础 xff0c 集Dijkstra算法和最佳优先 best fit 于一身的一种算法 示例1 4向 示例2 8向 思路 递归的通过估值函数找到最佳路径 x
  • ECCV2022 | 多模态融合检测新范式!基于概率集成实现多模态目标检测

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心技术交流群 后台回复 ECCV2022 获取ECCV2022所有自动驾驶方向论文 xff01 说在前面的话 标题 xff1a
  • 什么是地址映射

    ARM体系结构 地址映射 一 什么是地址映射 1 ARM Cortex A8架构 xff0c 32位CPU xff0c CPU设计时就有32根地址线和32根数据线 2 32根地址线决定了CPU的地址空间为4G xff0c 那么这4G空间如何
  • 寄存器和GPIO

    一 什么是GPIO 1 GPIO的英文全称General Purpose Input Output Ports 中文意思是通用I O端口 2 GPIO就是芯片的引脚 xff08 芯片上的引脚有些不是GPIO xff0c 只有一部分是 xff
  • 什么是I2C通信

    ARM体系 I2C通信 一 什么是I2C 1 I2C总线是由Philips公司开发的一种简单 双向二线制同步串行总线 它只需要两根线即可在连接于总线上的设备之间传送信息 2 主设备用于启动总线传送数据 xff0c 并产生时钟以开放传送的设备
  • 什么是AD转换

    ARM体系 ADC 一 什么是ADC 1 ADC xff1a analog digital converter xff0c AD转换 xff0c 模数转换 xff08 也就是模拟转数字 xff09 2 模拟信号只有通过A D转化为数字信号后
  • 什么是SPI通信

    ARM体系 SPI通信 一 什么是SPI通信 1 SPI是串行外设接口 Serial Peripheral Interface xff0c 可以理解为一种通信协议 xff0c 也就是用来传输数据的 2 SPI 是由摩托罗拉 Motorola
  • petalinux uboot源码在哪的问题

    petalinux uboot源码在哪的问题 提出问题解决问题注意 xff1a 要知道自己的版本 1 uboot2 kernel 提出问题 petalinux 源码目录存放在哪里的问题 xff0c 也就是petalinux工程的uboot和
  • petalinux uboot源码怎么打补丁

    petalinux的源码 petalinux工程对于我来说 xff0c 就是有一点不能直接起修改源码 xff0c 你需要间接的修改源码的内容 xff1f 这个修改你还需要遵从petalinux的规章流程 当你不知道的时候你会感到无从下手 x
  • 嵌入式Ubuntu根文件系统移植带桌面

    1 为什么要移植Ubuntu根文件系统 相信到达这一步的人 xff0c 都已经对根文件系统有了个充分的认识 xff0c 已经自己从无到有创建过根文件系统了 xff0c 玩过busybox的了 xff0c 也可能移植过别的嵌入式文件系统了 但
  • Keil5在已有项目中导入文件夹(文件或模块),后编译,头文件找不到问题

    Keil5在已有项目中导入文件夹 文件或模块 后编译 头文件找不到问题 如果你是以及成功导入文件后 但是编译时发现头文件找不到 可以直接从第二部分看起 第一部分导入文件 第二部分导入头文件 导入头文件时注意 注意 注意路径问题要和导入文件时
  • stm32之串口使用和串口中断

    1 定义 串口通讯 Serial Communication 是一种设备间非常常用的串行通讯方式 xff0c 因为它简单便捷 xff0c 因此大部分电子设备都支持该通讯方式 xff0c 其通讯协议可分层为协议层和物理层 物理层规定通信协议中
  • 万字长文解析CV中的注意力机制(通道/空间/时域/分支注意力)

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心技术交流群 后台回复 transformer综述 获取2022最新ViT综述论文 xff01 注意力机制是机器学习中嵌入的一
  • 5. STM32——串口发送字符、字符串 + printf 的重定向

    STM32 串口发送字符 字符串 43 printf 的重定向 基本框架1 配置时钟 xff1a 配置GPIO时钟 窗口时钟 引脚复用时钟2 配置GPIO结构体在 stm32f10x gpio h 头文件中查找相关函数函数 3 配置串口结构