STM32串口结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯、接收不定长数据、DMA

2023-11-03

参考:串口的结构体 重定向printf串口发送stm32等博文
作者:点灯小哥
发布时间: 2021-03-06 21:46:33
网址:https://blog.csdn.net/weixin_46016743/article/details/114458698

串口相关知识

定义

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层为协议层和物理层。

  • 物理层规定通信协议中具有机械、电子功能的特性,从而确保原始数据在物理媒体的传播
  • 协议层主要规定通讯逻辑,统一双方的数据打包、解包标准。通俗的讲物理层规定我们用嘴巴还是肢体交流,协议层规定我们用中文还是英文交流。

通信概念

1.通讯结构

串口通讯的物理层的主要标准是RS-232标准,其规定了信号的用途、通讯接口及信号的电平标准,其通讯结构如下:

在这里插入图片描述
在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平标准传输的,而且TTL电平需要经过电平转换芯片才能转化为RS-232电平,RS-232电平转TTL电平也是如此。

2.电平标准

根据使用的电平标准不同,串口通讯可分为 RS-232标准及TTL标准,具体标准如下:
在这里插入图片描述

在电子电路中常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MAX232芯片对TTL电平及RS-232电平进行相互转换。

3.同步异步传输方式(USART与UART)

  • A同步:
    传输以数据块为核心,在一个数据块内,字符间无间隔,接受发送同步,有sclk时钟,双方sclk(串行时钟)连在一起,提供同步
    特点:效率高,无间隔
  • B异步:
    字符为传输单位,每发一个字符,都得发送一个起始位,(告诉对方我开始发了)结束发送停止位。(我发完了)
    特点:效率低,间隔任意

在这里插入图片描述

在这里插入图片描述

  • USART(通用同步异步收发器)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。

  • UART,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。

USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。

4.串口数据包组成

在这里插入图片描述
在这里插入图片描述

起始位、数据位(8位或者9位)、奇偶校验位(第9位)、起始停止位(1,15,2位)、波特率设置

校验方式 :
奇偶校验需要一位校验位,即使用串口通信的方式2或方式3(8位数据位+1位校验位)。
奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。
即:如果传输字节中1的个数是偶数(不包含校验位),则校验位为“1”,奇数相反。

5.速率类型

比特(bit):每秒传输的二进制位
波特(byte):每秒传输的码源个数(串口常用),一个二进制位表示一个码源(0V——0;3.3V——1)

注:这俩本质上其实是一样的

6.通信类型(串行、并行)

  • 串行:一个一个传输 如:fsmc
  • 特点:占用资源多,速度慢,看干扰强
  • 并行:多个一起传输 如:spi usart
  • 特点:占用资源少,速度快。抗干扰能力弱,距离近

7.通信方式(单工、半双工、全双工)

在这里插入图片描述

  • 单工:数据传输只支持数据在一个方向上传输;如:打印机

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

  • 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。如:spi,usart

8.概念补充

  • 1.数据包
    串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备得RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。

  • 2.波特率
    由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。

  • 3.起始和停止信号
    数据包的首尾分别是起始位和停止位,数据包的起始信号由一个逻辑0的数据位表示,停止位信号可由0.5、1、1.5、2个逻辑1的数据位表示,双方需约定一致。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。

  • 4.有效数据
    有效数据规定了主题数据的长度,一般为8或9位,其在STM32中也是通过串口初始化结构体来实现的。

  • 5.数据校验
    在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及无(noparity)。这些也都可以在串口初始化结构体中实现的。
    在这里插入图片描述

串口的引脚

在这里插入图片描述

下面是最小板原理图,UART4和UART5并没有引出来。在这里插入图片描述

结构体

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

库函数(状态标志位)

在这里插入图片描述

在这里插入图片描述

串口标志位,用于说明串口发送接收状态,是否都发/收完了
在这里插入图片描述
在这里插入图片描述

串口的发送配置

在这里插入图片描述

串口发送字符(STM32发送到上位机)

新建一个usart文件夹,里面新建usart.c和usart.h两个文件,将usart.c添加到工程里面(user一栏下),编译一下usart.h会自动添加进工程。
在这里插入图片描述
usart.h

#include "stm32f10x.h" 
void Usart_Init(void);

