Stm32f103学习记录---TIM和EXTI(代码部分)

STM32F103 外部中断(EXTI)介绍以及代码 如果用 GPIO 作为外部中断,需要配置 AFIO,来选择是哪个端口,可以是 GPIOA/GPIOB/GPIOC/GPIOD/GPIOE/GPIOF/GPIOG,需要注意的是,对于同一个 Pin 脚,只能选择配置一个端口,例如我配置 Pin15 为 GPIOC,那么就不能再用用 GPIOA/B/D/E/F/G 15 作为 EXTI ,如下图所示。②Edge Detect :边缘检测,可以是上升沿触发,也可以是下降沿触发,还可以是上升沿和下降沿都可以分别触发,对应图中 ②-1 和 ②-2。 阅读详情

一、EXTI配置

打通这一路的电路即可

GPIO             ------》       AFIO        ------》    EXTI        -----》      NVIC

step1:打开RCC时钟

注意:RCC管的是外面的,NVIC住在皇宫里面,RCC管不着,可参照stm32f103c8t6芯片原

           理图

step2:配置GPIO,输入模式

step3:AFIO,选择这一路的GPIO

注意:相同的pin不能同时申请中断如PA1和PB1

step4:配置EXTI,选择边沿触发方式or触发响应方式

step5:配置NVIC,给中断配置抢占优先级和响应优先级

1.打开RCC时钟

rcc.h

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
//使用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)

 AFIO也在APB2上


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)

2.配置GPIO,输入模式

/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PA1和PA2引脚初始化为推挽输出

GPIO_Mode_AIN 模拟输入

。。。IN_FLOATING 浮空输入

。。。IPD    下拉输入 

。。。IPU   上拉输入

。。。Out_OD   开漏输出

。。。Out_PP    推挽输出

。。。AF_OD     复用开漏输出

。。。AF_PP     复用推挽输出

推挽输出时:寄存器为1,输出1,为0,输出0

开漏输出时:寄存器为1,输出断开(高阻模式),为0,输出0

(作用:1.可作为通信协议输出,输出更高电平2.只需在IO口外接上拉电阻到5V )

库函数(gpio.h):

读取某引脚输入的电平(0为低,1为高)
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
读取整个输入寄存器的数据
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
读取某引脚输出的电平(0为低,1为高)
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
读取整个输出寄存器的数据
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
设为高电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
设为低电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
写某个引脚的数据
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
写数据
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

锁定引脚配置,放止意外修改
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
引脚重映射
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
配置AFIO数据选择器,选择要配置中断的引脚
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
以太网相关
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

 3.AFIO,选择这一路的GPIO

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
选择GPIO pin作为外部中断线
GPIO_PortSource 要选择的GPIO pin
GPIO_PinSource 哪个引脚

以PB14为例:
GPIO_PortSourceGPIOB
GPIO_PinSource14
4.配置EXTI,选择边沿触发方式or触发响应方式 
/*EXTI初始化*/
EXTI_InitTypeDef EXTI_InitStructure;						//定义结构体变量
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;		//选择配置外部中断的0号线和1号线
EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中断线使能
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中断线为中断模式
            EXTI_Mode_Event事件模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//指定外部中断线为下降沿触发
            Trigger_Rising上升沿
            Trigger_Falling下降沿
            Trigger_Rising_Falling双边沿
EXTI_Init(&EXTI_InitStructure);								//将结构体变量交给EXTI_Init,配置EXTI外设
 库函数(exti.h): 
清除EXTI配置
void EXTI_DeInit(void);
配置EXTI外设
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
用结构体配置EXTI外设
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
软件触发中断
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);


这两个一般在主函数用,get完flag一定要clear,否则重复触发中断!!!

看看挂起寄存器的标志位是否为1,
9-15会触发同一个中断,这样可以判断哪个线触发了中断
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
清除flag(必须!!!)
void EXTI_ClearFlag(uint32_t EXTI_Line);


