作为初学者,刚刚接触STM32,所以文章有何不妥之处,敬请指出,一定会改。

听说呼吸灯是很久以前的事情了,那时候刚刚学习51单片机,没有单片机的基础。后来在网上看到了一个呼吸灯的电路图,甚是复杂,根本看不懂,无奈之下放弃了呼吸灯的制作。在接触了STM32后,发现呼吸灯还是比较容易实现的,而且不需要什么硬件知识就可以完成。于是开始尝试做呼吸灯了。

其实做呼吸灯还是有一些波折的,程序有各种版本,且由于刚刚学习STM32——看不懂程序,所以在了解了大概的思路后,便开始自己尝试写程序了。哈哈美图隔开。

下面进入今天的正题——呼吸灯。

首先我们应该了解呼吸灯的基本原理——关键是用STM32输出占空比可调的方波。

用到了STM32的PWM输出,我们就必须了解它。STM32是带有PWM输出功能的。我们以TIM3来实现PWM的输出。

关于TIM3大家可以查阅STM32的相关资料,在这里我不在详解。

由以上可知道我们必须让STM32输出PWM或者说输出方波,因此我们必须知道怎么让STM32输出PWM。

用STM32输出占空比可调的PWM制作呼吸灯的步骤:(自己感觉很重要)

① 配置系统时钟(RCC_Config)

② 配置GPIO口(TIM3_GPIO_Config)

③ 配置TIMER(TIM3_Mode_Config)

④ 写实现呼吸灯的主体程序

⑤ 进行呼吸灯的调试

现在我们来一步一步理解程序:

① 配置系统时钟(RCC_Config):

将TIM3和GPIO的时钟打开。

由以上可以看出:

TIM3挂载在APB1

GPIO挂载在APB2

② 配置GPIO口(TIM3_GPIO_Config):

这里新手一般都会很疑惑,尤其是自学者都不知道为什么要设置Pin,Mode,Speed等等。

还有人常常有疑问,再用某个功能之前我怎么知道都要设置哪些东西。其实大家可以看看学习STM32至关重要的资料——STM32固件库手册,便会有所了解。

③ 配置TIMER(TIM3_Mode_Config)

void TIM3_Mode_Config(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//设置一个TIM_TimeBaseStructure结构体。

TIM_OCInitTypeDef TIM_OCInitStructure;//设置一个TIM_OCInitStructure结构体。

TIM_TimeBaseStructure.TIM_Period=1000-1;//个人理解就是计几个数。(由此可以得到PWM的周期)

TIM_TimeBaseStructure.TIM_Prescaler=0;//设置用来作为 TIMx 时钟频率除数的预分频值。

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割。

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//选择了计数器模式。

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//将设置好的参数初始化。

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置TIM输出模式PWM1。

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//选择输出比较状态(?)

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//TIM 输出比较极性高。

TIM_OCInitStructure.TIM_Pulse=CCR1_Val;//设置了待装入捕获比较寄存器的脉冲值。

TIM_OC1Init(TIM3, &TIM_OCInitStructure);//将设定好的参数初始化给通道1。

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能TIM3在CCR1上的预装载寄存器。

TIM_OCInitStructure.TIM_Pulse=CCR2_Val;

TIM_OC2Init(TIM3,&TIM_OCInitStructure);//通道2

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM3,ENABLE);//使能TIM3在 ARR 上的预装载寄存器。

TIM_Cmd(TIM3,ENABLE);//使能TIM3的外设

}

④ 写实现呼吸灯的主体程序:

其实这就是主函数,任何情况下主函数是必须有的。这个呼吸灯实现的方法和网上的大神写的差很多,但是它实现了呼吸灯的逐渐明暗,自我感觉适合初学者学习呼吸灯以后大家把STM32学习的比较明白了后,就自然而然会写那些更加“高大上”的呼吸灯程序了。

为了方便自学初学的需要下面添加一些附件(芯片型号和整体程序)

① 芯片信号STM32F103RB,晶振用的是8M。

② 整体程序:

#include "stm32f10x.h"

u16 CCR1_Val=1000;

u16 CCR2_Val=0;

u8 a=0;

void Delay(__IO u32 nCount)

{

while(nCount--);

}

void RCC_Config(void)

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

}

void TIM3_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;//设置一个GPIO_InitStructure结构体。

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//选择引脚6和7。

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//选择输出模式为复用推挽输出。

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置引脚最高输出速率为50MHz。

GPIO_Init(GPIOA,&GPIO_InitStructure);//将设定好的参数初始化。

}

void TIM3_Mode_Config(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//设置一个TIM_TimeBaseStructure结构体。

TIM_OCInitTypeDef TIM_OCInitStructure;//设置一个TIM_OCInitStructure结构体。

TIM_TimeBaseStructure.TIM_Period=1000-1;//个人理解就是计几个数。(由此可以得到PWM的周期)

TIM_TimeBaseStructure.TIM_Prescaler=0;//设置用来作为 TIMx 时钟频率除数的预分频值。

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割。

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//选择了计数器模式。

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//将设置好的参数初始化。

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置TIM输出模式PWM1。

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//选择输出比较状态(?)

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//TIM 输出比较极性高。

TIM_OCInitStructure.TIM_Pulse=CCR1_Val;//设置了待装入捕获比较寄存器的脉冲值。

TIM_OC1Init(TIM3, &TIM_OCInitStructure);//将设定好的参数初始化给通道1。

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能TIM3在CCR1上的预装载寄存器。

TIM_OCInitStructure.TIM_Pulse=CCR2_Val;

TIM_OC2Init(TIM3,&TIM_OCInitStructure);//通道2

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM3,ENABLE);//使能TIM3在 ARR 上的预装载寄存器。

