stm32F407(CORTEX-M4)之RCC配置与TIM2的PWM

发布者:Xiangsi最新更新时间:2015-10-21 来源: eefocus关键字:stm32F407  CORTEX-M4  RCC配置  PWM 手机看文章 扫描二维码
随时随地手机看文章
之前我已经发过了关于TIM2的PWM,但是没有自己配置RCC时钟,用到的系统时钟、HCLK、PCLK1与PCLK2都是系统启动代码里默认设置的,但是由于应用场合不同,默认的设置可能不满足用户需要,这时便需要手动配置。还是同样的问题,M4的资料太少,我只能参考函数的英文说明(我已经习惯看英文了,呵呵)来自己配置,不敢独享,现分享如下:

(我的外部时钟为25MHz)

 

#include

static __IO uint32_t TimingDelay;    //__IO为volatile的宏定义
int8_t LED_Flag = 1;       //LED灯翻转标志位

void RCC_Config(void);
void GPIO_Config(void);
void TIM_Config(void);
void NVIC_Config(void);
void Delay(__IO uint32_t nTime);

main ()
{
RCC_Config();
GPIO_Config();
TIM_Config();
NVIC_Config();

RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_1);

if (SysTick_Config(SystemCoreClock / 1000))
 
  
 while (1);
 }
while (1)
    {
  
  if (LED_Flag != 1)
  {
    GPIO_SetBits(GPIOG, GPIO_Pin_6);      //setbits使能IO,当前下指输出(此时为灭)
        
  else
  {
    GPIO_ResetBits(GPIOG, GPIO_Pin_6);     //Resetbits屏蔽IO,当前下指不输出(此时为亮)
  }
    }
}


void RCC_Config(void)
{
RCC_DeInit();              //RCC寄存器初始化
RCC_HSEConfig(RCC_HSE_ON);  //使用外部时钟
if (RCC_WaitForHSEStartUp() == SUCCESS) //等待外部时钟启动
  {
   RCC_PLLCmd(DISABLE);                    //配置PLL前应先关闭主PLL
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择PLL时钟为系统时钟
   RCC_HCLKConfig(RCC_SYSCLK_Div1);     //HCLK(AHB)时钟为系统时钟1分频
   RCC_PCLK1Config(RCC_HCLK_Div4);     //PCLK1(APB1)时钟为HCLK时钟8分频,则TIM2时钟为HCLK时钟4分频
   RCC_PCLK2Config(RCC_HCLK_Div2);     //PCLK2(APB2)时钟为HCLK时钟2分频
   RCC_PLLConfig(RCC_PLLSource_HSE, 25, 336, 2, 7); //PLL时钟配置,公式详见‘system_stm43f4xx.c’ Line149
   RCC_PLLCmd(ENABLE);        //PLL时钟开启
   while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } //等待PLL时钟准备好
  }
}

 
void GPIO_Config(void)
{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_StructInit(&GPIO_InitStructure);

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初始化函数


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

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_MCO);
}


void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_DeInit(TIM2);//初始化TIM2寄存器


TIM_TimeBaseStructure.TIM_Period = 10000-1; //查数据手册可知,TIM2与TIM5为32位自动装载

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);


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_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定时器
}


void NVIC_Config(void)
{

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中断优先级分组为1
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //嵌套中断通道为TIM2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     //使能中断
NVIC_Init(&NVIC_InitStructure);
}


void Delay(__IO uint32_t nTime)

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


void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
 
    TimingDelay--;
  }
}

中断服务函数:

void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
 LED_Flag= ~LED_Flag;

 
   
}


关键字:stm32F407  CORTEX-M4  RCC配置  PWM 引用地址:stm32F407(CORTEX-M4)之RCC配置与TIM2的PWM

上一篇:stm32f407(cortex-M4)USART串口调试程序
下一篇:stm32 复位io默认输出

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

