使用STM32测量脉宽可变的PWM波的脉冲宽度

2023-11-01

最近受疫情影响导致我莫得办法出去玩,打游戏一不小心又给打通关了就只能找点东西玩玩了,所以就有了下面这篇文章。。。。。。搞这个东西的时候遇见一些好玩的问题,我写在第6部分,希望能帮到看到这篇小文章的同志们

1.硬件平台:stm32f103zet6,正点原子的精英板
2.使用到的硬件:定时器3,定时器5,串口1,按键
3.描述:使用定时器3产生一个pwm波,占空比可通过串口调试助手调整。把pwm波通过IO和杜邦线输入到定时器5的输入捕获通道以测量pwm波的高电平持续时间,单位为us
4.主要代码

(1).main.c

//1.main.c
#include "stm32f10x.h"
#include "timer.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	uart_init(115200);
	timer3_ch2_pwm_out(999,7199);//定时器2时钟10khz,溢出时间为100ms,pwm波周期为100ms
	TIM_SetCompare2(TIM3,499);//占空比50%,高电平时间为50ms
	timer5_ch1_capture(0XFFFF,71);//定时器3时钟1Mhz,记一个数为1us,溢出时间为65536us
	while(1)
	{
		if(USART_RX_STA&0x8000) 
		{
			USART_RX_STA=0;//请注意这里,当字符串接收完成后(即USART_RX_STA&0x8000=1,在system下的usart.c内有相关代码)请在接收中断函数或main内将USART_RX_STA置零,否则将无法完成下次接收
		}
		//一般情况下在这里都会写个delay_ms(10),但是这里延时之后会导致上面的if来不及执行,就会使得无法完成下次的串口接收
	}
}

(2).timer.c

#include "timer.h"
#include "sys.h"
void timer3_ch2_pwm_out(u16 arr,u16 psc)
{
	GPIO_InitTypeDef GPIO_InitType;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitType;
	TIM_OCInitTypeDef TIM_OCInitType;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);//部分重映射对应PB5,完全重映射对应PC7,不映射对应PA7,但是PA7并不能生成PWM波,其余两个都可以
	GPIO_InitType.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitType.GPIO_Pin=GPIO_Pin_7;
	GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitType);
	
	TIM_TimeBaseInitType.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitType.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitType.TIM_Period=arr;
	TIM_TimeBaseInitType.TIM_Prescaler=psc;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitType);
	
	TIM_OCInitType.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitType.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitType.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OC2Init(TIM3,&TIM_OCInitType);
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
	TIM_ARRPreloadConfig(TIM3,ENABLE);//使占空比的调整在本周期立即生效
	
	TIM_Cmd(TIM3,ENABLE);

}
	
	
	
	
void timer5_ch1_capture(u16 arr,u16 psc)
{
	GPIO_InitTypeDef GPIO_InitType;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitType;
	TIM_ICInitTypeDef TIM_ICInitType;
	NVIC_InitTypeDef NVIC_InitType;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitType.GPIO_Mode=GPIO_Mode_IPD;
	GPIO_InitType.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitType);
	
	TIM_TimeBaseInitType.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitType.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitType.TIM_Period=arr;
	TIM_TimeBaseInitType.TIM_Prescaler=psc;
	TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitType);
	
	TIM_ICInitType.TIM_Channel=TIM_Channel_1;
	TIM_ICInitType.TIM_ICFilter=0x0;
	TIM_ICInitType.TIM_ICPolarity=TIM_ICPolarity_Rising;
	TIM_ICInitType.TIM_ICPrescaler=TIM_ICPSC_DIV1;
	TIM_ICInitType.TIM_ICSelection=TIM_ICSelection_DirectTI;
	TIM_ICInit(TIM5,&TIM_ICInitType);
	
	NVIC_InitType.NVIC_IRQChannel=TIM5_IRQn;
	NVIC_InitType.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitType.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitType.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitType);
	
	TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
	
	TIM_Cmd(TIM5,ENABLE);

}

