打印
[STM32F4]

【STM32F469I试用】+任意IO口的呼吸灯~详细讲解!(多图慎入...

[复制链接]
7796|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
逍遥李|  楼主 | 2015-12-27 18:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 逍遥李 于 2015-12-27 18:57 编辑

呼吸灯很多人都玩过,大都使用PWM实现,如果LED管脚没有不是定时器通道怎么办?普通IO口如何实现呼吸灯效果?(循环方式不算啊,占用太多MCU时钟资源的也不算!)下面就是使用两个定时器来实现板子上LD1、LD2、LD3三个LED的呼吸灯效果的详细过程。

目的:
1、学习GPIO基本操作:置位、清零、翻转等函数。
2、学习定时器基本配置操作过程,学习定时器PWM输出配置。
3、学习定时器中断,中断回调函数的使用。
开发环境:cubemx 4.10+Keil V5.16

1)首先来看下F469Discovery板子上LED的硬件连接电路:


可以发现,这四个管脚都是没有PWM通道的
2)创建工程,打开定时器

说实话,看到这么多管脚,也是一头雾水,先不管它,打开TIM1和TIM2的时钟,并配置TIM1_CH1为PWM模式……

3)配置定时器
首先来看下时钟,默认16MHZ,不作修改

然后定时器1配置,预分频15,周期999

打开定时器1更新和输出比较中断

配置定时器2,预分频15,周期19999

打开定时器2全局中断

4)生成初始代码
注意选中图中小窗口……原因不多说……

5)打开工程后,进入tim.c中,找到下面这行代码:

移动到下面这个位置:

然后打开main.c,在用户变量定义区域增加下面这行代码:

这样还不够,继续定义两个变量,如下图

6)启动定时器1和定时器2

这三行代码一行不能少……,Base_Start_IT用于使能定时器溢出中断
7)为对比效果,主函数写个LD4的闪烁即可
        HAL_Delay(500);
        HAL_GPIO_TogglePin(GPIOK,GPIO_PIN_3);
8)呼吸灯相关代码:
前面说过,为了不占用太多MCU时钟资源,呼吸灯效果的实现是通过定时器中断回调函数来实现的,具体就是下面两个函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* NOTE : This function Should not be modified, when the callback is needed,
            the __HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
  if(htim==&htim1)
                {
                        HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,GPIO_PIN_RESET);
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET);
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);
                }
        else        if(htim==&htim2)
                {
                        if((Pulse+Shift)>999)
                                Shift =-20;
                        else if((Pulse+Shift)<30)
                                Shift =20;
                        Pulse        +=Shift;
                        sConfigOC.Pulse = Pulse;
                  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);        
                        HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_1);
                }
        else
                ;        
}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
  /* NOTE : This function Should not be modified, when the callback is needed,
            the __HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file
   */
  if(htim==&htim1)
                {
                        HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,GPIO_PIN_SET);
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
                }
        else
                ;
}

至此,整个工程就完成了,可以编译下载试下效果了~!
9)实际效果:






沙发
xiaoyuyzx| | 2016-1-6 20:33 | 只看该作者
大爱啊,楼主能不能给下完整的代码啊

使用特权

评论回复
板凳
wahahaheihei| | 2016-1-6 22:32 | 只看该作者
allback是编程语言中的一种可调用的方法(一般指函数)结构,比如 B(callback A),则可以在B中调A方法(有可能是匿名函数)
楼主,问一下,STM32提供的HAL库函数里面总是有callback不懂什么意思,讲一讲啊。

使用特权

评论回复
地板
逍遥李|  楼主 | 2016-1-7 08:38 | 只看该作者
wahahaheihei 发表于 2016-1-6 22:32
allback是编程语言中的一种可调用的方法(一般指函数)结构,比如 B(callback A),则可以在B中调A方法(有可能是 ...

callback”只是函数名的一部分,我个人理解是它也是函数而已,并没有什么特别的,只是callback翻译过来是“回调”的意思,就是说带有“callback”的函数一般都是会被其他函数在一定的条件下自动调用的(只是一般都需要用户重写),比如:外部中断回调函数、定时器更新回调、PWM回调……
HAL我也接触不久,只能说简单会用,讲还讲不太好,以上仅供参考!

使用特权

评论回复
5
逍遥李|  楼主 | 2016-1-7 08:50 | 只看该作者
xiaoyuyzx 发表于 2016-1-6 20:33
大爱啊,楼主能不能给下完整的代码啊

文件太大无法上传,我回头把源文件删掉上传过来,不在工作电脑上

使用特权

评论回复
6
赤井秀1| | 2016-3-7 20:34 | 只看该作者
楼主要不把文件夹一个一个发来!   小白在此谢过!!!

使用特权

评论回复
7
逍遥李|  楼主 | 2016-3-10 23:54 | 只看该作者
赤井秀1 发表于 2016-3-7 20:34
楼主要不把文件夹一个一个发来!   小白在此谢过!!!

还需要吗?这个时间有点久了,我需要再找找

使用特权

评论回复
8
maxwell449449| | 2016-10-26 16:58 | 只看该作者
逍遥李 发表于 2016-3-10 23:54
还需要吗?这个时间有点久了,我需要再找找

大侠发个呼吸灯例程谢谢啦

使用特权

评论回复
9
weidni2009| | 2017-2-21 16:10 | 只看该作者
mark!

使用特权

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

本版积分规则

57

主题

1315

帖子

32

粉丝