STM32H750VBT6配置定时器


用CUBEMX配置时钟树

在这里插入图片描述

配置时钟树注意

在这里插入图片描述
我配置时钟树运行不起来,到时钟配置函数这里会报错。
1.晶振不匹配(发现是这个问题,是40M的外部晶振,而不是8M的)
2.Flash Latency 这个参数HAL库有问题,需要手配,2/4 WS都试试
3.电压不稳定
4.配480M,CPU按手册最高的配置
5.看单片机是v版本还是y版本。丝印上面有

在这里插入图片描述
我配置时钟树运行不起来,到时钟配置函数这里会报错。
1.晶振不匹配(发现是这个问题,是40M的外部晶振,而不是8M的)
2.Flash Latency 这个参数HAL库有问题,需要手配,2/4 WS都试试
3.电压不稳定
4.配480M,CPU按手册最高的配置
5.看单片机是v版本还是y版本。丝印上面有
在这里插入图片描述

配置TIM2

看数据手册的时钟树,TIM2,3是APB2提供的时钟,所以我们进行分频240-1=1MHZ,1us定时器加1. 超过1000会触发中断(1ms触发一次)
在这里插入图片描述

开中断
在这里插入图片描述

TIM时钟来源

参考数据手册,定时器TIM1,TIM8是靠APB2的,他们是高级定时器
TIM2是普通定时器,是靠APB1时钟。

高级定时器和普通定时器区别

在这里插入图片描述

生成代码

1.在这里插入图片描述
2.开定时器2中断
在这里插入图片描述
3.写TIM2回调函数
在这里插入图片描述
4.main函数里面10s调用一次
在这里插入图片描述

普通定时器实现us延时

Us级别延时我们不能用中断,因为太频繁了占用不必要的CPU资源。
我们用一个普通定时器来作为 us延时定时器,这个定时器不用开中断,我们只读他的计数值就ok了。
在这里插入图片描述

当调用 HAL_TIM_Base_Start(&htim3) 时,定时器从初始值开始计数,但启动过程本身需要一定时间(例如配置寄存器、中断处理等)。-5 是为了提前设置一个较小的初始值,抵消这部分启动延迟。不同的硬件可能有差异,建议用一个gpio
eg:逻辑分析仪设置为电平上升沿采样
gpio拉高
延时20us
gpio拉低。用逻辑分析仪读一下之间延时时间,如果不是20us,适当的调整参数值5

/*
 普通定时器实现us延时
*/

void udelay(uint32_t us)
{
 #deinfe HARDWARE_EXE_TIME_US 5
 volatile uint16_t  differ = 0xffff-nus-HARDWARE_EXE_TIME_US;
 //设置定时器3的技术初始值
  __HAL_TIM_SetCounter(&htim3,differ);
  //开启定时器
  HAL_TIM_Base_Start(&htim3);
 
  while( differ<0xffff-HARDWARE_EXE_TIME_US)
 {
  differ = __HAL_TIM_GetCounter(&htim3);
 };
 //关闭定时器
  HAL_TIM_Base_Stop(&htim3);
}
### STM32H750VBT6 定时器使用教程 #### 配置环境准备 为了配置STM32H750VBT6定时器,建议先通过STM32CubeMX工具创建一个新的项目,并选择对应的MCU型号。完成基本设置后,可以进一步调整外设参数。 #### RCC与时钟树配置 对于RCC(复位和时钟控制)模块,在STM32CubeMX界面左侧找到并展开它。外部晶振频率应作为输入源指定给HSI或HSE选项;随后设定PLL输出为目标系统核心频率——最高可达480MHz[^1]。确认无误后点击“Auto”按钮让软件自动生成完整的时钟分配方案。 #### 定时器初始化 进入TIMx (其中x代表具体的定时器编号) 的配置页面: - **模式选择**: 可选向上计数、向下计数或是中央对齐双向计数等方式; - **预分频系数(PSC)**: 设置此值可改变实际计数值与内部时钟脉冲之间的比例关系; - **自动重装载极限(ARR)**: 当计数达到这个上限就会触发一次溢出事件,从而实现周期性的中断请求; - **使能状态**: 开启/关闭选定通道的功能开关。 ```c // 初始化定时器实例化结构体 static void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 8399; // 假定APB1=84Mhz,则PSC=(84*1e6)/(期望频率)-1 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 9999; // ARR=10K-1 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } } ``` 上述代码片段展示了如何利用HAL库函数来初始化一个基础型通用定时器(TIM2),包括但不限于预分频寄存器(PSC), 自动重载寄存器(ARR)以及工作模式的选择等重要属性。 #### 中断处理程序编写 当需要响应由定时器产生的特定条件变化时,则要定义相应的回调函数用于捕获这些信号。下面是一个简单的例子说明怎样建立一个基于时间间隔触发的任务调度机制: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { /* Prevent unused argument(s) compilation warning */ UNUSED(htim); if (htim->Instance == TIM2){ // 插入用户逻辑代码... } } /* 用户应用程序入口点 */ int main(void) { ... HAL_TIM_Base_Start_IT(&htim2); // 启用全局中断服务例程 while (1){ // 主循环体内保持空闲等待ISR调用 } } ``` 这段C语言代码实现了启动带有中断功能的基础定时器操作,并注册了一个专门用来接收过期通知的服务例程(HAL_TIM_PeriodElapsedCallback())。每当发生超时期间结束的情况时,该函数将会被CPU执行以便及时作出反应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值