您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 【原创】stm32F407(CORTEX-M4)之RCC配置与TIM2的PWM
【原创】【原创】【原创】【原创】stm32F407stm32F407stm32F407stm32F407((((CORTEX-M4CORTEX-M4CORTEX-M4CORTEX-M4)之)之)之)之RCCRCCRCCRCC配置与配置与配置与配置与TIM2TIM2TIM2TIM2的的的的PWMPWMPWMPWM2012-04-2917:31:38|分类:stm32|字号大中小订阅小枣年糕之前我已经发过了关于TIM2的PWM,但是没有自己配置RCC时钟,用到的系统时钟、HCLK、PCLK1与PCLK2都是系统启动代码里默认设置的,但是由于应用场合不同,默认的设置可能不满足用户需要,这时便需要手动配置。还是同样的问题,M4的资料太少,我只能参考函数的英文说明(我已经习惯看英文了,呵呵)来自己配置,不敢独享,现分享如下:(我的外部时钟为25MHz)/************************************************************Copyright(C),2012-2022,yin.FileName:main.cAuthor:ycwVersion:1.0Date:2012.04.29Description:RCCTIM2PWMVersion:V3.0FunctionList:RCCTIM2PWMHistory:V1.0authortimeversiondescYCW12/04/291.0buildthismoudle***********************************************************/#includestm32f4xx.hstatic__IOuint32_tTimingDelay;//__IO为volatile的宏定义int8_tLED_Flag=1;//LED灯翻转标志位voidRCC_Config(void);voidGPIO_Config(void);voidTIM_Config(void);voidNVIC_Config(void);voidDelay(__IOuint32_tnTime);main(){RCC_Config();GPIO_Config();TIM_Config();NVIC_Config();/*在PA8引脚上输出HSE外部时钟,观察可得f(HSE)=25MHz;f(HSI)=16MHz*f(PLLCLK)=168MHz;*/RCC_MCO1Config(RCC_MCO1Source_PLLCLK,RCC_MCO1Div_1);/*SystemCoreClock/1000时基为1ms*/if(SysTick_Config(SystemCoreClock/1000)){/*Captureerror*/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:voidRCC_Config(void)Description:RCC时钟配置函数Input:无Output:无Return:无*************************************************/voidRCC_Config(void){RCC_DeInit();//RCC寄存器初始化RCC_HSEConfig(RCC_HSE_ON);//使用外部时钟if(RCC_WaitForHSEStartUp()==SUCCESS)//等待外部时钟启动{RCC_PLLCmd(DISABLE);//配置PLL前应先关闭主PLLRCC_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’Line149RCC_PLLCmd(ENABLE);//PLL时钟开启while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}//等待PLL时钟准备好}}/*************************************************Function:voidGPIO_Config(void)Description:GPIO配置函数Input:无Output:无Return:无*************************************************/voidGPIO_Config(void){/*定义了一个GPIO_InitStructure的结构体,方便一下使用*/GPIO_InitTypeDefGPIO_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_Channel2PWM输出*/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_Ch2GPIO_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);}/*************************************************Function:voidTIM_Config(void)Description:定时器配置函数Input:无Output:无*************************************************/voidTIM_Config(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_OCInitTypeDefTIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_DeInit(TIM2);//初始化TIM2寄存器/*分频和周期计算公式:Prescaler=(TIMxCLK/TIMxcounterclock)-1;Period=(TIMxcounterclock/TIM3outputclock)-1TIMxcounterclock为你所需要的TXM的定时器时钟*/TIM_TimeBaseStructure.TIM_Period=10000-1;//查数据手册可知,TIM2与TIM5为32位自动装载/*在system_stm32f4xx.c中设置的APB1Prescaler=4,可知*APB1时钟为168M/4*2,因为如果APB1分频不为1,则定时时钟x2*/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);//填入缺省值,其中后几项只对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);
本文标题:【原创】stm32F407(CORTEX-M4)之RCC配置与TIM2的PWM
链接地址:https://www.777doc.com/doc-4679625 .html