usart.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"
 
void Usart_Init(void)
{
	//2. 配置GPIO的结构体
	GPIO_InitTypeDef GpioInitStructure; //初始化GPIO结构体命名

	//3. 配置USART的结构体(另外一个结构体是带时钟的串口)
	USART_InitTypeDef UsartInitStructure;//初始化USART结构体命名
	
	//1. 时钟使能: GPIOA的时钟,引脚复用(成串口)的时钟,串口的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启APB2总线复用时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
 
	//2.1 配置PA9 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 配置PA10 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_Rx| USART_Mode_Tx;//模式(输入输出都选择)
	UsartInitStructure.USART_Parity = USART_Parity_No;			//校验位(不用)
	UsartInitStructure.USART_StopBits =	USART_StopBits_1;		//停止位(1位)
	UsartInitStructure.USART_WordLength =	USART_WordLength_8b;//有效字节长度(8位)
	
	         //串口1
	USART_Init(USART1, &UsartInitStructure);
	USART_Cmd(USART1, ENABLE);//打开串口 比配置GPIO多这一步	
}

main.c

#include "stm32f10x.h" 
#include "usart.h"//头文件是单独创建的文件 main函数找不到 要去手工添加路径(点击魔术棒...)

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

int main(void)
{
		Usart_Init(); 
		while(1)
		{						
			USART_SendData(USART1, 'O'); //发送一个字符   
			 						//数据寄存器空标志位   RESET状态说明上面字符发送成功了!
			while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //USART_GetFlagStatus是判断标志位 
			USART_SendData(USART1, 'K');                     
			while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);   
			USART_SendData(USART1, '\n');
			while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //右键USART_GetFlagStatus去goto找到RESET
						
			delay(1000); 
		}
}

在这里插入图片描述

串口发送字符串

上一节串口只能一个一个发送字符,可以自己写一个串口发送字符串函数,然后main函数调用即可。

usart.c

