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

news2024/11/16 17:48:01

 实验目的:

熟悉外部时钟的应用。

实验步骤:

  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 incremented
  uint32_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 interrupt
  HAL_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 Value
      uint32_t currentCount=__HAL_TIM_GET_COUNTER(&htim2);


      OLED_ShowNum(2, 3, currentCount,10);
		OLED_ShowNum(4, 5, counter,10);
      HAL_Delay(200); // delay 1 second
      OLED_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.coloradmin.cn/o/1693179.html

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

相关文章

从ZooKeeper切换到ClickHouse-Keeper,藏着怎样的秘密

本文字数:7772;估计阅读时间:20 分钟 作者:博睿数据 李骅宸(太道)& 小叮当 本文在公众号【ClickHouseInc】首发 本系列前两篇内容: 从ES到ClickHouse,Bonree ONE平台更轻更快&a…

操作抖音小店一直不出单怎么办?只需要做好这两点就可以了!

大家好,我是电商小V 最近很多新手小伙伴来咨询我说自己操作抖音小店,自己的店铺长时间不出单应该怎么办?今天咱们就来详细的说一下, 咱们要清楚的就是自己的店铺不出,只需要咱们做好这两点就可以了, 第一点…

七个很酷的GenAI LLM技术性面试问题

不同于互联网上随处可见的传统问题库,这些问题需要跳出常规思维。 大语言模型(LLM)在数据科学、生成式人工智能(GenAI)和人工智能领域越来越重要。这些复杂的算法提升了人类的技能,并在诸多行业中推动了效率和创新性的提升,成为企业保持竞争…

阿里云产品DTU评测报告(一)

阿里云产品DTU评测报告(一) 名词解释物联网平台控制台产品设备 DTU设备模拟器 体验评价针对业务场景,您觉得该产品还有哪些可改进的地方?什么场景下使用该产品产品的优势是什么个人建议 在正式进行DTU测评之前,说一点题…

【LeetCode】【2】两数相加(1411字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示Python实现模拟 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给两个非空的链表,表示两个非负的整数,它们每位数字都是按…

SpringBoot + Redis实现对接口的限流

目录 前言 什么是限流? 实现限流 创建一个注解类 接着创建一个切面类 前言 在项目中,对于接口的限流,是任何项目都必不可少的一部分,主要是为了防止用户频繁的发送请求,对服务器造成压力。 另外一点就是防止外来攻…

齐护K210系列教程(三十)_多任务切换

多任务切换 1,任务1的设定2,任务2的设定3,主程序4, 课程资源联系我们 在开发项目时,我们常会用到AIstart的多个任务来切换应用,比如当我识别到某种卡片时,要切换到别的任务,这样就要…

ClickHouse vs. Elasticsearch: 计数聚合的工作原理

本文字数:7875;估计阅读时间:20 分钟 审校:庄晓东(魏庄) 介绍 在另一篇博客文章中,我们对 ClickHouse 和 Elasticsearch 在大规模数据分析和可观测性用例中的性能进行了比较,特别是对…

【Linux】LAMP集群分布式安全方案

LAMP集群分布式安全方案主要涉及确保Linux、Apache、MySQL和PHP(LAMP)组合构成的集群环境的安全性和稳定性。 本次实验通过网络层安全对防火墙配置:使用防火墙(如iptables或firewalld)来限制对集群的访问,只…

CSDN 访问量增加脚本

在脚本猴中新建脚本并使用: // ==UserScript== // @name CSDN Blog Visitor // @namespace http://tampermonkey.net/ // @version 2024-05-25 // @description Automated visits to CSDN blog pages to simulate user interaction. // @author FontTi…

力扣--字符串58.最后一个单词的长度

思路分析 初始化变量: num 用于记录当前单词的长度。before 用于记录上一个单词的长度。 遍历字符串: 如果字符不是空格,增加 num 计数。如果字符是空格,检查 num 是否为 0: 如果 num 为 0,说明之前没有记录到单词,所以…

无人机支持下的自然灾害风险评估技术应用

张老师(副教授),长期从事无人机遥感技术与应用,主持多项国家级科研项目,编写著作2部,第一作者发表科研论文20余篇。对无人机遥感的多平台、多传感应用现状以及涉及的核心技术具有很深的理解,精通…

Spring 模拟管理Web应用程序

MVC:Model View Controller 1)controller:控制层(Servlet是运行服务器端,处理请求响应java语言编写技术) 2)service:业务层(事务,异常) 3&#xf…

linux系统防火墙开放端口命令

目录 linux相关命令参考文章1.开放端口1.1 开发单个端口1.2 一次性开放多个端口 2.保存设置3.查看所有开放的端口4.查看防火墙状态 linux相关命令参考文章 管理、设置防火墙规则(firewalld): https://download.csdn.net/blog/column/8489557/137911049 i…

如何参与github开源项目并提交PR

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,目前工作于上海某电商服务公司…”); 📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正&…

编程式路由导航

之前的导航区都是使用<RouterLink>实现路由跳转的 但是很多时候我们希望不需要用户点击就能实现页面跳转&#xff0c;比如首页待三秒自动跳转到新闻页等&#xff0c;有时候需要点击按钮执行函数然后实现跳转&#xff0c;这时候函数是在脚本中&#xff0c;不在结构中&…

2.Redis之Redis的背景知识

Redis 是一个在内存中存储数据的中间件 用于作为数据库,用于作为数据缓存. 在分布式系统中能够大展拳脚~ 1.Redis的特性介绍(优点) 1.1 在内存中存储数据 MySQL 主要是通过"表"的方式来存储组织数据的,"关系型数据库" Redis 主要是通过“键值对" 的…

SpringMVC流程

1、SpringMVC常用组件&#xff1a; DispatcherServlet&#xff08;请求分发器&#xff09;&#xff1a;Spring MVC的核心组件之一&#xff0c;负责处理全局配置和将用户请求分发给其他组件进行处理。Controller&#xff08;处理器&#xff09;&#xff1a; 实际处理业务逻辑的…

链接物化视图在 ClickHouse 中的应用

本文字数&#xff1a;7728&#xff1b;估计阅读时间&#xff1a;20 分钟 作者&#xff1a;Mark Needham 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 在 ClickHouse 中&#xff0c;物化视图【https://clickhouse.com/docs/en/guide…

uni-app App端实现文字语音播报(Ba-TTS)

前言 最近在遇到消息提示语音播放出来&#xff0c;查了一圈文档发现并没有自带api 后面想起支付宝收钱播报&#xff0c;不受限与系统环境和版本环境&#xff08;后面查阅他是音频实现的&#xff09; 如果是由安卓端需要语音播放功能-直接使用Ba-TTs救急&#xff08;需要付费2…