關 閉

新聞中心

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

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

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

1   任務目標

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

2   開發(fā)工具

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

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

●   CubeCLT意法半導體退出的一體化、多操作系統(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)出點擊“編輯”分別選擇對應的路徑即可。

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

●   STM32CubeMX和STM32CubeCLT工具檢測OK;

●   啟動STM32CubeMX配置工程,導出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,對應PA5,原理圖如下:

1752640737807653.png

4.1 定時器

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

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

●   預分頻為1000-1

●   向上計數(shù)模式

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

1752640797912245.png

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

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

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

計數(shù)周期10000-1即0.1秒鐘產(chǎn)生中斷?!疽獙崿F(xiàn)1 秒鐘翻轉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的溢出中斷服務函數(shù)中層層調(diào)用到HAL_TIM_PeriodElapsedCallback() 函數(shù),計數(shù)10 次達到1 秒鐘,翻轉用戶LD2

女超人.jpg

6 關鍵代碼

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秒鐘翻轉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》


評論


相關推薦

技術專區(qū)

關閉