国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2025年05月17日(星期六)

2020年05月17日 | 第五節(jié):STM32輸入捕獲(用CubeMX學(xué)習(xí)STM32)

發(fā)布者:閃耀之星 來(lái)源: eefocus關(guān)鍵字:STM32  輸入捕獲  CubeMX 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

前言: STM32定時(shí)器輸入捕獲簡(jiǎn)介

STM32的輸入捕獲可以用于捕獲脈寬, 測(cè)量時(shí)間 . 例如超聲波測(cè)距模塊就是需要用輸入捕獲功能, 通過(guò)測(cè)量輸入脈沖的高電平脈寬 , 從而計(jì)算出測(cè)量物體的距離 ;

定時(shí)器PWM工作模式上篇博客講過(guò)了, 上篇是輸出PWM, 本篇是要輸入, 即外面的信號(hào)送給單片機(jī)的引腳, 然后單片機(jī)測(cè)量出脈寬 ;

注: 下面根據(jù)正點(diǎn)原子的標(biāo)準(zhǔn)庫(kù)函數(shù)教程分析, 并用CubeMX完成配置以及HAL庫(kù)函數(shù)編程

在這里插入圖片描述

如圖所示 : 以測(cè)量高電平脈寬為例, 我們先設(shè)置定時(shí)器通道為上升沿捕獲, 到1的時(shí)候觸發(fā)定時(shí)器計(jì)數(shù), 然后立刻設(shè)置為下降沿捕獲, 到2的時(shí)候就捕獲到下降沿, 再記錄輸入捕獲寄存器的值, 兩個(gè)時(shí)間差就是高電平時(shí)長(zhǎng)tH;

需要注意的是, 在tH這段高電平時(shí)間內(nèi), 是由很多個(gè)向上計(jì)數(shù)的脈沖來(lái)計(jì)數(shù)的。在這里面計(jì)數(shù)可能溢出N多次; 下面是原子的庫(kù)函數(shù)指南pdf里面講解的圖

在這里插入圖片描述

在tH這段高電平里面, 可能有多個(gè)向上計(jì)數(shù)的脈沖, 而那個(gè)三角向上計(jì)數(shù)脈沖也可能溢出多次。就是利用這N多個(gè)向上計(jì)數(shù)的脈沖來(lái)計(jì)算tH的值的。??ARR的值是我們自己設(shè)定的,所以可以知道溢出一次是多長(zhǎng)時(shí)間, 每溢出一次, 都給溢出次數(shù)加一。 溢出次數(shù)以及檢測(cè)高低電平的數(shù)據(jù)記錄在自己設(shè)定的一個(gè)變量里面


N*ARR + CCRx2即為CNT計(jì)數(shù)次數(shù), 從而就可以算出計(jì)數(shù)時(shí)間, 算出高電平時(shí)長(zhǎng)


N: 溢出次數(shù)??ARR: 溢出一次的時(shí)間?? 在一個(gè)tH內(nèi),溢出的次數(shù)不一定正好是整數(shù), 所以用記錄下CCRx2的值, 用以補(bǔ)充, 這樣tH的值就更精確了

在這里插入圖片描述

這是一個(gè)八位的變量,可以將其看做8位寄存器,不同的位儲(chǔ)存不同的數(shù)據(jù)


5.1 操作簡(jiǎn)介

?? 通過(guò)信號(hào)發(fā)生器給單片機(jī)對(duì)應(yīng)引腳輸入一個(gè)給定頻率和占空比的矩形波信號(hào), 單片機(jī)通過(guò)輸入捕獲測(cè)量出高電平時(shí)長(zhǎng); 通過(guò)串口發(fā)送至PC端的串口調(diào)試助手查看測(cè)量的脈寬是否準(zhǔn)確


5.2 STM32CubeMX配置初始化+IAR編程

Step1 : Cube配置

(1) 新建工程