u8 timer3_ch2_capture_sta=0;//该变量的位0指示上次是否检测到了高电平,1代表检测到高电平;位1表示是否完成了一次先检测高电平再检测一次低电平的过程,1代表完成了
u8 overFlowTimer=0;
u16 timer3_ch2_capture_val;

void TIM5_IRQHandler()
{
		if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET)//定时器3溢出
		{
			if(timer3_ch2_capture_sta&0x01)
			{
				if(overFlowTimer>=0xFF)//溢出次数到最大值,强制结束本次高电平维持时间测量
				{
					timer3_ch2_capture_sta|=0x02;//标记本次捕获完成,当然本行可以不要
					timer3_ch2_capture_val=0xffff;
					timer3_ch2_capture_sta=0;
					printf("高电平为%d微秒,到达最大时间范围\n",256*65536+timer3_ch2_capture_val);
				}else
				{
					overFlowTimer++;
				}
			}
		}

	
	
	if(TIM_GetITStatus(TIM5,TIM_IT_CC1)==SET)
	{
		if(timer3_ch2_capture_sta&0x01)//符合条件的话说明上次捕获了高电平,那么这次捕获的一定是低电平
		{
			timer3_ch2_capture_sta|=0x02;//标记本次捕获完成,当然本行可以不要
			timer3_ch2_capture_val=TIM_GetCapture1(TIM5);
			TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);
			timer3_ch2_capture_sta=0;//清掉标志位准备开始下一次上升沿和下降沿检测
			printf("高电平为%d微秒\n",overFlowTimer*65536+timer3_ch2_capture_val);
		}else
		{
			//timer3_ch2_capture_sta=0;
			overFlowTimer=0;
			timer3_ch2_capture_val=0;
			TIM_SetCounter(TIM5,0);//以上为清零
			
			timer3_ch2_capture_sta|=0x01;//高电平指示被赋值
			TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //当捕获上升沿后改为捕获下降沿
		}
	}
	TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位,一定不要忘,要不然下次进不了中断
}

(3).usart.c
该部分是在正点原子的源码基础上改动的,改动的地方我都标注了

#include "sys.h"
#include "usart.h"	  
#include "stm32f10x.h"
#include "stdlib.h"//我自己加的
#include "string.h"//我自己加的
// 	 
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//ucos 使用	  
#endif
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//串口1初始化		   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/8/18
//版本:V1.5
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明 
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//V1.4修改说明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
//3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改说明
//1,增加了对UCOSII的支持
// 	  
 

//
//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}
#endif 

/*使用microLib的方法*/
 /* 
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t) ch);

	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	
   
    return ch;
}
int GetKey (void)  { 

    while (!(USART1->SR & USART_FLAG_RXNE));

    return ((int)(USART1->DR & 0x1FF));
}
*/
 
#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   	
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记	  
  
void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

  USART_Init(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

int temp;//我自己加的,非正点原子源码

void USART1_IRQHandler(void)                	//串口1中断服务程序
	{
	u8 Res;
#if SYSTEM_SUPPORT_OS 		//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntEnter();    
#endif
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
					else {
					//以下为我自己加的,非正点原子的源码
					temp=atoi(USART_RX_BUF);
					if(temp>=1&&temp<=999)
					{
						TIM_SetCompare2(TIM3,temp);
						printf("PWM ARR寄存器为999,OC寄存器为%d\n",temp);
					}
					
					USART_RX_STA|=0x8000;	//接收完成了
					memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));
					//以上为我自己加的,非正点原子的源码
					}
				}
			else //还没收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 
#if SYSTEM_SUPPORT_OS 	//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntExit();  											 
#endif
} 
#endif	


MDK5工程结构如下(使用的是正点原子提供的新建工程模板)
在这里插入图片描述
5.测试
程序最初设定的PWM波的周期是100ms,占空比为50%,也就是说理论上高电平持续时间为50000us。初始状态下的测试结果如下(PC7连接PA0):
在这里插入图片描述
与理论值还是很接近的。接下来再使用串口调试助手改变占空比试试看,最开始时CCR2的值是499,这里我设定的能输入的范围是1到999。测试结果如下:
在这里插入图片描述
可以看到当输出比较值被设定为1后高电平几乎就是100ms,与理论很接近。
在这里插入图片描述
如上图,当输出比较寄存器的值被设定为999后高电平脉宽持续时间几乎为0,与理论相符合。

