尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

STM32定时器输入捕获:从原理到实战,精准测量脉宽与频率

STM32定时器输入捕获:从原理到实战,精准测量脉宽与频率 1. 项目概述从“数数”到“感知”的跨越搞嵌入式开发尤其是玩STM32的定时器这玩意儿绝对是绕不开的核心外设。PWM输出、延时、计时这些基础功能大家都很熟了。但今天咱们要聊的是定时器一个更“主动”、更“聪明”的功能——输入捕获。简单来说PWM是定时器“说”出去而输入捕获是定时器“听”进来。它能精准地测量外部信号的脉宽、周期、频率甚至配合编码器还能测速和方向。想想那些需要精确测速的电机控制、需要测量脉冲宽度的红外遥控解码、或者需要频率计功能的仪器仪表输入捕获就是背后的功臣。我刚开始接触时觉得它就是个“高级计数器”但踩过几次坑、调通几个项目后才发现这里面门道不少。从最基础的边沿检测到高级的PWM输入模式再到利用DMA进行批量捕获以解放CPU每一步配置都关系到测量的精度和系统的实时性。很多人调不通问题往往不是出在代码逻辑而是对定时器时钟源、预分频、捕获/比较通道、中断和DMA的协同工作机制理解不透。这篇文章我就结合自己实际项目中的经验把STM32定时器的输入捕获功能从头到尾捋清楚不仅告诉你寄存器该怎么配更要讲明白为什么要这么配以及实际调试中会遇到哪些“坑”和解决技巧。2. 核心原理定时器如何“抓住”瞬间在深入代码之前我们必须把输入捕获的工作原理吃透。这就像打仗前先看明白地图不然配置寄存器就是盲人摸象。2.1 核心工作流程拆解想象一下定时器就像一个永不疲倦的马拉松运动员在一个环形跑道上匀速跑步跑一圈的里程是固定的比如0xFFFF。他的手腕上戴着一块特殊的表这块表有一个神奇的功能当跑道边的特定传感器对应外部输入引脚被触发时这块表能瞬间“咔嚓”一下记录下运动员当前已经跑过的精确里程数。这个过程分解开来就是时钟与计数运动员的速度由“时钟源”决定。内部时钟APB总线就像标准计时器外部时钟模式则像是跟着另一个领跑员的速度跑。预分频器PSC可以调节他的“步频”比如时钟频率是72MHz预分频设为71那么实际计数频率就是72M/(711)1MHz相当于运动员每1微秒“迈出一步”计数器加1。边沿检测跑道边的传感器输入捕获通道被配置为在特定事件时触发比如运动员经过时“上升沿”从低到高或“下降沿”从高到低。这个配置就是捕获极性选择。瞬间抓拍当传感器被触发检测到设定的边沿时运动员手腕上的表捕获/比较寄存器CCRx会立刻把当前跑过的总里程数计数器的值CNT复制保存下来。这个“抓拍”动作是硬件自动完成的速度极快精度可以达到一个计数时钟周期。通知系统抓拍完成后手表会亮起一个灯捕获标志位CCxIF被置1如果允许它还会大声通知教练产生捕获中断或DMA请求。教练CPU或DMA这时就可以过来读取记录下的里程数进行后续计算。2.2 测量脉宽与频率的数学逻辑理解了单次抓拍测量脉宽和周期就简单了。以测量一个正方波的高电平脉宽为例第一次抓拍配置通道在上升沿触发。当信号从低变高时捕获寄存器CCR1记录下此刻计数器的值T1。第二次抓拍在中断服务程序里立刻将通道的捕获极性改为下降沿。当信号从高变低时CCR1再次抓拍记录值T2。计算高电平时间 (T2 - T1) * 计数时钟周期。如果T2 T1计数器溢出了那么时间 ((0xFFFF - T1) T2 1) * 时钟周期。测量频率周期更简单只需连续捕获两个相邻的上升沿时间差即为信号周期其倒数就是频率。这里的一个关键技巧是在测量高频信号时为了获得高精度我们希望每次捕获的计数值差异尽可能大减少量化误差。因此在定时器计数频率固定的情况下应尽量让信号的周期接近定时器的溢出周期。例如用1MHz的计数频率去测量一个10kHz周期100us的信号两次捕获值差大约为100这个分辨率是足够的。但如果用同样的1MHz去测量100Hz周期10ms的信号若计数器是16位最大值6553510ms需要10000个计数值仍在量程内但若信号周期更长就可能发生计数器多次溢出计算时就必须考虑溢出次数通常我们会开启定时器的更新溢出中断来累计溢出次数。注意在计算时间差时必须考虑计数器溢出的情况。一个健壮的代码应该在捕获中断中除了读取CCR值还要检查并累计定时器的溢出次数。公式应为总计数 溢出次数 * (ARR 1) 本次CCR值 - 上次CCR值。其中ARR是自动重装载值。3. 从零开始通用定时器的输入捕获配置我们以STM32F1的通用定时器TIM2的通道1PA0引脚为例演示如何一步步配置输入捕获来测量一个PWM信号的高电平脉宽。这里我会使用标准外设库SPL和HAL库两种方式对比讲解让你理解本质。3.1 硬件与时钟树初始化任何外设使用时钟是第一步。TIM2挂在APB1总线下。在标准库中我们需要手动开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 因为PA0属于GPIOA在HAL库中通常由HAL_TIM_IC_Init()函数内部或CubeMX自动完成。接着配置GPIO。PA0需要被复用到TIM2的通道1上。// 标准库方式 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; // 上拉输入避免悬空 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // 或者复用功能输入 GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 对于某些型号输入捕获也是复用推挽 GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2); // 引脚复用映射这里有个坑不同系列、不同型号的STM32对于输入捕获的GPIO模式要求可能不同F1系列通常配置为上拉输入GPIO_Mode_IPU或浮空输入GPIO_Mode_IN_FLOATING即可因为信号是由外部驱动。而F4/F7/H7等系列则需要将引脚配置为复用功能Alternate Function并选择正确的复用映射。务必查阅对应型号的《数据手册》中“引脚复用功能”表格和《参考手册》的GPIO章节。3.2 定时器基础参数配置接下来配置定时器本身的工作模式。我们的目标是让定时器作为一个简单的向上计数器运行。// 标准库 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period 0xFFFF; // ARR值16位定时器最大值 TIM_TimeBaseStructure.TIM_Prescaler 71; // PSC值72MHz/(711)1MHz计数频率 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频与数字滤波器相关通常设为DIV1 TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure);TIM_Prescaler (PSC)这个值决定了定时器的“心跳”多快。我们的系统时钟是72MHz如果PSC设为71则计数器每72个时钟周期加1计数频率为1MHz即每个计数值代表1微秒。预分频器是硬件同步的更改它通常在下一次更新事件生效。TIM_Period (ARR)这是自动重装载值计数器计数到ARR后在下一个时钟周期归零或根据计数模式装载并产生一个更新事件溢出中断。在测量长脉宽时我们需要用这个溢出中断来累计溢出次数。TIM_ClockDivision这个参数与输入捕获的数字滤波器采样时钟有关并非定时器计数时钟的分频。设为DIV1意味着滤波器采样时钟频率等于定时器输入时钟在捕获时就是APB时钟经过可能的倍频后。如果信号有毛刺可以通过增大这个值如DIV4来降低采样频率配合滤波器使用。3.3 输入捕获通道配置这是最核心的部分。我们需要配置通道1工作在输入捕获模式并设置其极性、滤波和分频。// 标准库 TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel TIM_Channel_1; // 通道1 TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; // 初始捕获极性上升沿 TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; // 输入映射直接映射到TI1 TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; // 输入预分频器每个边沿都捕获 TIM_ICInitStructure.TIM_ICFilter 0x0; // 滤波器值不滤波 TIM_ICInit(TIM2, TIM_ICInitStructure);TIM_ICPolarity决定在哪个边沿触发捕获。可以是上升沿、下降沿、双边沿某些型号支持。TIM_ICSelection这个非常重要它决定了引脚信号映射到哪个内部输入源。TIM_ICSelection_DirectTI引脚信号直接连接到对应的TIx输入。例如通道1对应TI1。TIM_ICSelection_IndirectTI引脚信号交叉连接到另一个输入。例如通道1可以配置为捕获TI2的信号。TIM_ICSelection_TRC捕获内部触发输入。 对于简单的单通道捕获通常使用DirectTI。TIM_ICPrescaler输入捕获预分频器。它可以配置为每N个事件捕获一次。例如设为DIV4时每检测到4个指定边沿才触发一次捕获。这在测量频率时可以用来对输入信号分频避免中断过于频繁。注意它和定时器的预分频器PSC是两回事。TIM_ICFilter数字滤波器长度。这是一个从0到15的值定义了以多少倍的采样频率连续采样到相同电平才认为是一个有效的边沿。例如滤波器值设为4且ClockDivisionDIV1则需要在4个连续的采样点都检测到新电平边沿才被确认。这能有效滤除高频毛刺。调试技巧如果测量值偶尔出现巨大跳变很可能是噪声引起的误触发适当增加滤波器值如设为6或8往往能解决问题。3.4 中断与DMA配置捕获事件发生后我们需要被通知。有两种方式中断和DMA。中断方式// 使能捕获/比较1中断和更新溢出中断 TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_Update, ENABLE); // 在NVIC中配置中断优先级并开启中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority 0; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); // 最后启动定时器 TIM_Cmd(TIM2, ENABLE);在中断服务函数TIM2_IRQHandler中我们需要做以下事情检查中断源是更新中断TIM_IT_Update还是捕获中断TIM_IT_CC1。如果是更新中断说明计数器溢出了将一个全局的溢出计数器overflow_count加1。如果是捕获中断首先清除标志位然后根据当前是第几次捕获通过一个状态机变量capture_state来读取CCR1的值并可能改变捕获极性。volatile uint32_t capture_overflow_count 0; volatile uint8_t capture_state 0; // 0:等待上升沿1:已捕获上升沿等待下降沿2:完成 volatile uint32_t capture_rise_val 0; volatile uint32_t capture_fall_val 0; volatile uint32_t high_level_ticks 0; void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) ! RESET) { // 计数器溢出 capture_overflow_count; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } if (TIM_GetITStatus(TIM2, TIM_IT_CC1) ! RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); switch(capture_state) { case 0: // 第一次捕获上升沿 capture_rise_val TIM_GetCapture1(TIM2); // 改变极性为下降沿 TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Falling); capture_state 1; break; case 1: // 第二次捕获下降沿 capture_fall_val TIM_GetCapture1(TIM2); // 计算高电平计数值考虑溢出 if (capture_fall_val capture_rise_val) { high_level_ticks (capture_overflow_count * 65536) (capture_fall_val - capture_rise_val); } else { // 下降沿捕获时计数器已溢出一次 high_level_ticks ((capture_overflow_count - 1) * 65536) (65536 - capture_rise_val capture_fall_val); } // 重置状态准备下一次测量 capture_overflow_count 0; TIM_SetCounter(TIM2, 0); TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Rising); capture_state 0; // 此时 high_level_ticks 就是高电平的计数值乘以计数周期即得时间 break; } } }DMA方式对于需要连续、高速、批量捕获的场景如音频采样、高频信号分析使用DMA可以极大减轻CPU负担。你需要配置DMA通道将定时器的捕获/比较寄存器CCR1作为外设地址内存地址指向一个数组。当捕获事件发生时硬件自动将CCR1的值搬运到数组中。// 以TIM2_CH1的捕获事件触发DMA为例 DMA_InitTypeDef DMA_InitStructure; // ... 配置DMA通道外设地址为 TIM2-CCR1内存地址为 capture_buffer DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord; // 16位 DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode DMA_Mode_Circular; // 循环模式 DMA_InitStructure.DMA_Priority DMA_Priority_High; DMA_Init(DMA1_Channel5, DMA_InitStructure); // TIM2_CH1对应DMA1通道5F1系列 // 使能TIM2的CC1 DMA请求 TIM_DMACmd(TIM2, TIM_DMA_CC1, ENABLE); // 启动DMA和定时器 DMA_Cmd(DMA1_Channel5, ENABLE); TIM_Cmd(TIM2, ENABLE);使用DMA时你只需要定期或当DMA半满/全满中断时去处理capture_buffer数组里的数据即可CPU在此期间可以处理其他任务。4. 高级应用与实战技巧掌握了基础的单通道捕获我们可以玩一些更高级的功能这些在实际项目中非常有用。4.1 PWM输入模式一键测量周期与占空比这是输入捕获的一个特殊应用专门用于测量PWM信号。它利用了一个定时器的两个捕获通道通常是CH1和CH2协同工作自动测量周期和占空比且只需要一个引脚TI1或TI2。工作原理以测量TI1上的PWM为例。将TI1映射到IC1和IC2。IC1配置为上升沿捕获并触发从模式控制器复位定时器。IC2配置为下降沿捕获。当上升沿到来时IC1捕获事件发生记录为周期开始同时定时器CNT被清零。接下来下降沿到来时IC2捕获事件发生记录的值即为高电平脉宽。下一个上升沿到来时IC1再次捕获记录的值即为整个周期。同时CNT再次被清零开始新的测量。这样我们只需要读取CCR1周期和CCR2脉宽的值就能直接得到周期和占空比无需在中断中切换极性也避免了两次捕获间的软件开销精度更高。// 标准库配置PWM输入模式测量TI1 TIM_ICInitTypeDef TIM_ICInitStructure; // 配置IC1通道1捕获TI1的上升沿 TIM_ICInitStructure.TIM_Channel TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; // 直接TI1 TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter 0x0; TIM_ICInit(TIM2, TIM_ICInitStructure); // 配置IC2通道2捕获TI1的下降沿 TIM_ICInitStructure.TIM_Channel TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_IndirectTI; // 间接映射到TI1 TIM_ICInit(TIM2, TIM_ICInitStructure); // 配置从模式复位模式触发源为TI1FP1滤波后的TI1 TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);注意事项PWM输入模式会占用一个定时器的两个通道。同时从模式控制器被占用该定时器可能无法用于其他主/从模式应用。4.2 高精度频率测量与量程扩展对于频率测量精度和量程是一对矛盾。高计数频率如72MHz不分频能提高精度但计数器很快溢出量程小低计数频率量程大但精度低。技巧1使用定时器级联。用一个定时器TIM1的更新事件作为另一个定时器TIM2的时钟。这样TIM2的每个计数周期相当于TIM1的整个溢出周期可以极大地扩展量程用于测量极低频率的信号。技巧2使用输入分频ICPrescaler和溢出中断结合。对于已知范围的高频信号可以设置ICPrescaler为DIV2或DIV4每2个或4个边沿捕获一次减少中断频率。同时开启更新中断累计溢出次数。在计算时总时间 (溢出次数 * (ARR1) CCR值) * (计数周期 * ICPrescaler值)。技巧3使用捕获比较模式的“影子寄存器”。在高级定时器中可以配置CCR的影子寄存器在发生特定事件如另一个通道的捕获事件时才将当前CNT值锁存到CCR中并产生中断。这可以实现更复杂的同步捕获逻辑。4.3 正交编码器接口另一种“输入捕获”严格来说正交编码器模式是定时器的另一种工作模式但它本质上也利用了输入捕获功能。它通过两个通道TI1和TI2捕获编码器的A、B相脉冲硬件自动根据两相的相位关系判断方向并计数。// 配置TIM2为编码器模式 TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_Cmd(TIM2, ENABLE);配置好后只需读取TIM2-CNT的值就能得到带方向的计数值。这个功能在电机位置控制中至关重要。一个常见问题编码器计数方向与实际运动方向相反。这时可以交换编码器A、B相的接线或者通过软件对计数值取反或者重新配置TIM_ICPolarity参数例如一个上升沿一个下降沿来改变计数方向。5. 调试排坑与性能优化实录理论配置完了实际调不通才是常态。下面是我总结的几个典型问题和优化点。5.1 常见问题排查清单现象可能原因排查步骤与解决方案捕获不到任何中断1. 定时器时钟未开启2. GPIO模式配置错误3. 中断未使能或NVIC未配置4. 捕获极性设置错误1. 检查RCC_APBxPeriphClockCmd或CubeMX时钟树配置。2. 用万用表或逻辑分析仪检查引脚是否有信号。确认GPIO模式输入捕获应为输入模式浮空/上拉/下拉或复用功能模式并正确映射AF。3. 检查TIM_ITConfig和NVIC_Init。在中断函数入口加断点或翻转一个测试引脚。4. 确保信号边沿与TIM_ICPolarity设置一致。捕获值始终为0或固定值1. 输入信号频率远高于定时器捕获能力2. 滤波器值设置过大3. 捕获通道映射错误ICSelection1. 降低输入信号频率测试或提高定时器计数频率减小PSC。2. 将TIM_ICFilter暂时设为0。3. 确认TIM_ICSelection是否正确。对于单通道直接捕获应为DirectTI。测量值跳动大不稳定1. 信号有噪声或毛刺2. 中断处理时间过长丢失捕获事件3. 未考虑计数器溢出1. 硬件上增加RC滤波。软件上适当增加TIM_ICFilter值如从0x0增至0x8。2. 优化中断服务函数只做最必要的操作读取、存储、清除标志。对于高频信号考虑使用DMA。3. 确保开启了更新中断TIM_IT_Update并在计算时间差时加入溢出次数的计算。PWM输入模式测量不准1. 从模式触发源选择错误2. 两个通道的极性配置反了3. 信号占空比极端接近0%或100%1. 确认TIM_SelectInputTrigger选择的触发源是TIM_TS_TI1FP1对应TI1或TIM_TS_TI2FP2。2. 检查IC1和IC2的极性是否分别为上升沿和下降沿或反之。3. 极端占空比下其中一个捕获事件可能发生在定时器复位后极短时间内需确保定时器分辨率足够。DMA方式数据错乱1. DMA缓冲区溢出2. 外设/内存数据宽度不匹配3. DMA传输完成中断未及时处理1. 增大DMA缓冲区或提高DMA传输优先级。使用双缓冲半传输/全传输中断。2. 确保DMA_PeripheralDataSize和DMA_MemoryDataSize与CCR寄存器宽度通常16位及内存数组类型匹配。3. 在DMA传输完成中断中及时处理数据并重置相关索引。5.2 精度与实时性优化心得计数频率与ARR的权衡这是精度的核心。测量时间 计数值 * 计数周期。要获得高时间分辨率例如1us就需要高的计数频率1MHz。但ARR限制了最大可测量时间对于16位定时器1MHz下最大约65.5ms。如果信号周期可能超过此值你有两个选择一是使用32位定时器如F4/F7的某些TIM二是使用预分频器PSC来降低计数频率牺牲一些分辨率来换取量程同时必须使用更新中断来累计溢出。中断服务程序ISR要短输入捕获中断对实时性要求高。ISR里只做读取CCR、更新状态/计数值、清除标志位这几件事。复杂的计算如将计数值转换为时间或频率应该放到主循环或低优先级任务中。使用volatile关键字声明在ISR和主程序间共享的变量。利用DMA解放CPU对于需要连续捕获大量数据的应用如音频采样、高频脉冲序列分析DMA是必选项。配置为循环模式结合DMA半传输和全传输中断可以实现“乒乓操作”几乎零CPU开销地处理流数据。注意GPIO速度对于高频信号10MHz除了定时器配置GPIO的翻转速度也可能成为瓶颈。确保GPIO配置为最高速度如GPIO_Speed_50MHz。时钟树检查确保你计算的定时器实际计数频率是正确的。APB1/APB2的预分频、是否使能了倍频如F1的PLL、定时器是否挂在低速时钟如LSE上这些都会影响最终频率。使用SystemCoreClock变量或手动计算来验证。5.3 一个综合案例测量舵机PWM信号舵机控制信号是一个周期为20ms50Hz高电平脉宽在0.5ms到2.5ms之间的PWM波。我们需要精确测量其脉宽。方案选择周期20ms较长为了兼顾精度和避免频繁溢出我们选择72MHz系统时钟PSC设为7199得到计数频率为10kHz0.1ms/计数。ARR设为最大值65535则定时器溢出周期为6.5535秒远大于信号周期因此可以忽略溢出简化计算。配置步骤初始化TIM3或其他通用定时器PSC7199ARR0xFFFF向上计数。配置对应通道如CH2为输入捕获模式初始极性为上升沿滤波器可设为4以抗干扰。使能捕获中断和定时器。在中断中第一次上升沿捕获记录T1并切换极性为下降沿第二次下降沿捕获记录T2计算脉宽 (T2 - T1) * 0.1ms。然后重置状态切换回上升沿准备下一次测量。避坑点舵机信号可能来自遥控接收机信号质量可能不佳。适当增加数字滤波器值ICFilter可以有效滤除窄毛刺。另外计算时确保使用无符号整数并处理T2 T1的情况虽然在此配置下概率极低但好的习惯是加上判断。通过这个案例你将输入捕获的核心流程——时钟配置、通道初始化、中断处理、数值计算——完整地走了一遍。STM32的定时器功能强大且灵活输入捕获只是其冰山一角。理解其工作原理结合数据手册和参考手册你就能驾驭它去解决各种实际的信号测量问题。记住多动手调试善用逻辑分析仪观察实际波形和捕获时刻是掌握这门技术最快的方法。
返回列表