新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32單片機(jī)定時(shí)器調(diào)試之方波輸出

        STM32單片機(jī)定時(shí)器調(diào)試之方波輸出

        作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
        今天試著讓STM32定時(shí)器輸出50%占空比信號(hào),按照例程寫(xiě)了一下方波初始化函數(shù),例程用的是STM32自帶庫(kù)函數(shù),由于嫌麻煩,我又自己寫(xiě)了一個(gè)簡(jiǎn)單的,采用定時(shí)器1進(jìn)行輸出。結(jié)果一上來(lái),沒(méi)反應(yīng),修改了很多參數(shù),還是沒(méi)反應(yīng),然后將開(kāi)發(fā)板例程寫(xiě)進(jìn)芯片后,有反應(yīng) ,仔細(xì)越多數(shù)據(jù)手冊(cè),沒(méi)有問(wèn)題,糾結(jié)一上午,中午吃飯。吃完飯后,下午又開(kāi)始試驗(yàn),還是別人程序有反映,自己程序,沒(méi)反應(yīng)。再看了看,開(kāi)發(fā)板程序使用的是TIM3,而我使用的是TIM1,于是又把我的程序?qū)IM1換成TIM3,點(diǎn)擊調(diào)試運(yùn)行,有反應(yīng) 。不會(huì)是高級(jí)定時(shí)器只能干高級(jí)的任務(wù)吧,像輸出方波這么簡(jiǎn)單的低級(jí)任務(wù)他不惜的干?郁悶了半天。后來(lái)通過(guò)在網(wǎng)上查找,這個(gè)程序

        以下為源代碼,CC1進(jìn)行比較輸出,模式為翻轉(zhuǎn)電平.

        本文引用地址:http://www.104case.com/article/201611/324059.htm

        程序運(yùn)行后,CC中斷可以進(jìn)去,PA.11的指示燈能閃,但PA.08的指示一直為低電平,請(qǐng)教一下程序哪里錯(cuò)了???

        void TIM1_CC_Init(void)
        {
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        /* 使能定時(shí)器 TIM1_CC 中斷 */
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        /* 配置 PA.11 為推挽輸出 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIOA->BSRR = GPIO_Pin_11; // 將PA.08配置為高電平

        /* 配置 PA.08 為復(fù)用推挽輸出 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* 預(yù)分頻自動(dòng)重載寄存器 */
        TIM1->ARR = 0x2FFF;
        /* PSC 預(yù)分頻器:計(jì)數(shù)頻率 = CK_PSC /(PSC + 1) */
        TIM1->PSC = 0xFF;
        /* CCR1 捕獲比較值寄存器 */
        TIM1->CCR1 = 0xFFF;
        /* 循環(huán)計(jì)數(shù)器的寄存器(控制更新事件) */
        TIM1->RCR = 0x00; // 每次更新
        /* 捕獲/比較模式寄存器 */
        TIM1->CCMR1 = 0x30; // CC1為輸出,CCR1立即生效,輸出翻轉(zhuǎn).
        /* 捕獲/比較使能寄存器 */
        TIM1->CCER = 0x03; // 開(kāi)啟CC1輸出,反向輸出
        /* 中斷使能寄存器*/
        TIM1->DIER = 0x02; // 使能 CC1 中斷
        /* 控制寄存器1 */
        TIM1->CR1 = 0x01; // 使能計(jì)數(shù)器(向上計(jì)數(shù))
        }

        /***************************************************************************************
        ** 函數(shù)名稱: TIM1_CC_IRQHandler
        ** 功能描述: CC 中斷
        ** 參 數(shù): None
        ** 返 回 值: None
        ****************************************************************************************/
        void TIM1_CC_IRQHandler(void)
        {
        static uint32 counter = 0;

        TIM1->SR &= ~2; // 清除中斷標(biāo)志(不做判斷提高效率)

        if(counter)
        {
        counter = 0;
        GPIOA->BSRR = GPIO_Pin_11;
        }
        else
        {
        counter = 1;
        GPIOA->BRR = GPIO_Pin_11;
        }
        }


        最后找到問(wèn)題,沒(méi)有打開(kāi)主輸出...
        /* 打斷和死區(qū)控制器*/
        TIM1->BDTR = 0x8000; // 主輸出使能(MOE)
        加這句就可以了.

        得知,高級(jí)定時(shí)器就是高級(jí)定時(shí)器,由于加入了剎車和死區(qū),所以想輸出波形,必須要比普通定時(shí)器多一句“TIM1->BDTR = 0x8000;” 開(kāi)啟主輸出使能,通道輸出和這個(gè)必須同時(shí)開(kāi)啟,若出現(xiàn)剎車信號(hào),則一次將4路輸出全部關(guān)閉。以保證設(shè)備能夠正常運(yùn)行。哎!悲催呀,糾結(jié)了一上午。stm32定時(shí)器還真是復(fù)雜,尤其是高級(jí)定時(shí)器。設(shè)計(jì)者真是了不起,還要感謝這位仁兄,要不是他我恐怕還得多弄幾天



        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 通辽市| 哈巴河县| 内黄县| 金阳县| 长海县| 邢台县| 漳平市| 湘潭县| 自贡市| 昂仁县| 咸阳市| 平利县| 板桥市| 黄龙县| 五寨县| 镇原县| 毕节市| 双桥区| 萝北县| 白城市| 苗栗市| 筠连县| 新沂市| 大兴区| 易门县| 乐平市| 班玛县| 冕宁县| 花莲市| 石阡县| 河西区| 胶南市| 鄯善县| 昌图县| 灵宝市| 钟山县| 达州市| 陆丰市| 遵义市| 祁连县| 吴堡县|