用HAL库改写江科大的stm32入门例子-6-2 定时器外部时钟

 实验目的:

熟悉外部时钟的应用。

实验步骤:

  1. 创建项目
  2. 参照前面的文章,集成oled(没有oled,用uart串口传递也可以)
  3. 选择外部时钟源
  4. 时钟源参数设置
  5. 编写代码:

  5.1声明全局变量,如果发生定时器中断的时候,在回调函数中修改这个变量

 5.2while循环中获取定时器的值,通过串口传给pc 或者在oled上显示

开启定时中断:

代码部分:

首先定义一个全局变量:

开启定时器: 

取得计数器的值,显示数据: 

写定时中断代码:

完整代码如下:

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2024 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 "i2c.h"
#include "tim.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "OLED.h"
/* 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 */// declare new variable, when timer interrupt fires, this variable will be incrementeduint32_t counter = 0;
/* 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 */// timer interrupt callback function
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{// is it timer2?counter++;}/* USER CODE END 0 *//*** @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_I2C1_Init();MX_TIM2_Init();/* USER CODE BEGIN 2 */OLED_Init();		OLED_ShowChar(1, 1, 'A');				// clear timer2 flag__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);//enable timer interruptHAL_TIM_Base_Start_IT(&htim2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){// read the counter value, and display it on the OLED// user _HAL  get counter Valueuint32_t currentCount=__HAL_TIM_GET_COUNTER(&htim2);OLED_ShowNum(2, 3, currentCount,10);OLED_ShowNum(4, 5, counter,10);HAL_Delay(200); // delay 1 secondOLED_Clear();/* USER CODE END WHILE *//* 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_MUL9;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_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != 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 */

ps:外部时钟示意图:

补充说明:

  timer2的clock选择项,取默认即可,它们的意思是什么?

初始值的矫正:

由于内部影子寄存器启动时中断的影响,系统启动后,没有外部中断信号,开始值是有1,这里做个小修正,启动定时器前,清除一下标志位:

  __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);

正点原子精英板上的应用:

正点原子精英板上,PA0引脚上是按键,可以当成外部时钟信号,即按一次相当于一个脉冲信息进入,显示上,通过串口发送到pc端串口助手即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SW 零件插入零件的重合配合

重合配合有时候会失效,可以先用距离配合代替,之后修改距离尽量接近

AI网络爬虫-自动获取百度实时热搜榜

工作任务和目标&#xff1a;自动获取百度实时热搜榜的标题和热搜指数 标题&#xff1a;<div class"c-single-text-ellipsis"> 东部战区台岛战巡演练模拟动画 <!--48--></div> <div class"hot-index_1Bl1a"> 4946724 </div> …

【bash】统计服务器信息脚本

起因 写一个bash脚本统计服务器的机器名、内网IP、CPU使用率、内存使用率、List{GPU使用率、显存} 脚本 #!/bin/bash# 主机名 hostname$(hostname) # 内网ip ip$(ip addr | grep inet | grep -v 127.0.0.1 | awk {print $2} | cut -d/ -f1) ip$(echo "$ip"|tr \n…

Excel表格在线解密:轻松解密密码,快速恢复数据

忘记了excel表格密码&#xff1f;教你简单两步走&#xff1a;具体步骤如下。首先&#xff0c;在百度搜索中键入“密码帝官网”。其次&#xff0c;点击“立即开始”&#xff0c;在用户中心上传表格文件即可找回密码。这种方法不用下载软件&#xff0c;操作简单易行&#xff0c;适…

【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化+完美使用

模版介绍 【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化完美使用 腾讯官方出品discuz论坛DIY的后台设置&#xff0c;功能齐全&#xff0c;论坛功能不亚于葫芦侠&#xff0c;自定义马甲&#xff0c;自定义认证&#xff0c;自定义广告&#xff0c;完全可以打造出自己想…

元本学堂是什么?杜旭东疑似再翻车!

杜旭东&#xff0c;1956年1月7日出生于中国北京市&#xff0c;毕业于解放军艺术学院&#xff0c;中国内地男演员、国家一级演员&#xff01; 2023年11月17日晚&#xff0c;杜旭东在其个人社交媒体上发布视频&#xff0c;就其以前给缅北电诈集团的白家成员录制庆生视频一事道歉…

C++11std::bind的简单使用

std::bind用来将可调用对象与其参数一起进行绑定&#xff0c;绑定后的结果可以用std::function&#xff08;可调用对象包装器&#xff09;进行保存&#xff0c;并延迟调用到任何我们需要的时候。 通俗来讲&#xff0c;它主要有两大作用&#xff1a; &#xff08;1&#xff09…

每日一题Cat, Fox and the Lonely Array