? RCC和SYS配置, 時(shí)鐘樹(shù)配置都同前面一樣; 還要用串口打印數(shù)據(jù), 測(cè)試用。

RCC和SYS配置

在這里插入圖片描述

USART1串口1配置(按照串口那一篇配置串口即可–>串口通信 )

在這里插入圖片描述

注: 詳細(xì)解釋轉(zhuǎn)至串口通信


時(shí)鐘樹(shù)配置

在這里插入圖片描述

(2)TIM5參數(shù)配置

使用TIM5的通道一(TIM5_CH1)接收外部輸入的信號(hào)。配置如下

在這里插入圖片描述

注: 上一篇介紹了如何計(jì)算定時(shí)器溢出時(shí)間,這里溢出時(shí)間為1us??點(diǎn)擊查看—>定時(shí)器中斷及定時(shí)器產(chǎn)生PWM

使能TIM5中斷(要在中斷里面計(jì)數(shù)高電平脈寬)

NVIC設(shè)置(同樣可以查看上一篇看詳細(xì)講解NVIC配置以及中斷分組詳解)

在這里插入圖片描述

(3) 工程配置(Project Manager)

在這里插入圖片描述

注 : 高級(jí)設(shè)置默認(rèn)即可


(4) 生成代碼(Generate Code)

Step2 : Keil/IAR編程

(1)重定向printf函數(shù)(重定向之后我們才可以使用printf函數(shù)將調(diào)試信息打印到串口調(diào)試助手) 下面是串口通信那一篇博客寫(xiě)的話,直接搬到這里:

在學(xué)習(xí)C語(yǔ)言的時(shí)候, 大家肯定都用過(guò)printf這個(gè)函數(shù), printf可以將指定字符打印到電腦的顯示器上;

但是, 單片機(jī)要使用這個(gè)就要把他打印的方向改一下, 不是打印在電腦的命令行中, 而是打印到串口里面,傳輸?shù)酱谡{(diào)試助手. 因此我們需要重定向printf函數(shù);

重定向后我們要將調(diào)試信息打印到USART1中, 需要對(duì)printf所依賴(lài)的打印函數(shù)fputc()重定向 .

在usart.c里面添加重定向代碼

在這里插入圖片描述

以后這段代碼直接抄就好了, copy下來(lái)用


/* USER CODE BEGIN 0 */

#include "stdio.h"


#ifdef __GNUC__

    #define PUTCHAR_PROTOTYPE int _io_putchar(int ch)

#else 

    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /* __GNUC__*/

    

// 重定向C語(yǔ)言中的printf函數(shù) 

PUTCHAR_PROTOTYPE

{

    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

    return ch;

}


/* USER CODE END 0 */


(2) 查看一下定時(shí)器相關(guān)代碼學(xué)習(xí)

打開(kāi)之后跟正點(diǎn)原子的標(biāo)準(zhǔn)庫(kù)函數(shù)寫(xiě)的代碼對(duì)比一下, 又利于自己理解CubeMX配置的機(jī)理, 以后會(huì)更得心應(yīng)手, 慢慢的自己就可以一直標(biāo)準(zhǔn)庫(kù)函數(shù)用HAL庫(kù)寫(xiě)了。

在這里插入圖片描述

這張圖左邊是CubeMX配置后自動(dòng)生成的代碼, 藍(lán)色框框里面就是對(duì)應(yīng)的CubeMX里面的配置; 右側(cè)是原子的標(biāo)準(zhǔn)庫(kù)例程代碼, 可以對(duì)比一下, 增強(qiáng)理解


tips:CSDN只能上傳不超過(guò)5M的圖片, 所以這個(gè)圖片經(jīng)過(guò)了壓縮 , 放大看可以看清晰一點(diǎn)。


(3) 編寫(xiě)中斷部分函數(shù)

因?yàn)橐谥袛嘀胁东@上升沿和下降沿, 所以主要代碼寫(xiě)在中斷服務(wù)函數(shù)里面

下圖是計(jì)數(shù)中斷

在這里插入圖片描述

TIM5CH1_CAPTURE_STA雖然是我們定義的一個(gè)變量,但可以把它看做是一個(gè)8位的寄存器

在這里插入圖片描述

下圖是捕獲中斷

在這里插入圖片描述

在HAL_TIM_PeriodElapsedCallback()回調(diào)函數(shù)中用以處理計(jì)數(shù)次數(shù)和時(shí)間;?? 在HAL_TIM_IC_CaptureCallback()回調(diào)函數(shù)負(fù)責(zé)處理捕獲到的上升沿和下降沿,

并隨著捕獲到上升沿而更改為下降沿捕獲,?? 隨著捕獲到下降沿而更改定時(shí)器為上升沿捕獲.

下面是完整代碼:


/* USER CODE BEGIN 1 */

/* bit7 捕獲完成標(biāo)識(shí) bit6 捕獲到高電平標(biāo)識(shí) bit5~0 捕獲高電平后定時(shí)器溢出的次數(shù) */

uint8_t TIM5CH1_CAPTURE_STA = 0; // 輸入捕獲狀態(tài)

uint32_t TIM5CH1_CAPTURE_VAL; // 輸入捕獲值(TIM2/TIM5是32位的定時(shí)器所以這里定義為uint32_t)

// 中斷服務(wù)函數(shù)里面會(huì)自動(dòng)調(diào)用這個(gè)回調(diào)函數(shù)  這個(gè)是定時(shí)器更新中斷中處理的函數(shù)

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  if (htim->Instance == TIM5) // 判斷是定時(shí)器5發(fā)生中斷

  {

    if ((TIM5CH1_CAPTURE_STA & 0x80) == 0) // 還未成功捕獲

    {

      if (TIM5CH1_CAPTURE_STA & 0x40)    // 捕獲到高電平

      {

        if ( (TIM5CH1_CAPTURE_STA & 0x3f) == 0x3f ) // 如果高電平太長(zhǎng)  做溢出處理

        {

          TIM5CH1_CAPTURE_STA |= 0x80; // 標(biāo)記成功捕獲了一次

          TIM5CH1_CAPTURE_VAL = 0xffffffff;

        }

        else

        {

          TIM5CH1_CAPTURE_STA++; // 若沒(méi)有溢出, 就只讓TIM5CH1_CAPTURE_STA自加就ok

        }

      }

    }

  }

}


// 定時(shí)器輸入捕獲中斷處理回調(diào)函數(shù),該函數(shù)在 HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) 中會(huì)被調(diào)用 

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

{

  if ( (TIM5CH1_CAPTURE_STA & 0x80) == 0 ) // 還未成功捕獲

  {

    if (TIM5CH1_CAPTURE_STA & 0x40) // 捕獲到一個(gè)下降沿

    {

      TIM5CH1_CAPTURE_STA |= 0x80; // 標(biāo)記成功捕獲到一次高電平脈寬

      TIM5CH1_CAPTURE_VAL = HAL_TIM_ReadCapturedValue(&htim5, TIM_CHANNEL_1); // 獲取當(dāng)前的捕獲值. 即CCRx2

      TIM_RESET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1); // 清除原來(lái)的設(shè)置

      TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING); // 配置TIM5通道1上升沿捕獲

      

    }

    else

    {

      TIM5CH1_CAPTURE_STA = 0; // 清空自定義的狀態(tài)寄存器

      TIM5CH1_CAPTURE_VAL = 0; // 清空捕獲值

      TIM5CH1_CAPTURE_STA |= 0x40;// 標(biāo)記捕獲到了上升沿

      __HAL_TIM_DISABLE(&htim5); //關(guān)閉定時(shí)器5

      __HAL_TIM_SET_COUNTER(&htim5,0);

      TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);   //一定要先清除原來(lái)的設(shè)置?。?p>      TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定時(shí)器5通道1設(shè)置為下降沿捕獲

      __HAL_TIM_ENABLE(&htim5);//使能定時(shí)器5

    }

  }

}


/* USER CODE END 1 */

=

tips:每句話都有注釋, 不要一看到密密麻麻代碼就不看了, 看一下并不是很難理解。 也不要因?yàn)榭吹饺谴髮?xiě)字母的函數(shù)或者變量而犯怵, 靜下心來(lái)用兩分鐘看一看很容易看懂

在這里插入圖片描述

還有一個(gè)問(wèn)題:就是這里為什么用HAL_TIM_PeriodElapsedCallback而不是其他的callback呢? 原因在IRQ_Handler函數(shù)里面。

在這里插入圖片描述

(4) 主函數(shù)程序(main.c)

首先使能定時(shí)器中斷、同時(shí)定義一個(gè)變量備用:

在這里插入圖片描述

/* USER CODE BEGIN 2 */

HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1); // 開(kāi)啟輸入捕獲中斷

__HAL_TIM_ENABLE_IT(&htim5,TIM_IT_UPDATE); //使能更新中斷

long long temp = 0; // 定義一個(gè)變量用以存儲(chǔ)捕獲到的時(shí)間 long long型是為了防止數(shù)據(jù)溢出

/* USER CODE END 2 */


在while(1)循環(huán)測(cè)量數(shù)據(jù)并打印

在這里插入圖片描述

while (1)

{

  /* USER CODE END WHILE */


  /* USER CODE BEGIN 3 */

  HAL_Delay(10);


  // 信號(hào)發(fā)生器輸入信號(hào) 串口打印高電平時(shí)長(zhǎng)  ms

  if (TIM5CH1_CAPTURE_STA & 0x80)   // 如果捕獲完成

  {

      temp = TIM5CH1_CAPTURE_STA & 0x3f;

      temp *= 0xffffffff; // Total Overflow Time(總的溢出時(shí)間)

      temp += TIM5CH1_CAPTURE_VAL;    // Get Total High Level Time(獲取總的高電平時(shí)長(zhǎng))

      printf("HIGH: %lld msrn", temp/1000); // Print Total High Level Time(打印總的高電平時(shí)長(zhǎng))

      TIM5CH1_CAPTURE_STA = 0;     // Clear Capture State , Open The Next Capture(清除捕獲狀態(tài),打開(kāi)下一次捕獲)

  }

}

/* USER CODE END 3 */


(5) 至此程序就完成了.

2020年4月10日2020年4月10日20:53:30

== 補(bǔ)充說(shuō)明:==


輸入捕獲這一節(jié) 有個(gè)學(xué)弟反應(yīng)有點(diǎn)問(wèn)題,如果用檢測(cè)按鍵輸入,按下時(shí)間太久了就會(huì)顯示4194ms ; 類(lèi)比到我這里的操作就是,信號(hào)發(fā)生器產(chǎn)生的波形頻率很低的時(shí)候,就達(dá)到了測(cè)量上限,高電平最多4194ms;


這是因?yàn)樵拥睦逃幸粋€(gè)時(shí)間上限 在于0x3f那個(gè)地方,0x3F就限制了時(shí)間的上限;下面這個(gè)是他給我的截圖;


后面返校之后我會(huì)修改代碼,完善這個(gè)地方

在這里插入圖片描述

在主函數(shù)里面, TIM5CH1_CAPTURE_STA & 0x80的意思是判斷有沒(méi)有捕獲到高電平 用TIM5CH1_CAPTURE_STA和0x80相與, 從而判斷TIM5CH1_CAPTURE_STA的6位是否為1, 進(jìn)而判斷出是否捕獲到高電平; 下面的一些涉及到相與的操作也都類(lèi)似, 把一個(gè)變量看做一個(gè)寄存器, 把0x80、 0xffffffff等轉(zhuǎn)換為二進(jìn)制就好判斷了, 在演草紙上畫(huà)一下就很清楚

