stm32F407的TIM定时器输出PWM波

发布者:CelestialLight最新更新时间:2016-08-05 来源: eefocus关键字:stm32F407  TIM定时器  输出PWM波 手机看文章 扫描二维码
随时随地手机看文章
今天测试了stm32F407的TIM定时器输出PWM波,了解了其配置过程。要点如下:

1.使能GPIO的复用功能,指的是1)GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);和2)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF。这两条缺一不可,在F4里没有了开始复用时钟(RCC)功能。

2.分频和周期计算公式:
  Prescaler = (TIMxCLK / TIMx counter clock) - 1;
  Period = (TIMx counter clock / TIM3 output clock) - 1 
  TIMx counter clock为你所需要的TXM的定时器时钟 
3.PWM的幅值为3.3V

/************************************************************
Copyright (C), 2012-2022, yin.
FileName: main.c
Author: ycw Version :  1.0 Date: 2012.04.24
Description:           TIM2 PWM  
Version:               V1.0                 
Function List:         TIM2 PWM
History:                      

#include

static __IO uint32_t TimingDelay;    //__IO为volatile的宏定义
int8_t LED_Flag = 1;       //LED灯翻转标志位
void GPIO_Config(void);
void TIM_Config(void);
void NVIC_Config(void);
void Delay(__IO uint32_t nTime);

main ()
{
/*在主函数main之前通过调用启动代码运行了SystemInit函数,而
这个函数位于system_stm32f4xx.c”。程序运行起始于启动文件的第
175行(LDR R0, =SystemInit)。sys时钟为HSE频率/PLL_M*PLL_N/PLL_P,
定义HSE为25M,则sys时钟频率为168M */

GPIO_Config();
TIM_Config();
NVIC_Config();
/*SystemCoreClock / 1000时基为1ms*/
if (SysTick_Config(SystemCoreClock / 1000))
 { 
 /* Capture error */ 
 while (1);
 }
while (1)
    { /*产生一个软件中断
     EXTI_GenerateSWInterrupt(EXTI_Line0);
  Delay(1000); */
  if (LED_Flag != 1)
  {
    GPIO_SetBits(GPIOG, GPIO_Pin_6);        //setbits使能IO,当前下指输出(此时为灭)
  }       
  else
  {
    GPIO_ResetBits(GPIOG, GPIO_Pin_6);     //Resetbits屏蔽IO,当前下指不输出(此时为亮)
  }
    }
}

/*************************************************
Function:    void GPIO_Config(void)       
Description: GPIO配置函数              
Input: 无                              
Output:无                              
Return:无                              
*************************************************/ 
void GPIO_Config(void)
{
/*定义了一个GPIO_InitStructure的结构体,方便一下使用 */
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能GPIOG时钟(时钟结构参见“stm32图解.pdf”)*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOA, ENABLE);
/*仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数PPP_SturcInit(..)
来初始化变量PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他
成员的值(多为缺省值)被正确填入。*/
GPIO_StructInit(&GPIO_InitStructure);
/* 初始化GPIOG的Pin_6为推挽输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;     //指定第六引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;    //模式为输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率为快速
GPIO_Init(GPIOG, &GPIO_InitStructure);      //调用IO初始化函数

/*配置GPIOA_Pin_1,作为TIM_Channel2 PWM输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;     //指定第六引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    //模式必须为复用!
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率为快速
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉与否对PWM产生无影响
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);//复用GPIOA_Pin1为TIM2_Ch2
}

/*************************************************
Function:    void TIM_Config(void)  
Description: 定时器配置函数       
Input:       无
Output:      无                            
*************************************************/
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_DeInit(TIM2);//初始化TIM2寄存器
/*分频和周期计算公式:
  Prescaler = (TIMxCLK / TIMx counter clock) - 1;
  Period = (TIMx counter clock / TIM3 output clock) - 1 
  TIMx counter clock为你所需要的TXM的定时器时钟 
  */
TIM_TimeBaseStructure.TIM_Period = 10000-1; //查数据手册可知,TIM2与TIM5为32位自动装载
/*在system_stm32f4xx.c中设置的APB1 Prescaler = 4 ,可知
  APB1时钟为168M/4*2,因为如果APB1分频不为1,则定时时钟*2 
 */
TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

/*配置输出比较,产生占空比为20%的PWM方波*/
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM1为正常占空比模式,PWM2为反极性模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 2000;//输入CCR(占空比数值)
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//High为占空比高极性,此时占空比为20%;Low则为反极性,占空比为80%
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//CCR自动装载默认也是打开的
TIM_ARRPreloadConfig(TIM2, ENABLE);  //ARR自动装载默认是打开的,可以不设置

TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2, ENABLE); //使能TIM2定时器
}

/*************************************************
Function:    void NVIC_Config(void)  
Description: 嵌套中断断配置函数       
Input:       无
Output:      无                            
*************************************************/
void NVIC_Config(void)
{
/*配置定时器TIM2中断嵌套*/
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

/*************************************************
Function:    void Delay(__IO uint32_t nTime)  
Description: 精确延时函数,时基根据前面设定,当前
             为1ms       
Input: 需要延时的时间,单位ms                      
Output:无                            
*************************************************/
void Delay(__IO uint32_t nTime)

  TimingDelay = nTime;
  while (TimingDelay != 0);
}

/*************************************************
Function:    void TimingDelay_Decrement(void)  
Description: SysTick中断服务函数,加在_it.h中的
             void SysTick_Handler(void)函数内        
Input: 无                      
Output:无                            
*************************************************/
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}

关键字:stm32F407  TIM定时器  输出PWM波 引用地址:stm32F407的TIM定时器输出PWM波