文章目录 题名&#xff1a;题意&#xff1a;题解&#xff1a;代码&#xff1a; 题名&#xff1a; Cat, Fox and the Lonely Array 题意&#xff1a; 给定一个数组a&#xff0c;求出最小的k&#xff0c;满足数组每个长度为k的连续子数组元素按位或答案都相等。 题解&#xf…

【AI新时代】拥抱未来,用AI无人直播替代真人直播,解放劳动力,控制成本!

在科技日新月异的新时代&#xff0c;人工智能&#xff08;AI&#xff09;的 keJ0277 浪潮正在席卷各行各业&#xff0c;为传统的工作模式带来了前所未有的变革。其中&#xff0c;AI无人直播的兴起&#xff0c;无疑是这场科技革命中的一股强劲力量。它以其独特的优势&#xff0…

【Linux设备驱动】1.字符设备驱动程序框架及相关结构体

目录 程序总体框架模块加载函数模块卸载函数具体操作函数 相关结构体cdev结构体file_oparations结构体 设备号分配设备号注销设备号创建设备文件 程序总体框架 /* 包含相关头文件 */ #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h&…

C# System.Span<T>、ref struct

1. Span<T>的特性 system.span<T>在.net core 2.0版本引入它适用于对连续内存的操作&#xff0c;而不产生新的内存分配&#xff0c;比如数组、字符串、堆外内存类型为ref struct&#xff0c;不能作为参数传递&#xff0c;不能被装箱(不能作为类的字段)&#xff0c…

信号处理技术:现代通信技术的基石

随着信息技术的飞速发展&#xff0c;通信技术的每一次革新都极大地改变了人们的生活方式。而在这背后&#xff0c;信号处理技术作为通信技术的核心&#xff0c;通过深入分析信号特性、提取有用信息、转换信号形式等一系列手段&#xff0c;为现代通信技术的发展提供了强有力的支…

机器学习7大方面,30个硬核数据集。纯干货分享

在刚刚开始学习算法的时候&#xff0c;大家有没有过这种感觉&#xff0c;最最重要的那必须是算法本身&#xff01; 其实在一定程度上忽略了数据的重要性。 而事实上一定是&#xff0c;质量高的数据集可能是最重要的&#xff01; 数据集在机器学习算法项目中具有非常关键的重…

Python读写文件

最近得以空闲&#xff0c;然后继续学习py。 学习一下py中最频繁用到的文件读写的方法。 在py中&#xff0c;操作是通过文件对象【File obj】实现的&#xff0c;通过文件对象可以读写文本文件和一些二进制文件。 1.打开文件 使用Python中的open函数。有8个参数&#xff0c;但…

2024.5.25.python.exercise

# # 导入数据处理的包 # # from pyecharts.charts import Line # # from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts, LabelOpts # # import json # # # # # 打开文件 # # file_us open("美国.txt", "r", encoding&quo…

C++ Primer Plus第十八章复习题

1、使用用大括号括起的初始化列表语法重写下述代码。重写后的代码不应使用数组ar。 class z200 { private:int j;char ch;double z; public:Z200(int jv,char chv&#xff0c;zv) : j(jv), ch (chv), z(zv){} };double x 8.8; std::string s "what a bracing effect ! …

头歌OpenGauss数据库-H.存储过程第1关:创建存储过程

编程要求 数据库中已经存在三个基础表&#xff1a; student ( num integer, name char(20), age integer, level integer, dept char(20) ); course ( id integer, name char(20) ); sel_course ( studentid integer, courseid integer, score integer ); 创建存储过程&#xf…

Vue3/Vite引入EasyPlayer.js播放H265视频错误的问题

一、引入EasyPlayer.js github链接:GitHub - EasyDarwin/EasyPlayer.js: EasyPlayer.js H5播放器 将demo/html目录下的 EasyPlayer-element.min.js、EasyPlayer-lib.min.js、EasyPlayer.wasm、jquery.min.js 复制到vue3工程的public目录下,注意,vue3 vite的index.html文件…

win10配置wsl的深度学习环境

# 1、一步完成wsl&#xff1a;开启虚拟机、linux子系统、并下载ubuntu # 官方文档: https://learn.microsoft.com/zh-cn/windows/wsl/install wsl --install# 2、打开windows terminal&#xff0c;选ubuntu交互环境 # 第一次需要配置用户名和密码 # 接下来正常使用即可# 3、cud…

自然资源-做好用地用海国土空间规划符合性审查

自然资源-做好用地用海国土空间规划符合性审查 为发挥国土空间规划战略引领和刚性管控作用&#xff0c;强化国土空间规划对各专项规划的指导约束作用&#xff0c;依法依规加强自然资源要素保障&#xff0c;做好用地用海用岛国土空间规划符合性审查工作&#xff1a; 一、加快地…