STM32 Input Capture
前言
本文介绍了如果通过软件[STM32CubeMX],对[STM32F401CCU6]芯片进行初始化配置,继而在[Keil MDK-ARM]中进行应用代码的编写。
实现了如下功能:使用STM32定时器的输入捕获功能。
“输入捕获”被用来测量输入的频率。
注意本文章只是通过测量上升沿来测量频率。
“输入捕获”以如下方式工作:
- 不论何时有上升沿被检测到,一个回调CALLback函数就会被执行。
- 本文将捕获时间戳,并把它存储在某个变量中
- 一旦检测到第二个上升沿,另一个时间戳将被捕获并储存。
- 最后输入频率将通过这种方式计算:用时间戳之差除以计时器时钟频率
下面我们从CubeMX开始!
1 通过CubeMX创建keil工程
File→New Project→双击选择芯片STM32F401CCUx→工程新建完毕。
左侧System core→RCC→High Speed Clock (HSE)→Crystal/CeramicResonator→外部晶振启用完毕。
顶部Clock Configuration→左侧Input frequency(HSE)根据板子上的外部晶振填写数值,我的是25,一般的是8→界面中间HCLK(MHz)设置数值为最大,我的为84→回车,弹出窗口统统点确定→左侧HSE对应的PLL SourceMux选择HSE(界面会出现红色警示)→再回到界面中间HCLK(MHz)设置数值为最大,我的为84→回车,弹出窗口统统点确定→系统时钟设置完毕
进入主要操作
顶部Pinout & Configuration→Timers→TIM3→紧靠的右侧TIM3 Mode and Configuration→Channel1选择Input Capture direct mode→下侧Configuration→Parameter Settings→Counter Settings→Counter Period(ARR)设置为0xffff→NVIC Settings→TIM3 global interrupt打勾。
另外我还设置了SPI接口,以便在12864屏幕显示数据。这部分操作请参考这里。
说明:
在这里,我选择了TIM3的输入捕获功能,根据F401CC数据手册,TIM3连接在APB1总线上,本例中APB1总线工作的频率为42MHz。TIM3的工作频率是APB1总线频率的2倍,即84MHz。
CubeMX中唯一的改动,是把ARR设置为最大值,本例中为0xffff(TIM3是16位的)。
要注意的是,应用此方法可测量的最小频率 = (TIMx CLK)/ARR。
在本例中,最小可测量频率为(84Mhz)/65536 =1282Hz
另外请确保你使能了TIMx的全局中断“global TIMx interrupt”。
退出主要操作
顶部Project Manager→设定Project Name→设定Toolchain / IDE及可适用的最低版本
左侧Code Generator→Generated files→勾选第一项Generate peripheralinitialization as a pair of ’.c/.h’ files per peripheral
最后点击右上角蓝色按钮GENERATE CODE生成代码,生成完毕后点击Open Project,进入Keil界面。
2 Keil中应用代码的编写
在main.c中Private variables处添加
/* USER CODE BEGIN PV */
在/ USER CODE BEGIN 2 /中进行初始化,
/* USER CODE BEGIN 2 */
最后在while(1)中显示所测得的频率(也可以直接用debug的watch窗口来看)
/* Infinite loop */
3 本文知识点
知识点1 通过测得的diff来计算输入频率的方法(说明-2)
知识点2 HAL库函数的使用
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1); //调用此函数打开定时器的捕获功能
知识点3 关于输入捕获的说明(说明-1)
本例中,输入捕获功能就是检测某引脚的上升沿,出现一个上升沿,就产生一个中断(进入中断处理函数),记录一次时间戳(定时器的计数值),第二次检测到上升沿就再进入中断记录一次时间戳。
所以可能的情况是①第一次中断时,CNT=0x0001,第二次中断时,CNT=0xf016。求diff时,直接用后者减去前者。②第一次中断时,CNT=0xff01,第二次中断时,CNT=0x0001(经历了一次重装载),此时求diff就不能直接相减了,要进行换算。即diff=0x0001+(0xffff+1)-0xff01。
附录
软件名称 软件版本
STM32CubeMX 5.5.0
MDK-ARM Plus 5.27.1.0
接线:
stm32 12864
PA5(SCK) -- SCLK (exp5)
PA6(MISO)-- 不接 ()
PA7(MOSI)-- SID (exp3)
PA9(GPIO) -- CS(RS) (exp4)
输入的待测频率的波形接在PB4