精华内容
下载资源
问答
  • STM32按键输入检测

    2014-12-09 21:04:29
    STM32 的四路PWM脉冲输出,并串口显示脉冲的宽度
  • stm32 GPIO输入检测

    千次阅读 2019-07-27 17:23:53
    检测按键输入为例: 如图一共有三个按键,WK-UP按键被按下会被拉到高电平,其它两个被按下会被拉到低电平。下面例子中如果key0被按下那就让led0状态反转,如果是key1被按下那就让led1状态反转,如果是wk-up被按下...

    以检测按键输入为例:
    在这里插入图片描述
    如图一共有三个按键,WK-UP按键被按下会被拉到高电平,其它两个被按下会被拉到低电平。下面例子中如果key0被按下那就让led0状态反转,如果是key1被按下那就让led1状态反转,如果是wk-up被按下那就让蜂鸣器状态反转。

    首先要说明的是按键有两种模式,一种就像是快进键,持续被按下就持续快进,就像是可重复触发的单稳态触发器,另外一种就是像关机一样的键,就算被持续按下也只是被判定为一次触发,就像是不可重复触发的单稳态触发器。在程序中用key_mode这个参数配置模式。

    读取IO输入的库函数是:
    uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    在程序中直接使用了宏定义绕过库函数的使用达到操作寄存器的目的

    1.key.h

    #ifndef __key_h_
    #define __key_h_
    #include "stm32f10x.h"
    #include "sys.h"
    #include "delay.h"
    
    #define wk_up PAin(0)  //位操作参数宏,用多级宏映射寄存器
    #define key0 PEin(4)
    #define key1 PEin(3)
    #define beep PBout(8)
    #define led0 PBout(5)
    #define led1 PEout(5)
    
    u8 key_scan(u8 key_mode);
    void key_init(void);
    #endif
    

    2.key.c

    #include "key.h"
    
    
    void key_init()
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
     
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟
    
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
     	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3
    
    	//初始化 WK_UP-->GPIOA.0	  下拉输入
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉	  
    	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
    	
    	
    }
    
    u8 key_scan(u8 key_mode)
    {
    	static u8 key_up = 1;//按键没有被按下
    	if(key_mode) key_up = 1;//key_mode为1时持续按下被判定为多次按下,key_mode为0时持续按下被判定为一次按下
    	if(key_up&&((wk_up==1)||(key0==0)||(key1==0)))
    	{
    		delay_ms(10);//延时,防止按键抖动带来误判
    		key_up = 0;
    			if(wk_up==1)
    			{
    				return 1;//返回1代表wk_up被按下
    			}
    			else if(key0==0)
    			{
    				return 2;//key0被按下返回2
    			}
    			else if(key1==0)
    			{
    				return 3;//key1 被按下返回3
    			}
    	}
    	else if(key1==1&&key0==1&&wk_up==0)key_up=1;//按键没被判定按下
    	return 0;
    }
    
    

    在这里有必要解释下key_scan这个函数:
    (1.)
    static u8 key_up = 1;
    if(key_mode) key_up = 1;
    这两行代码可能会让人感到疑惑,会有人认为key_up重复被赋值为1,如果是在第一次调用这个函数,并且key_mode为1时确实是重复赋值,然而可能重复被赋值的次数只有这一次,因为static u8 key_up = 1;仅仅在第一次调用这个函数时执行。
    如果按键处于持续按下被判定为多次按下模式时,当按键被按下key_up = 0;这段代码一定会执行,但是当下次再调用key_scan函数时key_up又被赋值为1,这样就能多次判定被按下。
    如果是持续按下被判定为一次按下模式,当持续按下按键时,第一次监测到按键被按下后key_up 被赋值为0,下次再检测时虽然按键被按下,但是无法进入if(key_up&&((wk_up==1)||(key0==0)||(key1==0)))语句块,也就不会被判定为按下。

    (2.)

    else if(key1==1&&key0==1&&wk_up==0)key_up=1;
    //该语句不能放入if(key_up&&((wk_up==1)||(key0==0)||(key1==0)))语句块之内,
    //虽然该语句放在if(key_up&&((wk_up==1)||(key0==0)||(key1==0)))看似合理,
    //但却会造成问题:当有按键被判定为按下后key_up被赋值为0,在下次检测
    //时虽然按键已经被弹起了,但是却无法进入
    //if(key_up&&((wk_up==1)||(key0==0)||(key1==0)))语句块,这样一来
    //key_up就永远为0,之后任何按键按下去都不会被判定为按下。
    
    

    3.led.h

       void led_init(void);
    

    4.led.c

    #include "stm32f10x.h"
    #include "led.h"
    #include "sys.h"
    void led_init(void)
    {
    	GPIO_InitTypeDef gpio_init_structure;
    	//1.时钟使能
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
    	//2.初始化
    	gpio_init_structure.GPIO_Mode=GPIO_Mode_Out_PP;
    	gpio_init_structure.GPIO_Pin=GPIO_Pin_5;
    	gpio_init_structure.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB,&gpio_init_structure);
    	PBout(5)=1;//3.设置初始电平高,不亮
    	
    	
    	gpio_init_structure.GPIO_Mode=GPIO_Mode_Out_PP;
    	gpio_init_structure.GPIO_Pin=GPIO_Pin_5;
    	gpio_init_structure.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(GPIOE,&gpio_init_structure);
    	PEout(5)=1;//3.设置初始电平高,不亮
    }
    

    5.beep.h

    void beep_init(void);
    

    6.beep.c

    #include<beep.h>
    #include<stm32f10x.h>
    
    void beep_init()
    {
    	GPIO_InitTypeDef GPIOSetting_structure;				//设置IO口模式,速度等信息
    	GPIOSetting_structure.GPIO_Mode=GPIO_Mode_Out_PP;
    	GPIOSetting_structure.GPIO_Pin=GPIO_Pin_8;
    	GPIOSetting_structure.GPIO_Speed=GPIO_Speed_50MHz;     
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使相应的时钟
    	GPIO_Init(GPIOB,&GPIOSetting_structure);//初始化相应的IO
    	
    	GPIO_ResetBits(GPIOB,GPIO_Pin_8);//默认推挽输出低
    }	
    
    

    7.main.c

    #include "key.h"
    #include "led.h"
    #include "beep.h"
    
    int main(void)
    {
    	u8 key = 0;//在mdk5里面,变量的声明要放在任何可执行语句之前,否则会报错
    	delay_init();
    	beep_init();
    	led_init();
    	key_init();
    	while(1){
    		key = key_scan(0);//传入1表示按键持续按下会被多次判定有效,传入0时即使按键持续被按下也只判定为被按下一次
    		if(key)
    		{
    			switch(key)
    			{
    				case 1: beep = !beep;break;
    				case 2: PBout(5) = !PBout(5);break;
    				case 3: PEout(5) = !PEout(5);break;
    			}
    		}
    		
    		delay_ms(10);//10ms扫描一次按键
    	}
    	
    }
    
    
    展开全文
  • 本例程演示如何操作GPIO输入和输出。通过检测USER1、USER2按键的状态,点亮不同的LED,同时输出键值到串口1。
  • ADC模拟输入,电压转换,基础版 后面再传一个PT100 1ma恒流温度检测 正式产品用的 程序
  • 通过STM32F4输入捕获功能测量方波相位差,正点原子探索者系列,高频信号不适用。从PA0上升沿到PA2的上升沿的时间
  • STM32学习记录——2.GPIO输入—按键检测 使能 GPIO端口时钟; 初始化 GPIO目标引脚为输入模式(引脚默认电平受按键电路影响,浮空/上拉/下拉均没有区别); 编写简单测试程序,检测按键的状态,实现按键控制 LED灯...
  • 固件库编程,之 GPIO输入-按键检测,使用GPIO口控制三色LED口的RGB
  • 通过输入捕获测量频率程序源码,测量,串口输出显示,STM32F103
  • STM32人体检测(体温、心率、心跳、跌倒检测)+zigbee 笔者前言 在闲鱼有缘结识的一个哥们,帮助做的基于STM32人体检测系统,我负责硬件程序开发设计,哥们负责客户端服务器微信程序的实现,人体检测系统要求将测得...

    STM32人体检测(体温、心率、心跳、跌倒检测)+zigbee

    笔者前言

    在闲鱼有缘结识的一个哥们,帮助做的基于STM32人体检测系统,我负责硬件程序开发设计,哥们负责客户端服务器微信程序的实现,人体检测系统要求将测得数据通过zigbee传输到坏境检测系统中。

    系统成品图

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

    模块选用

    • STM32f103c8t6

    • 0.96 oled IIC 模块

    • max30100心率血氧模块

    • mpu-6050模块

    • 人体温度模块 (某宝54元买的价格有点贵哈)
      在这里插入图片描述

    • zigbee转串口模块
      在这里插入图片描述
      接线
      在这里插入图片描述

    功能概述

    1.跌倒检测

    *速度瞬态变化
    人体加速度向量幅值SVM和微分加速度幅值的绝对平均值DSVM是区分人体运动状态的重要参量。SVM通过计算加速度幅度表征人体运动的剧烈程度,其值越大表明运动越剧烈。DSVM通过计算SVM的微分绝对值的时间平均表征人体运动状态变化的剧烈程度,其值越大表明运动状态变化越剧烈。其定义为:在动态坐标系下考察SVM和DSVM,可监测人体的运动强度和运动状态变化强度。
    在这里插入图片描述
    *姿态角判断
    利用三轴加速度和重力的关系,经过四元运算测量得到 俯仰角、横滚角、航向角
    在这里插入图片描述
    mpu6050驱动上位机测试
    在这里插入图片描述
    判定标准:

    1. SVM正常状态下值是17000左右,当将其加速晃动时,分析得到的安全加速度约在12000~22000之间(模拟测试值,仅供参考),当超出阈值时,5秒内都判定为异常,且板载蓝色LED灯亮。

    2. 三轴欧拉偏角大于 40°时 即异常
      人体体位的另一个重要特征就是身体的倾角,调查显示,人体处于直立状态时,躯干与重心方向的倾角小于60度;而人体处于水平状态时,倾角接近90度;人体在跌倒时,躯干从直立状态变为接近水平的状态。所以可以将人体倾角值是否大于60度来作为辅助判断跌倒的特征,倾角值可通过倾角传感器获得。
      在这里插入图片描述

    2.人体温度

    线性区间温度30—44度/电压2.127–1.193V
    在这里插入图片描述
    获取温度流程:

    1. 模块AO输出捕获ADC平均有效值换算成电压值
    2. 根据驱动例程提供的数据表,用电压值匹配电阻表
    3. 电阻表匹配对应温度值

    3.心率血氧浓度

    当LED光射向皮肤,透过皮肤组织反射回的光被光敏传感器接受并转换成电信号再经过AD转换成数字信号,简化过程:光–> 电 --> 数字信号。根据官方历程移植代码,中途遇到很多问题,血氧的测量,相比心率血氧测量难度较大而且精度不算太高,寄存器中文描述可参考此链接
    程序设计流程如下

    1. 先初始化IIC,再初始化血氧模块SPO2_Init()
    2. 检查样本,采样获取红外FIFO、红外FIFO 的AC值
    3. 对红外FIFO、红外FIFO过滤脉冲值
    4. 根据相应的算法 光电容积脉搏波描记法PPG 获取心跳速率、血氧浓度

    zigbee发送数据

    USART -> zigbee只需要 串口 printf 就可以完成数据的传输
    使用该模块前需要配置模块我这里配置的波特率是115200
    在这里插入图片描述
    注意:

    1. 温度测量范围是 30-44°,其他范围默认取值为零
    2. 心跳有效范围设置为20-300,血氧是百分比值0-100
    3. 跌倒标志位【0:正常 1:异常】
      在这里插入图片描述

    代码

    main函数代码

    #include "adc.h"
    #include "led.h"
    #include "oled.h"
    #include "uart.h"
    #include "math.h"
    #include "delay.h"
    #include "stdio.h"
    #include "myiic.h"
    #include "timer3.h"
    #include "stdlib.h"
    #include "MAX30100.h"
    #include "stm32f10x.h"
    #include "MAX30100_Filters.h"
    #include "MAX30100_PulseOximeter.h"
    #include "MAX30100_SpO2Calculator.h"
    #include "mpu6050.h"
    #include "inv_mpu.h"
    #include "inv_mpu_dmp_motion_driver.h" 
    
    u32 TimingDelay = 0;
    u16 led_count = 0;
    float Tempertaure_val=0;  		//体温变量
    signed short HeartRate_val=0; 	//心跳速率
    u8 SPO2_val = 0;				//血氧浓度
    u8 str[20];						//字符串缓存
    _Bool send_flag = 0;      		//发送标志位
    u8 mpu_flag = 0;      			//人体跌倒检测标志位 标志位1、2任意一个异常 该标志位为1 	【1:跌倒,0:正常】
    _Bool mpu_1_flag = 0;      		//人体跌倒检测标志位1	角度异常标志		【1:异常,0:正常】
    _Bool mpu_2_flag = 0;      		//人体跌倒检测标志位2	加速度异常标志	【1:异常,0:正常】
    int SVM;											//人体加速度向量幅值SVM和微分加速度幅值的绝对平均值DSVM是区分人体运动状态的重要参量。SVM通过计算加速度幅度表征人体运动的剧烈程度,其值越大表明运动越剧烈。
    u8 t=0,i=10;
    
    int main(void)
    {
    	float pitch,roll,yaw; 	//欧拉角
    	short aacx,aacy,aacz;		//加速度传感器原始数据
    
    	
    	SysTick_Config(SystemCoreClock/1000);	//系统定时器初始化 1MHz 每1ms执行一次中断
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 
    	Delay_Ms(100);			//等待配置稳定
    	
    	/***************第一部分:初始化部分*************/
    	LED_Init();					//板载LED初始化
    	UART1_Init();				//打印调试信息,zigbee 发送数据到气象站
    	OLED_Init();		    	//初始化OLED模块-----SCLK接到“B7”脚 SDIN接到“B6”脚
    	ADC1_Init();				//初始化ADC用于温度获取-----获取 “A0”ADC值
    	IIC_Init();					//血氧浓度模块IIC-----SCLK接到“B8”脚 SDIN接到“B9”脚
    	TIM3_Init();				//每1ms执行一次中断,	RunTime 每1ms加 1
    	SPO2_Init();				
    	MPU_Init();					//初始化MPU6050
    	
    	Delay_Ms(1000);			//等待初始化稳定
    	while(mpu_dmp_init())
     	{
    		//printf("MPU6050 Error");
     		Delay_Ms(200);
    	}
    	show_interface();		//显示主界面
    	
    	/***************第二部分:数据显示更新部分*************/
    	while(1)
    	{
    		//====心跳血氧====
    		POupdate();				//更新FIFO数据 血氧数据 心率数据
    		
    		//====温度获取====
    		Tempertaure_val = get_temp();   //获取人体温度
    		show_temp(Tempertaure_val);		//屏幕显示温度
    			
    		//====MPU6050数据获取====
    		if((t%10)==0)
    		{ 
    			if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
    			{ 
    				MPU_Get_Accelerometer(&aacx,&aacy,&aacz);	//得到加速度传感器数据		
    				SVM = sqrt(pow(aacx,2)+  pow(aacy,2) + pow(aacz,2));	
    				//printf("pitch:%0.1f   roll:%0.1f   yaw:%0.1f   SVM:%u\r\n",fabs(pitch),fabs(roll),fabs(yaw),SVM);
    				
    				//分析x、y、z角度的异常判断
    				if( fabs(pitch)>40 || fabs(roll)>40 || fabs(yaw)>40 )//倾斜角度的 【绝对值】 大于40°SVM大于设定的阈值时,即认为摔倒
    					mpu_1_flag = 1;	
    				else 
    					mpu_1_flag = 0;
    				
    				//分析加速度SVM的异常判断
    				if( SVM>23000 || SVM<12000 )i = 0;
    				i++;
    				
    				if( i<=10 )mpu_2_flag = 1;
    				else 
    				{
    					i = 10;
    					mpu_2_flag = 0;
    				}
    		
    				//综合欧拉角、SVM异常判断异常	
    				if( mpu_2_flag || mpu_1_flag )mpu_flag = 1;
    				else mpu_flag = 0;
    				
    				show_mpu(mpu_flag);
    			}
    			t=0;
    		}
    		t++;
    		
    		//====发送数据====
    		if(send_flag)//SysTick_Handler()设置1s发送一次数据
    		{
    			printf("%0.2f %d %u %u\r\n",Tempertaure_val,HeartRate_val,SPO2_val,mpu_flag);
    			send_flag=!send_flag;
    		}
    		
    		Delay_Ms(10);
    	}
    }
    
    
    /***************系统定时器中断函数*************/
    void SysTick_Handler(void)
    {			
    	TimingDelay--;		//延时函数所需的变量
    	
    	led_count++;			//每1s发送一次数据
    	if(led_count>=1000)
    	{
    		led_count=0;
    		send_flag=!send_flag;
    	}
    }
    
    

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

    展开全文
  • STM32——检测输入方波的频率

    千次阅读 2021-02-01 12:04:33
    #include “stm32f10x.h” #include “stdio.h” float Frequency_value; #define LED_ON GPIO_ResetBits(GPIOA,GPIO_Pin_12) #define LED_OFF GPIO_SetBits(GPIOA,GPIO_Pin_12) Void TIM2_Configuart(void) { TIM_...

    Main ()
    {
    #include “stm32f10x.h”
    #include “stdio.h”
    float Frequency_value;

    #define LED_ON GPIO_ResetBits(GPIOA,GPIO_Pin_12)
    #define LED_OFF GPIO_SetBits(GPIOA,GPIO_Pin_12)
    Void TIM2_Configuart(void)
    {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能其所在时钟

     TIM_TimeBaseStructure.TIM_Period = 400-1; //设置重装载寄存器的周期
     TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; //设置时钟频率除数的预分频值
     TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割
     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上的计数模式
     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //TIM3的初始化
     TIM_ETRClockMode2Config(TIM3,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_Inverted,0);
     // TIM_ExtTRGPSC_OFF :ETRP 预分频 OFF
     // TIM_ExtTRGPolarity_NonInverted : TIM外部触发极性非翻转:高电平或者上升沿有效
     TIM_SetCounter(TIM3,0);
     TIM_Cmd(TIM2, ENABLE);  //使能TIM3 
    

    }
    Void TIM3_Configuart(void)
    {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能其所在时钟

     // TIM_Period | TIM_Prescaler 16位
     TIM_TimeBaseStructure.TIM_Period = 0XFFFF - 1; //设置重装载寄存器的周期
     TIM_TimeBaseStructure.TIM_Prescaler = 0X00; //设置时钟频率除数的预分频值
     TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割
     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上的计数模式
     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //TIM3的初始化
     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //TIM3更新中断使能
     TIM_Cmd(TIM2, ENABLE);  //使能TIM2 
    

    }
    Void IO_Configuart(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能其所在时钟
    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_12 //设置引脚
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置模式
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置速度
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    }
    Void NVIC_ Configuart(void)
    {
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从占优先3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
    }
    void USART1_Configuart(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9 | GPIO_Pin_10; //设置引脚TX | RX
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //设置串行通信模式
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置速度
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    USART_InitTypeDef USART_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    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);
    USART_Cmd(USART1,ENABLE);
    }
    int fputc(int ch, FILE *f)
    {
    USART_SendData(USART1, (unsigned char) ch);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
    return ch;
    }
    void Delay_ms(void)
    {
    long int i,j;
    for (i = 0; i < 10000; i++)
    for (j = 0; j < 1000; j++);
    }

    int main(void)
    {
    TIM3_Configuart();
    TIM2_Configuart();
    IO_Configuart();
    NVIC_ Configuart();
    USART1_Configuart();

    While(1)
    {
    LED_ON;
    printf("\nHello!\n");
    printf("\n%f",Frequency_value);
    Delay_ms();
    LED_OFF;
    Delay_ms();
    }
    Return 0;
    }
    /stm32f10x_it.c********/
    //定时器3中断服务程序
    void TIM3_IRQHandler(void) //TIM3中断
    {
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
    {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志
    Frequency_value = TIM_GetCounter(TIM3)/0.2; //周期200ms
    TIM_SetCounter(TIM3,0);//从0开始计数字
    }
    /stm32f10x_it.c********/
    /stm32f10x_it.h********/
    Extern float Frequency_value;
    void TIM2_IRQHandler(void);
    /stm32f10x_it.h********/

    展开全文
  • KEY_Scan函数频繁调用了JTAG_Set函数,每次按键扫描的时候都禁用了JTAG和SWD,这样做的目的是使PA13和PA15用作普通IO口,从而检测按键状态,在按键扫描结束后,有开启了SWD,这样让JLIK能够继续后面的跟踪,这样可以...
  • stm32+风速风向的测量,通过模拟量输入经过adc转换,测量风速及风向
  • STM32输入信号频率

    2018-03-21 08:14:34
    STM32输入信号频率,通过输入捕获的方式测量信号频率(学习定时器的输入捕获功能)
  • 1.对于按键输入检测有两种基本的情况(假设每隔100ms检测一次): (1)一种情况是支持连续按: 什么意思呢?最典型的例子就是电视机遥控器,如果你一直按他就是一直换台或者一直增大减小音量,就是说它检测到一次...

    在这里插入图片描述

    1.对于按键输入的检测有两种基本的情况(假设每隔100ms检测一次):
    (1)一种情况是支持连续按:
    什么意思呢?最典型的例子就是电视机遥控器,如果你一直按他就是一直换台或者一直增大减小音量,就是说它检测到一次低电平就认为有效从而做出反应。
    (2)第二种情况是不支持连续按:
    这种情况很常见,例如电源开关,只要你按下了它就会开或者关,而不是你一直按着它开关开关。
    2.我们怎样实现这两种做法呢?
    通过记录上一次检测到的电平情况,对这一次电平的效果做出不同反应:
    支持连续按不用管上一次什么情况只要检测到低电平就会做出反应;
    不支持连续按必须保证上一次是高电平,这一次的低电平才会起作用,如图:
    在这里插入图片描述3.从而想到要用到static关键字:
    在这里插入图片描述**注意的是:它的记忆功能!!!**例如:
    在这里插入图片描述第一次调用这个函数:返回1
    第二次调用这个函数:返回2
    第三次调用这个函数:返回3
    第四次调用这个函数:返回4

    展开全文
  • 12-GPIO输出—使用固件库点亮LED灯
  • 使用CubeMX生成PWM波形,并且进行PWM波形的频率和占空比测量,使用硬件来进行两次捕获,降低代码的工作量。
  • 本部分的电路设计如图所示,主要是通过3.96插座,接收检测外来的0V或者5V信号,然后做出相应的动作。 原理图中200欧姆电阻,主要起限流保护作用,同时这里使用了一个器件BAV99,他的作用在这里再复习一下: 当正的...
  • STM32F103】按键检测(GPIO输入

    千次阅读 2019-01-17 01:29:08
    按键硬件电路: 分析电路:按键K1按下,接通高电平3.3V,为了保护GPIO,加了限流电阻(R7),没按下的时候是...GPIO输入:GPIO数据输入寄存器IDR,只要读取这个寄存器就可以。 bsp_key.c 按键初始化: #inc...
  • 以方波信号为例,利用STM32开发板,设计了一套方波信号源和相应的检测系统,该系统利用一块STM32按要求输出不同类型的方波信号,另一块STM32对方波信号进行捕获.实验结果表明:单片机1可成功实现对方波信号的模拟,单片机2...
  • STM32】HAL库 STM32CubeMX教程四---UART串口通信详解

    万次阅读 多人点赞 2019-08-11 08:57:51
    今天我们学习STM32CubeMX串口的操作,以及HAL库串口的配置,我们会详细的讲解各个模块的使用和具体功能,并且基于HAL库实现Printf函数功能重定向,UART中断接收,本系列教程将HAL库与STM32CubeMX结合在一起讲解,使...
  • 1、实现电压采集;ADC1,PA0为电压检测输入。 2、0.96寸OLED显示采集到的电压值。其驱动采用SSD1306。 3、密码:stm32。 4、解压后打开。
  • stm32实现GPIO输入按键检测

    万次阅读 2018-10-24 22:46:53
    由于用软件消抖处理滤波不方便输入检测,所以提出了如下带有硬件消抖的电路。 从按键的原理图可知,当按键没有被按下时,GPIO引脚通过一个下拉电阻R64使引脚处于低电平状态,当按键被按下时,按键所在的电路导通...
  • STM32输入捕获(一)

    千次阅读 2018-02-08 13:51:50
    STM32输入捕获(一) 今天,就参照芯片的数据手册,来编写程序,实现输入捕获功能,首先看一下输入捕获的实现原理:(这里只拿通道1为例,其他通道与之类似)首先来看这张图 (图中的U代表更新事件,UI表示可以...
  • 采用ST公司的生产的STM32F103系列单片机作为控制核心,输入任意信号经用以TDA2030芯片为核心的功率放大的模块,再串联10欧姆的电阻和用漆包线缠绕锰芯磁环而形成的电流互感器,采集流经电流互感器的电流,将其输出到...
  • STM32输入捕获简介

    2020-08-18 07:51:19
    STM32输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存(TIMx_CCRx)里面,完成一次捕获。...
  • stm32输入捕获,可以捕获PWM波,可以检测占空和频率等。。。。。。。。
  • STM32_HAL:按键输入检测 0x01.目录 节目录0x00.章索引0x01.目录0x02.背景/声明0x03.开始前...0X04.捕获按键状态0x05.小结附录 0x02.背景/声明 得益于STM32系列MCU的外设功能丰富、软件驱动库规范与参考资料多等特性...
  • (2)本资源使用stm32自带的ADC采集外部输入的正弦信号(外加信号需要偏置,因为32自带ADC采集0~3.3V)。 (3)采用stm32官方DSP库的FFT算法处理数据(64,256,1024点处理) (4)计算正弦波失真度。 (5) 采样频率...
  • 主要涉及技术: 1) TIM5通用定时器的脉宽捕获功能,捕获一个按键的低电平时间 2)输入捕获的配置和原理
  • 通过检测GPIO输入,让LED等实现亮灭的翻转效果

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,246
精华内容 4,498
关键字:

stm32输入检测