TIM_Cmd(TIM3,ENABLE);//使能TIM3的外设

}

int main(void)

{

RCC_Config();

TIM3_GPIO_Config();

TIM3_Mode_Config();

while(1)

{

if(CCR1_Val>0&&a<40&&CCR2_Val<1000)

{

CCR1_Val-=25;

CCR2_Val+=25;

TIM3_Mode_Config();

a++;

Delay(0XF424);

}

else

{

CCR1_Val+=25;

CCR2_Val-=25;

TIM3_Mode_Config();

Delay(0XF424);

a++;

if(a==80)a=0;

}

}

}

stm32呼吸灯c语言程序,STM32之呼吸灯相关推荐

  1. stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果

    实验的STM32型号: STM32F103C8T6   48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...

  2. stm32流水灯c语言程序,STM32——流水灯程序

    STM32--流水灯 stm32f10x_conf.h:打开stm32f10x_gpio.h和stm32f10x_rcc.h: stm32f10x_gpio.c 和 stm32f10x_rcc.c加入 ...

  3. stm32流水灯c语言程序,stm32流水灯程序源码

    #include "STM32f10x.h" #include #include "delay.h" /**************************** ...

  4. led流水灯c语言程序移位,LED流水灯程序 移位写法

    /*********** (C) COPYRIGHT 201 2************ * 程序作者: 蓝雨(QQ:983931459 ,Email:chenhengchuan@163.com) * ...

  5. 8个灯以此点亮c语言程序,单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS)...

    #include #include void delayms(unsigned char ms) // 延时子程序 { unsigned char i; while(ms--) { for(i = 0 ...

  6. 按钮查询方式控制交通灯c语言程序,单片机控制交通灯(内含程序和实物图)

    模拟交通灯控制系统 摘要:随着经济发展,汽车数量急剧增加,城市道路日渐拥挤,交通拥塞已成为一个国际性的问题.因此,设计可靠.安全.便捷的多功能交通灯控制系统有极大的现实必要性.根据交通灯在实际控制中的 ...

  7. msp430流水灯c语言程序,MSP430单片机流水灯程序

    unsigned int i = 0; unsigned int flag = 0 ,speed = 0; /****************主函数****************/ void mai ...

  8. AT89C51单片机流水灯c语言程序及详解(扫盲教程)

    AT89C51单片机是我们学习单片机必学的一个单片机,也是单片机入门的教材,下面给大家展示一下流水灯的编写方法适合初学者 首先先在proteus画出仿真图,方便仿真程序 下面来编写程序,先来写入头函数 ...

  9. msp心形16个闪灯c语言程序,心形流水灯程序

    标签: 心形 心形 流水灯程序 流水灯程序 心形流水灯,是用了10多种不同led流水方式 文档内容节选 includereg52h include intrinsh define uint unsig ...

  10. 单片机交通灯灯c语言程序,51单片机用C语言实现交通灯(红绿灯)源程序

    51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: /* 1.程序目的:使用 ...

最新文章

  1. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁
  2. Leetcode题库 32.从上到下打印二叉树(层次遍历 C实现)
  3. python-自动发邮件
  4. Vue 组件间通信六种方式
  5. java线程工作内存在栈中吗_JVM常见面试题解析
  6. 第二十六讲:tapestry的树状(tree)组件
  7. windows控制台中文乱码解决方法
  8. 二十五、K8s系统强化1- 系统安全与apparmor
  9. 排序 不用order by_Sort Techniques:介绍九种排序算法
  10. 找到所需的产品或服务
  11. flac文件转换成mp3格式
  12. 百度AI市场MYNT EYE小觅双目摄像机开箱试用全记录
  13. python抢注最新到期删除域名!
  14. unity 中是如何实现游戏人物换装的
  15. js案例一 :方块拖动效果
  16. 《智能制造时代的研发智慧:知识工程2.0》一第3章 隐性知识的显性化
  17. 无人驾驶小车调试笔记(五)-- 命令行通信
  18. 淘宝标题优化技巧有哪些禁区注意事项
  19. Windows Server 2008(修改计算机名并加入工作组)
  20. LWIP轻量级TCPIP协议栈的移植

热门文章

  1. C# 驱动级模拟键盘输入
  2. [Realtek sdk-3.4.14b]升级iptables以支持IPv6 DHCPV6 NAT6的MASQUERADE属性(原厂默认iptables不支持NAT6)
  3. Never give up!!
  4. unity 暂停按钮_Unity VideoPlayer教程之 视频播放暂停切换
  5. 扫描探针显微术入门(4)
  6. 电脑声控 电脑机器人功能
  7. pytorch drop_last参数
  8. 很多次游戏的最后取胜实际上都有很强的偶然性
  9. 安装WebStorm激活码失效解决方法
  10. 操作系统与内核的关系