在這里插入圖片描述

(6) 編譯下載

上述代碼都是之前經(jīng)過(guò)測(cè)試的,但是當(dāng)前由于疫情,沒(méi)有條件展現(xiàn)結(jié)果, 如果有人用了這些代碼并測(cè)試,有什么問(wèn)題的話可以下面評(píng)論告知,感激不盡。效果展示會(huì)在后期補(bǔ)上

關(guān)鍵字:STM32  輸入捕獲  CubeMX 引用地址:第五節(jié):STM32輸入捕獲(用CubeMX學(xué)習(xí)STM32)

上一篇:STM32CubeMX 配置STM32F407 實(shí)現(xiàn)HAL庫(kù)延時(shí)微妙方案
下一篇:第六節(jié):STM32基于HAL庫(kù)的IIC通信

推薦閱讀

5月17日?qǐng)?bào)道(記者 張軼群)今日,由北京兆易創(chuàng)新科技股份有限公司全資子公司——合肥格易集成電路有限公司投資興建的公益性集成電路科技館“兆易集成電路科技館”在合肥舉行開(kāi)館儀式,向公眾免費(fèi)開(kāi)放。“兆易集成電路科技館”位于安徽省合肥市南艷湖科技城,是合肥市科普示范單位,建造理念從“哲學(xué)+自然科學(xué)”的角度策劃,以“微聚能量 集智未來(lái)”為主...
2018年iG拿到了2018英雄聯(lián)盟全球總決賽冠軍,他們的大老板王思聰很高興,為了慶祝就決定在微博搞抽獎(jiǎng)活動(dòng),考慮到王思聰是萬(wàn)達(dá)貴公子的身份,因此他的抽獎(jiǎng)活動(dòng)也格外的引人注意。王思聰?shù)牡诙ㄎ⒉┏楠?jiǎng)的操作,讓人驚呼真是“城會(huì)玩”,王思聰是這樣做的,他稱(chēng):“轉(zhuǎn)發(fā)此微博抽出67套紀(jì)念版手機(jī)殼。(總決賽三把共67個(gè)人頭)為防止型號(hào)對(duì)不上附贈(zèng)iphone xs...
北京時(shí)間5月6日晚間,路透社援引知情人士消息稱(chēng),美國(guó)商務(wù)部即將簽署一項(xiàng)新規(guī)定,該規(guī)定將允許美國(guó)公司與中國(guó)華為公司合作,共同為下一代5G網(wǎng)絡(luò)制定標(biāo)準(zhǔn)。路透社報(bào)道截圖消息一出,國(guó)內(nèi)多家媒體迅速進(jìn)行了轉(zhuǎn)發(fā)報(bào)道,并多使用“美國(guó)允許華為參與5G標(biāo)準(zhǔn)建設(shè)”一類(lèi)標(biāo)題,乍看之下似有“美方掌握5G標(biāo)準(zhǔn)制定權(quán),并主動(dòng)對(duì)華為網(wǎng)開(kāi)一面”之意。但在筆者看來(lái),這一...
1 引言RFID(Radio Frequency Identification Technology,無(wú)線射頻識(shí)別技術(shù))由于具有高速移動(dòng)物體識(shí)別、多目標(biāo)識(shí)別和非接觸識(shí)別等特點(diǎn),顯示出巨大的發(fā)展?jié)摿蛻?yīng)用空間,被認(rèn)為是21 世紀(jì)最有發(fā)展前途的信息技術(shù)之一。射頻識(shí)別技術(shù)雖然有很多優(yōu)點(diǎn),但其技術(shù)本身也有局限性。對(duì)RFID 系統(tǒng)而言,低頻系統(tǒng)具有良好的對(duì)水、肉體等可導(dǎo)媒介的穿透力,而速度...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved