hal庫練習1

?要求:一個按鍵實現呼吸燈的控制,一個按鍵控制LED燈的閃爍,串口發送數據控制燈的開關

定時器配置

1.選擇需要的定時器2.配置基礎參數(根據時鐘樹給定時器輸入的時鐘)3.打開中斷4.在主函數里打開中斷

定時器掃描按鍵

呼吸燈(使用TIM2的Channel2的PWM脈沖生成)

1.在定時器配置相應通道2.在GPIO中配置相應引腳為復用推挽輸出

呼吸燈(不使用PWM脈沖生成)

1.0

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* 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.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint16_t mode1=0,mode2=0;//0表示關閉,mode1為閃爍,mode2為呼吸燈
uint16_t value=0,dir=1;//value表示當前PWM值,dir表示方向,1為暗變亮,0為亮變暗
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3)//TIM3控制閃爍{if(mode1==1){HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);}else{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);}}if(htim->Instance==TIM2)//TIM2控制呼吸燈{if( mode2 == 1)  {if(dir){value++;if(value >= 99) dir = 0;}else{value--;if(value <= 0)dir = 1;}__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, value);}else{value = 0;  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 100); }}}#define KEY0 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) 
#define KEY1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
void Scan_Keys()
{if(KEY0==GPIO_PIN_RESET){HAL_Delay(10);if(KEY0==GPIO_PIN_RESET){while(KEY0==GPIO_PIN_RESET);mode2=!mode2;}}if(KEY1==GPIO_PIN_RESET){HAL_Delay(10);if(KEY1==GPIO_PIN_RESET){while(KEY1==GPIO_PIN_RESET);mode1=!mode1;}}
}uint8_t Tx_str1[]="LED1 Open!\r\n";
uint8_t Tx_str2[]="LED1 Closed!\r\n";
uint8_t Tx_str3[]="LED2 Open!\r\n";
uint8_t Tx_str4[]="LED2 Closed!\r\n";
uint8_t Rx_data=0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance==USART1){if(Rx_data==0xa1){HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);mode1=1;HAL_UART_Receive_IT(&huart1,&Rx_data,1);}else if(Rx_data==0xa2){HAL_UART_Transmit(&huart1,Tx_str2,sizeof(Tx_str2),10000);	mode1=0;HAL_UART_Receive_IT(&huart1,&Rx_data,1);}else if(Rx_data==0xa3){HAL_UART_Transmit(&huart1,Tx_str3,sizeof(Tx_str3),10000);	mode2=1;HAL_UART_Receive_IT(&huart1,&Rx_data,1);}else if(Rx_data==0xa4){HAL_UART_Transmit(&huart1,Tx_str4,sizeof(Tx_str4),10000);	mode2=0;HAL_UART_Receive_IT(&huart1,&Rx_data,1);}}}/*** @brief  The application entry point.* @retval int*/
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_TIM2_Init();MX_TIM3_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *///初始設置為關閉HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//開啟定時中斷HAL_TIM_Base_Start_IT(&htim2);HAL_TIM_Base_Start_IT(&htim3);//開啟串口接收中斷HAL_UART_Receive_IT(&huart1,&Rx_data,1);//開啟PWMHAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *///掃描按鍵Scan_Keys();/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

2.0

????????只能說勤加練習,陸陸續續寫了一天,一開始定時器在主函數里沒打開,白費半天,一開始調試的時候就疑惑為什么沒有結果。后面會迭代,現在先去轉電機了

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

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

相關文章

java線程(4)

程序(program) 是為完成制定任務,用某種語言編寫的一組指令的集合.簡單的話說:就是我們寫的代碼. 進程 1.進程是指進行中的程序,比如我們使用QQ,就啟動了一個進程,操作系統就會為該進程分配內存空間,當我們使用迅雷,又啟動了一個進程,操作系統將為迅雷分配新的內存空間. 2、…

02《F8Framework》核心入口 FF8.cs

