STM32使用PWM控制LED呼吸灯效果

发布者:老王古玩店最新更新时间:2017-09-12 来源: eefocus关键字:STM32  PWM控制  LED呼吸灯 手机看文章 扫描二维码
随时随地手机看文章

实验的STM32型号:

STM32F103C8T6   48引脚

涉及到的知识:

RCC,GPIO,TIMER,PWM 设置

*RCC需打开外部时钟

*GPIO查表得知 PA3 默认复用引脚 TIM2_CH4

*TIMER使用默认的TIM2_CH4

*PWM的控制使用了动态的占空比来达到呼吸效果

下面给出代码:


  1. #include "stm32f10x.h"  

  2.   

  3. void RCC_cfg(void);  

  4. void GPIO_cfg(void);  

  5. void TIMER_cfg(void);  

  6. void PWM_cfg(void);  

  7.   

  8. int led_fx=1;  

  9. int led_dt=0;  

  10.        

  11. void delay_ms(u16 time)  

  12. {      

  13.    u16 i=0;    

  14.    while(time--)  

  15.    {  

  16.       i=12000;    

  17.       while(i--) ;      

  18.    }  

  19. }  

  20.   

  21. int main(void)  

  22. {  

  23.    RCC_cfg();  

  24.    GPIO_cfg();  

  25.    TIMER_cfg();  

  26.    PWM_cfg();  

  27.    //使能TIM2计时器,开始输出PWM  

  28.    TIM_Cmd(TIM2, ENABLE);  

  29.    while(1)  

  30.          {  

  31.           delay_ms(5);  

  32.          if(led_fx==1)  

  33.          {  

  34.                  led_dt++;  

  35.          }  

  36.          else  

  37.          {  

  38.            led_dt--;  

  39.          }  

  40.          if(led_dt>500) led_fx=0;  

  41.          if(led_dt==0)   led_fx=1;  

  42.          TIM_SetCompare4(TIM2,led_dt);  

  43.    }     

  44. }  

  45.   

  46. void RCC_cfg(void)  

  47. {  

  48.        //定义错误状态变量  

  49.        ErrorStatus HSEStartUpStatus;  

  50.        //将RCC寄存器重新设置为默认值  

  51.        RCC_DeInit();  

  52.        //打开外部高速时钟晶振  

  53.        RCC_HSEConfig(RCC_HSE_ON);  

  54.        //等待外部高速时钟晶振工作  

  55.        HSEStartUpStatus = RCC_WaitForHSEStartUp();  

  56.        if(HSEStartUpStatus == SUCCESS)  

  57.        {  

  58.               //设置AHB时钟(HCLK)为系统时钟  

  59.               RCC_HCLKConfig(RCC_SYSCLK_Div1);  

  60.               //设置高速AHB时钟(APB2)为HCLK时钟  

  61.               RCC_PCLK2Config(RCC_HCLK_Div1);  

  62.               //设置低速AHB时钟(APB1)为HCLK的2分频  

  63.               RCC_PCLK1Config(RCC_HCLK_Div2);  

  64.               //设置FLASH代码延时  

  65.               FLASH_SetLatency(FLASH_Latency_2);  

  66.                //使能预取指缓存  

  67.               FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  

  68.               //设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz  

  69.               RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  

  70.               //使能PLL  

  71.               RCC_PLLCmd(ENABLE);  

  72.               //等待PLL准备就绪  

  73.               while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  

  74.               //设置PLL为系统时钟源  

  75.               RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

  76.               //判断PLL是否是系统时钟  

  77.               while(RCC_GetSYSCLKSource() != 0x08);  

  78.        }  

  79.        //开启TIM2的时钟  

  80.        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  

  81.        //开启GPIOB的时钟和复用功能  

  82.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);  

  83. }  

  84.   

  85. void GPIO_cfg(void)  

  86. {  

  87.        GPIO_InitTypeDef GPIO_InitStructure;  

  88.     // GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);     //映射引脚,默认PA3 ->TIM2_CH4因此不用映射  

  89.        //选择引脚3  

  90.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  

  91.        //输出频率最大50MHz                                                          

  92.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  93.        //复用推挽输出                                                

  94.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   

  95.          //PA  

  96.        GPIO_Init(GPIOA,&GPIO_InitStructure);  

  97. }  

  98.   

  99. void TIMER_cfg(void)  

  100. {  

  101.        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  

  102.        //重新将Timer设置为缺省值  

  103.        TIM_DeInit(TIM2);  

  104.        //采用内部时钟给TIM2提供时钟源  

  105.        TIM_InternalClockConfig(TIM2);  

  106.        //预分频系数为0  

  107.        TIM_TimeBaseStructure.TIM_Prescaler = 0;  

  108.        //设置计数溢出大小  

  109.        TIM_TimeBaseStructure.TIM_Period = 500;    

  110.        //设置计数器模式为向上计数模式(+1)  

  111.        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    

  112.        //设置时钟分割  

  113.        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  

  114.        //将配置应用到TIM2中  

  115.        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);  

  116. }  

  117.   

  118. void PWM_cfg(void)  

  119. {  

  120.        TIM_OCInitTypeDef TimOCInitStructure;  

  121.        //设置缺省值  

  122.        TIM_OCStructInit(&TimOCInitStructure);  

  123.        //PWM模式1输出  

  124.        TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  

  125.        //设置占空比 (Led亮度)  

  126.        TimOCInitStructure.TIM_Pulse = 0;  

  127.        //TIM输出比较极性高  

  128.        TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  

  129.        //使能输出状态  

  130.        TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  

  131.        //TIM2的CH4输出  

  132.        TIM_OC4Init(TIM2, &TimOCInitStructure);  

  133.        //设置TIM2的PWM输出为使能  

  134.        TIM_CtrlPWMOutputs(TIM2,ENABLE);  

  135. }  


