關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 功率監測與控制系統DIY——搭建環境,定時器翻轉LED

        功率監測與控制系統DIY——搭建環境,定時器翻轉LED

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

        1   任務目標

        使用定時器實現1s翻轉LED驗證開發板時鐘晶振是否正確

        2   開發工具

        支持的開發環境很多,我現在中意下面的組合:

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

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

        ●   CLion 一個功能強大的且智能化的C/C++開發環境,具有高效的代碼編輯、調試和項目管理能力;

        ●   STM32CubeIDE/Keil MDK/IAR曾經非常流行的STM32開發環境,這里不做介紹;

        分別安裝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固件升級

        第一次調試工程,彈出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

        ●   向上計數模式

        ●   計數周期10000-1

        1752640797912245.png

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

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

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

        計數周期10000-1即0.1秒鐘產生中斷。【要實現1 秒鐘翻轉LED,需要計數10 次】

        1752640875200832.png

        1752640905867022.png

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

        1752640950730918.png

        5   流程

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

        ●   在TIM1的溢出中斷服務函數中層層調用到HAL_TIM_PeriodElapsedCallback() 函數,計數10 次達到1 秒鐘,翻轉用戶LD2

        女超人.jpg

        6 關鍵代碼

        6.1 主函數

        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定時溢出回調函數

        tim.c中新增加一個函數,定時器溢出回調函數HAL_TIM_PeriodElapsedCallback()中實現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》


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 汕头市| 永安市| 乐山市| 揭东县| 津市市| 葫芦岛市| 大足县| 南木林县| 云阳县| 株洲县| 民权县| 东乡| 体育| 鲁甸县| 昂仁县| 道孚县| 六枝特区| 太白县| 苍梧县| 舒兰市| 孟连| 浙江省| 翼城县| 张北县| 潮州市| 莱芜市| 瑞昌市| 灵寿县| 陆良县| 永康市| 洞口县| 无极县| 扬州市| 莫力| 黄梅县| 昌平区| 潍坊市| 黄龙县| 盖州市| 屯门区| 商都县|