国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32 HAL庫 CubeMX配置 定時(shí)器學(xué)習(xí) F103C8T6

這篇具有很好參考價(jià)值的文章主要介紹了STM32 HAL庫 CubeMX配置 定時(shí)器學(xué)習(xí) F103C8T6。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

須知

開發(fā)板:STM32F103C8T6最小系統(tǒng)板

編譯環(huán)境:Keil5 MDK

輔助軟件:STM32 CubeMX

課程教學(xué):基于正點(diǎn)原子HAL庫學(xué)習(xí)教程

其余配件:江科大STM32配件包?和 示波器一臺(tái)

備注:?因?yàn)檫@塊開發(fā)板沒有基本定時(shí)器,所以本文也沒有基本定時(shí)器的內(nèi)容

????????????本文1.3和2.1部分的標(biāo)題不知道為什么顯示不對

? ? ? ? ? ? 大家湊合一下應(yīng)該還是看得懂標(biāo)題的


一. 通用定時(shí)器

1.1 定時(shí)器中斷

1.1.1 實(shí)現(xiàn)目標(biāo)

我們這里目標(biāo)為用定時(shí)器2實(shí)現(xiàn)LED以500ms為間隔亮滅

注意LED接PA6

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


1.1.2 CubeMX配置

?配置系統(tǒng)線

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置時(shí)鐘

這里用高速就行了,所以低速就不設(shè)置了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置GPIOA6

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


?配置定時(shí)器2

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

注意Psc和Arr都需要減1所以應(yīng)該設(shè)置為7199和4999? ? ?

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置NVIC

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


?設(shè)置時(shí)鐘頻率并生成工程

這里有個(gè)便捷方法,就是在紅框里面輸入72,然后按下enter,再點(diǎn)擊OK

這樣CubeMX就會(huì)幫我們自動(dòng)配好其他的

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

這樣我們的CubeMX就寫好了,接下來是代碼部分


1.1.3 程序編寫

這里我們要先在主函數(shù)中給中斷使能

HAL_TIM_Base_Start_IT(&htim2);          //使能中斷

然后我們在主函數(shù)下面加上

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)        //判斷是否為定時(shí)器2產(chǎn)生的中斷
    {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6);//GPIOA6電平翻轉(zhuǎn)
    }
}

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

再然后我們編譯并下載程序,我們就會(huì)發(fā)現(xiàn)在PA6上的LED以500ms為間隔亮滅了


1.2 定時(shí)器輸入比較(PWM)

1.2.1 實(shí)現(xiàn)目標(biāo)

我們的目標(biāo)是實(shí)現(xiàn)LED的呼吸燈,同時(shí)我們在旁邊點(diǎn)亮一個(gè)LED來作為對比

注意一個(gè)LED接PA0,另一個(gè)LED接PA6

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


1.2.2 CubeMX配置

這里的配置和上面的定時(shí)器中斷開始和結(jié)尾是一樣的

所以看過上面部分的朋友可以直接看定時(shí)器部分的配置

但需要注意這里不用配置NVIC

配置系統(tǒng)線

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置時(shí)鐘

這里用高速就行了,所以低速就不設(shè)置了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置GPIOA6

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置定時(shí)器2

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

這里附上一張總的引腳定義圖,可以作為參考

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

接了下來我們配置定時(shí)器2 PWM

具體原理我就不講解了,不懂的去百度都有

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


設(shè)置時(shí)鐘頻率并生成工程

這里有個(gè)便捷方法,就是在紅框里面輸入72,然后按下enter,再點(diǎn)擊OK

這樣CubeMX就會(huì)幫我們自動(dòng)配好其他的

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

這樣我們的CubeMX就寫好了,接下來是代碼部分

1.2.3 程序編寫

首先我們需要定義一個(gè)全局變量

uint16_t Pwm;    //PWM控制

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

記下來我們在主程序while前面加入這句代碼

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);       //開啟 定時(shí)器2 PWM通道1

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

