普冉(PUYA)單片機開發筆記(5): 配置定時器PWM輸出

概述

定時器的輸出通道作為 PWM 驅動是 MCU 的常用功能。

PY32F003 有一個高級定時器 TIM1 和一個通用定時器 TIM3,這兩個定時器都可以驅動4個輸出通道。現在我們就利用 TIM1 的某一個通道實現可控占空比的 PWM 輸出。

原理簡介

看數據手冊,簡單摘錄如下。

關于 TIM1 的描述,廠家的《Reference_manual v1.1.pdf》中很詳細了,內容很多,這里不再詳述了。不說廢話,上代碼吧。

實現代碼

使用 SystemClock_Config 函數選擇 HSE

/********************************************************************************************************
**函數信息 :void SystemClock_Config(void)
**功能描述 :系統時鐘配置
**輸入參數 :
**輸出參數 :
**    備注 :
********************************************************************************************************/
HAL_StatusTypeDef SystemClock_Config(void)
{HAL_StatusTypeDef conf_res= HAL_OK;RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE |RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI;              // 配置時鐘源HSE/HSI/LSE/LSIRCC_OscInitStruct.HSIState = RCC_HSI_ON;                                // 開啟HSIRCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;                                // 不分頻//RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_8MHz;      // 配置HSI輸出時鐘為8MHz//RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_4MHz;      // 配置HSI輸出時鐘為4MHz//RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_16MHz;     // 配置HSI輸出時鐘為16MHz//RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_22p12MHz;  // 配置HSI輸出時鐘為22.12MHzRCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_24MHz;       // 配置HSI輸出時鐘為24MHzRCC_OscInitStruct.HSEState = RCC_HSE_ON;                                // 開啟 HSERCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz;                           // HSE工作頻率范圍16M~32MRCC_OscInitStruct.LSIState = RCC_LSI_OFF;                               // 關閉 LSIconf_res = HAL_RCC_OscConfig(&RCC_OscInitStruct);                       // 初始化RCC振蕩器if (conf_res != HAL_OK)                                                 return conf_res;//初始化CPU,AHB,APB總線時鐘RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;      // RCC系統時鐘類型RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;  // SYSCLK的源選擇為HSERCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;      // APH時鐘不分頻RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;       // APB時鐘不分頻conf_res = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); // 初始化RCC系統時鐘// (FLASH_LATENCY_0=24M以下;// FLASH_LATENCY_1=48M)if (conf_res != HAL_OK)  return conf_res;return HAL_OK;
}

和先前開發筆記中的相同,選用 HSE 作為 TIM 子系統的時鐘。重要的語句是

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;?
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

這三句,設置TIM 子系統的總線頻率和 HSE 相同(24MHz)。

SystemClock_Config 函數存放在 Application/User 組的 app.c 文件中。

main.h 聲明 TIM1_PWM 相關的幾個函數

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H#ifdef __cplusplus
extern "C"
{
#endif/* Includes ------------------------------------------------------------------*/
#include "py32f0xx_hal.h"
#include "py32f003xx_Start_Kit.h"
#include <stdbool.h>/* Exported functions prototypes ---------------------------------------------*/
HAL_StatusTypeDef SystemClock_Config(void);
HAL_StatusTypeDef GPIO_Config(void);
HAL_StatusTypeDef USART_Config(void);
HAL_StatusTypeDef DBG_UART_Start(void);
HAL_StatusTypeDef TIM16_Config(void);
HAL_StatusTypeDef TIM16_Start(void);/*** ------------------------------------------------------* Added for TIM1 and PWM output.* Marked by HardCoder_LLuo@2023-12-07*/
HAL_StatusTypeDef TIM1_PWM_Config(void);
HAL_StatusTypeDef TIM1_PWM_Start(uint32_t duty);
HAL_StatusTypeDef TIM1_PWM_Stop(void);
void TIM1_PWM_Output(const uint8_t duty_percent);
/* ------------------------------------------------------
*/void Debug_Info(const char* msg);......
......

在 app_pwm.c 中編寫代碼

在 Application/User 組加入 app_pwm.c 文件,編寫在 main.h 中聲明的函數。

/********************************************************************************* @file    app_pwm.c* @brief   Application level PWM codes.******************************************************************************* @attention** Copyright (c) 2023 CuteModem Intelligence.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/#include "main.h"#define PWM_PERIOD 1200TIM_HandleTypeDef  htim1;
TIM_OC_InitTypeDef cfg_tim1;HAL_StatusTypeDef TIM1_PWM_Config(void)
{HAL_StatusTypeDef cfg_res = HAL_OK;htim1.Instance = TIM1;                                                  // 選擇TIM1htim1.Init.Period            = PWM_PERIOD - 1;                                // 自動重裝載值,和Prescaler可確定PWM的頻率htim1.Init.Prescaler         = 1 - 1;                                   // 預分頻為1-1htim1.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;                  // 時鐘不分頻htim1.Init.CounterMode       = TIM_COUNTERMODE_UP;                      // 向上計數htim1.Init.RepetitionCounter = 1 - 1;                                   // 不重復計數htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;          // 自動重裝載寄存器無緩沖cfg_res = HAL_TIM_Base_Init(&htim1);                                    // 初始化if (cfg_res != HAL_OK)              {return cfg_res;}cfg_tim1.OCMode       = TIM_OCMODE_PWM1;                                // 輸出配置為模式1cfg_tim1.OCPolarity   = TIM_OCPOLARITY_HIGH;                            // OC通道輸出高電平有效cfg_tim1.OCFastMode   = TIM_OCFAST_DISABLE;                             // 輸出快速使能關閉cfg_tim1.OCNPolarity  = TIM_OCNPOLARITY_HIGH;                           // OCN通道輸出高電平有效cfg_tim1.OCNIdleState = TIM_OCNIDLESTATE_RESET;                         // 空閑狀態OC1N輸出低電平cfg_tim1.OCIdleState  = TIM_OCIDLESTATE_RESET;                          // 空閑狀態OC1輸出低電平cfg_tim1.Pulse        = 0;                                              // CC1值為0,相當于復位PWM輸出cfg_res = HAL_TIM_OC_ConfigChannel(&htim1, &cfg_tim1, TIM_CHANNEL_1);   // OC1配置通道if (cfg_res != HAL_OK) return cfg_res;cfg_res = HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1);                      // OC1通道開始輸出if ( cfg_res != HAL_OK) return cfg_res;return cfg_res;
}HAL_StatusTypeDef TIM1_PWM_Start(uint32_t duty)
{HAL_StatusTypeDef cfg_res = HAL_OK;cfg_tim1.Pulse = duty - 1;                                              // CC1值為duty,PWM平均=duty/periodcfg_res = HAL_TIM_OC_ConfigChannel(&htim1, &cfg_tim1, TIM_CHANNEL_1);   // OC1配置通道if (cfg_res != HAL_OK) return cfg_res;cfg_res = HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1);                      // OC1通道開始輸出if ( cfg_res != HAL_OK) return cfg_res;return cfg_res;
}HAL_StatusTypeDef TIM1_PWM_Stop(void)
{return HAL_TIM_OC_Stop(&htim1, TIM_CHANNEL_1);
}void TIM1_PWM_Output(const uint8_t duty_percent)
{uint8_t  tmp_duty = 0;uint32_t duty     = 0;tmp_duty = duty_percent;if(duty_percent > 100) tmp_duty = 100;duty = (uint32_t)(tmp_duty * PWM_PERIOD / 100.0F + 0.5F) + 1;TIM1_PWM_Start(duty);
}

在 py32_f0xx_hal_msp.c 中增加對復用管腳的初始化

/********************************************************************************* @file    py32f0xx_hal_msp.c* @author  MCU Application Team* @Version V1.0.0* @Date    2020-10-19* @brief   This file provides code for the MSP Initialization*          and de-Initialization codes.*******************************************************************************//* Includes ------------------------------------------------------------------*/
#include "main.h"/*** Initializes the Global MSP.*/void HAL_MspInit(void)
{BSP_LED_Init(LED_GREEN);BSP_PB_Init(BUTTON_USER,BUTTON_MODE_GPIO);
}/*** -----------------------------------------------------------------------* @name   : void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)* @brief  : 功能描述 :初始化TIM相關MSP* @param  : [in] htim, TIM handler pointer* @retval : void* @remark :* -----------------------------------------------------------------------
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM16){__HAL_RCC_TIM16_CLK_ENABLE();           //使能TIM16時鐘HAL_NVIC_SetPriority(TIM16_IRQn, 0, 8); //設置中斷優先級HAL_NVIC_EnableIRQ(TIM16_IRQn);         //使能TIM1中斷return;}if(htim->Instance == TIM1){GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_TIM1_CLK_ENABLE();                  // TIM1 時鐘使能__HAL_RCC_GPIOA_CLK_ENABLE();                 // GPIOA 時鐘使能GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;       // 復用GPIO_InitStruct.Pull = GPIO_PULLDOWN;         // 下拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速GPIO_InitStruct.Pin = GPIO_PIN_3;             // PA3 初始化成 TIM1_CH1GPIO_InitStruct.Alternate = GPIO_AF13_TIM1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}
}

在 py32_f0xx_hal_it.c 中增加對中斷服務程序的重定向

extern TIM_HandleTypeDef  htim16;
extern TIM_HandleTypeDef  htim1;...
...// Override. For TIM1_PWM service
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{HAL_TIM_IRQHandler(&htim1);
}...
...void TIM16_IRQHandler(void)
{HAL_TIM_IRQHandler(&htim16);
}

在 main.c 中添加對這些功能的調用

/**
* -------------------------------------------------------------------------
* @file   : int main(void)
* @brief  : main函數
* @param  : 無
* @retval : 無限循環,無返回值
* @remark : 
* -------------------------------------------------------------------------
*/
int main(void)
{HAL_Init();             // systick初始化SystemClock_Config();   // 配置系統時鐘if(USART_Config() != HAL_OK) Error_Handler();         printf("[SYS_INIT] Debug port initilaized.\r\n");if(GPIO_Config() != HAL_OK) Error_Handler();          printf("[SYS_INIT] Board LED initilaized.\r\n");if(TIM16_Config() != HAL_OK) Error_Handler();printf("[SYS_INIT] Timer initialized.\r\n");if (TIM16_Start() != HAL_OK) Error_Handler();printf("[SYS_INIT] Timer started.\r\n");/***   Added for TIM1 PWM output*   By HardCoder_LLuo@2023-12-07*/if(TIM1_PWM_Config() != HAL_OK) Error_Handler();printf("[SYS_INIT] PWM initialized.\r\n");printf("\r\n+---------------------------------------+""\r\n|        PY32F003 MCU is ready.         |""\r\n+---------------------------------------+""\r\n");if (DBG_UART_Start() != HAL_OK) Error_Handler();TIM1_PWM_Output(0);//    while(BSP_PB_GetState(BUTTON_USER) != 0){}
//    TIM1_PWM_Output(20);while(BSP_PB_GetState(BUTTON_USER) != 0){}TIM1_PWM_Output(50);
//        
//    while(BSP_PB_GetState(BUTTON_USER) != 0){}
//    TIM1_PWM_Output(60);
//        
//    while(BSP_PB_GetState(BUTTON_USER) != 0){}
//    TIM1_PWM_Output(80);
//        
//    while(BSP_PB_GetState(BUTTON_USER) != 0){}
//    TIM1_PWM_Output(100);while (1){/***  For testing GPIO output*  2023-11-24*  Hard coder Luoyuan*/
#if(0)// Toggle LED3 in TIM16 IT service procedure instead.HAL_Delay(1000);HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
#endif}
}

代碼新增部分實現對 TIM1_PWM 的初始化,然后將 TIM1 的 CHANNEL_1 拉低,等待按壓一下開發板上的按鈕,設置不同的 PWM 占空比,在示波器上觀察這個輸出通道的波形。

先前開發的功能仍然在使用,設置不同的中斷優先級,避免中斷之間的沖突。

實驗結果

  • 啟動后,在 XCOM 的顯示如下圖。

  • 啟動信息顯示正常,連續發送字符串,MCU 回顯正常。
  • 板載的 LED 以 1Hz 的頻率在翻轉,說明原有的 TIM16 中斷運行正常。
  • 查看按鈕按下后,測量 GND 和 PA3 的波形如下,按順序分別是占空比為 20%, 50%, 60%, 80% 和 100% 時的輸出波形。

總結

利用 PY32F003 實現PWM輸出的步驟:

  1. 選擇時鐘
  2. 設置端口復用
  3. 初始化高級定時器 TIM1
  4. 為 TIM1 的 OCx(x取值0,1,2,3) 通道設定占空比的值
  5. 啟動(重啟)這個通道

注意事項

  • 在 HAL_TIM_Base_MspInit 函數中,定義輸出通道對應的 IO 管腳時,應根據外部硬件電路是否有上拉或者下拉來設置 GPIO_InitStructure.Pull 屬性的值。在這里的實驗當中,PWM輸出的初始狀態是全低電平(PWM關斷的狀態),并且這個 IO 管腳外部沒有上拉電阻,那么這個 GPIO_InitStructure.Pull 屬性就應該設置成 PULLDOWN,如果設置成了 PULLUP(默認值)就會在 PWM 通道進行初始化前產生一個高電平脈沖。在示波器上觀察,這個高電平脈沖的寬度大約有 50us,如果是驅動一個靈敏的外部設備,例如一盞 LED 燈的話,足以讓這盞燈突然閃亮一下了(有網友取名為“零點爆閃”現象,如果做到產品中,那是很 LOW 的哦)。相反,如果外部有上拉電阻,并且是使用 PWM2 模式輸出的話,就應該將其初始化成 PULLUP。
  • 想要使 PWM 輸出變成零,設置 PWM CCx 輸出為0 和 PWM_PERIOD,都可以。這是因為比較器比較 0 和比較 PWM_PERIOD,兩者之差一拍,就都能產生 Elapsed 的結果。
  • 和通用定時器相同,TIM1 的Period 和 Prescaler 決定了 PWM 波形的頻率。零輸出和滿輸出時,PWM 頻率體現不出來。
  • TIM1 可以同時驅動 4 個通道的 PWM 輸出,這里只列出了一個。

謬誤之處,歡迎指正。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212516.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212516.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

激活函數數學詳解以及應用場景解釋

文章目錄 激活函數1. Sigmoid 激活函數例子及推導過程代碼 2. ReLU 激活函數例子及推導過程 3. Tanh 激活函數例子及推導過程代碼 4. Softmax 激活函數例子及推導過程代碼 CNN 中的卷積層工作原理卷積計算過程卷積后的輸出及 ReLU 應用 激活函數 激活函數在神經網絡中扮演著至…

IPSec 協議

在 TCP/IP 協議中&#xff0c;對 IP 數據包沒有提供任何安全保護&#xff0c;攻擊者可以通過網絡嗅探、 IP 欺騙、連接截獲等方法來攻擊正常的 TCP/IP 通信。因此&#xff0c;通信過程中會存在以下危險&#xff1a;數據并非來自合法的發送者、數據在傳輸過程中被非法篡改、信息…

前端知識(十七)——入口函數和特定函數的區別

入口函數和特定函數是編程中常見的兩種函數類型&#xff0c;它們在功能和使用場景上有所不同。下面我將通過Python代碼示例來解釋它們的區別。 1.入口函數&#xff1a;入口函數通常是一個程序或模塊的起始點&#xff0c;它負責接收用戶輸入或外部數據&#xff0c;并啟動程序的…

DM8/達夢 數據庫管理員使用手冊詳解

1.1DM客戶端存放位置 Windows&#xff1a;DM數據庫安裝目錄中tool文件夾和bin文件夾中。 Linux&#xff1a;DM數據庫安裝目錄中tool目錄和bin目錄中。 1.2DM數據庫配置助手 1.2.1Windows創建數據庫 打開數據庫配置助手dbca 點擊創建數據庫實例 選擇一般用途 瀏覽選擇數據庫…

圖中的最長環

說在前面 &#x1f388;不知道大家對于算法的學習是一個怎樣的心態呢&#xff1f;為了面試還是因為興趣&#xff1f;不管是處于什么原因&#xff0c;算法學習需要持續保持&#xff0c;今天讓我們一起來看看這一道題目————圖中的最長環&#xff0c;圖論題目中比較常見的環路…

vite+TypeScript+vue3+router4+Pinia+ElmPlus+axios+mock項目基本配置

1.viteTSVue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Select a variant:>>Typescrit2. 修改vite基本配置 配置 Vite {#configuring-vite} | Vite中文網 (vitejs.cn) vite.config.ts import { defineConfig } from vite …

C語言筆試例題_指針專練30題(附答案解析)

C語言筆試例題_指針專練30題(附答案解析) 指針一直是C語言的靈魂所在&#xff0c;是掌握C語言的必經之路&#xff0c;收集30道C語言指針題目分享給大家&#xff0c;測試環境位64位ubuntu18.04環境&#xff0c;如有錯誤&#xff0c;懇請指出&#xff0c;文明討論&#xff01;&am…

基于SSM+JSP網上訂餐管理系統(Java畢業設計)

大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

Flask筆記三之連接使用數據庫

本文首發于公眾號&#xff1a;Hunter后端 原文鏈接&#xff1a;Flask筆記三之連接使用數據庫 這一節介紹 Flask 與數據庫的連接&#xff0c;以及接口里查詢數據的操作。 這里使用的是 SQLAlchemy pymysql 實現與數據庫的連接&#xff0c;SQLAlchemy 的詳細介紹見之前的筆記有…

藍橋杯2021年5月青少組Python程序設計國賽真題

30 個人在一條船上,超載&#xff0c;需要 15 人下船于是人們排成一隊&#xff0c;排隊的位置即為他們的編號。報數,從1開始,數到9的人下船。如此循環,直到船上僅剩15 人為止&#xff0c;問都有哪些編號的人下船了呢? 2】判斷101-200之間有多少個素數&#xff0c;并輸出所有素數…

Maven上傳Jar到Nexus遠程倉庫的兩種方式

Maven上傳Jar到Nexus遠程倉庫的兩種方式 文章目錄 前言通過mvn clean deploy指令上傳第一步 配置maven的setting.xml文件第二步 配置pom文件第三步 執行打包指令 手動上傳 jar到遠程倉庫第一步 配置setting文件第二步 執行上傳命令 前言 各個公司在開發項目時&#xff0c;一般…

Linux C/C++并發編程實戰(8)CAS機制的ABA問題

文章目錄 無鎖隊列中的ABA問題ABA問題解決方案 ABA問題&#xff1a;CAS在操作的時候會檢查變量的值是否被更改過&#xff0c;如果沒有則更新值&#xff0c;但是帶來一個問題&#xff0c;最開始的值是A&#xff0c;接著變成B&#xff0c;最后又變成了A。經過檢查這個值確實沒有修…

Leetcode每日一題

https://leetcode.cn/problems/binary-tree-preorder-traversal/ 這道題目需要我們自行進行創建一個數組&#xff0c;題目也給出我們需要自己malloc一個數組來存放&#xff0c;這樣能達到我們遍歷的效果&#xff0c;我們來看看他的接口函數給的是什么。 可以看到的是這個接口函…

說說webpack中常見的loader?解決了什么問題?

在Webpack中&#xff0c;Loader是用于處理各種文件類型的模塊加載器&#xff0c;它們用于對文件進行轉換、處理和加載。常見的Loader解決了以下問題&#xff1a; 處理 JavaScript 文件&#xff1a;Babel Loader用于將最新的JavaScript語法轉譯為瀏覽器兼容的版本&#xff0c;以…

5_CSS三大特性盒子模型

第5章-盒子模型【比屋教育】 本課目標&#xff08;Objective&#xff09; 掌握CSS三大特性理解什么是盒子模型掌握內邊距padding的用法掌握外邊距margin的用法 1. CSS的層疊&#xff0c;繼承&#xff0c;優先級 1.1 CSS層疊 層疊&#xff1a;是指多個CSS樣式疊加到同一個元…

Web(8)SQL注入

Web網站&#xff08;對外門戶&#xff09; 原理&#xff1a;not>and>or(優先級) 一.低級注入 order by的作用是對字段進行排序&#xff0c;如order by 5&#xff0c;根據第五個字段 進行排序&#xff0c;如果一共有4個字段&#xff0c;輸入order by 5系統就會報錯不 …

詳細介紹開源固件-TF-A

什么是TF-A&#xff1f; TF-A&#xff08;Trusted Firmware-A&#xff09;是一種用于嵌入式系統的開源固件&#xff0c;而不是Linux的一部分。TF-A主要用于ARM架構的處理器和設備&#xff0c;它提供了一組安全和可信任的軟件組件&#xff0c;用于引導和初始化系統。 如下是其…

GD32F30X-RT-Thread學習-線程管理

1. 軟硬件平臺 GD32F307E-START Board開發板MDK-ARM Keil 2.RT-Thread Nano 3.RT-Thread 內核學習-線程管理 ? 在多線程操作系統中&#xff0c;可以把一個復雜的應用分解成多個小的、可調度的、序列化的程序單元&#xff0c;當合理地劃分任務并正確地執行時&#xff0c;這…

qt可以詳細寫的項目或技術

1.QT 圖形視圖框架 2.QT 模型視圖結構 3.QT列表顯示大量信息 4.QT播放器 5.QT 編解碼 6.QT opencv

Linux--RedHat--安裝和配置C++環境

百度下載&#xff0c;安裝包&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1IgBfCCRxGYZ_PPiedad0xQ 提取碼&#xff1a;ffff 下載后&#xff0c;建個目錄&#xff0c;先解壓好安裝包&#xff01; &#xff08;兩種方法&#xff09;執行如下命令&#xff1a; 參考…