关键字:STM32  PWM控制  LED呼吸灯 引用地址:STM32使用PWM控制LED呼吸灯效果

上一篇:s3c6410的GPIO驱动总结
下一篇:STM32 控制4位共阳数码管输出计数

推荐阅读最新更新时间:2024-03-16 15:36

STM32学习—如何选择各个电路部分的主要芯片
电路设计的基本过程一般是这样的:需求分析——元件选型——原理图设计——PCB设计——焊接调试。 ▼需求分析: 在这里,主要是确定小车需要哪些模块、外设或接口。首先,STM32最小系统是必须的,这是小车控制的核心。然后小车的两个轮子需要两个H桥驱动和编码器接口。需要陀螺仪感知小车的姿态(包括倾角,转向角,角速度等)。需要一些调试和指示用的外设(蜂鸣器,LED等)。需要电源电路为系统供电。需要电池电压采集电路来实时采集电池电压,做低压报警,防止电池过放。需要下载接口和调试用的串口。基本就是根据自己想要实现功能,然后确定需要那些部分的电路。 ▼元件选型: 为需要的各个部分电路选择元件,一般来说,主要是选择何种型号、什么封装的芯片
[单片机]
<font color='red'>STM32</font>学习—如何选择各个电路部分的主要芯片
STM32双路信号源及配置平台电路设计
随着在雷达探测、仪表测量、化学分析等领域研究的不断深入,不仅要求定性的完成目标检测,更加需要往高精度、高分辨率成像的方向发展。一方面,产生频率、幅度灵活可控,尤其是低相位噪声、低杂散的频率源对许多仪器设备起着关键作用。另一方面,电子元器件实际性能参数并非理想以及来存在自外部内部的干扰,大量的误差因素会严重影响系统的准确性。双路参数可调的信号源可有效地对系统误差、信号通道间不平衡进行较调,并且可以产生严格正交或相关的信号,这在弱信号检测中发挥重要作用。为此本文采用双通道DDS方法,以STM32($18.3200)为控制器,完成了一种高分辨率灵活可调的双路信号源电路设计。 最终设计出的滤波器结构参数及仿真结果如图1所示。 图1
[单片机]
<font color='red'>STM32</font>双路信号源及配置平台电路设计
STM32—位带操作
STM32中的位带操作: 名字为位带操作,实际上是对位的操作,位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见。 51 单片机中通过关键字 sbit 来实现位定义, STM32 没有这样的关键字,而是通过访问位带别名区来实现。STM32 的全部寄存器都可以通过访问位带别名区的方式来达到访问原始寄存器比特位的效果,这比 51 单片机强大很多。因为 51 单片机里面并不是所有的寄存器都是可以比特位操作,有些寄存器还是得字节操作,比如 SBUF。 51单片机中的位操作: 51单片机中可以对寄存器实现单个位的操作,靠的就是关键字sbit,如 sbit led=P1^0; led=1;就可实现对P1.0位置1的效果
[单片机]
再造STM32---第七部分:初识 STM32 固件库
本章参考资料:《STM32F4xx 参考手册》、《STM32F4xx 规格书》、《Cortex-M3 权威指南》 , STM32 标准库帮助文档:《stm32f4xx_dsp_stdperiph_lib_um.chm》。在上一章中,我们构建了几个控制 GPIO 外设的函数,算是实现了函数库的雏形,但GPIO 还有很多功能函数我们没有实现,而且 STM32 芯片不仅仅只有 GPIO 这一个外设。 如果我们想要亲自完成这个函数库,工作量是非常巨大的。 ST 公司提供的标准软件库,包含了 STM32 芯片所有寄存器的控制操作,我们直接学习如何使用 ST 标准库,会极大地方便控制 STM32 芯片。 7.1 CMSIS
[单片机]
再造STM32---第七部分:初识 <font color='red'>STM32</font> 固件库
STM32-IIC模拟从模式
这里是讲的模拟IIC,不是采用硬件IIC。为啥用软件模拟IIC而不用硬件IIC? 除了ST的IIC模块本身问题,还因为硬件IIC移植不方便,在不同的MCU中无法通用;而且有的项目需要在IIC主从模式切换。 网上的资料大部分都是模拟IIC主模式的,很少有资料告诉我怎么实现模拟IIC从模式。 因为特殊要求,我们在做汽车电容屏升级的时候,要扔掉原车屏的一个部件,即IIC从机部分,只保留IIC主芯片,并采用STM32替代被扔掉的IIC从机功能,而且在不同应用内容下,需要切换IIC的主从工作模式。 要实现IIC从机功能,最核心的部分就是如何精确的抓住IIC_SCL,也就是IIC主机发出来的时钟信号。只有抓住精确的时钟SCL,才能正确的读取到
[单片机]
stm32 片上flash用作EEPROM(掉电保存)
#if !defined (_FLASH_H) #define _FLASH_H #define FLASH_ADR 0x08010000 //要写入数据的地址 #define u8 INT8U #define u16 INT16U #define u32 INT32U union union_temp16 { unsigned int un_temp16; unsigned char un_temp8 ; // example 16: 0x0102 8: 2 1 }my_unTemp16; typedef struct { u8 apn ; u8 useName ; u8 password ; u8 serverIP
[单片机]
基于STM32的OV7670摄像头总结
一、OV7670模块: 介绍一下OV7670传感器:CMOS器件;标准的SCCB接口,兼容IIC接口;内置感光阵列,时序发生器,AD转换器,模拟信号处理,数字信号处理器..... 大致工作过程:光照射到感光阵列产生相应电荷,传输到相应的模拟信号处理单元,再由AD转换为数字信号,在经由数字信号处理器插值到RGB信号,最后传输到屏幕上...... 先了解一下基础知识:现在市面上的OV7670模块分两种:1、带FIFO芯片;2、不带FIFO芯片。当然带FIFO的要贵一点~下面介绍带FIFO和不带FIFO的工作原理: 图1:不带FIFO 图2:带FIFO 下面就讲解这两种方式的适用范围: 不带FIFO:这种方法最
[单片机]
基于<font color='red'>STM32</font>的OV7670摄像头总结
SPI接口说明及原理
1简介 SPI:Serial Peripheral Interface,是串行外设接口。 SPI是由摩托罗拉于 1985 年前后开发,是一种适用于短距离、设备到设备通信的同步串行接口。 从那时起,这种接口就已成为许多半导体制造商,特别是微控制器(MCU)和微处理器(MPU)采用的事实标准。 2SPI接口 SPI总线是一种4线总线,通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以。 MOSI:Master Output Slave Input,主设备数据输出,从设备数据输入; MISO:Master Input Slave Output,主设备数据输入,从设备数据输出; SCLK:Serial Clock,时
[单片机]
SPI接口说明及原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved