0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32G0開發(fā)筆記:定時(shí)器timer的基本使用方法

CHANBAEK ? 來(lái)源:電子技術(shù)攻城獅 ? 作者:MakerInChina.cn ? 2023-01-17 10:43 ? 次閱讀

使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,以下為定時(shí)器timer的基本使用方法。

1 新建項(xiàng)目

  • PIO主頁(yè)新建項(xiàng)目timer,框架選擇libopencm3,開發(fā)板選擇 MonkeyPi_STM32_G070RB;
  • 新建完成后在src目錄新建主程序文件main.c;
  • 然后更改項(xiàng)目文件platformio.ini的燒寫和調(diào)試方式:
1upload_protocol = cmsis-dap
2debug_tool = cmsis-dap

2 使用基本定時(shí)器

  • 定時(shí)器設(shè)置

以下為設(shè)置定時(shí)器3的過(guò)程:

1static void timer_setup(void)
 2{
 3    /* Enable TIM3 clock. */
 4    rcc_periph_clock_enable(RCC_TIM3);
 5
 6    /* Enable TIM3 interrupt. */
 7    nvic_enable_irq(NVIC_TIM3_IRQ);
 8
 9    /* Timer global mode:
10     * - No divider
11     * - Alignment edge
12     * - Direction up
13     */
14    timer_set_mode(TIM3, TIM_CR1_CKD_CK_INT,
15        TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
16
17    /*
18     * APB1 PRE = 1, TIMPCLK = PCLK
19     * APB1 PRE != 1, TIMPCLK = PCLK * 2
20     */
21    timer_set_prescaler(TIM3, (rcc_apb1_frequency/100000-1)); //100KHz
22
23    /* Disable preload. */
24    timer_disable_preload(TIM3);
25    timer_continuous_mode(TIM3);
26
27    /* Timer Period */
28    timer_set_period(TIM3, 20000-1);    /* 100kHz /20_000 = 5 Hz */
29
30    /* Counter enable. */
31    timer_enable_counter(TIM3);
32
33    timer_enable_irq(TIM3, TIM_DIER_UIE);
34}

包括設(shè)置定時(shí)器的模式,使能定時(shí)器中斷,定時(shí)器的中斷頻率通過(guò) timer_set_prescaler 設(shè)置分頻值和 timer_set_period 設(shè)置周期值,上面需要注意的是 timer_set_prescaler 設(shè)置分頻值需要根據(jù)系統(tǒng)設(shè)置的時(shí)鐘,如果APB1的分頻為1,則TIM外設(shè)時(shí)鐘和APB1相同,否則為其2倍, 這里由于系統(tǒng)設(shè)置的時(shí)鐘為64MHz,即APB1預(yù)分頻為1,因此這里設(shè)置TIM分頻為 rcc_apb1_frequency/100000-1,即100KHz; 然后timer_set_period設(shè)置定時(shí)器周期為 20000-1,那么定時(shí)器中斷頻率為5Hz;

  • 定時(shí)器中斷
1void tim3_isr(void)
2{
3    if(timer_get_flag(TIM3, TIM_SR_UIF)) {
4        /* Clear compare interrupt flag. */
5        timer_clear_flag(TIM3, TIM_SR_UIF);
6
7        gpio_toggle(GPIOB,GPIO4);
8    }
9}

這里直接在中斷中對(duì)GPIO進(jìn)行翻轉(zhuǎn),即5Hz翻轉(zhuǎn)一次GPIO,即200ms進(jìn)行高低變化;

  • 燒寫測(cè)試

將程序燒寫到開發(fā)板后,測(cè)量頻率可以看到和預(yù)期一致:

3 使用systick定時(shí)器

3.1 systick 定時(shí)器設(shè)置
1static void systick_setup(void)
2{
3    /* clock rate / 1000 to get 1mS interrupt rate */
4    systick_set_reload(64000);
5    systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
6    systick_counter_enable();
7    /* this done last */
8    systick_interrupt_enable();
9}

這里設(shè)置systick重載值為64000,因?yàn)橄到y(tǒng)設(shè)置時(shí)鐘為64MHz,那么定時(shí)器的頻率為1KHz,即1ms時(shí)間定時(shí)中斷;

3.2 systick 定時(shí)器中斷
1volatile uint32_t tick_counter = 0;
2
3void sys_tick_handler(void)
4{
5    tick_counter++;
6}

這里在中斷函數(shù)里進(jìn)行計(jì)數(shù);

3.3 使用

一般這個(gè)systick定時(shí)器在cortex-m芯片中都存在,因此比較通用,可以用作RTOS的時(shí)基或用作延時(shí)功能,比如根據(jù)上面的tick_counter計(jì)數(shù)可以實(shí)現(xiàn)類似Arduino中的millis方式編程

  • 由于定時(shí)器中斷為1ms定時(shí),因此tick_counter就是1ms的計(jì)數(shù)值
1uint32_t millis(void)
2{
3    return tick_counter;
4}
  • 使用millis進(jìn)行延時(shí)
1uint32_t lastTime = millis();
 2while(1){
 3    if( (millis() - lastTime) > 500) {
 4        lastTime = millis();
 5
 6        gpio_toggle(GPIOB,GPIO4);
 7    }
 8
 9    ...
10}

這樣就達(dá)到500ms的延時(shí),而且不會(huì)對(duì)其他語(yǔ)句的執(zhí)行造成影響。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3231

    瀏覽量

    114326
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4896

    瀏覽量

    97058
  • 燒寫
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    14237
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1188

    瀏覽量

    51832
  • Timer
    +關(guān)注

    關(guān)注

    1

    文章

    63

    瀏覽量

    12762
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GD32E230開發(fā)筆記-GD32E230定時(shí)器控制

    GD32E230開發(fā)筆記-GD32E230定時(shí)器控制1.硬件設(shè)計(jì)2.軟件設(shè)計(jì)定時(shí)器的配置3.設(shè)計(jì)效果4.程序源碼1.硬件設(shè)計(jì)GD32E230C8T6中定時(shí)器的資源還是比較豐富,這里我們
    發(fā)表于 12-02 14:36 ?28次下載
    GD32E230<b class='flag-5'>開發(fā)筆記</b>-GD32E230<b class='flag-5'>定時(shí)器</b>控制

    STM32G0開發(fā)筆記:FreeRTOS和FreeModbus庫(kù)使用

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,以下為FreeRTOS和FreeModbus庫(kù)使用。
    的頭像 發(fā)表于 01-16 14:44 ?5383次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:FreeRTOS和FreeModbus庫(kù)使用

    STM32G0開發(fā)筆記:FreeRTOS和CLI組件使用

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,以下為FreeRTOS和CLI組件使用。
    的頭像 發(fā)表于 01-16 14:47 ?3316次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:FreeRTOS和CLI組件使用

    STM32G0開發(fā)筆記:使用FreeRTOS系統(tǒng)的隊(duì)列Queue

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,下面為使用FreeRTOS系統(tǒng)的隊(duì)列Queue。
    的頭像 發(fā)表于 01-16 14:50 ?1312次閱讀

    STM32G0開發(fā)筆記:使用FreeRTOS系統(tǒng)

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,下面為使用FreeRTOS系統(tǒng)。
    的頭像 發(fā)表于 01-16 15:07 ?2290次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:使用FreeRTOS系統(tǒng)

    STM32G0開發(fā)筆記:使用ADC進(jìn)行NTC溫度采集

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,以下使用ADC進(jìn)行NTC溫度采集。
    的頭像 發(fā)表于 01-16 15:12 ?8922次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:使用ADC進(jìn)行NTC溫度采集

    STM32G0開發(fā)筆記:用PWM來(lái)實(shí)現(xiàn)LED呼吸燈效果

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,下面使用PWM來(lái)實(shí)現(xiàn)LED呼吸燈效果。
    的頭像 發(fā)表于 01-16 15:15 ?2175次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:用PWM來(lái)實(shí)現(xiàn)LED呼吸燈效果

    STM32G0開發(fā)筆記:EEPROM M24C02的使用方法

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,以下為EEPROM M24C02的使用方法。
    的頭像 發(fā)表于 01-16 15:19 ?2697次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:EEPROM M24C02的<b class='flag-5'>使用方法</b>

    STM32G0開發(fā)筆記:SD卡模塊的使用方法

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,下面介紹SD卡模塊的使用方法
    的頭像 發(fā)表于 01-19 16:27 ?2162次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:SD卡模塊的<b class='flag-5'>使用方法</b>

    STM32G0開發(fā)筆記:SPI接口的基本使用

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,下面介紹SPI接口的基本使用。
    的頭像 發(fā)表于 01-17 10:38 ?3005次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:SPI接口的基本使用

    STM32G0開發(fā)筆記:多通道ADC與DMA的使用

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,以下為多通道ADC與DMA的使用。
    的頭像 發(fā)表于 01-17 10:41 ?6697次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:多通道ADC與DMA的使用

    STM32G0開發(fā)筆記:串口中斷的使用

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,以下為串口中斷的使用。
    的頭像 發(fā)表于 01-17 10:46 ?2243次閱讀

    STM32G0開發(fā)筆記:GPIO接按鍵的使用方式

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,下面為GPIO接按鍵的使用方式。
    的頭像 發(fā)表于 01-17 10:48 ?1698次閱讀

    STM32G0開發(fā)筆記:LED燈示例

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,下面為L(zhǎng)ED燈示例。
    的頭像 發(fā)表于 01-17 10:52 ?1357次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:LED燈示例

    STM32G0開發(fā)筆記:使用libopencm3庫(kù)

    使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,開發(fā)環(huán)境為VSCode+PIO插件,這里以開發(fā)
    的頭像 發(fā)表于 01-17 10:56 ?1787次閱讀
    <b class='flag-5'>STM32G0</b><b class='flag-5'>開發(fā)筆記</b>:使用libopencm3庫(kù)