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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;读者可以了解如何将前面章节学到…