keil delay要包含什么头文件_STM32 Input Capture || CubeMX || Keil || HAL

STM32 Input Capture

前言

本文介绍了如果通过软件[STM32CubeMX],对[STM32F401CCU6]芯片进行初始化配置,继而在[Keil MDK-ARM]中进行应用代码的编写。

实现了如下功能:使用STM32定时器的输入捕获功能。

9a5a02bd78ade39e0a448af646359bc9.gif

“输入捕获”被用来测量输入的频率。

注意本文章只是通过测量上升沿来测量频率。

“输入捕获”以如下方式工作:

  1. 不论何时有上升沿被检测到,一个回调CALLback函数就会被执行。
  2. 本文将捕获时间戳,并把它存储在某个变量中
  3. 一旦检测到第二个上升沿,另一个时间戳将被捕获并储存。
  4. 最后输入频率将通过这种方式计算:用时间戳之差除以计时器时钟频率

下面我们从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”。

d77128ccc7db2c63d34dfd4b24ea89fd.png

退出主要操作


顶部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)

990b34fa551d89dd0ee26088cbe2f1c2.png

知识点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

bd5db1e588ab0a2ad9ef70788837329a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值