//发送字符函数  (自己定义的 注意形参要和固件库里面串口发送字符的形参要一样) 
//调用这个函数不用每次都去判断标志位
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)//main函数调用这个函数的方法:USARTSendByte(USART1, 'A');
{
		USART_SendData( USARTx,  Data);//固件库本身的串口发送函数
		//判断数据寄存器是否为空    						字符标志位
		while( USART_GetFlagStatus( USARTx,  USART_FLAG_TXE) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TXE 去usart.h  FLAG找
}



//发送字符串函数(自己定义的)
void USARTSendString( USART_TypeDef* USARTx, char *str)
{
		uint16_t i = 0;
		do{
			USARTSendByte(USART1,*(str+i));
			i++;
		}while(*(str+i) != '\0');//字符串结束标识
		                                     			//字符串标志位 上面是字符标志位
		while( USART_GetFlagStatus( USARTx,  USART_FLAG_TC) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TC(这是判断字符串) 去usart.h  FLAG找

}      
      
      //main函数里这样调用
      USARTSendByte( USART1, 'O');
      USARTSendByte( USART1, 'K');
      USARTSendString( USART1, "你好STM32");      

重定向printf串口发送

在C语言标准库中,printf()拥有十分强大的输出能力,可以输出各种类型的数据,整型、浮点型、8进制、16进制、换行符,缩进符等等。

printf()是把数据输出到屏幕,但是ARM芯片中没有屏幕,我们设想将printf()打印到串口,这样我们就可以通过printf()和串口实时的观察ARM芯片内部的工作情况,运行结果。

先来认识一个关键字:__weak

weak的字面意思就是“微弱”的意思,其主要作用就是可以重新定义重名函数或变量而编译时不报错。笔者最开始注意到这个关键字是在使用 STM32 HAL 库的时候注意到的,比如这张图片所示:
在这里插入图片描述

在上图我们可以看到左边的 HAL_MspInit 函数前面用 __weak 进行修饰,而图片右边又定义了 HAL_MspInit函数,这时整个工程就定义了两个 HAL_MspInit 函数,声明可以有多个,但是定义只能存在一个,因为 __weak的存在,所以不会报错,并且真正起作用的函数是没有用 __weak 修饰的函数。

printf函数其实就是调用了fputc,我们来重写fputc达到重定向printf的目的

在这里插入图片描述

实现过程:在usart.c 的后面增加两个函数

usart.c

int fputc(int ch, FILE *f)//(串口发送)重写fputc,供printf调用
{                            
		USARTSendByte( USART1,  (uint8_t)ch);
		while( USART_GetFlagStatus( USART1,  USART_FLAG_TXE) == RESET);
		return (ch);
}

int fgetc(FILE *f)//(串口接收)重写fgetc
{		                                     //标志位选择接收
		while( USART_GetFlagStatus( USART1,  USART_FLAG_RXNE) == RESET);
		
		return (int) USART_ReceiveData(USART1); 
}

usart.h

#include "stm32f10x.h" 
#include <stdio.h>//标准输入输出printf

void Usart_Init(void);
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data);
void USARTSendString( USART_TypeDef* USARTx, char *str);
int fputc(int ch, FILE *f);

注意:在使用printf等C语言标准库函数要包含头文件stdio.h,并且勾选Target中的use MicroLIB使用标准库。

在这里插入图片描述

main.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"
 
void delay(uint16_t time)
{
		uint16_t i = 0;
		while(time--)
		{
			i=12000;
			while(i--);
		}
}
 
int main(void)
{ 
		Usart_Init(); 
		printf("你好STM32");//printf调用重写的fputc  这样单片机就可以通过串口发送字符串"你好STM32"		
		putchar('X');      //putchar调用重写的fputc  这样单片机就可以通过串口发送字符'X'   
	
		while(1)
		{
									
		}
}

串口的中断接收(控制灯)

参考:串口 stm32 实现中断接收 打开板子上的led灯
作者:点灯小哥
发布时间: 2021-03-07 11:55:35
网址:https://blog.csdn.net/weixin_46016743/article/details/114481125

注:板子上的LED灯看电路图连接的是PC13引脚,前面博文led.c文件里配置好了。

方法:在usart.c上增加配置NVIC中断控制器,中断源为串口1

串口中断不属于EXTI外部中断,所以不用配置EXTI结构体

	NVIC_InitTypeDef Nvic_init;	 //misc.h
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //配置NVIC中断组
	
    //3.配置NVIC中断控制器  中断源(通道)选择串口1
	Nvic_init.NVIC_IRQChannel = USART1_IRQn; 
	Nvic_init.NVIC_IRQChannelCmd = ENABLE; //使能  找到FunctionalState字眼 右键goto
	Nvic_init.NVIC_IRQChannelPreemptionPriority = 1; //因为只配置了一个中断  不考虑优先级 所以只有1个
	Nvic_init.NVIC_IRQChannelSubPriority = 1;//抢占优先级与子优先级
	
	NVIC_Init(&NvicInitStructure);

usart.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"
//#include "stdio.h"
 
void Usart_Init(void)
{
	//2. 配置GPIO的结构体
	GPIO_InitTypeDef GpioInitStructure; //初始化GPIO结构体命名
	USART_InitTypeDef UsartInitStructure;//初始化USART结构体命名	
	NVIC_InitTypeDef	NvicInitStructure; //加入NVIC
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC中断分组  目前一个中断随便配置就好了 
	
	//1. 配置时钟:GPIO的时钟,引脚复用的时钟,串口的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
 	
	//2.1 配置PA9 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 配置PA10 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_Rx| USART_Mode_Tx;					//模式
	UsartInitStructure.USART_Parity = USART_Parity_No;						//校验位
	UsartInitStructure.USART_StopBits =	USART_StopBits_1;					//停止位
	UsartInitStructure.USART_WordLength =	USART_WordLength_8b;				//字节长度
	USART_Init(USART1, &UsartInitStructure);							
	//串口中断配置函数		//接收数据寄存器非空标志位 作为串口发生中断的标志
	USART_ITConfig( USART1,  USART_IT_RXNE, ENABLE ); 
	USART_Cmd(USART1, ENABLE);//打开串口 比配置GPIO多这一步
 
 	//配置NVIC中断控制器    中断源(通道)选择串口1
	NvicInitStructure.NVIC_IRQChannel = USART1_IRQn;
	NvicInitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
	NvicInitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级
	NvicInitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NvicInitStructure);	
}