然后我們在主程序while循環(huán)中加入下面的代碼

        while (Pwm < 999)
        {
            Pwm++;
            __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, Pwm);       //設(shè)置比較值
            HAL_Delay(1);                                           //延時(shí)1ms不然改變太快
        }
        while (Pwm)
        {
            Pwm--;
            __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, Pwm);       //設(shè)置比較值
            HAL_Delay(1);                                           //延時(shí)1ms不然改變太快
        }

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

接下來我們編譯下載就能看到LED呼吸燈的效果了


1.3 定時(shí)器輸入捕獲

1.3.1 實(shí)現(xiàn)目標(biāo)

我們的實(shí)現(xiàn)目標(biāo)為:按鍵下,松手后將脈寬值通過串口發(fā)送給電腦,并顯示在OLED上

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

1.3.2 CubeMX配置

配置系統(tǒng)線

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置時(shí)鐘

這里用高速就行了,所以低速就不設(shè)置了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置定時(shí)器

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置GPIO

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置I2C

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置串口

這里開不開中斷都無所謂,因?yàn)槲覀冎话l(fā)送數(shù)據(jù)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


設(shè)置時(shí)鐘頻率并生成工程

這里有個(gè)便捷方法,就是在紅框里面輸入72,然后按下enter,再點(diǎn)擊OK

這樣CubeMX就會(huì)幫我們自動(dòng)配好其他的

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

這樣我們的CubeMX就寫好了,接下來是代碼部分


1.3.3 程序編寫

usart.c

我們將使用串口的重定向

首先包含#include <stdio.h>

然后在末尾加上

int fputc(int ch, FILE * f)
{
    HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    return ch;
}

注意我們還需要設(shè)置一下

首先我們要打開魔法棒,然后勾上就行了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


main.c

首先一樣是包含頭文件

#include <stdio.h>
#include "./OLED/OLED.h"

然后在include下面加上

/* 輸入捕獲狀態(tài)(g_timxchy_cap_sta)
 * [7]  :0,沒有成功的捕獲;1,成功捕獲到一次.
 * [6]  :0,還沒捕獲到高電平;1,已經(jīng)捕獲到高電平了.
 * [5:0]:捕獲高電平后溢出的次數(shù),最多溢出63次,所以最長捕獲值 = 63*65536 + 65535 = 4194303
 *       注意:為了通用,我們默認(rèn)ARR和CCRy都是16位寄存器,對于32位的定時(shí)器(如:TIM1),也只按16位使用
 *       按1us的計(jì)數(shù)頻率,最長溢出時(shí)間為:4194303 us, 約4.19秒
 *
 *      (說明一下:正常32位定時(shí)器來說,1us計(jì)數(shù)器加1,溢出時(shí)間:4.294秒)
 */
uint8_t g_timxchy_cap_sta = 0;    /* 輸入捕獲狀態(tài) */
uint16_t g_timxchy_cap_val = 0;   /* 輸入捕獲值 */

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)接著在主函數(shù)里定義一個(gè)變量

    uint32_t temp = 0;

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

再然后我們在while循環(huán)內(nèi)加入

        if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)
            OLED_ShowString(0, 4, "Down", 16, 0);
        else
            OLED_ShowString(0, 4, " UP ", 16, 0);
        
        if (g_timxchy_cap_sta & 0X80)       /* 成功捕獲到了一次高電平 */
        {
            temp = g_timxchy_cap_sta & 0X3F;
            temp *= 65536;                  /* 溢出時(shí)間總和 */
            temp += g_timxchy_cap_val;      /* 得到總的高電平時(shí)間 */
            g_timxchy_cap_sta = 0;          /* 開啟下一次捕獲*/
            OLED_ShowNum(32, 0, temp, 7, 16, 0);
            printf("LOW: %4d ms", temp/1000);
        }

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

再然后我們在主函數(shù)下面加上回調(diào)函數(shù)