这两个一般在中断中用!!!

看看挂起寄存器的标志位是否为1,
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
清除flag(必须!!!)
void EXTI_ClearITPendingBit(uint32_t EXTI_Line); 

 

5. 配置NVIC,给中断配置抢占优先级和响应优先级

	/*NVIC配置*/
NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//选择配置NVIC的EXTI0线
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC线路的抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init,配置NVIC外设
库函数(misc.h): 
 The table below gives the allowed values of the pre-emption priority and subpriority according
 to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function
  ============================================================================================================================
    NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  | Description
  ============================================================================================================================
   NVIC_PriorityGroup_0  |                0                  |            0-15             |   0 bits for pre-emption priority
                         |                                   |                             |   4 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------
   NVIC_PriorityGroup_1  |                0-1                |            0-7              |   1 bits for pre-emption priority
                         |                                   |                             |   3 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------    
   NVIC_PriorityGroup_2  |                0-3                |            0-3              |   2 bits for pre-emption priority
                         |                                   |                             |   2 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------    
   NVIC_PriorityGroup_3  |                0-7                |            0-1              |   3 bits for pre-emption priority
                         |                                   |                             |   1 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------    
   NVIC_PriorityGroup_4  |                0-15               |            0                |   4 bits for pre-emption priority
                         |                                   |                             |   0 bits for subpriority                       
  ============================================================================================================================


中断分组
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
设置中断向量表
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
低功耗配置
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
时钟源
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);

6.写中断函数

stm32中中断函数名称是固定的,名字参照启动文件startup_stm32f10x_md.s,名字以IQRHandler结尾的,就是中断函数

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
                DCD     RTC_IRQHandler             ; RTC
                DCD     FLASH_IRQHandler           ; Flash
                DCD     RCC_IRQHandler             ; RCC
                DCD     EXTI0_IRQHandler           ; EXTI Line 0
                DCD     EXTI1_IRQHandler           ; EXTI Line 1
                DCD     EXTI2_IRQHandler           ; EXTI Line 2
                DCD     EXTI3_IRQHandler           ; EXTI Line 3
                DCD     EXTI4_IRQHandler           ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
                DCD     ADC1_2_IRQHandler          ; ADC1_2
                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5

例如(以下代码来自B站江科大):

/**
  * 函    数:EXTI0外部中断函数
  * 参    数:无
  * 返 回 值:无
  * 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
  *           函数名为预留的指定名称,可以从启动文件复制
  *           请确保函数名正确,不能有任何差异,否则中断函数将不能进入
  */
void EXTI0_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line0) == SET)		//判断是否是外部中断0号线触发的中断
	{
		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)
		{
			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)		//PB0的下降沿触发中断,此时检测另一相PB1的电平,目的是判断旋转方向
			{
				Encoder_Count --;					//此方向定义为反转,计数变量自减
			}
		}
		EXTI_ClearITPendingBit(EXTI_Line0);			//清除外部中断0号线的中断标志位
													//中断标志位必须清除
													//否则中断将连续不断地触发,导致主程序卡死
	}
}

二、TIM配置

分频:输入信号时会以一定频率采样多次,若这N个采样点电平相同,就代表信号稳定了,输出采样值,否则保持上一个值,这个频率与分频值和时钟频率相关。而N的值是和ExtTRGFilter相关的


定时频率(CK_CNT_OV,计数器溢出频率)= CK_CNT(72MHz)/【(PSC+1)*(ARR+1)】

1.System下新建Timer.h Timer.c

2.放止重复引头文件,我们这样处理

#ifndef __TIMER_H
#define __TIMER_H

#endif

Timer.c这边还是#include "stm32f10x.h"    

我们只要让硬件电路打通,就可以让TIM工作 

库函数(tim.h,拖到最后) 
void TIM_DeInit(TIM_TypeDef* TIMx);

时基单元初始化
TIMx选定时器
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

时基单元初始化
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

使能计数器
FunctionalState NewState(使能或失能)
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

