[应用相关]

基于stm32通用定时器延时实现LED闪烁经验分享

[复制链接]
192|11
手机看帖
扫描二维码
随时随地手机跟帖
flycamelaaa|  楼主 | 2023-5-4 10:15 | 显示全部楼层 |阅读模式
stm32有很多定时器,每种定时器的功能也不尽相同,今天学习了如何用通用定时器实现1s延时,使LED灯闪烁,现总结如下:

步骤总结:
使能定时器时钟->配置定时器结构体->清空定时器标志位->开启定时器中断->使能定时器->编写中断服务函数

Timer.c:
  • #include "Timer.h"
  • void TimerBase_Config(void)
  • {
  •         //开时钟
  •         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  •         //定义结构体变量
  •         TIM_TimeBaseInitTypeDef TimerBaseInitStructure;
  •         NVIC_InitTypeDef NVICInitStructure;
  •         //配置定时器结构体
  •         TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  •         TimerBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  •         TimerBaseInitStructure.TIM_Period = 10000;
  •         TimerBaseInitStructure.TIM_Prescaler = 7200;
  •         TIM_TimeBaseInit(TIM2, &TimerBaseInitStructure);
  •         //清空标志位
  •         TIM_ClearFlag(TIM2,TIM_FLAG_Update);
  •         //开启定时器中断
  •         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  •         //使能定时器
  •         TIM_Cmd(TIM2,ENABLE);
  •         //配置NVIC结构体
  •         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  •         NVICInitStructure.NVIC_IRQChannel = TIM2_IRQn;
  •         NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;
  •         NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  •         NVICInitStructure.NVIC_IRQChannelSubPriority = 1;
  •         NVIC_Init(&NVICInitStructure);
  • }

复制代码



stm32f103x_it.c:
  • void TIM2_IRQHandler(void)
  • {
  •         static uint16_t temp;
  •         if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
  •         {
  •                 if(temp ++ %2 == 1)
  •                 {
  •                         GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
  •                 }
  •                 else
  •                 {
  •                         GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
  •                 }
  •         }
  •         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  • }

复制代码


main.c:
  • #include "stm32f10x.h"
  • #include "led.h"
  • #include "Timer.h"
  • int main(void)
  • {
  •         TimerBase_Config();
  •         LED_GPIO_Confing();
  •         GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
  •         while(1)
  •         {
  •         }
  • }

复制代码


注意事项:
一定要记得清空标志位,尤其是中断服务函数里的清空标志位,博主就因为此检查好长时间

使用特权

评论回复
童雨竹| | 2024-3-22 07:02 | 显示全部楼层

这些引线越窄越好

使用特权

评论回复
Wordsworth| | 2024-3-22 08:05 | 显示全部楼层

图像由前景和背景组成,在灰度直方图上,前景和背景会形成高峰,在双峰之间的最低谷处就是阈值。

使用特权

评论回复
Clyde011| | 2024-3-22 09:08 | 显示全部楼层

要将多余空间去除。对于第一个字符从第一行开始向下扫描,把那些一行中所有的点的灰度值全为0的点去掉,直到扫描到有一行不全为0时为止。

使用特权

评论回复
公羊子丹| | 2024-3-22 10:01 | 显示全部楼层

输入滤波电容的公共端应作为其他交流电流地的唯一接点

使用特权

评论回复
万图| | 2024-3-22 11:04 | 显示全部楼层

根据色彩的变化记录每一行的颜色跳变点,由此识别出车牌区域。

使用特权

评论回复
Uriah| | 2024-3-22 12:07 | 显示全部楼层

切割完了第四个字符之后,再依次扫描剩下的空间,直到所扫描的这一竖上的所有点的灰度值不全为0时,认为是字符的开始并依次扫描直到所扫描的这一竖上的所有点的灰度值全为0时认为是字符的结束。

使用特权

评论回复
帛灿灿| | 2024-3-22 14:03 | 显示全部楼层

计算量小,计算快。缺点也严重:在不同的图像中,颜色分布差别大,处理效果也不会很好。

使用特权

评论回复
Bblythe| | 2024-3-22 15:06 | 显示全部楼层

在内存中开辟七个长为车牌长的七分之一和宽为车牌宽的区域

使用特权

评论回复
周半梅| | 2024-3-22 17:02 | 显示全部楼层

把纹波电流分摊到每个电容上

使用特权

评论回复
Pulitzer| | 2024-3-22 18:05 | 显示全部楼层

分别记录车牌区域的上下高度。然后通过RGB-HSV颜色转换

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

519

主题

1699

帖子

0

粉丝