stm32f407的TIM1的中断和PWM

发布者:数字梦行最新更新时间:2016-08-05 来源: eefocus关键字:stm32f407  TIM1  中断  PWM 手机看文章 扫描二维码
随时随地手机看文章
调试了多半天TIM1的中断和PWM,终于算是调通了。遇到了不少问题,也深入了解了TIM1的配置过程。代码如下:

/************************************************************
Copyright (C), 2012-2022, yin.
FileName: main.c
Author: ycw Version :  1.0 Date: 2012.04.25
Description:           TIM1 PWM   NVIC
Version:                 V1.0                 
Function List:         TIM1 PWM  NVIC
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)
    {
  /*产生一个软件中断
     TIM_GenerateEvent(TIM1,TIM1_UP_TIM10_IRQn);
  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 | RCC_AHB1Periph_GPIOB, 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_8,作为TIM1_Channel2 PWM输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11; //指定复用引脚
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_InitStructure.GPIO_Pin = GPIO_Pin_13;     //GPIOB_Pin13作为TIM1_CH1N输出
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM1); //复用GPIOA_Pin7为TIM1_Ch1N,效果不理想高电平不到0.5V
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1); //复用GPIOA_Pin8为TIM1_Ch1, 
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_TIM1);//复用GPIOA_Pin10为TIM1_Ch3, 
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_TIM1);//复用GPIOA_Pin11为TIM1_Ch4,注意没有CH4N 
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_TIM1);//复用GPIOB_Pin13为TIM1_Ch1N,效果很好,可以和GPIOA_Pin7同时复用
}               

/*************************************************
Function:    void TIM_Config(void)  
Description: 定时器配置函数       
Input:       无
Output:      无                            
*************************************************/
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_DeInit(TIM1);//初始化TIM1寄存器

/*分频和周期计算公式:
  Prescaler = (TIMxCLK / TIMx counter clock) - 1;
  Period = (TIMx counter clock / TIM3 output clock) - 1 
  TIMx counter clock为你所需要的TXM的定时器时钟 
  */
TIM_TimeBaseStructure.TIM_Period = 10000-1; //查数据手册可知,TIM1与TIM8为16位自动装载
/*在system_stm32f4xx.c中设置的APB2 Prescaler = 2 ,可知
 *APB1时钟为168M/2*2,因为如果APB1分频不为1,则定时时钟x2 
 */
TIM_TimeBaseStructure.TIM_Prescaler = 16800-1;      //分频为10K
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

/*配置输出比较,产生占空比为20%的PWM方波*/
TIM_OCStructInit(&TIM_OCInitStructure);  //填入缺省值,其中后几项只对TIM1和TIM8有效
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1为正常占空比模式,PWM2为反极性模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出允许
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //互补输出允许
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //High为占空比高极性,此时占空比为20%;Low则为反极性,占空比为80%
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//互补输出,与以上相反
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_Pulse = 2000;    //输入通道1 CCR1(占空比数值)
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //Ch1初始化
TIM_OCInitStructure.TIM_Pulse = 4000;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = 7000;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//CCR自动装载默认也是打开的
TIM_ARRPreloadConfig(TIM1, ENABLE); //ARR自动装载默认是打开的,可以不设置

TIM_ClearFlag(TIM1, TIM_FLAG_Update);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM1, ENABLE); //使能TIM1定时器
TIM_CtrlPWMOutputs(TIM1, ENABLE);//使能TIM1的PWM输出,TIM1与TIM8有效
}

/*************************************************
Function:    void NVIC_Config(void)  
Description: 嵌套中断断配置函数       
Input:       无
Output:      无                            
*************************************************/
void NVIC_Config(void)
{
/*配置定时器TIM1中断嵌套*/
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);           //中断优先级分组为1
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;  //嵌套中断通道为TIM1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //响应优先级为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  TIM1  中断  PWM 引用地址:stm32f407的TIM1的中断和PWM

上一篇:stm32F407之USART6的DMA工作方式
下一篇:调试ARM遇到:No Cortex-M Device found问题的解决方法

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

TOPSwitch_GX系列单端反激式开关电源设计
   1 引言    开关电源 被称为高效节能型电源,因为内部电路工作在高频开关状态,自身消耗的能量很低,电源效率可达80%左右。而通常开关电源的设计使用控制电路与功率MOSFET相分立的拓扑结构,但这种方案开发周期长,成本高,系统可靠性差。 TOPSwitch 系列智能开关电源集成芯片具有高集成度、高性价比、最简外围电路、最佳性能指标等优点,从而提高了电源的效率,降低了成本,增强了系统的可靠性,因此被广泛地应用在中小功率电源中。    2 TOPSwitch_GX器件介绍   TOPSwitch_GX系列是单片开关电源第四代产品,他将高压功率MOSFET、 PWM 控制、过电流保护、过热保护、关断/自动重启动电路和其