上一篇:调试ARM遇到:No Cortex-M Device found问题的解决方法
下一篇:STM32通用定时器(TIM2-5)基本用法

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

stm32f407 内部flash保存数据
#include stm32f4xx.h //FLASH起始地址 #define STM32_FLASH_BASE 0x08000000 //STM32 FLASH的起始地址 #define FLASH_SAVE_ADDR 0x080A0000 //保存地址 //FLASH 扇区的起始地址 #define ADDR_FLASH_SECTOR_0 ((u32)0x08000000) //扇区0起始地址, 16 Kbytes #define ADDR_FLASH_SECTOR_1 ((u32)0x08004000) //扇区1起始地址, 16 Kbytes #define ADDR_FLASH_S
[单片机]
STM32F407的串口采用DMA收发数据
环境: 主机:WIN8 开发环境:MDK5.13 mcu: stm32f407VGT6 说明: 之前用STM32F103实现DMA收发串口数据,现在项目中采用STM32F407,所以将此机制移植到F4上。 STM32F103上用DMA收发串口数据文章: STM32的串口采用DMA方式发送数据测试 STM32的串口采用DMA方式接收数据测试 源代码: 串口初始化代码: /********************************************************************* * 初始化串口 ************************
[单片机]
STM32f103ZET6定时器TIM3使用通道1输出PWM程序
总结: TIM3_CH1输出口为PA6(重映射为PB4),PB5位DS0接口。 1.使用重映射之后,原始IO口不再有输出;本例子中,若使用部分重映射,则 PA6映射到PB4中,所以仅仅PB4有波形输出;飞线连接PB4与PB5即可观察PWM呼吸灯效果。 2.使用IO口前务必初始化,本例子中开始仅仅初始化了PB5口,而没有初始化PA6导致一直验证失败;正点原子给出程序中是由通道2直接映射到PB5因此只需要初始化PB5口即可,不存在上述问题。 3.除了正常输出输入信号之外,输出PWM以及其他功能均属于IO口的复用功能。 #include stm32f10x.h #include led.h #include ti
[单片机]
我该选择哪一个?DSP与DSP功能的ARM
  最近在工控领域里的一个项目,看到前期的工程设计人员设计了 Cortex-M3 微处理器 与TI DSP 的搭档来完成整个项目。“为什么不使用 Cortex-M4 的内核?”这个疑问就立刻蹦了出来。今天仔细查询了一下,做个简单的对比,供广大的网友们参考。   上面只是简单提到了几点。3倍于 DSP 的主频频率使得 STM32F407 在一定程序上弥补了在处理浮点运算的不足,而较便宜的价格,不仅使得项目的总成本大幅节省,也便得有 ARM 开发基础的工程师们更容易操控 DSP 的算法。   毕竟是工业控制领域的应用, Cortex-M4 还能充分发挥其过程控制的优势,丰富的IO引脚及兼容的5v TTL电平与外
[嵌入式]
我该选择哪一个?DSP与DSP功能的ARM
PIC 1508 TIM2的定时器使用
使用TIM2的频率计算公式f=FOSC/4/T2CKPS/T2OUTPS/TMR2 (TMR2是TIM2的数据寄存器) void main() { OSCCON = 0x78;//主频率为16M 即FOSC = 16M __delay_ms(50); ANSC6 = 1; TRISC6 = 0; RC6 = 1;//RC6接了一盏LED T2CON = 0x04; /*T2OUTPS = 0(Timer2 输出后分频比为1:1) TMR2ON=1(Timer2 使能位使能) T2CKPS=0(Timer2 时钟预分频比为1:1);*/ PR2 = 49;/
[单片机]
PIC 1508 <font color='red'>TIM</font>2的<font color='red'>定时器</font>使用
STM32F407——电子评分器
#main.c #include sys.h #include delay.h #include usart.h #include led.h //#include beep.h //#include key.h #include exti.h extern u8 great,fine,bad,num; extern float Average,Percent; int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组 delay_init(168); //初始化延时函数 uar
[单片机]
<font color='red'>STM32F407</font>——电子评分器
ADC模数转换器简介
本文将介绍STM32F407的模数转换功能ADC ①ADC的概念及作用 ②ADC的性能指标及STM32F4-ADC的特性 ③ADC的功能框图 ④ADC的功能框图的详细介绍 ⑤ADC的工作模式 ①ADC的概念及作用 ADC是analog to digtal converter的缩写,指的是模数转换器,模数转换器可以将连续的模拟信号转换为离散的数字信号。 ADC的作用:采集传感器的数据、电压、电流等。 ②ADC的性能指标及STM32F4-ADC的特性 ADC的性能指标主要有以下几个方面: 量程:能测量的电压范围; 分辨率:ADC的分辨率常以输出二进制的位数表示,位数越多分辨率越高、相应的转换时间会越长; 转换时间:在模拟输入电压符合输
[单片机]
ADC模数转换器简介
MSP430F5529-PWM在串口中的输出及调整
本篇的代码能在试用的端口输出PWM波(附上修改的基本方法) 先放代码: PWM.c Created on: 2021年9月12日 Author: feidao #include MSP430F5529.h #include PWM.h void PWM1(volatile int direction,volatile int speed) { P1DIR |=BIT4; //TA0.3 P1SEL |=BIT4; P1DIR |=BIT5; //TA0.4 P1SEL |=BIT5; TA0CCR0=650;//修改它跟频率有关 if(direction==1) { TA0CCTL3=OUTMOD
[单片机]
MSP430F5529-<font color='red'>PWM</font><font color='red'>波</font>在串口中的<font color='red'>输出</font>及调整
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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