基本定时器的使用步骤(全干货-无细究讲解)

好的,WWDG 👨‍🏫,我们按照你给出的结构,用 STM32CubeMX + Keil + HAL库 来实现:


✅ 1:用 500ms 翻转 LED 灯为例 —— STM32CubeMX + Keil + HAL

目标: 使用 TIM6 定时器,每 500ms 产生一次中断,在中断中翻转 LED(PC13)。


🧮 步骤一:定时器参数计算

  • 系统主频(SYSCLK):72 MHz

  • 目标中断周期:500ms(0.5秒)

设:

  • 预分频器(Prescaler)设为 7199 → 得到 10kHz 的定时器时钟

  • 自动重装载(ARR)设为 4999 → 每 5000 次 10kHz = 0.5 秒

计算公式:

T=(PSC+1)×(ARR+1)FCLK=7200×500072×106=0.5sT = \frac{(PSC + 1) \times (ARR + 1)}{F_{\text{CLK}}} = \frac{7200 \times 5000}{72 \times 10^6} = 0.5s


🧰 步骤二:STM32CubeMX 设置

打开 STM32CubeMX 工程,完成如下配置:

✅ 基础配置

项目设置
MCU 型号STM32F103ZETx
RCCHSE 使能,SYSCLK 72MHz
SYSDebug 设置为 Serial Wire

✅ 引脚配置

引脚设置
PC13GPIO_Output,用于控制 LED

✅ TIM6 设置

  1. 在“Timers”中选择 TIM6

  2. 设置为 Internal Clock

  3. 配置参数:

参数
Prescaler7199
Auto-Reload4999
Counter ModeUp
AutoReloadPreloadDisable
Interrupt启用 Update event 中断 ✔️

✅ NVIC 中断设置

  • 在 “Configuration → NVIC” 中使能 TIM6 global interrupt


完成后点击 Project → Generate Code
并用 Keil uVision 打开工程 🔧


🧱 步骤三:TIM6 初始化代码(自动生成)

tim.c 中自动生成:

void MX_TIM6_Init(void)
{
  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 7199;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 4999;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  HAL_TIM_Base_Init(&htim6);
}

⚙️ 步骤四:中断配置(自动生成)

stm32f1xx_it.c 中:

void TIM6_DAC_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim6);
}

tim.c 中的 MSP 初始化:

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
  if(htim_base->Instance==TIM6)
  {
    __HAL_RCC_TIM6_CLK_ENABLE();

    HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
  }
}

🔁 步骤五:实现中断服务函数和回调


✅ IRQ Handler(自动调用)

位置:stm32f1xx_it.c

void TIM6_DAC_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim6);  // 自动调用回调函数
}

✅ 回调函数(需要自己实现

位置:main.c 或新建 user.c  其实这个放在tim.c最下面就可以了-看个人目录结构喜好吧,因为常使用STM32CUBE所以,基本对于STM32CUBE生成的目录结构 不会过于修改。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM6)
  {
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);  // 翻转LED
  }
}

✅ 启动定时器(在 main.c 中)

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM6_Init();

  HAL_TIM_Base_Start_IT(&htim6);  // 启动定时器中断

  while (1)
  {
    // 主循环无需操作,中断中翻转LED
  }
}

💡 最终效果

  • 每 0.5 秒触发一次 TIM6 中断

  • 中断中翻转 PC13 引脚 → LED 闪烁频率 1Hz


<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值