[电源管理]
stm32f103 pwm模式配置总结
void MiniBalance_PWM_Init(u16 arr,u16 psc) { RCC- APB1ENR|=1 1; //TIM3时钟使能 RCC- APB2ENR|=1 3; //PORTB时钟使能 GPIOB- CRL&=0XFFFFFF00; //PORTB0 1复用输出 GPIOB- CRL|=0X000000BB; //PORTB0 1复用输出 TIM3- ARR=arr;//设定计数器自动重装值 TIM3- PSC=psc;//预分频器不分频 TIM3- CCMR2|=6 12;//CH4 PWM1模式 TIM3- CCMR2|=6 4; //CH3 PWM1模式 TIM3- CCMR2|=1 11;//CH
[单片机]
stm32f103 <font color='red'>pwm</font>模式配置总结
用单片机开发板做温控风扇PWM调速
能够利用PWM调速原理实现对系统的控制对象(直流电机)进行转速控制,当温度低于系统设置温度下限时直流电机停止工作,到达设置温度的下限和上限之间时以1档的速度工作,当温度高于系统设置温度上限时直流电机全速工作其中上下限温度可以在数码管上人工设置,数码管上能够显示当前的实时温度。 单片机源程序如下: #include reg51.h #include intrins.h //包含头文件 typedef unsigned int u16; //对数据类型进行声明定义 ,用u16表示 unsigned int typedef unsigned char u8; // 用 u8表
[单片机]
STM32进入低功耗模式以及唤醒(RTC+中断
此文献给做单片机工作的同僚,希望大家在嵌入式硬件的道路上越走越远,第一篇,望大家多多指导,不喜勿喷! 这里主要说一下,本人在调试STM32低功耗功能时遇到的问题以及解决思路与大家分享一下。 在确认使用低功耗功能后,大家铁定会通过不同途径查找相关的资料,了解到什么是低功耗、低功耗有哪几种以及不同模式之间的区别,最后还有一些程序截取、说明,资料不少,但是能让人一目了然理解的不太多,尤其是刚接触这个功能的新手,或许是资历尚浅,编程以及检索资料能力还有待提高。 再此,我抛砖引玉,发表一篇我的调试感受,我从 低功耗初体验、低功耗功能说明、低功耗总结三个方面进行说明。 首先,低功耗初体验。跟大家一样,查到STM
[单片机]
STM32进入低功耗模式以及唤醒(RTC+<font color='red'>中断</font>)
STM32F407玩控制—神经网络PID控制
在玩51单片机时就想玩神经网络PID控制,但51单片机的数据存储器地址空间很小,就普通的应用,要增加一个变量尚且“抖抖哗哗”,更遑论玩神经网络PID控制,那可需要非常多的变量,而玩STM32F407就不存在这方面问题了。转入正题,大部分书上的神经网络PID控制,讲的是BP神经网络PID控制,举的例子都是非线性系统,通常仿真效果都不错,但BP神经网络PID控制有一个限制,就是kp、ki、kd小于1,这就限制了它的应用范围,如果kp、ki、kd 1,那就得改进,而刘金琨的《先进PID控制 MATLAB仿真》一书中讲了一种RBF神经网络PID控制,它突破了前者的限制,其原理如图1所示,图中RBF NN1神经网络根据偏差e、Jacobia
[单片机]
用<font color='red'>STM32F407</font>玩控制—神经网络PID控制
用于单相电机调速的单片PWM控制技术
1 引言   随着家用电器产品变频技术的发展,单相电机的变频调速已成为一种可行的方法,在这种调 速系统中,脉宽调制(PWM)技术仍然是提高调速性能的主要手段 [1,2,3] 。虽然PWM技术的实现方法很多 [4] ,然而,为了降低产品的制造成本,采用微机控制软件实 现PWM控制具有成本低、调制方式灵活等特点,比较适合于家用电器产品的要求。本文针对 洗衣机电机的调速要求,提出了采用直接PWM(DPWM)软件计算的方法,并在AVR系列单片机AT 90C8535上实现,该方法可以很容易地实现电机的恒V/f比调速,其PWM算法简单,易于实现,是一种较为实用的方法。 2 直接PWM技术的算法   
[工业控制]
S3C2440外部中断之按键中断
要做2440的中断实验。首先要了解ARM的中断体系结构。ARM体系CPU有七种工作模式。分别是: 用户模式(usr):ARM处理器正常程序执行状态。 快速中断模式(fiq):用于高速数据传输或通道处理。 中断模式(irq):用于通用的中断处理。 管理模式(svc):操作系统使用的保护模式。 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。 系统模式(sys):运行具有特权的操作系统任务。 未定义指令终止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。 此外,ARM体系的CPU有两种工作状态,分别是:ARM状态、Thumb状态。 实际上,CPU一
[单片机]
S3C2440外部<font color='red'>中断</font>之按键<font color='red'>中断</font>
51单片机+PWM控制渐变七彩灯C51程序
一、硬件介绍: (采用5050LED 2W) RGB三色LED控制引脚分别为单片机P1.2、P1.1、 P1.0。LED正极接主电源(24V)正极,负极接驱动3颗三极管的集电极,单片机控制脚分别接3颗NPN三极管,三极管发射极接地,而单片机的供电是来自三端稳压器7805,祥细原理如下: 二、实物图片: 三、软件部分: 1、原理: 先亮红灯(保持一会儿)----红绿过度(绿加1、红减1循环240次)------ 绿灯亮起(保持一会儿)----绿兰过度(兰加1、绿减1循环240次) -----兰灯亮起(保持)-----兰白过度(绿加1、红加1循环240次、兰不变) ---白红过度 2、具体程序如下:
[单片机]
51单片机+<font color='red'>PWM</font>控制渐变七彩灯C51程序
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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