//发送字符
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{
		USART_SendData( USARTx,  Data);
		while( USART_GetFlagStatus( USARTx,  USART_FLAG_TXE) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TXE 去usart.h  FLAG找
}
//发送字符串
void USARTSendString( USART_TypeDef* USARTx, char *str)
{
		uint16_t i = 0;
		do{
			USARTSendByte(USART1,*(str+i));
			i++;
		}while(*(str+i) != '\0');
		
		while( USART_GetFlagStatus( USARTx,  USART_FLAG_TC) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TC(这是判断字符串) 去usart.h  FLAG找 
}

main.c – USART1_IRQHandler(void)

#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "led.h"
#include "exti.h"
 
void delay(uint16_t time)
{
		uint16_t i = 0;
		while(time--)
		{
			i=12000;
			while(i--);
		}
}
 
int main(void)
{ 
		Usart_Init();
		LED_Init();
	
		GPIO_SetBits( GPIOC,  GPIO_Pin_13);//初始化C13电平为高电平 灯不亮
 
		while(1)
		{
									
		}
}

//4. 中断服务函数(在启动头文件里 有weak标志 属于重定向函数)
void USART1_IRQHandler(void)
{
		char temp;
		    //获得串口中断标志位         接收数据寄存器非空标志位
		if( USART_GetITStatus( USART1,  USART_IT_RXNE) != RESET) //发生了中断 开始接收数据
		{			 
			temp = USART_ReceiveData( USART1);
			
			if(temp == 'O')
			{
				 GPIO_ResetBits( GPIOC,  GPIO_Pin_13);//串口助手发送过来字符'O' 开灯
				 USARTSendString(  USART1, "LED IS OK");//调用自己写的串口发送字符串函数			
			}
			if(temp == 'C')
			{
				 GPIO_SetBits( GPIOC,  GPIO_Pin_13);//关灯
				 USARTSendString(  USART1, "LED IS DOWN"); 
			}		
		}
}

在这里插入图片描述

串口接收不定长数据

STM32串口USART1接收字符串

串口接收不定长数据的几种方式

STM32串口接收一帧数据方法(处理一帧数据中所需内容)

STM32单片机串口空闲中断接收不定长数据

STM32CubeMX系列04——串口(查询、中断、DMA、不定长接收、重定向)

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

STM32串口结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯、接收不定长数据、DMA 的相关文章

  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • Java长存!12个Java长久占居主要地位的原因

    我们很容易就会遗忘那些曾经在猿群中大热而又被各种新技术掩盖直至堙灭的技术的价值 就拿COBOL这个老猿们当年所用的神器来说 就跟条死鱼一样被现代猿基本这么形容 没价值 腥臭 过时了 对你没好处 Java 作为现代猿的中坚力量在这点上可能会成
  • thymeleaf 基本语法

    在学习 springboot 中学习到了模板引擎 thymeleaf 总结一下基本语法 1 集成thymeleaf 模板 Thymeleaf 是一个用于 web 和独立环境的现代服务器端 Java 模板引擎 1 1 引入依赖
  • 有Cmake的工程交叉编译到链接时报错找不到.so动态库文件

    1 打开CmakeLists txt 找到这个函数add executable ZegoExpressExample SRC LIST 2 在其后面添加链接库的函数 target link libraries ZegoExpressExam
  • 学习笔记-二叉树遍历、查找、删除

    二叉树 树结构出现的原因 二叉树示意图 常用用语 叶子节点 没有子节点的节点 节点的权 节点值 路径 从根节点找到该节点的一条路 树的高度 也就是最大层数 二叉树概念 每个节点最多只能有两个子节点称为二叉树 二叉树的节点分为左子节点和右子节
  • 网格的关键技术问题

    网格的核心观念是一句老话 即 网络就是计算机 这个网络可以大到整个互联网 小到一个家庭网 几年前 当一些国外公司和媒体大炒特炒 网络就是计算机 这类缺乏内容的虚概念的时候 科研人员却在踏踏实实地研究网格的关键技术问题 如果整个互联网就是一台
  • 记录腾讯云服务器解决登录报:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 问题

    起因 我手上有两个腾讯云账号 每个账号下都挂了一台云服务器 之前都是可以通过Mac的 Terminal终端ssh登录 今天发现其中一台报如下错误 首先说下解决方案 看报错信息中有这样一句 这里每个人的hostname不一样需要注意 Add
  • 网安面试题

    导航小助手 如何识别CDN 如何判断靶标站点是windows linux 常见端口 同源策略 TCP和UDP区别 TCP协议的长连接和短连接 SYN FLOOD攻击和CC攻击 Mysql的网站注入 5 0以上和5 0以下的区别 sql注入读
  • 哈希算法(hash)加密解密

    一 哈希算法 hash 加密解密介绍 哈希 英文叫做 hash 哈希函数 hash function 可以把 任意长度的数据 字节串 计算出一个为固定长度的结果数据 我们习惯把 要计算 的数据称之为 源数据 计算后的结果数据称之为 哈希值
  • Redis的geospatial(地理位置)类型的用法

    Redis的geospatial 地理位置 类型的用法 说明 像微信中朋友的定位 附近的人 打车距离等 可以使用Geo在3 2版本之后推出 可以推算地理位置的信息 两地之间的距离 周围的人 底层是Zset 命令同样适用 常用命令 添加 ge
  • 用visio制作机柜服务器,ibm visio 服务器机柜图标

    实例简介 ibm visio 服务器机柜图标 ibm全系列产品visio机柜图标 画机柜平面图的选择 实例截图 核心代码 af108d07 08fb 4638 bf08 372416c35cd2 IBM IBM 1 vss IBM 2 vs
  • 华为手机日历倒计时_华为手机日历怎么设置生日和纪念日提醒?敬业签支持多方式提醒...

    我们在日常生活中除了每天普通的日子外 还有一些对于我们个人来说比较特殊的 有意义的日子 例如亲朋好友的生日 恋爱纪念日 结婚纪念日 以及每月初一十五去上香等 我们将要在一些固定的日期去做指定的事情 如果到时间遗忘做某事 将会造成或大或小的影
  • PID算法控制小车转向

    1 平衡小车转向控制调试 角加速度传感器线加速度计 直立静止时 x和y轴输出为0 z轴为g 存在一定角度时 g会在x和y轴存在分量 Angle Y表示角度 弧度制 Accel X表示重力加速度在x轴的分量 1 平衡小车转向环使用P 比例控制
  • C++:内联函数的优缺点

    内联函数 首先我们阐述一下函数 先从汇编语言的角度看函数的调用 其实就是call和ret的搭配实现了一个函数调用 用下面代码来解释 assume cs code code segment s nop ret main call s mov
  • Android中多USB摄像头解决方案——UVCCamera

    先贴上采用的开源库链接 https github com saki4510t UVCCamera https github com saki4510t OpenCVwithUVC 给USBCamera添加了OpenCV 业余时间捣鼓了下An
  • 支付宝自定义tabbar和小红点及解决bug

    须知 支付宝自定义tabbar 以 我的 界面为例 我有5个tabbar 所以 我的 界面就为第4个 有数字4 的地方换为你对应的tabbar序号 首次运行时 小红点allRedDot会出错 建议将有关allRedDot的地方都先注释 根据
  • 认识NR(四):全网最全最详细5G TypeII 和 Enhanced TypeII码本讲解

    声明 以下内容节选自本人组会ppt 仅供分享 禁止转载 一
  • 使用matlab内存不足,Matlab内存不足问题(Out of memory)

    今天遇到过这个错误 Error using gt horzcat Out of memory Type HELP MEMORY for your options 做算法仿真时 矩阵太大 超出内存了 当信号矩阵缩到可以满足内存时 仿真也没意义
  • discuz知识总结

    Discuz 系统常用函数及变量 常用函数 showmessage 函数 该函数就是我们最常见的页面提示跳转 比如登陆 退出 个人信息修改提交等等 效果演示 函数原型 showmessage message url forward extr
  • VUE搭建项目,配置本地IP地址其他人可访问项目

    1 首先找到config文件夹目录下的 index js文件 Various Dev Server settings host localhost 将localhost进行替换成 0 0 0 0 host 0 0 0 0 can be ov
  • STM32串口结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯、接收不定长数据、DMA

    参考 串口的结构体 重定向printf串口发送stm32等博文 作者 点灯小哥 发布时间 2021 03 06 21 46 33 网址 https blog csdn net weixin 46016743 article details