/* 定時(shí)器輸入捕獲回調(diào)函數(shù) */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        if ((g_timxchy_cap_sta & 0X80) == 0)                /* 還未成功捕獲 */
        {
            if (g_timxchy_cap_sta & 0X40)                   /* 捕獲到一個(gè)下降沿 */
            {
                g_timxchy_cap_sta |= 0X80;                  /* 標(biāo)記成功捕獲到一次高電平脈寬 */
                g_timxchy_cap_val = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);  /* 獲取當(dāng)前的捕獲值 */
                TIM_RESET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1);                      /* 一定要先清除原來的設(shè)置 */
                TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_ICPOLARITY_FALLING); /* 配置TIM2通道1上升沿捕獲 */
            }
            else /* 還未開始,第一次捕獲上升沿 */
            {
                g_timxchy_cap_sta = 0;                              /* 清空 */
                g_timxchy_cap_val = 0;
                g_timxchy_cap_sta |= 0X40;                          /* 標(biāo)記捕獲到了上升沿 */
                __HAL_TIM_SET_COUNTER(&htim2, 0);   /* 定時(shí)器2計(jì)數(shù)器清零 */
                TIM_RESET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1);   /* 一定要先清除原來的設(shè)置?。?*/
                TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING); /* 定時(shí)器2通道1設(shè)置為下降沿捕獲 */
            }
        }
    }
}


/* 定時(shí)器更新中斷回調(diào)函數(shù) */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        if ((g_timxchy_cap_sta & 0X80) == 0)            /* 還未成功捕獲 */
        {
            if (g_timxchy_cap_sta & 0X40)               /* 已經(jīng)捕獲到高電平了 */
            {
                if ((g_timxchy_cap_sta & 0X3F) == 0X3F) /* 高電平太長了 */
                {
                    TIM_RESET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1);                     /* 一定要先清除原來的設(shè)置 */
                    TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_ICPOLARITY_FALLING);/* 配置TIM2通道1上升沿捕獲 */
                    g_timxchy_cap_sta |= 0X80;          /* 標(biāo)記成功捕獲了一次 */
                    g_timxchy_cap_val = 0XFFFF;
                }
                else      /* 累計(jì)定時(shí)器溢出次數(shù) */
                {
                    g_timxchy_cap_sta++;
                }
            }
        }
    }
}

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

再然后我們就可以下載編譯就能實(shí)現(xiàn)現(xiàn)象了


二. 高級定時(shí)器

2.1 定時(shí)器輸出多路PWM

2.1.1 實(shí)現(xiàn)目標(biāo)

用定時(shí)器1產(chǎn)生多路PWM實(shí)現(xiàn)LED的不同亮度做對比

這里因?yàn)樵O(shè)備問題拍照看不出來,但實(shí)物還是呢看出來的

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


2.1.2 CubeMX配置

?配置系統(tǒng)線

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置時(shí)鐘

這里用高速就行了,所以低速就不設(shè)置了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置定時(shí)器

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


設(shè)置時(shí)鐘頻率并生成工程

這里有個(gè)便捷方法,就是在紅框里面輸入72,然后按下enter,再點(diǎn)擊OK

這樣CubeMX就會(huì)幫我們自動(dòng)配好其他的

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

這樣我們的CubeMX就寫好了,接下來是代碼部分


2.1.3 程序編寫

這里的很簡單

在while循環(huán)前開啟PWM就行

    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

然后就是編譯下載就完成了


2.2 定時(shí)器OC輸出比較產(chǎn)生相位差

2.2.1 實(shí)現(xiàn)目標(biāo)

使用定時(shí)器1產(chǎn)生4路占空比為50%的PWM并具有相位差

相位差為45度

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


相位差為90度

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


相位差為135度

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


2.2.2 CubeMX配置

??配置系統(tǒng)線

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置時(shí)鐘

這里用高速就行了,所以低速就不設(shè)置了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置定時(shí)器

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


?設(shè)置時(shí)鐘頻率并生成工程

這里有個(gè)便捷方法,就是在紅框里面輸入72,然后按下enter,再點(diǎn)擊OK

這樣CubeMX就會(huì)幫我們自動(dòng)配好其他的

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

這樣我們的CubeMX就寫好了,接下來是代碼部分


2.2.3 程序編寫

我們需要使能輸出捕獲所以在while循環(huán)之前加入這段代碼

HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_3);
HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_4);

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

然后我們就可以編譯下載了


2.3 定時(shí)器OC互補(bǔ)輸出

2.3.1 實(shí)現(xiàn)目標(biāo)

OC互補(bǔ)輸出用2個(gè)通道產(chǎn)生4路占空比為50%的PWM

具體原理我這里不多贅述,可以去看正點(diǎn)原子的HAL庫教學(xué)視頻

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


2.3.2 CubeMX配置

?配置系統(tǒng)線

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置時(shí)鐘

這里用高速就行了,所以低速就不設(shè)置了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置定時(shí)器

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


??設(shè)置時(shí)鐘頻率并生成工程

這里有個(gè)便捷方法,就是在紅框里面輸入72,然后按下enter,再點(diǎn)擊OK

這樣CubeMX就會(huì)幫我們自動(dòng)配好其他的

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

這樣我們的CubeMX就寫好了,接下來是代碼部分


2.3.3 程序編寫

我們只需要在while循環(huán)前面加上使能OC和OCN的代碼就行了

    HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_2);
    HAL_TIMEx_OCN_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIMEx_OCN_Start(&htim1, TIM_CHANNEL_2);

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

然后我們就可以編譯下載了


2.4 定時(shí)器PWM互補(bǔ)輸出加死區(qū)生成

2.4.1 實(shí)現(xiàn)目標(biāo)

開啟兩路的PWM和其互補(bǔ)輸出,并有死區(qū)生成

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


2.4.2 CubeMX配置

??配置系統(tǒng)線

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置時(shí)鐘

這里用高速就行了,所以低速就不設(shè)置了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置定時(shí)器

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


??設(shè)置時(shí)鐘頻率并生成工程

這里有個(gè)便捷方法,就是在紅框里面輸入72,然后按下enter,再點(diǎn)擊OK

這樣CubeMX就會(huì)幫我們自動(dòng)配好其他的

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

這樣我們的CubeMX就寫好了,接下來是代碼部分


2.4.3 程序編寫

我們只需要在while前加上

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

然后我們就可以編譯下載了


2.5 定時(shí)器PWM輸入捕獲

2.5.1 實(shí)現(xiàn)目標(biāo)

用定時(shí)器1對定時(shí)器2產(chǎn)生的PWM測量,并用串口打印出來

有興趣的可以用示波器測 ,我這里就不展示效果圖了

注意在不考慮溢出的情況下這里的配置測量周期最大為910us

周期為100us,高電平脈寬為60us

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

周期為910us,高電平脈寬為60us

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

周期為911us(注意已經(jīng)超出),高電平脈寬為60us

明顯看出周期不對

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


2.5.2 CubeMX配置

?配置系統(tǒng)線

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置時(shí)鐘

這里用高速就行了,所以低速就不設(shè)置了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置定時(shí)器1

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置定時(shí)器2

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


配置串口

這里開不開中斷都無所謂,因?yàn)槲覀冎话l(fā)送數(shù)據(jù)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


??設(shè)置時(shí)鐘頻率并生成工程

這里有個(gè)便捷方法,就是在紅框里面輸入72,然后按下enter,再點(diǎn)擊OK

這樣CubeMX就會(huì)幫我們自動(dòng)配好其他的

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

這樣我們的CubeMX就寫好了,接下來是代碼部分


2.5.3 程序編寫

?usart.c

我們將使用串口的重定向

首先包含#include <stdio.h>

然后在末尾加上

int fputc(int ch, FILE * f)
{
    HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    return ch;
}

注意我們還需要設(shè)置一下

首先我們要打開魔法棒,然后勾上就行了

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)


main.c

首先我們在前創(chuàng)建3個(gè)全局變量

uint8_t Tim1_IC_Flag;            //0-未捕獲  1-捕獲
uint16_t Tim2_Pwm_H_Val;         //PWM的高電平脈寬
uint16_t Tim2_Pwm_C_Val;         //PWM的周期寬度

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

然后再主函數(shù)內(nèi)創(chuàng)建4個(gè)局部變量

double ht, ct, f, tpsc;

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

