
STM32 F407骄阳电机版用DMA双缓存接收串口数据时,上电第一次接收区是memory1而不是memory0?
STM32F407骄阳版用DMA双缓存区接收串口数据,上电第一次接收到的数据在memory1而不是memory0
stm32f407无法配置定时器2为全部dma
FreeRTOS问题求解
使用stm32F407连接PHY芯片进行以太网通讯,一插网线就会进入错误中断。
ST的IMU和地磁计用motionfx库融合后航向角异常的问题
CUEBIDE生成的APP程序,在写入FLASH之后无法正常跳转。
有关Cubeide IAP 问题
stm32驱动st7735屏幕区分地图上的障碍物.
stm32cubumx使用1.28.0固件包无法初始化fsmc
测量连续两次的时间差,这个时间差用内部定时器两次捕获的差值来获得。
下面有篇文章介绍基于STM32 定时器做脉宽测量的内容,你可以参考下。
基于定时器捕获测量脉宽的应用示例
问题如题。采用STM32F401芯片,想用内部时钟计数外部脉冲间隔(可以是沿到沿或两上升沿之间),采用那种方式最好。
希望响应速度快,丢码率低,重复可靠。
有样板工程最好。
先谢谢了
谢谢[ xmshao]
看了您的文章,有点不太明白,估计需要细琢磨一下。我按照您的文章的CubeMX配置开始尝试。主要的问题是STM32F401RCT6右3个Timer可以设置,有两个已经用作PWM输出,只有一个TIMER2作为外部捕获测量,思路是用TIMER4或11记录内部时钟(已经设为80MHz)这没有关系,我的思路与您这个稍稍有点不同时:用TIMER4或11内部Clock定时器时间间隔触发TIMER2开始进入外部信号测量计数过程,由TIMER4或11第二个脉冲终止TIMER2的计数,进入计算阶段,计算完毕,重新开始此循环。
再次感谢回复和您的文章,谢谢谢谢
同一定时器的两个通道。
使能第二个通道的中断,
这样在这个捕获中断中就可以同时处理两个捕获值,计算间隔。
当然,速度慢一些就不合适了。
[md]说实在的,对你的需求还不是看得很明白。
整体上讲,测量脉冲宽度我们可以给予一个通道,也可以基于两个通道。从你的描述来看,测量的起止有额外的同步动作?没关系,总会有办法的。
你可以把你的需求用图文的形式表述或许更清晰。
这个问题暂时解决了。首先感谢 xmshao的一篇推荐文章,翻阅后对从CUBEMX开始设置项目,其中tim的选设有了一定了解,有东西大家分享吧。
按照文章中的选设(文中是TIM4,本人采用的是STM32F401RCxx只有T1-T3有外部触发其余的tim只能内部触发)设定Timer2为外部触发产生事件。T1,T3一已在系统中设定为PWM,当然曾考虑到T2具有32为分辨率作为外部触发计数具有独到优势。
具体设置可以参考 xmshao 给的文档此处不再重复,仅仅将我在试验中的测试结果做一描述。先声明,绝对不是最佳方案,仅仅是实现了需要的功能,如此而已。当让后边还会描述进一步想做何用,急需的实验抽空再做了。
本实验希望能对外部信号进行中断计数,“单位”时间数脉冲数,能读一次即可多测更好!
CubeMX设置完成后并不能立即实现需要做一些代码设置。
我的MCU是STM32F401RCxx,主频最高支持84MHz最后设在了外部25MHz晶振,PLL设置到Core Clock为84MHz,许多计算按照文章带入实际上不准确,误差非常大——不是一倍几倍,只能采用测试的方法——当然与找不到这款芯片的用户手册有关——官网和许多技术网站只能搜到几乎一样的技术手册。想搜相关的F4系列的用户手册也无果,这是诟病。
首先设置main前部的time2的初始代码:
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2); __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE); __HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_TRIGGER);
后两句也可以先不写。
接着设置tim.c中TIM2中的一句进行测式:
sSlaveConfig.InputTrigger =TIM_TS_TI2FP2;
这一句实在CubeMX设置完成后自动生成的,我用了两个Tim4,Tim11想用他们来产生TI2FP2信号,结果无果,既然这种方式不行,那么就采用自己触发采样计数,遍历TIM_TS_TI2FP2,结果搜到了触发定义变量(有用的2个):
TIM_TRGO_OC1;
TIM_TRGO_UPDATE;
经过测试两个都能触发tim2进行计数,相对而言前一个函数误差最小。于是更改stm32f4xx_it.c函数中关于time2的中断向量函数,原始如下:
/**
/ USER CODE END TIM2_IRQn 1 / }
只需要在用户代码中加入一段中断处理函数即可,本思路是:第一个出发沿开始计数,之到第二个触发沿终止计数,为了省事和技术准确(不因中断二占用计数时间),在中断函数中永远累加计数,在中断处理中完成求此时间间隔的计数值,结果效果比预想的好,加入的代码如下:
/ USER CODE END TIM2_IRQn 1 /
if(__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_UPDATE)!=RESET){
//__HAL_TIM_CLEAR_IT(&htim2,TIM_IT_UPDATE); __HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_TRIGGER); t2Cnt++;if(t2Cnt>1){t2Cnt=0;kk=ttc;ttc=0;} } ttc++;
/ USER CODE END TIM2_IRQn 0 / HAL_TIM_IRQHandler(&htim2); / USER CODE BEGIN TIM2_IRQn 1 /
其中ttc是tim2每产生一次沿中断,ttc累加一次;
代码首次运行t2Cnt=0;中断处理函数是首次沿中断,将ttc清0,t2Cnt++;(此时为1)
带第二次沿中断,t2Cnt+1>1,
将ttc的值赋予kk,同时ttc清0;。kk是送LCD显示和计算的计数值。
经过测试,在测试99.99KHz以及1KHz的赔率下的误差都小于1/1000。
美中不足的是,多次循环采样中LCD现实的数据会有个位数的小跳变。当然与偷懒有关——kk开作为按键的测试值显示在LCD上。
证明此方案技术可用。
再次感谢 [xmshao](https://shequ.stmicroelectronics.cn/space-uid-1105.html !