新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32學(xué)習(xí)筆記(5):通用定時(shí)器PWM輸出

        STM32學(xué)習(xí)筆記(5):通用定時(shí)器PWM輸出

        作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏

        //等待外部高速時(shí)鐘晶振工作

        HSEStartUpStatus = RCC_WaitForHSEStartUp();

        if(HSEStartUpStatus == SUCCESS)

        {

        //設(shè)置AHB時(shí)鐘(HCLK)為系統(tǒng)時(shí)鐘

        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        //設(shè)置高速AHB時(shí)鐘(APB2)為HCLK時(shí)鐘

        RCC_PCLK2Config(RCC_HCLK_Div1);

        //設(shè)置低速AHB時(shí)鐘(APB1)為HCLK的2分頻

        RCC_PCLK1Config(RCC_HCLK_Div2);

        //設(shè)置FLASH代碼延時(shí)

        FLASH_SetLatency(FLASH_Latency_2);

        //使能預(yù)取指緩存

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        //設(shè)置PLL時(shí)鐘,為HSE的9倍頻8MHz * 9 = 72MHz

        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

        //使能PLL

        RCC_PLLCmd(ENABLE);

        //等待PLL準(zhǔn)備就緒

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

        //設(shè)置PLL為系統(tǒng)時(shí)鐘源

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        //判斷PLL是否是系統(tǒng)時(shí)鐘

        while(RCC_GetSYSCLKSource() != 0x08);

        }

        //開(kāi)啟TIM3的時(shí)鐘

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

        //開(kāi)啟GPIOB的時(shí)鐘和復(fù)用功能

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

        }

        void GPIO_cfg()

        {

        GPIO_InitTypeDef GPIO_InitStructure;

        //部分映射,將TIM3_CH2映射到PB5

        //GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

        //選擇引腳5

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

        //輸出頻率最大50MHz

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        //復(fù)用推挽輸出

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_Init(GPIOB,&GPIO_InitStructure);

        }

        void TIMER_cfg()

        {

        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

        //重新將Timer設(shè)置為缺省值

        TIM_DeInit(TIM3);

        //采用內(nèi)部時(shí)鐘給TIM3提供時(shí)鐘源

        TIM_InternalClockConfig(TIM3);

        //預(yù)分頻系數(shù)為0,即不進(jìn)行預(yù)分頻,此時(shí)TIMER的頻率為72MHz

        TIM_TimeBaseStructure.TIM_Prescaler = 0;

        //設(shè)置時(shí)鐘分割

        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

        //設(shè)置計(jì)數(shù)器模式為向上計(jì)數(shù)模式

        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

        //設(shè)置計(jì)數(shù)溢出大小,每計(jì)7200個(gè)數(shù)就產(chǎn)生一個(gè)更新事件,即PWM的輸出頻率為10kHz

        TIM_TimeBaseStructure.TIM_Period = 7200 - 1;

        //將配置應(yīng)用到TIM3中

        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

        }

        void PWM_cfg()

        {

        TIM_OCInitTypeDef TimOCInitStructure;

        //設(shè)置缺省值

        TIM_OCStructInit(&TimOCInitStructure);

        //PWM模式1輸出

        TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

        //設(shè)置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%

        TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;

        //TIM輸出比較極性高

        TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

        //使能輸出狀態(tài)

        TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

        //TIM3的CH2輸出

        TIM_OC2Init(TIM3, &TimOCInitStructure);

        //設(shè)置TIM3的PWM輸出為使能

        TIM_CtrlPWMOutputs(TIM3,ENABLE);

        }


        上一頁(yè) 1 2 下一頁(yè)

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 防城港市| 荆门市| 开原市| 三江| 类乌齐县| 孙吴县| 通山县| 定边县| 桓台县| 保亭| 府谷县| 溧阳市| 赣州市| 庐江县| 西林县| 山东省| 宜宾县| 鄢陵县| 启东市| 广宗县| 策勒县| 新郑市| 开鲁县| 梁河县| 青田县| 阿鲁科尔沁旗| 崇礼县| 开江县| 南投市| 沾化县| 岚皋县| 新巴尔虎左旗| 安龙县| 长丰县| 唐河县| 海南省| 北碚区| 名山县| 桂林市| 西华县| 丰城市|