基于PWM降压转换器AP3003的车载充电器的系统设计
随着电子技术的不断发展,手机、MP3、DSC等移动多媒体设备正逐渐成为人们生活中不可缺少的工具,与这些产品相对应的充电器设计也越来越受到关注。  按照充电器的使用场合,可以分成家用型充电器和车载充电器,一般手机自带的充电器多数是家用型,即交流输入型;车载充电器是一种直流输入型的充电器,它的出现使移动设备的充电场合更加多样化。目前BCD公司提供的比较常用的车载充电器方案的控制芯片主要有AZ34063A/C,AZ494B/D和AP3003。   AZ34063A/C方案的优点是成本较低,缺点是限流点不准确,过热问题较为普遍;AZ494B/D方案的优点是设计灵活性较强,缺点是外围器件选择较复杂,需要选择合适的功率管、驱动电路,同时
[嵌入式]
51MCU的PWM
[单片机]
51MCU的<font color='red'>PWM</font>
PWM DC/DC转换器二极管
  在开关电源中的PWM DC/DC转换器所用的二极管有两种:即快恢复二极管和肖特基二极管。   1 快恢复二极管   在开关电源中,除了工频整流器外,二极管大多数也工作在高频开关状态。因此,二极管的动态开关特性是十分重要的,其中主要是正向特 性和反向恢复特性。在使用中要求二极管的正向瞬态压降要小,反向恢复时间要短,反向恢复电荷要少,并且具有快速恢复的特性。   (1)开通特性。二极管的开通时间特性如图(a)所示,开通初期出现较高的正向峰值电压Ufp,电压下降到2V时为正向恢复时间tfr,然后继续下 降到稳态压降(如1V左右)。diF/dt为电流变化率,此电流变化率与器件内部机制、引线长短、有无磁性材料等因素有关。随着
[电源管理]
<font color='red'>PWM</font> DC/DC转换器二极管
有刷直流电机的PWM驱动中其他电流再生方法
在上一篇文章对有刷直流电机的PWM驱动原理的说明中,介绍了基于电机两端短路的电流再生方法,实际上有刷直流电机的PWM驱动中还有其他电流再生方法,有刷直流电机的PWM驱动中的每种方法都有其应该考虑的事项。 使用PWM输出方式驱动有刷直流电机:电流再生方法 下面是用来说明PWM驱动原理的示意图。其中省略了没必要列出的晶体管。(a)是施加电压时的电流再生,(b)是电机两端短路方法的电流再生。 由于使用了晶体管(在该示例中为MOSFET)来切换H桥,因此作为现实问题,需要将晶体管的导通电阻作为每条路径中的损耗加以考虑。该思路也同样适用于后续的电流再生方法。 除了(b)以外,还有三种电流再生方法。(c)是在施加电压的状态下的只断
[嵌入式]
有刷直流电机的<font color='red'>PWM</font>驱动中其他电流再生方法
stm32f407】I2C实验
一.I2C介绍 IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。如图: I2C协议一共有6种协议信号 ① 空闲状态 ② 开始信号 ③ 停止信号 ④ 应答信号 ⑤ 数据的有效性 ⑥ 数据传输 1) 空闲信号 I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场
[单片机]
【<font color='red'>stm32f407</font>】I2C实验
STC单片机实现可调PWM输出的C51程序
//以下是源程序,只需修改定义IO口就可以使用,#include reg52.h #include intrins.h sbit K1 =P3^2 ; //增加键 sbit K2 =P3^3 ; //减少键 sbit BEEP =P3^1 ; //蜂鸣器 sbit pp =P3^7 ; unsigned char PWM=0x7f ; //赋初值 void Beep(); void delayms(unsigned char ms); void delay(unsigned char t); /***********************************************
[单片机]
stm32f407_hal库_工程模板
硬件平台: stm32f407ve 软件平台: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363) Keil5 5.26.2 HAL库版本: 2.14.0(目前下载的最新的) 1.在工程路径下建立一个空的文件夹 2.打开keil5,没有建立工程,应该示空白工程(我的版本是5.26.2)。 3.我现在安装的hal库的版本: 4. 新建工程 5. 选择工程保存的路径,就是第一步新建的文件夹
[单片机]
stm32f407_hal库_工程模板
如何设计不足15毫米超薄型笔记本适配器?(三)
   当今的笔记本电脑正在向超薄型发展,这一设计趋势带给系统工程师的最大设计挑战是超薄电源适配器。如何以一个合理的成本设计出能够装入厚度不足15毫米机壳中的电源?如何对它进行有效的散热设计?以及如何使它满足最新的能源之星标准及其它全球性能效标准?要克服所有这些挑战并非易事。请看PI技术专家是如何解决这些难题的。   本文第二部分讨论了如何降低严重影响电源效率的开关损耗问题,接下来的第三部分将讨论如何利用TOPSwitch来优化所有功率水平下的开关频率和RMS电流。   为了克服PWM控制常见的效率限制问题,PI在TOPSwitch中采用了包含四种工作模式的多模式PWM引擎,可优化所有功率水平下的开关频率和RMS电流。具体说明详
[手机便携]
如何设计不足15毫米超薄型笔记本适配器?(三)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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