我使用的捕获通道是定时器5的通道1,连接在PA0,恰好PA0上面还连接一个按下为高电平输入的按键,所以按按键也能测试。在前面的测试中考虑了高电平持续时间过长会溢出的问题,所以专门准备了一个变量来记录溢出的次数,根据溢出的次数和捕获通道计时器的值之和能得到准确的持续时间。定时器5的溢出时间是63356us,接下来试试看在有溢出的情况下能否测准:
在这里插入图片描述
图中倒数第二次我一直按下按键不松手,到了大概十六秒多的时候自动结束测量,这是因为记录溢出次数的变量是八位的,定时器的值是16位的,那么最大测量时间就是256*65536+0xffff,理论值是16842752us,与实测数据仅相差1us。如果换个16位的变量记录溢出次数那记录的时间范围将大大延长。大家如果要试验的话可以使用别的定时器或串口,修改起来也是很简单的

6.遇到的一些问题
(1.)当pwm波出不来的时候先检查两遍用的定时器的配置,当找不着问题的时候不要怀疑自己,有可能代码没写错,可能只是硬件上由于IO连接了其他片内外设导致的。就比如我使用的定时器3的通道2,如果不重映射或者不部分重映射的话对应的IO引脚输出不了pwm波。遇见这种情况建议换个通道,或者换个定时器,或者是映射一下试试看,总比看着代码干瞪眼强。
(2.)测时间的时候不要只读取一个捕获通道的计数器值就完事了,如果不溢出的话那还是准确的,如果高电平比较长,那就不准确了。
(3.)定时器5的中断服务函数里一定要手动清除中断标志位,要不然下次就进不去中断了。
(4.)一般我们习惯在main.c的while(1)里放一个延时,但这个延时可能会导致某些代码来不及执行。就比如把我的while(1)里放个delay_ms(10)会导致上面的if语句来不及执行从而导致在第一次接收字符串完成后下次能进接收中断但却无法接收,因为USART_RX_STA没有被清掉(大概是因为定时器5的时钟频率比较高导致的吧)

这些我在注释里也有写,大家看代码的时候希望能注意一下
关于代码有哪里看不懂的话可以留言,如果我看到的话会尽量回复。(我也只是个STM32的半吊子,如果能帮到大家的话还是会尽量帮的)
完整工程:https://download.csdn.net/download/naruhina/12124097

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

使用STM32测量脉宽可变的PWM波的脉冲宽度 的相关文章

  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

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