FF8.cs類是 F8Framework的核心入口 采用單例模式 提供對各個功能模塊的全局訪問 【特點】通過靜態類FF8統一訪問所有功能 1.模塊化設計&#xff1a; 每個功能獨立 通過 ModuleCenter 統一管理 2.懶加載機制&#xff1a; …

【硬件】相機的硬件測試

相機測試 author: Alla Imatest 提供超過 30 種測試項目&#xff0c;主要包括&#xff1a; 1&#xff09;圖像基礎參數?&#xff1a;MTF&#xff08;調制傳遞函數&#xff09;、畸變、均勻性、動態范圍 2&#xff09;色彩與光學特性?&#xff1a;白平衡誤差、飽和度、gamma …

Profinet與Modbus TCP協議轉換技術:西門子S7-1500(主站)和歐姆龍NJ PLC的高效數據交換

一、項目背景 某大型現代化智慧農業養殖場致力于打造全方位智能化的養殖環境。其養殖系統中&#xff0c;環境監測與調控部分選用了西門子S7-1500PLC作為Profinet協議主站。該PLC憑借強大的運算能力和豐富的功能模塊&#xff0c;能夠精準地采集和處理養殖場內的溫度、濕度、空氣…

希爾伯特變換,實信號轉復信號的FPGA實現思路

希爾伯特變換將實信號轉復信號的原理 將實信號的相位推遲90度后作為復信號的虛部。 錯誤實現方式 實信號經過希爾伯特濾波后得到復信號的虛部&#xff0c;之后直接與實信號組成復信號。而由于濾波器本身會對信號延時&#xff0c;故I路與Q路并不是相差90度&#xff0c;所以此方…

多模態大語言模型演進:從視覺理解到具身智能的技術突破

多模態大語言模型演進:從視覺理解到具身智能的技術突破 多模態大語言模型(MLLMs)正在重塑人工智能的邊界,實現從"看見"到"理解"再到"行動"的全鏈條智能。本文將深入解析蘋果最新多模態研究進展,揭示視覺-語言模型十年演進的技術脈絡,剖析…

window顯示驅動開發—渲染管道

支持 Direct3D 版本 10 的圖形硬件可以使用共享可編程著色器核心進行設計。 GPU) (圖形處理單元可以編程著色器核心&#xff0c;這些著色器核心可以跨構成呈現管道的功能塊進行計劃。 這種負載均衡意味著硬件開發人員不需要使用每種著色器類型&#xff0c;而只需要使用執行呈現…

時序數據庫Apache IoTDB核心技術深度解析

一、引言 ?背景?&#xff1a;5G技術加速了IoT領域的發展&#xff0c;物聯網設備數據的收集、存儲和計算需求日益增長。Apache IoTDB作為一款專為物聯網時序數據設計的軟件系統&#xff0c;在2020年被Apache基金會認可為頂級項目。 二、IoT領域發展趨勢 ?5G與IoT?&#x…

Next.js面試題:API深度解析

Next.js面試題&#xff1a;API深度解析 Next.js 通過 App Router 的引入徹底改變了 Web 開發范式。在這個新時代&#xff0c;深入理解 Next.js 的 API 函數不再只是錦上添花&#xff0c;而是技術面試中的關鍵區分點。這些函數構成了構建高性能、可擴展、現代化 Web 應用的基石…

Docker-MCP quickstart

項目概述 Docker-MCP 是一個 支持mcp的Docker 管理服務器&#xff0c;它允許 客戶端 通過 MCP&#xff08;Model Control Protocol&#xff09;接口直接與 Docker 進行交互。該項目提供了一套工具&#xff0c;使 AI 助手能夠創建容器、部署 Docker Compose 、獲取容器日志以及…

git 的變基操作(適合一個功能進行了多次commit提交,提交記錄過多不美觀)

git提交的 commit 的記錄很多&#xff0c;想多個 commit 進行合并&#xff0c;對代碼進行整理&#xff0c;幫助更好的閱讀代碼 IDEA 的操作步驟&#xff1a; 這里&#xff0c;給出你想進行合并的記錄 hash 值&#xff0c;完了點擊“Rebase”進行合并 點擊后&#xff0c;會進行…

【完整源碼+數據集+部署教程】路邊廣告牌實例分割系統源碼和數據集:改進yolo11-SEAMHead

研究背景與意義 研究背景與意義 隨著城市化進程的加快&#xff0c;路邊廣告牌作為重要的商業宣傳媒介&#xff0c;越來越多地出現在城市的各個角落。它們不僅承擔著信息傳播的功能&#xff0c;還對城市的視覺環境產生了深遠的影響。然而&#xff0c;隨著廣告牌數量的激增&…

C++ 中文件 IO 操作詳解

在C中&#xff0c;文件操作是通過流(stream)來實現的。標準庫提供了三種主要的文件流類來處理文件IO操作&#xff1a; ofstream&#xff1a;用于寫入文件&#xff08;output file stream&#xff09;ifstream&#xff1a;用于讀取文件&#xff08;input file stream&#xff0…

第32節 Node.js 全局對象

在Node.js中我們可以直接訪問到全局對象。 這些對象在所有模塊里都是可用的&#xff0c;有些對象不是在全局作用域而是在模塊作用域里&#xff0c;這些情況將在本文的內容中進行介紹。 global {Object} 全局命名空間對象。 在瀏覽器中&#xff0c;全局作用域就是頂級域。如…

Linux文件屬性和權限概述-linux026

Linux文件屬性和權限概述 Linux 系統作為多用戶操作系統&#xff0c;通過文件屬性和權限機制來控制不同用戶對文件和目錄的訪問&#xff0c;從而保證系統的安全性。不同的用戶對同一文件可以有不同的訪問權限&#xff0c;這些權限包括 讀取&#xff08;read&#xff09;、寫入…

nuScenes介紹

目標檢測指標 指標內容mAP&#xff08;mean Average Precision&#xff09;bev下2d中心點的距離來評價&#xff0c;而不是像2d檢測里用iou來評價mATE&#xff08;Average Translation Error&#xff09;中心點的2D歐式距離mASE&#xff08;Average Scale Error&#xff09;中心…

帶中斷計數器的UART接收中斷程序 (8259@400H/402H)

1.程序功能 在中斷服務程序中增加了中斷計數器&#xff0c;并在主循環中通過串口輸出中斷次數。 2.驗證 2.1手動觸發8259的IR1&#xff0c;高電平有效 2.2串口接收 3.測試程序 ; You may customize this and other start-up templates; ; The location of this template is…

在Postgresql中跟蹤SQL語句

文章說明 本文主要說明如何在Postgresql中跟蹤實際執行的SQL語句。 本文內容有如下應用場景&#xff1a; 在系統中執行了一系列的操作&#xff0c;需要將這些操作轉化成SQL在正式環境上一次性執行&#xff0c;省下重新執行一遍的操作時間。最近系統數據被人或被程序修改導致…

【信創-k8s】重磅-鯤鵬arm+麒麟V10離線部署k8s1.30+kubesphere4.1.3

隨著信創產業的推進&#xff0c;鯤鵬arm64架構得以快速發展。而由于信創領域的主要客戶通常部署在內網環境中&#xff0c;這使得離線部署成為該架構方案實施過程中不可或缺的關鍵環節。 **環境涉及軟件版本信息** 服務器芯片: **鯤鵬920/飛騰2000(arm64)** 操作系統&#xff…

第11章:Neo4j實際應用案例

理論知識和技術細節固然重要&#xff0c;但真正理解Neo4j的價值在于了解它如何解決實際業務問題。本章將探討Neo4j在各個領域的實際應用案例&#xff0c;包括社交網絡分析、推薦系統、知識圖譜以及欺詐檢測與安全分析。通過這些案例&#xff0c;讀者可以了解如何將前面章節學到…