• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 關(guān) 閉

    新聞中心

    EEPW首頁 > 工控自動化 > 設(shè)計應(yīng)用 > 功率監(jiān)測與控制系統(tǒng)DIY——搭建環(huán)境,定時器翻轉(zhuǎn)LED

    功率監(jiān)測與控制系統(tǒng)DIY——搭建環(huán)境,定時器翻轉(zhuǎn)LED

    作者:CoderX9527 時間:2025-07-16 來源:EEPW 收藏

    1   任務(wù)目標(biāo)

    使用定時器實現(xiàn)1s翻轉(zhuǎn)LED驗證開發(fā)板時鐘晶振是否正確

    2   開發(fā)工具

    支持的開發(fā)環(huán)境很多,我現(xiàn)在中意下面的組合:

    ●   CubeMX圖形化配置、生成工程;

    ●   CubeCLT意法半導(dǎo)體退出的一體化、多操作系統(tǒng)支持的命令行工具,主要面向第三發(fā)集成開發(fā)環(huán)境提供商,允許他們在自己的IDE框架內(nèi)集成對STM32微控制器的支持,包括代碼編譯、燒錄、調(diào)試等功能;

    ●   CLion 一個功能強大的且智能化的C/C++開發(fā)環(huán)境,具有高效的代碼編輯、調(diào)試和項目管理能力;

    ●   STM32CubeIDE/Keil MDK/IAR曾經(jīng)非常流行的STM32開發(fā)環(huán)境,這里不做介紹;

    分別安裝STM32CubeMX/STM32CubeCLT以及CLion,然后再Clion 中新建STM32CubeMX 工程。

    在CLion 中第一次新建STM32CubeMX,還需要配置STM32CubeMX和STM32CubeCLT工具路徑,下圖中(2)出點擊“編輯”分別選擇對應(yīng)的路徑即可。

    ●   下圖在SDK目錄中新建一個工程;

    ●   STM32CubeMX和STM32CubeCLT工具檢測OK;

    ●   啟動STM32CubeMX配置工程,導(dǎo)出CMake工程即可

    ●   然后CLion打開剛才生成的工程目錄即可,自動加載CMakeLists.txt并配置工程

    1752639935125569.png

    第一次打開CMakeLists.txt工程,彈出下面的配置對話框,一般選擇Debug類型即可

    1752640005354207.png

    3   ST-Link固件升級

    第一次調(diào)試工程,彈出ST-Link固件升級提示,按照下面的提示操作,升級固件通過。

    1752640545820118.png

    點擊右下角的YES開始升級固件

    1752640603164340.png

    固件升級成功

    1752640635979700.png

    升級后固件版本號變了

    1752640695296637.png

    4   用戶LED

    LED是指用戶LED,即板子上的綠色LD2,對應(yīng)PA5,原理圖如下:

    1752640737807653.png

    4.1 定時器

    這里使用定時器1,配置如下:

    ●   時鐘源,選擇Internal Clock(TIM1 位于APB2 Timer Clock)

    ●   預(yù)分頻為1000-1

    ●   向上計數(shù)模式

    ●   計數(shù)周期10000-1

    1752640797912245.png

    4.2 為什么這么設(shè)置預(yù)分頻和計數(shù)周期呢?

    因為參考手冊中STM32F411xx的TIM1位于APB2 Timer clock 上,見下圖。而且在時鐘樹中把APB2 Timer Clock 設(shè)置為100 MHz。

    所以預(yù)分頻1000-1把TIM1時鐘頻率配置為100MHz/1000=100kHz

    計數(shù)周期10000-1即0.1秒鐘產(chǎn)生中斷。【要實現(xiàn)1 秒鐘翻轉(zhuǎn)LED,需要計數(shù)10 次】

    1752640875200832.png

    1752640905867022.png

    最后使能TIM1的中斷,中斷類型是TIM1 update interrupt and TIM10 global interrupt,表示定時器溢出產(chǎn)生中斷。

    1752640950730918.png

    5   流程

    ●   主流程中初始化硬件(GPIO、UART2、TIM1)然后已開啟中斷的方式啟動TIM1

    ●   在TIM1的溢出中斷服務(wù)函數(shù)中層層調(diào)用到HAL_TIM_PeriodElapsedCallback() 函數(shù),計數(shù)10 次達到1 秒鐘,翻轉(zhuǎn)用戶LD2

    女超人.jpg

    6 關(guān)鍵代碼

    6.1 主函數(shù)

    int main(void)

    {


      /* USER CODE BEGIN 1 */

      /* USER CODE END 1 */

      /* MCU Configuration--------------------------------------------------------*/

      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

      HAL_Init();


      /* USER CODE BEGIN Init */

      /* USER CODE END Init */

      /* Configure the system clock */

      SystemClock_Config();

      /* USER CODE BEGIN SysInit */

      /* USER CODE END SysInit */

      /* Initialize all configured peripherals */

      MX_GPIO_Init();

      MX_USART2_UART_Init();

      MX_TIM1_Init(); // 配置定時器TIM1

      /* USER CODE BEGIN 2 */


      HAL_TIM_Base_Start_IT(&htim1);//啟動定時器TIM1

      /*USER CODE END 2 */


      /*Infinite loop */

      /*USER CODE BEGIN WHILE */

      while (1)

      {

        HAL_Delay(200);

        /* USER CODE END WHILE */


        /* USER CODE BEGIN 3 */

      }

      /* USER CODE END 3 */

    }

    6.2 TIM1定時溢出回調(diào)函數(shù)

    tim.c中新增加一個函數(shù),定時器溢出回調(diào)函數(shù)HAL_TIM_PeriodElapsedCallback()中實現(xiàn)1秒鐘翻轉(zhuǎn)LED2

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

    {

      if (htim->Instance == htim1.Instance)//確保是特定的定時器實例(例如TIM1、TIM2 等)

        {

        tim_elapsed_cnt++;

        if (tim_elapsed_cnt % 10 == 0) 

        {

          HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);

        }

      }

    }

    1752641891597046.png

    7   實測演示

    7.1 LD2閃爍

    板子中心的綠色LD 每隔一秒鐘點亮、熄滅一次。

    (本文來源于《EEPW》


    評論


    相關(guān)推薦

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

    關(guān)閉
    主站蜘蛛池模板: 始兴县| 洪湖市| 南投市| 广州市| 青海省| 衡南县| 广州市| 通榆县| 修武县| 甘肃省| 阿鲁科尔沁旗| 黎城县| 桓台县| 都江堰市| 米脂县| 云龙县| 桐乡市| 通化县| 江华| 玛多县| 宣汉县| 瑞昌市| 和田市| 淮滨县| 五原县| 武定县| 台南市| 丹东市| 磐石市| 英德市| 红原县| 米易县| 金塔县| 米林县| 隆德县| 个旧市| 七台河市| 高碑店市| 济阳县| 广宗县| 常德市|