再就是在while循環(huán)前添加代碼

    // 定時(shí)器2PWM使能 產(chǎn)生PWM波
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
    
    //定時(shí)器1輸入捕獲使能
    HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
    HAL_TIM_IC_Start(&htim1, TIM_CHANNEL_2);

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

如果我們要修改定時(shí)器2通道1的比較值和定時(shí)器的重裝載值可以用這個(gè)函數(shù)和宏定義

    //修改參數(shù)
    TIM2->CCR1 = 60;
    __HAL_TIM_SetAutoreload(&htim2, 100);

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

再然后我們就可以寫while循環(huán)內(nèi)的邏輯了

    HAL_Delay(500);     //延時(shí)500ms不然打印數(shù)據(jù)太快
    
    if (Tim1_IC_Flag)    /* 捕獲了一次數(shù)據(jù) */
    {
        printf("\r\n");                                     /* 輸出空,另起一行 */
        printf("PWM Hight:%d\r\n", Tim2_Pwm_H_Val);   /* 打印高電平脈寬 */
        printf("PWM Cycle:%d\r\n", Tim2_Pwm_C_Val);   /* 打印周期 */
        tpsc = ((double)0 + 1) / 72;      /* 得到PWM采樣時(shí)鐘周期時(shí)間 */ 
        ht = Tim2_Pwm_H_Val * tpsc;                   /* 計(jì)算高電平時(shí)間 */
        ct = Tim2_Pwm_C_Val * tpsc;                   /* 計(jì)算周期長度 */
        f = (1 / ct) * 1000000;                             /* 計(jì)算頻率 */
        printf("PWM Hight time:%.3fus\r\n", ht);            /* 打印高電平脈寬長度 */
        printf("PWM Cycle time:%.3fus\r\n", ct);            /* 打印周期時(shí)間長度 */
        printf("PWM Frequency :%.3fHz\r\n", f);             /* 打印頻率 */ 
        
        
        HAL_TIM_IC_Stop_IT(&htim1, TIM_CHANNEL_1);  //停止定時(shí)器中斷
        Tim1_IC_Flag = 0;/* 清零狀態(tài),重新開始檢測 */
        Tim2_Pwm_H_Val=0;
        Tim2_Pwm_C_Val=0;/* 重啟PWM輸入檢測 */
        HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1); //開啟定時(shí)器中斷
    } 

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

接下來就是在主函數(shù)后面寫定時(shí)器輸入捕獲中斷回調(diào)函數(shù)了

/* 定時(shí)器輸出捕獲中斷回調(diào)函數(shù) */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1) //判斷是否為定時(shí)器1中斷
    {
        if (Tim1_IC_Flag == 0)  //未捕獲
        {
            if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)  //判斷是否是通道一
            {
                Tim2_Pwm_H_Val = HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_2) + 1 + 1;  //讀取高脈寬
                Tim2_Pwm_C_Val = HAL_TIM_ReadCapturedValue(&htim1, TIM_CHANNEL_1) + 1 + 1;  //讀取周期
                Tim1_IC_Flag = 1;   //標(biāo)志位置1
            }
        
        }
        
    }
}

stm32f103c8t6 timer4 hal庫配置,stm32,學(xué)習(xí)

然后我們就可以編譯下載看現(xiàn)象了,大家也可以多嘗試PWM看看效果

注意上面實(shí)現(xiàn)目標(biāo)的內(nèi)容就行了


三、結(jié)束語

這篇文章主要也是我自己為了我自己復(fù)習(xí)用的筆記

所以沒有過多的原理解釋,寫得也一般

主要是因?yàn)檎c(diǎn)原子并沒有出配置CubeMX的教程

所以我寫了這個(gè),原理部分看正點(diǎn)原子就行了

希望大家越學(xué)越有,早日成為嵌入式巨佬文章來源地址http://www.zghlxwxcb.cn/news/detail-859151.html

