当前位置: 首页 > news >正文

使用定时器消除抖动

问题:定时器中断和按键中断属于什么操作模式,轮询吗?

具体怎么实现

定时器中断  (判断)        时间参数           按键中断(修改)

中断 向量表.s文件

        DCD     SysTick_Handler            ; SysTick Handler

中断文件中定时器相关的
stm32f1xx_it.c

void SysTick_Handler(void)
{HAL_IncTick();//增加计数值,extern void check_timer(void);check_timer();}

stm32f1xxx_hal.c 

__weak void HAL_IncTick(void)
{uwTick += uwTickFreq;
}__weak uint32_t HAL_GetTick(void)
{return uwTick;
}

main.c

指针的时间和时钟的时间

pTimer结构体包含时间和处理计数值的函数

在系统的时钟处理函数处加上时钟检查函数,check_timer中的if语句限制  指针时间小于等于时钟时间

如果中断,通过中断回调函数让自己指针的时间加10ms,期间若又发生中断,指针时间再加10,

当未发生中断或者中断(n*10)ms内,都不满足进入check_timer中的if函数体的条件;

直至没有抖动时候进入if函数体中,通过定时器函数和check_timer函数调用结构体中的函数,使计数值增加

struct soft_timer {uint32_t timeout;void * args;void (*func)(void *);
};int g_key_cnt = 0;void key_timeout_func(void *args);
struct soft_timer key_timer = {~0, NULL, key_timeout_func};
void key_timeout_func(void *args)
{g_key_cnt++;key_timer.timeout = ~0;
}void mod_timer(struct soft_timer *pTimer, uint32_t timeout)
{pTimer->timeout = HAL_GetTick() + timeout;
}void check_timer(void)
{if (key_timer.timeout <= HAL_GetTick()){key_timer.func(key_timer.args);}
}、、数据处理的源头,发生中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_14){		mod_timer(&key_timer, 10);}
}
int main(){OLED_Init();	 OLED_Clear();   OLED_PrintString(0, 4, "Key ISR cnt = ");while (1){OLED_PrintSignedVal(0, 6, g_key_cnt);}}

stm32f1xx_it.c

          DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10

void EXTI15_10_IRQHandler(void)
{/* USER CODE BEGIN EXTI15_10_IRQn 0 *//* USER CODE END EXTI15_10_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);/* USER CODE BEGIN EXTI15_10_IRQn 1 *//* USER CODE END EXTI15_10_IRQn 1 */
}

 stm32f1xxx_hal_gpio.c  

数据处理的源头,发生中断

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{/* EXTI line interrupt detected */if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);}
}

http://www.lryc.cn/news/398007.html

相关文章:

  • IOS热门面试题一
  • 构建LangChain应用程序的示例代码:62、如何使用Oracle AI向量搜索和Langchain构建端到端的RAG(检索增强生成)pipeline
  • ffmpeg转换MP4为gif命令
  • kotlin Flow 学习指南 (三)最终篇
  • Memcached负载均衡:揭秘高效缓存分发策略
  • 【Python实战因果推断】31_双重差分2
  • ArcGIS中使用线快速构造成面的方法
  • Spring AOP的几种实现方式
  • 字节码编程bytebuddy之实现抽象类并并添加自定义注解
  • LLM-阿里云 DashVector + ModelScope 多模态向量化实时文本搜图实战总结
  • CentOS7安装部署git和gitlab
  • 《昇思25天学习打卡营第16天|基于MindNLP+MusicGen生成自己的个性化音乐》
  • 算法学习day10(贪心算法)
  • 卡尔曼滤波Kalman Filter零基础入门到实践(上部)
  • 力扣-dfs
  • keepalived高可用集群
  • 文献翻译与阅读《Integration Approaches for Heterogeneous Big Data: A Survey》
  • 应用最优化方法及MATLAB实现——第3章代码实现
  • django的增删改查,排序,分组等常用的ORM操作
  • Leetcode Java学习记录——树、二叉树、二叉搜索树
  • 华为HCIP Datacom H12-821 卷30
  • element el-table实现表格动态增加/删除/编辑表格行,带校验规则
  • QT调节屏幕亮度
  • 实变函数精解【3】
  • JVM:SpringBoot TomcatEmbeddedWebappClassLoader
  • 蜂窝互联网接入:连接世界的无缝体验
  • Sprint Boot 2 核心功能(一)
  • GitLab CI/CD实现项目自动化部署
  • 阿里云调整全球布局关停澳洲云服务器,澳洲服务器市场如何选择稳定可靠的云服务?
  • 排序(二)——快速排序(QuickSort)