STM32单片机简易定时器PWM输出

发布者:AngelicHeart最新更新时间:2015-06-23 来源: 51hei关键字:STM32  单片机  定时器  PWM输出 手机看文章 扫描二维码
随时随地手机看文章
由于RCC->CFGR时钟配置寄存器中  APB1设置为2分频,所以TIM3就是其倍频==72M

上次我发表的STM32单片机自带PWM输出实验大家可以参考学习: http://www.51hei.com/mcu/2123.html ,这次是用定时器产生的pwm.
 
//----------------------------------定时器-----------time.c-----------
#include "time.h"

 
void time_init(u16 arr,u16 psc)
{
 RCC->APB1ENR|=1<<1; //TIM2定时器时钟使能
 TIM3->ARR=arr;        //设置重装载值
 TIM3->PSC=psc;       //设置分配系数
 TIM3->DIER|=1<<0; //允许更新
 TIM3->DIER|=1<<6;      //触发中断使能
 TIM3->CR1|=1<<0;       //使能定时器2
 MY_NVIC_Init(2,2,TIM3_IRQChannel,2);  //设置定时器2中断类别
 
}

//----------------time.h--------------
#ifndef _time_h
#define _time_h
#include "sys.h"
 
void time_init(u16 arr,u16 psc);
#endif
//----------------------按键-----key.c------------
#include "key.h"

 
void key_init(void)
{
 RCC->APB2ENR|=1<<2;    //PORTA时钟使能
 GPIOA->CRH&=0x0f0fffff;
 GPIOA->CRH|=0x80800000;  //设置为输入
 GPIOA->ODR|=1<<15;
 GPIOA->ODR|=1<<13;

 
}

 
//-------------------key.h----------------
#ifndef _key_h
#define _key_h
#include "sys.h"
#define key1 PAin(13)
#define key2 PAin(15)
void key_init(void);

 
#endif
//-------------------LED---------led.c-------------
#include "led.h"
void led_init(void)
{
 RCC->APB2ENR|=1<<2;
 RCC->APB2ENR|=1<<5;   //使能PORTD时钟
 GPIOA->CRH&=0xfffffff0;
 GPIOA->CRH|=0x00000003;  //PA8推挽输出
 GPIOD->CRL&=0xfffff0ff;
 GPIOD->CRL|=0x00000300;  //PD2推挽输出
 GPIOA->ODR|=1<<8;
 GPIOD->ODR|=1<<2;

 
}
//------------------led.h---------------------
 #ifndef _led_h
 
#define _led_h
#include "sys.h"

 
#define LED0 PAout(8)
#define LED1 PDout(2)
[page]
 
void led_init(void);

 
#endif

//------------------------主函数-----------test.c-----------
#include
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "time.h"            

 
char pwm;       //pwm增减量
char cnt;         //pwm时间变量

 
//-----------------------pwm增量按键----------------
void key1_scan()
{
  static u8 i,j;
 if(key1==0)
 {
if(i==0)
{
j++;
if(j>3)
{
i=1;j=0;
pwm+=5;
if(pwm>100)pwm=0;
}
   }
 }
 else
  {
i=j=0;
  }
}

 
//--------------------pwm减量按键--------------------
void key2_scan()
{
  static u8 i,j;
 if(key2==0)
 {
if(i==0)
{
j++;
if(j>3)
{
i=1;j=0;
pwm-=5;
if(pwm<10)pwm=0;
}
   }
 }
 else
  {
i=j=0;
  }
}

 
void TIM3_IRQHandler(void) //定时器2中断函数
{
   if(TIM3->SR&0x0001)
   {
cnt++;
if(cnt>100)cnt=0;
if(cnt>pwm)                   //LED0作为pwm 输出指示
{
 LED0=0;
}
else
{
 LED0=1;
}
   }
   TIM3->SR&=~(1<<0);         //清除中断标志位
}

 

 
int main(void)
{
 u16 i,t;
 Stm32_Clock_Init(9);
 delay_init(72);
 uart_init(72,9600);
 led_init();
 key_init();
 time_init(3600,1);                        //产生10K频率      pwm只是~~100HZ  由于100分频
 while(1)
 {
  key1_scan();
  key2_scan();
  t++;
  if(t>60000)
  {
    i++;
if(i>11)
{
LED1=!LED1;       //系统运行指示约1秒闪烁一次
i=0;
    }
t=0;
  }

 
  }
 }

//--------------------------------关于定时器溢出时间计算--------------------------
1)TIM3时钟使能。
这里我们通过APB1ENR的第1位来设置TIM3的时钟,因为Stm32_Clock_Init函数里面把APB1的分频设置为2了,所以我们的TIM3时钟就是APB1时钟的2被,等于系统时钟。(72M)

Tout= (arr*(psc+1))/Tclk;
其中:
Tclk:TIM3的输入时钟频率(单位为Khz)。
Tout:TIM3溢出时间(单位为ms)。

Tout=(3600*(1+1))/72M=0.1ms

//------------------------------系统时钟初始化函数对于定时器TIM3 时钟简易分析-----------------
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;   
MYRCC_DeInit();  //复位并配置向量表
RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位
RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
RCC->CFGR|=1<<16;  //PLLSRC ON 
FLASH->ACR|=0x32;  //FLASH 2个延时周期

 
RCC->CR|=0x01000000;  //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟  
while(temp!=0x02)     //等待PLL作为系统时钟设置成功
{   
temp=RCC->CFGR>>2;
temp&=0x03;
}    
}    