到了這里,關(guān)于STM32 HAL庫 CubeMX配置 定時(shí)器學(xué)習(xí) F103C8T6的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【HAL庫】STM32CubeMX開發(fā)----非阻塞延時(shí)實(shí)驗(yàn)----SysTick(滴答定時(shí)器)中斷

    【HAL庫】STM32CubeMX開發(fā)----非阻塞延時(shí)實(shí)驗(yàn)----SysTick(滴答定時(shí)器)中斷

    STM32CubeMX 下載和安裝 詳細(xì)教程 【HAL庫】STM32CubeMX開發(fā)----STM32F103/F207/F407----目錄 HAL庫 有自帶的 ms級 延時(shí)函數(shù): HAL_Delay(); 缺點(diǎn): 這是 阻塞延時(shí) 方式,就是延時(shí)期間,什么都不能干,這樣很浪費(fèi)資源。 這篇文章主要介紹,利用 SysTick(滴答定時(shí)器)中斷 實(shí)現(xiàn) 非阻塞延時(shí) 的實(shí)驗(yàn)

    2024年02月16日
    瀏覽(96)
  • STM32 HAL庫 Timer(定時(shí)器)+DMA輸出PWM底層配置過程學(xué)習(xí)

    STM32 HAL庫 Timer(定時(shí)器)+DMA輸出PWM底層配置過程學(xué)習(xí)

    本文使用的芯片型號是STM32G030,寫本文的目前是想記錄學(xué)習(xí)下Timer借助DMA生成可變占空比PWM時(shí)的底層配置過程。 使用TIM1,配置就只改了圖上的配置,系統(tǒng)時(shí)鐘用的16M,分頻選擇15(16-1),自動(dòng)重裝載寄存器ARR選擇999(1000-1),那么生成的就是1kHz的PWM,這里為什么要減1,因?yàn)檫@倆是

    2024年04月09日
    瀏覽(55)
  • STM32CubeMX——定時(shí)器配置

    STM32CubeMX——定時(shí)器配置

    本文將會(huì)以STM32F103C8T6為例配置定時(shí)器2定時(shí)5 ms SMT32F1系列共有8個(gè)定時(shí)器: 基本定時(shí)器(TIM6、TIM7) 通用定時(shí)器(TIM2、TIM3、TIM4、TIM5) 高級定時(shí)器(TIM1、TIM8) 16位向上、向下、向上/下自動(dòng)裝載計(jì)數(shù)器 16位可編程(可以實(shí)時(shí)修改)預(yù)分頻器,計(jì)數(shù)器時(shí)鐘頻率的分頻系數(shù)為 1~6553

    2023年04月10日
    瀏覽(22)
  • 基于CubeMX(hal庫)stm32中hrtim高分辨率定時(shí)器的基本使用(自存)

    基于CubeMX(hal庫)stm32中hrtim高分辨率定時(shí)器的基本使用(自存)

    1、選通道 單通道輸出or雙通道輸出 2、Timer A~F配置 (Master Timer不用管) 比較值Compare 個(gè)人感覺跟CCR差不多的意思, 注意不要大于上面的Period就行 設(shè)置上升沿和下降沿時(shí)間: 若想讓上設(shè)Compare=CCR 如圖設(shè)置 即可 即在 計(jì)數(shù)到Compare1時(shí)拉低,計(jì)數(shù)溢出時(shí)拉高 所以上圖輸出頻率10kHz占

    2024年02月04日
    瀏覽(25)
  • STM32 HAL庫 通用定時(shí)器介紹及相關(guān)應(yīng)用例程 定時(shí)器中斷 輸出PWM (點(diǎn)亮LED呼吸燈、輸出PWM、輸入捕獲) CubeMX

    STM32 HAL庫 通用定時(shí)器介紹及相關(guān)應(yīng)用例程 定時(shí)器中斷 輸出PWM (點(diǎn)亮LED呼吸燈、輸出PWM、輸入捕獲) CubeMX

    (部分圖引自于ATK) 前情提要(基本定時(shí)器) 點(diǎn)此進(jìn)入 通用定時(shí)器類別 通用定時(shí)器和基本定時(shí)器相比大致的工作方式是相似的,不過通用定時(shí)器比基本定時(shí)器多了一些很好用的功能,比如: 外部輸入捕獲 輸出比較 輸出PWM 時(shí)鐘源 CubeMX為我們提供了配置時(shí)鐘的非常方便的工

    2024年04月15日
    瀏覽(39)
  • STM32開發(fā)(10)----CubeMX配置基本定時(shí)器

    STM32開發(fā)(10)----CubeMX配置基本定時(shí)器

    本章介紹使用STM32CubeMX對基本定時(shí)器進(jìn)行配置的方法,STM32F103高性能系列設(shè)備包括基本定時(shí)器、高級控制定時(shí)器、通用定時(shí)器、看門狗定時(shí)器和 SysTick 定時(shí)器,但是STM32F103C6t6上資源比較有限(高級定時(shí)器TIM1,通用定時(shí)器TIM2和TIM3),沒有真正的基本定時(shí)器,其實(shí)通用定時(shí)器和

    2024年02月16日
    瀏覽(20)
  • STM32使用CubeMx配置定時(shí)器輸出PWM

    STM32使用CubeMx配置定時(shí)器輸出PWM

    ????????項(xiàng)目中經(jīng)常使用到STM32來輸出PWM,每次配置過后過不了多久就會(huì)忘記,稍微需要對配置做出修改時(shí)都要翻很久的手冊,所以決定結(jié)合實(shí)例把PWM配置的詳細(xì)步驟記錄下來,這樣在下次配置時(shí)可以很快的撿起來。 ????????本文檔的行文結(jié)構(gòu)如下,首先,說明實(shí)際需

    2024年02月03日
    瀏覽(27)
  • STM32高級定時(shí)器輸出指定數(shù)量PWM(STM32CubeMx配置)

    STM32高級定時(shí)器輸出指定數(shù)量PWM(STM32CubeMx配置)

    高級定時(shí)器中有一個(gè)重復(fù)計(jì)數(shù)器,本實(shí)驗(yàn)輸出指定個(gè)數(shù)PWM就是利用了重復(fù)計(jì)數(shù)器的特性,先來看看重復(fù)計(jì)數(shù)器的特性是什么: 計(jì)數(shù)器每次上溢或下溢都能使重復(fù)計(jì)數(shù)器減1,減到0時(shí),再發(fā)生一次溢出就會(huì)產(chǎn)生更新事件 這是什么意思呢,這里舉個(gè)例子比如說我設(shè)定重復(fù)計(jì)數(shù)器的

    2024年02月02日
    瀏覽(22)
  • 搭建stm32電機(jī)控制代碼框架(二)——Stm32CubeMx配置定時(shí)器

    搭建stm32電機(jī)控制代碼框架(二)——Stm32CubeMx配置定時(shí)器

    搭建了基礎(chǔ)的環(huán)境,配置了一個(gè)簡單的工程后,CubeMx的基本操作就會(huì)了。然后基于這個(gè)操作往下推進(jìn),開始對關(guān)鍵模塊定時(shí)器的攻略,這個(gè)部分需要先熟悉一下Stm32的定時(shí)器基本原理。 《STM32參考手冊》中僅對定時(shí)器的介紹就已經(jīng)占了100多頁,這里就不一一展開,挑一些關(guān)鍵

    2024年02月06日
    瀏覽(21)
  • stm32——hal庫學(xué)習(xí)筆記(定時(shí)器)

    stm32——hal庫學(xué)習(xí)筆記(定時(shí)器)

    使用純軟件(CPU死等)的方式實(shí)現(xiàn)定時(shí)(延時(shí))功能 使用精準(zhǔn)的時(shí)基,通過硬件的方式,實(shí)現(xiàn)定時(shí)功能 遞增計(jì)數(shù)模式實(shí)例說明 中心對齊模式實(shí)例說明 TIM6 和TIM7 控制寄存器 1(TIMx_CR1) TIM6 和TIM7 DMA/中斷使能寄存器(TIMx_DIER) TIM6 和TIM7 狀態(tài)寄存器(TIMx_SR) TIM6 和TIM7 計(jì)數(shù)器(TIMx_CNT)

    2024年02月21日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包