中断输出配置
uint16_t TIM_IT          用哪个中断
FunctionalState NewState(使能或失能)
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

选择内部时钟
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);

选择ITRx其他定时器的时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

选择TIX捕获通道的时钟
uint16_t TIM_TIxExternalCLKSource   TIX的引脚
uint16_t TIM_ICPolarity, uint16_t ICFilter  极性选择和滤波器  
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);

选择ETR外部时钟模式1输入的时钟
uint16_t TIM_ExtTRGPrescaler预分频
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);

选择ETR外部时钟模式2输入的时钟
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

单独配置ETR引脚的预分频器、极性、滤波器等
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);



有些数值常常修改,要改是在用Init太麻烦,这里有几个修改单个参数的:

单独写预分频值
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
改变计数模式
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
自动重装计时器预装功能
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
给计数器写入一个值
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
手动给一个自动重装值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
过去当前计数器的值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
预分频值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

初始化函数
void Timer_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
	
	/*配置时钟源*/
	TIM_InternalClockConfig(TIM2);		//选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量

    //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		
TIM_CKD_DIV1 不分频
TIM_CKD_DIV2 2分频
TIM_CKD_DIV4 4分频
    //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_CounterMode_Down向下
TIM_CounterMode_CenterAligned1中央对齐模式
    //计数周期,即ARR自动重装的值

计几个数字再触发中断
改成1000的话,触发中断的频率会快10倍
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
    //预分频器,即PSC的值			
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;	
以多快的速度计数
改成720就会以原来的10倍计数

这样处理后频率为10K,在10K频率下记10000个数,时间就是1s	
    //重复计数器,高级定时器才会用到			
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元				
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);				
	


	/*中断输出配置*/
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定时器更新标志位
																//TIM_TimeBaseInit函数末尾,手动产生了更新事件
																//若不清除此标志位,则开启中断后,会立刻进入一次中断
																//如果不介意此问题,则不清除此标志位也可
	
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);					//开启TIM2的更新中断
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2
																//即抢占优先级范围:0~3,响应优先级范围:0~3
																//此分组配置在整个工程中仅需调用一次
																//若有多个中断,可以把此代码放在main函数内,while循环之前
																//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//选择配置NVIC的TIM2线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init,配置NVIC外设
	
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行
	
}
此处用到的中断函数是TIM2_IQRHandler 
/* 定时器中断函数,可以复制到使用它的地方
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)  //看看中断是不是从TIM2进来的
	{
		
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}
*/

但是注意!!!刚上电后会触发中断,原因在注释中解释了

三、外部时钟源选择

硬件电路

对射式红外传感器,Do接PA0(PA0是TIM2的外部时钟引脚)

程序编写

TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted,0x00)

TIM_ExtTRGPSC_OFF:关闭分频

TIM_ExtTRGPolarity_Inverted:反向,低电平或下降沿有效

TIM_ExtTRGPolarity_NonInverted:不反向,反之

0x00: 不用滤波器

GPIO这边我们用上拉输入,此处不再赘述。一般输入功率小的时候用浮空,防止上拉的影响,否则不建议用浮空,电平会跳来跳去

 术语表:

NVIC Nested Vectored Interrupt Controller 嵌套向量中断控制器

EXTI  External Interrupt                               外部中断

AFIO Alternate function I/O 复用IO,此处是中断引脚选择器

GPIO General-purpose input/output             通用型之输入输出

嵌入式蓝桥杯蜂鸣器的控制 跟上篇LED灯一样 先记住蜂鸣器 蜂鸣器的时钟是APB2 IO口是B4 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//B¶Ë¿Ú 要正确使用PB4作为普通IO口需要开启复用时 阅读详情

相关推荐

STM32F103中断系统全解析:从NVIC到EXTI的工程实践