关键字:STM32  单片机  定时器  PWM输出 引用地址:STM32单片机简易定时器PWM输出

上一篇:STM32 NVIC嵌套向量中断控制器函数分析
下一篇:STM32自带PWM输出实验

推荐阅读最新更新时间:2024-03-16 14:04

STM32串口通迅–使用中断方式
在上一节串口通讯中使用了查询方式, 在少量数据传输应用中, 这种方法基本可行, 但如果通迅数据量比较大的话会对系统实时性造成很大的影响, 所以在实际工程运用中, 查询的方法并不多见. 一个较好的方法就是利用空间换时间, 用一个缓存区加中断进行数据发送和接收, 以减少不必要的等待的时间, 提高系统的实时性. 为了提高空间利用率, 最常用的方法是采用一个环形队列做为接收/发送缓存, 配合中断, 可很好的完成数据接收/传送, 在时间和空间中取得一个平衡. 有关环形队列的知识, 这里不多做介绍, 可参考相关资料. 使用环形队列做为缓存. 发送逻辑: 当有一个字符串要发送时, 待发送的字符串送入FIFO缓存, 然后打开串口中断, 在中断
[单片机]
FM20L08型铁电存储器的原理及应用
1 引言 在一些需要下位机单独工作的场合(如汽车行驶记录仪、高速存储测试设备等),其数据的高速存储和掉电不丢失尤为重要,Ramtron公司推出的FM20L08型非易失性铁电存储器除具有其他铁电存储器的一般特点外,弥补了已有铁电存储器存储量小的缺点,其数据存储量达1MB,可完全代替标准异步静态随机存储器(SRAM)。 2 FM20L08的特点和引脚功能 FM20L08型非易失性铁电存储器的存储容量为128K×8位,和无限次擦写,掉电后数据可保存10年,工作电压为3V,最大功耗电流为22mA,采用32引脚TSOP型封装,图1示出FM20L08的引脚排列,表1示出FM20L08的主要引脚功能。 ? FM
[应用]
STM32学习笔记(5):通用定时器PWM输出
1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。 STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。 1.1PWM输出模式 STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1
[单片机]
STM32的宏定义问题
在刚开始学习STM32单片机的时候,我们会遇到这样的问题: #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) /* #define STM32F10X_LD */ /*! STM32F10X_LD: STM32 Low densi
[单片机]
单片机小白学习之路(十)---点阵
目标:用点阵点亮一个灯 1. 8x8LED点阵简介 LED点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随处可见,被广泛应用于汽车报站器,广告屏等。 8x8点阵 生活中利用 2. 内部结构 内部结构 有点数码管,矩阵按键的影子,有两种接法,都一样其实,我们是左边的那个接法。 控制和矩阵按键差不多,行为一组,列为一组。左边的列是由74HC595芯片控制的, 上面的行是P0端口控制的 点阵模块电路 看看我们这个芯片的说明书: 引脚说明 这个芯片是8 位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。三态。 模块电路里的符号是自己可改的, 我们看引脚就知道了, 模块电路中D0
[单片机]
<font color='red'>单片机</font>小白学习之路(十)---点阵
单片机C语言知识点全攻略
根据有网友提出美中不足的是所用单片机编程语言为汇编,基于此,电子发烧友网再接再厉再次为读者诚挚奉上非常详尽的《单片机C语言知识点全攻略》系列单片机C语言学习教程,本教程共分为四部分,主要知识点如下所示。 第一部分知识点:    第一课 建立你的第一个KeilC51项目    第二课 C51HEX文件的生成和单片机    第三课 C51数据类型    第四课 C51常量 第二部分知识点:    第五课 C51变量    第六课 C51运算符和表达式    第七课 运算符和表达式(关系运算符)    第八课 运算符和表达式(位运算符)    第九课 C51运算符和表达式(指针和地址运算符) 第三部分知识点:
[单片机]
<font color='red'>单片机</font>C语言知识点全攻略
STM32 ADC学习
12位ADC是一种逐次逼近型模拟数字数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。 ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。 如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。 ADC通常要与DMA一起使用 这里只是简单的用库配置ADC 不断扫描来实现ADC的应用。 首先配置GPIO与ADC的时钟: ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC
[单片机]
<font color='red'>STM32</font> ADC学习
基于8051增强型单片机的RJM8L系列超低功耗MCU介绍
对于一些采用电池供电的产品需要长达数年不换电池情况下能连续工作,系统低功耗设计就尤为重要。MCU微控制器的低功耗设计决定系统的成败关键。MCU微控制器的低功耗技术涉及到软件、系统和底层的硬件工艺等。对于应用来说,在空闲的时候,可以将其时钟关闭以节省动态功耗,或小部分电路以低速低功耗的方式运行,SRAM的读写动态功耗相当可观,因此应该尽量减少读写SRAM。 瑞纳捷针对低功耗应用推出了RJM8L151S和RJM8L003系列产品,已大量应用到各领域,如:烟雾报警器,LoRa模组,智能门锁,灯控设备,GPS定位器,安防探测器,电子烟等应用领域。 RJM8L151S和RJM8L003系列产品是基于8051增强型单片机,工作电压2.
[单片机]
基于8051增强型<font color='red'>单片机</font>的RJM8L系列超低功耗<font color='red'>MCU</font>介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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