随机推荐

  • 哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度

    哈希表 线性探测法和链地址法求查找成功与不成功的平均查找长度 了解ASL的公式 线性探测法求ASL 链地址法求ASL 了解ASL的公式 查找成功时 ASL 1 n frac 1 n n1
  • 训练VainF/DeepLabV3Plus-Pytorch

    conda activate pytorch cd DeepLabV3plus Pytorch master 先打开visdom 指定端口号 和运行指令里的端口号一致 python m visdom server p 28333 进行训练
  • Android面试心得

    过年回来到现在也一个月了 这段时间一直没写文章 这是因为我准备换工作了 一直在面试 也面试了四五家 但是效果都不是很好 虽然如此 但也算收获了一些经验 我就将我面试遇到的问题记录下来 与大家一起分享吧 本人是做游戏sdk的 所以一些问题会偏
  • JavaScript编程语言-交互:alert、prompt 和 confirm类型转换,字符串转换,数字型转换,布尔型转换,

    交互 alert prompt 和 confirm 由于我们将使用浏览器作为我们的演示环境 让我们看几个与用户交互的函数 alert prompt 和confirm alert 这个我们前面已经看到过了 它会显示一条信息 并等待用户按下 O
  • 【著名博客搬运翻译】无限过程式生成城市使用波函数坍缩算法

    Infinite procedurally generated city with the Wave Function Collapse algorithm 英文原址 https marian42 de article wfc 这是一个游戏
  • 虚拟机ubuntu18.04安装AoiAWD

    AoiAWD 轻量级EDR系统 AoiAWD 是一个由Aodzip 安恒信息 海特实验室研究员 HAC战队成员 维护的一个针对于CTF AWD模式的开源项目 专为比赛设计 便携性好 低权限运行的EDR系统 任何人都可以在 GNU AGPL
  • unity解决射线穿透UGUI的问题

    if Input GetMouseButtonDown 0 EventSystem current IsPointerOverGameObject Ray ray Camera main ScreenPointToRay Input mou
  • STL中的list容器

    以下转自http www cnblogs com BeyondAnyTime archive 2012 08 10 2631191 html STL中的list容器的一点总结 1 关于list容器 list是一种序列式容器 list容器完成
  • Excutors 线程池

    实例一 作为服务端 使用线程池接收多个客户端的TCP请求 String port 9015 ServerSocket serverSocket new ServerSocket port Executor exe Executors new
  • Base64加密解密算法【js】

    废话不多说 上代码 var Base64 private property keyStr ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 public metho
  • 最小二乘法(Least square method)

    最小二乘法是在线性回归模型最小化均方误差时使用 其实就是对误差函数求导数 然后让其等于0 然后解出使得误差最小 本篇文章讲解最小二乘法 首先声明 此篇的内容是来自 马同学高等数学 微信公众号的内容 目录 1 日用而不知 2 最小二乘法 3
  • 模板--类型萃取

    当我们在实现数据结构vector时 我们发现使用mencpy时只能实现基本类型的拷贝 而不能实现自定义类型的拷贝 比如说字符串类型 这问题如何解决呢 在学习了模板和基于模板的类型萃取之后 我们就有方法是在实现基本类型的拷贝时使用memcpy
  • iOS 网络

    1 http介绍 请求报文 响应报文 2 http的请求方式有哪些 get post head put delete options 3 get和post方式的区别 rfc官方文档 get请求参数以 分割拼接到url后面 post请求参数在
  • WPF 下的 VlcControl 控件,播放视频过程中,闪黑屏问题的排查与解决方法

    在Wpf 下 使用 VlcControl 控件 可以实现很多强大的播放功能和解码功能 但是在使用过程中发现当视频播放时 会有预加载时间 导致出现闪黑屏的情况 如下面gif所展示 这种情况其实是VlcControl视频控件在预加载视频 从而导
  • Linux shell上传/下载命令

    sz 和 rz sz命令发送文件到本地 sz filename rz命令本地上传文件到服务器 rz 执行该命令后 在弹出框中选择要上传的文件即可
  • ADB error: device unauthorized 问题解决

    error device unauthorized This adb server s ADB VENDOR KEYS is not set Try adb kill server if that seems wrong Otherwise
  • 学习笔记(材料力学组合梁实验报告图表绘制)

    一些反思 虽然大学里做了一些物理和力学实验 会进行基本的数据处理 但是其实还是很皮毛 深以为不可得过且过 本着钻研问题 深入研究excel制图的角度开启此篇章 一 需求 1 实验时本人所测量的 叠梁和楔块梁的实验应力值 表格化 对应力 高度
  • Truncate和Delete的区别

    1 表和索引所bai占空间 当表被truncate 后 这个表和索引所占du用的空间会恢复到初始zhi大小 delete操作不dao会减少表或索引所占用的空间 2 应用范围 truncate 只能对table delete可以是table和
  • 国内好的破解软件下载站

    MSDN https msdn itellyou cn 吾爱破解 https www 52pojie cn 奥学网 https 6so so 果核剥壳 http www ghboke com zd423 http www zdfans co
  • 使用STM32测量脉宽可变的PWM波的脉冲宽度

    最近受疫情影响导致我莫得办法出去玩 打游戏一不小心又给打通关了就只能找点东西玩玩了 所以就有了下面这篇文章 搞这个东西的时候遇见一些好玩的问题 我写在第6部分 希望能帮到看到这篇小文章的同志们 1 硬件平台 stm32f103zet6 正点