中断是嵌入式实时系统响应外部事件的核心机制,其本质是CPU对异步信号的可控跳转与优先级调度。基于ARM Cortex-M3内核的异常模型,STM32F103通过NVIC实现可嵌套、可配置的中断管理,并依托EXTI统一汇聚GPIO、RTC、PVD等60个外部中断源。该架构兼顾确定性与灵活性:硬件固化内核异常(如HardFault、NMI)保障系统健壮性,软件可编程的抢占/子优先级分组支持实时任务分级响应。典型应用场景包括按键唤醒、串口帧接收、定时器调度及故障安全处理。理解中断向量表布局、待决标志清除规则与HA

weixin_42602368的博客 418

STM32 EXTI(外部中断)

目录中断是什么?如何配置中断 中断是什么? 例:在公司上班打代码,然后经理打电话过去谈话,谈话到一半,老婆打电话要去医院,然后回来医院继续谈话,然后继续工作打代码。 打断原来做的事情 -> 打断工作 保留现场 -> 保留工作进度 处理中断 -> 谈话 回到现场 -> 继续工作 如何配置中断 1.初始化原来中断的GPIO口 2.初始化EXTI(什么是EXTI?) 边沿检测电路 -> 上升沿/下降沿触发中断 3.配置NVIC(中断优先级) 配置中断的优先级,中断嵌套 4.编写中断服

qq_44610809的博客 8406

Rust STM32F103嵌入式开发教程之大纲

这是一个关于 STM32F103 开发板使用案例,记录一些使用 Rust 语言进行学习嵌入式开发的示例。

清风冷吟 3596

STM32中断学习笔记

EXTI)外部中断EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,

m0_56628730的博客 1485

【STM32篇】驱动HC_SR04超声波测距模块

使用stm32f10x的外部中断和定时器辅助HC_SR04超声波测距模块完成测距,并通过OLED屏幕显示。

we_long的博客 8500

“STM32F103入门实战:GPIO控制实现经典流水灯(附完整代码)“(新手学习记录)

掌握推挽输出模式(高/低电平驱动能力强)学会初始化GPIO并控制LED亮灭。

CM2003000的博客 632

STM32F103 对中断的一些理解以及记录

中断是指打断CPU处理正常程序以处理紧急程序的机制,随后返回原程序继续运行。文中详细介绍了中断的概念、STM32的NVIC(嵌套向量中断控制器)、中断优先级的基本概念及其配置步骤,以及如何使用外部中断(EXTI)和相关寄存器的设置。中断的工作原理和HAL库的使用步骤也被阐述,强调了中断在实时控制和数据传输中的重要性。

m0_73658459的博客 930

STM32代码移植

STM32f103代码移植出现的问题 下次碰到直接翻阅(备忘录) 不同容量的的启动文件 里面的各个函数汇总 在stm32f10x.h

weixin_45885303的博客 1110

STM32F103_BLDC霍尔控制程序核心功能说明

本程序基于STM32F103系列微控制器,专为直流无刷电机(BLDC)的霍尔控制设计,是一套完整的底层驱动与控制框架。程序以CMSIS(Cortex Microcontroller Software Interface Standard)为基础,整合了核心寄存器操作、中断管理、时钟配置等底层功能,为BLDC电机的霍尔信号采集、转速控制、转向调节等核心控制逻辑提供稳定可靠的硬件抽象层支持,适用于需要高精度、高稳定性电机控制的场景,如工业自动化设备、智能家电、机器人驱动等。

vQAvXEsg的博客 992

STM32F103 基于输入捕获与定时器协同的多路风扇测速方案

本文详细介绍了基于STM32F103的输入捕获与定时器协同的多路风扇测速方案。通过硬件连接优化、定时器配置策略、中断处理技巧及转速计算实践,实现高精度、低资源占用的多路风扇转速测量。特别针对低速测量、电磁干扰等工程难题提供解决方案,适用于工业控制、服务器监控等场景。

weixin_29163797的博客 256

12、STM8(TIM1)定时器

文章目录1、概述1.1、定时器特点1.2、TIM1功能特点1.3、TIM1预分频器的实现1.4、向上计数模式1.5、向下计数模式1.6、中央对齐模式(向上/向下计数)1.7、定时器使用重点2、代码实现2.1、寄存器版2.2、库函数版 1、概述   STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1) 、通用型 (TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器来设计应用变得非常容易与方便 (相同的寄存器映射,相

嵌入式羊圈 2159

STM32单片机入门学习——第11节: [5-1] EXTI外部中断

本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!

qq_44764442的博客 1090

STM32F103外部中断原理与工程实践指南

外部中断是嵌入式系统实现硬件事件实时响应的核心机制,其本质是将GPIO电平跳变转化为可被CPU识别并处理的确定性事件。基于边沿触发原理(上升沿、下降沿、双边沿),它规避了电平触发在噪声环境下的重入风险,显著提升系统可靠性与实时性。在资源受限的MCU如STM32F103中,外部中断通过EXTI模块与NVIC协同工作,支撑按键检测、编码器解码、传感器唤醒等关键应用场景。结合触发方式选型、中断线映射、寄存器级配置及ISR编写规范,开发者可构建稳定低延迟的事件驱动架构。本文深入剖析下降沿触发、EXTI初始化流程等核

weixin_28721743的博客 181

Stm32学习笔记,3万字超详细

本文章主要记录本人在学习stm32过程中的笔记,也插入了不少的例程代码,方便到时候CV。绝大多数内容为本人手写,小部分来自stm32官方的中文参考手册以及网上其他文章;代码部分大多来自江科大和正点原子的例程,注释是我自己添加;配图来自江科大/正点原子/中文参考手册。笔记内容都是平时自己一点点添加,不知不觉都已经这么长了。其实每一个标题其实都可以发一篇,但是这样搞太琐碎了,所以还是就这样吧。

TheBszk的博客 10万+

超越音频!STM32 SAI接口在AD7768高速ADC采集中的妙用(含PCB布局指南)

本文深入探讨了如何将STM32的SAI接口应用于AD7768高速ADC的数据采集系统,超越了其传统的音频应用范畴。文章详细解析了SAI协议与ADC时序的匹配方法,提供了从CubeMX配置、DMA数据搬运到关键PCB布局指南的完整实战方案,旨在帮助工程师实现稳定、高精度的工业级高速数据采集。

efc12345678的博客 304

威联通改装飞牛fnOS全攻略:从刷机到Docker影视部署

NAS系统是家庭数字存储的核心,x86架构的威联通设备凭借通用引导和驱动支持,成为改装替代系统的理想平台。飞牛fnOS作为基于Debian的国产NAS系统,以简洁UI、内置Docker和影视墙以及硬件转码能力,吸引了大量玩家。通过U盘引导安装、BIOS调整、系统盘SSD部署,可实现系统切换;原机械硬盘可挂载为存储池,配合Docker部署下载、远程访问等容器,影视中心自动削刮海报墙,硬件转码保障4K播放。改装过程需注意引导失败、硬盘识别、核显驱动等问题。这套方案能让老旧威联通焕发新生,兼顾易用性与扩展性。本文

weixin_33585822的博客 742

学习记录:使用STM32外部输入中断

学习笔记:外部输入中断的概念,以及配置方法;STM32F1 的每个 IO 都可以作为外部中断的中断输入口,这点也是STM32F1 的强大之处。STM32F103 的中断控制器支持19个外部中断/事件请求。 每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103 的 19 个外部中断为: EXTI 线 0~15:对应外部 IO 口的输入中断。 EXTI 线 16:连接到 PVD 输出。 EXTI 线 17:连接到 RTC 闹钟事件。 EXTI 线 18:连接到 USB 唤醒事件。..

欢迎来到bitter tea seeds的博客,up会更新关于Multisim&MATLAB&嵌入式方面的内容,谢谢你的关注! 1394

基于ESP32-P4的低成本旋转式激光雷达系统设计

激光雷达(LiDAR)作为机器人环境感知的核心传感器,其本质是融合光学测距、机电控制与实时数据处理的嵌入式系统。理解时间飞行(ToF)原理与机械旋转耦合机制,是实现高精度点云采集的基础;而系统级误差源——如计时抖动、电机惯性、信号串扰和温漂——直接决定实际建图鲁棒性。在资源受限场景下,选用RISC-V双核MCU(如ESP32-P4)可兼顾实时控制与网络服务能力,通过硬件时间戳捕获、S型加减速轨迹规划、旋转变压器供电及双Bank OTA等工程手段,有效平衡分辨率、帧率与稳定性。本文围绕360°旋转式激光雷达的

weixin_36231030的博客 430

[STM32 HAL] 使用TIM 测量两次按键时间间隔

使用STM32HAL库,完成用TIM测量两次按键时间间隔

u011545492的博客 4381

dify工作流的原理

摘要: Dify 工作流是一个基于有向无环图(DAG)的智能任务编排系统,支持多节点(如LLM调用、API工具、条件分支等)的可视化拖拽与流程编排。其核心原理包括执行引擎(解析DAG并管理节点依赖)、上下文变量传递(类Jinja模板的变量引用机制)和状态持久化(存储执行日志与中间结果)。工作流通过事件驱动执行,支持异步任务调度,并与RAG知识库、LLM服务等模块深度集成,最终可发布为API或对话应用。技术栈基于Python(FastAPI+Celery)和PostgreSQL,实现低代码化的AI应用开发。

nbspzs的专栏 2186

f2fs学习笔记 - 3. F2FS文件系统布局

目录1.前言2.F2FS布局说明2.1. super block(block 0x0 ~ block 0x1ff)2.2 CP(block 0x200 ~ block 0x5ff)cp page1nat journalsit journaldata summarycurrent hot node summarycurrent warm node summarycurrent cold node summarycp page22nd checkpoint2.3 SIT(block 0x600 ~ block

HZero 4645

STM32F103学习笔记(标准库) 持续更新

启动时钟定义结构体(GPIO_PinGPIO_SpeedGPIO_Mode模式设置为推挽输出GPIO_Init端口号+结构体。

2303_79175394的博客 689

python 携程登陆_Python 学习练习之用户登录接口

目的:用python实现简单用户注册,登陆,加黑功能,放个流程图吧。以下内容仅为练习 执行流程:[root@zabbix login]# python user_login.pyusername:tompassword:123456Are you want to register ? [y/n]yRegister successful,Please relogin ![root@zabbix lo...

weixin_28679635的博客 515

STM32f103实现按键长按 短按 双击

注意的是delay.h中是笔者写的简单的延迟函数,自行使用大家的延迟函数即可,只在消抖处用到了延时函数,其余部分没用用到。下面为大家介绍以下大体思路,我们知道每个I/O端口都会对应一个EXIT中断,由此我们可以使用EXIT的双边沿触发来实现TIM定时器的开启关闭,当检测按下时开启TIM定时器,当检测松开按键时关闭TIM定时器,从而记录按键按下的时间,根据按键按下的时间长短不同可以判断按键的长短按,另外需要设定标志位来判断双击,下面开始上代码。

m0_65473174的博客 2100

从桨叶设计到电机匹配:手把手教你调出无人机最佳动力组合

本文系统介绍了无人机动力系统的核心匹配原则,重点解析了如何通过测试与数据分析,优化螺旋桨与电机的组合,从而显著提升系统力效与续航。文章提供了从参数解读、实战测试到深度调优的完整指南,帮助开发者解决电机过热、推力不足等常见问题,实现无人机性能最大化。

weixin_29305313的博客 235

【华为OD机试真题 2025C卷】895、贪心歌手 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷】895、贪心歌手 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华

KJ.JK 962
上一篇: Qt学习记录--QPushButton
下一篇: STM学习记录---MDK keil5暗色主题
python_use
博客等级 码龄5年 430粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值