原创] STM32学习笔记——单定时器四通道输入捕获
[
复制链接
]
Apache
68 主题 46 好友 1000 积分
管理员
哈工大电子设计
联盟
威望
53
积分
1000
精华
1
主题
68
帖子
1862
发消息 电梯直达 楼主 发表于 2012-8-18 23:20:37 |只看该作者 |倒序浏览 以下笔记始发于观海听涛,原创人Apache ,转载请说明 输入捕获作为定时器的一个功能,在工业测速上有很大的应用。STM32的一些定时器具有四个外部通道,可利用一个定时器采集外部四路脉冲频率,节约硬件资源和软件代码 如需要测量一个或多个外部方波脉冲频率,频率低于单片机运行频率,可如下操作:(以TIM4为例) 初始化:(省略GPIO 配置,将TIM4的四个通道引脚配置为上拉或浮空输入,省略定时器RCC 配置,省略中断NVIC 配置) 1. 2. void TIM_Configuration(void) 3. { 4. 5. TIM_ICInitTypeDef 6. TIM_ICInitStructure; 7. TIM_TimeBaseInitTypeDef 8. TIM_TimeBaseStructure; // TIM4 时基 9. 10. TIM_DeInit(TIM4); 11. TIM_TimeBaseStructure.TIM_Period = 12. 0xffff; 13. //自动重装值 14. TIM_TimeBaseStructure.TIM_Prescaler = 15. 719; 16. //预分频值, 使TIMx_CLK=1MHz 17. 18. TIM_TimeBaseStructure.TIM_ClockDivision =
19. TIM_CKD_DIV1;
20. //输入时钟不分频
21. TIM_TimeBaseStructure.TIM_CounterMode =
22. TIM_CounterMode_Up;
23. //向上计数
24. TIM_TimeBaseInit(TIM4,
25. &TIM_TimeBaseStructure);
26.
27. //TIM4_TimeBase
28. // TIM_ICInitStructure.TIM_ICMode =
29. TIM_ICMode_ICAP;
30. //输入捕捉方式
31. TIM_ICInitStructure.TIM_Channel =
TIM_Channel_1;//|
32. TIM_Channel_2; //输入通道
34.TIM_ICInitStructure.TIM_ICPolarity =
35.TIM_ICPolarity_Rising; //捕捉上升沿
36.
37.TIM_ICInitStructure.TIM_ICSelection =
38.TIM_ICSelection_DirectTI; //捕捉中断
39.
40.TIM_ICInitStructure.TIM_ICPrescaler =
41.TIM_ICPSC_DIV1; //捕捉不分频
42.
43.TIM_ICInitStructure.TIM_ICFilter =
44.0x0; //捕捉输入不滤波
45.TIM_ICInit(TIM4, &TIM_ICInitStructure);
46.TIM_ICInitStructure.TIM_Channel =
TIM_Channel_2 ;//|
47.TIM_Channel_2; //输入通道
48.
49.TIM_ICInitStructure.TIM_ICPolarity =
50.TIM_ICPolarity_Rising; //捕捉上升沿
51.
52.TIM_ICInitStructure.TIM_ICSelection =
53.TIM_ICSelection_DirectTI; //捕捉中断
54.
55.TIM_ICInitStructure.TIM_ICPrescaler =
56.TIM_ICPSC_DIV1; //捕捉不分频
57.
58.TIM_ICInitStructure.TIM_ICFilter =
59.0x0; //捕捉输入不滤波
60.TIM_ICInit(TIM4, &TIM_ICInitStructure);
61.TIM_ICInitStructure.TIM_Channel =
TIM_Channel_3 ;//|
62.TIM_Channel_2; //输入通道
63.
64.TIM_ICInitStructure.TIM_ICPolarity =
65.TIM_ICPolarity_Rising; //捕捉上升沿
66.
67.TIM_ICInitStructure.TIM_ICSelection =
68.TIM_ICSelection_DirectTI; //捕捉中断
69.
70.TIM_ICInitStructure.TIM_ICPrescaler =
71.TIM_ICPSC_DIV1; //捕捉不分频
72.
73.TIM_ICInitStructure.TIM_ICFilter =
74.0x0; //捕捉输入不滤波
75.TIM_ICInit(TIM4, &TIM_ICInitStructure);
76.TIM_ICInitStructure.TIM_Channel =
TIM_Channel_4 ;//|
77.TIM_Channel_2; //输入通道
78.
79.TIM_ICInitStructure.TIM_ICPolarity =
80.TIM_ICPolarity_Rising; //捕捉上升沿
82.TIM_ICInitStructure.TIM_ICSelection =
83.TIM_ICSelection_DirectTI; //捕捉中断
84.
85.TIM_ICInitStructure.TIM_ICPrescaler =
86.TIM_ICPSC_DIV1; //捕捉不分频
87.
88.TIM_ICInitStructure.TIM_ICFilter =
89.0x0; //捕捉输入不滤波
90.TIM_ICInit(TIM4, &TIM_ICInitStructure);
91./* TIM enable counter */
92.TIM_Cmd(TIM4, ENABLE);
93./* Enable the CC2 Interrupt Request */
94.TIM_ITConfig(TIM4,
95.TIM_IT_CC1, ENABLE);
96.TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);
97.
98.TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);
99.TIM_ITConfig(TIM4, TIM_IT_CC4,
100.ENABLE);
101.}
复制代码
其中:
TIM_TimeBaseStructure.TIM_Period = 0xffff;为自动重装值,与普通单片机一样
TIM_TimeBaseStructure.TIM_Prescaler = 719; 预分频值, 使TIMx_CLK=100KHz ,系统时钟运行于72M时720分频,定时器运行于100KHZ,即10us每分度
TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; 此句选择定时器为输入捕获模式,但在我的库函数下未定义,所以注释掉,未影响程序执行
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;配置通道1
TIM_ICInitStructure.TIM_ICPolarity =
TIM_ICPolarity_Rising;上升沿捕获
TIM_ICInitStructure.TIM_ICSelection =
TIM_ICSelection_DirectTI;捕获中断
TIM_ICInitStructure.TIM_ICFilter = 0x0;不滤波
TIM_ICInit(TIM4, &TIM_ICInitStructure);将配置应用
以上每个通道都需要将整个配置再写一遍,使用与'|'是无效的。
TIM_Cmd(TIM4, ENABLE);使能定时器4
TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE);
TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);
TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);
TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);打开四个通道的捕获中断
以上将TIM配置完成,下面是中断内代码:
2.void
3.TIM4_IRQHandler(void)
4.{
5.
6.//频率缓冲区计数
7.static u16 this_time_CH1 = 0;
8.static u16
https://www.doczj.com/doc/4f12022840.html,st_time_CH1 = 0;
10.static u8 capture_number_CH1 = 0;
11.vu16
12.tmp16_CH1;
13.static u16 this_time_CH2 = 0;
14.static u16 last_time_CH2 = 0;
15.
16.static u8 capture_number_CH2 = 0;
17.vu16 tmp16_CH2;
18.static u16 this_time_CH3 = 0;
19.static u16 last_time_CH3 = 0;
20.
21.static u8 capture_number_CH3 = 0;
22.vu16 tmp16_CH3;
23.static u16 this_time_CH4 = 0;
24.static u16 last_time_CH4 = 0;
25.
26.static u8 capture_number_CH4 = 0;
27.vu16 tmp16_CH4;
28.
29.if(TIM_GetITStatus(TIM4, TIM_IT_CC1) ==
SET)
30.
31.{
32.
33.TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
34.if(capture_number_CH1 == 0)
35.
36.{
37.
38.
39.capture_number_CH1 = 1;
40.
41.
https://www.doczj.com/doc/4f12022840.html,st_time_CH1 = TIM_GetCapture1(TIM4);
43.
44.}
45.
46.else if(capture_number_CH1 == 1)
47.
48.{
49.
51.capture_number_CH1 = 0;
52.
53.
54.this_time_CH1 = TIM_GetCapture1(TIM4);
55.
56.if(this_time_CH1 > last_time_CH1)
57.
58.{
59.
60.
61.tmp16_CH1 = (this_time_CH1 -
last_time_CH1);
62.
63.}
64.
65.else
66.
67.{
68.
69.
70.tmp16_CH1 = ((0xFFFF - last_time_CH1) +
this_time_CH1);
71.
72.}
73.//TIM2
74.counter clock = 1MHz
75.
76.//
77.FreqBuf[cnt] = (1000000L * 100) /
78.tmp16;
79.//*100为扩大显示量程
80.Freq_Value[0]=tmp16_CH1;
81.
82.}
83.}
84.if(TIM_GetITStatus(TIM4, TIM_IT_CC2) ==
SET)
85.
86.{
87.
88.TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
89.if(capture_number_CH2 == 0)
90.
91.{
92.
93.
94.capture_number_CH2 = 1;
95.
96.
https://www.doczj.com/doc/4f12022840.html,st_time_CH2 = TIM_GetCapture2(TIM4);
100.
101.else if(capture_number_CH2 == 1)
102.
103.{
104.
105.
106.capture_number_CH2 = 0;
107.
108.
109.this_time_CH2 = TIM_GetCapture2(TIM4); 110.
111.if(this_time_CH2 > last_time_CH2)
112.
113.{
114.
115.
116.tmp16_CH2 = (this_time_CH2 -
last_time_CH2);
117.
118.}
119.
120.else
121.
122.{
123.
124.
125.tmp16_CH2 = ((0xFFFF - last_time_CH2) + this_time_CH2);
126.
127.}
128.//TIM2
129.counter clock = 1MHz
130.
131.//
132.FreqBuf[cnt] = (1000000L * 100) /
133.tmp16;
134.//*100为扩大显示量程
135.Freq_Value[1]=tmp16_CH2;
136.
137.
138.}
139.}
140.
141.if(TIM_GetITStatus(TIM4, TIM_IT_CC3) == SET)
142.
143.{
144.
145.TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
147.
148.{
149.
150.
151.capture_number_CH3 = 1;
152.
153.
https://www.doczj.com/doc/4f12022840.html,st_time_CH3 = TIM_GetCapture3(TIM4); 155.
156.}
157.
158.else if(capture_number_CH3 == 1)
159.
160.{
161.
162.
163.capture_number_CH3 = 0;
164.
165.
166.this_time_CH3 = TIM_GetCapture3(TIM4); 167.
168.if(this_time_CH3 > last_time_CH3) 169.
170.{
171.
172.
173.tmp16_CH3 = (this_time_CH3 -
last_time_CH3);
174.
175.}
176.
177.else
178.
179.{
180.
181.
182.tmp16_CH3 = ((0xFFFF - last_time_CH3) + this_time_CH3);
183.
184.}
185.//TIM2
186.counter clock = 1MHz
187.
188.//
189.FreqBuf[cnt] = (1000000L * 100) / 190.tmp16;
191.//*100为扩大显示量程
192.Freq_Value[2]=tmp16_CH3;
193.
194.}
196.
197.
198.if(TIM_GetITStatus(TIM4, TIM_IT_CC4) == SET)
199.
200.{
201.
202.TIM_ClearITPendingBit(TIM4, TIM_IT_CC4); 203.if(capture_number_CH4 == 0)
204.
205.{
206.
207.
208.capture_number_CH4 = 1;
209.
210.
https://www.doczj.com/doc/4f12022840.html,st_time_CH4 = TIM_GetCapture4(TIM4); 212.
213.}
214.
215.else if(capture_number_CH4 == 1)
216.
217.{
218.
219.
220.capture_number_CH4 = 0;
221.
222.
223.this_time_CH4 = TIM_GetCapture4(TIM4); 224.
225.if(this_time_CH4 > last_time_CH4)
226.
227.{
228.
229.
230.tmp16_CH4 = (this_time_CH4 -
last_time_CH4);
231.
232.}
233.
234.else
235.
236.{
237.
238.
239.tmp16_CH4 = ((0xFFFF - last_time_CH4) + this_time_CH4);
240.
241.}
242.//TIM2
244.
245.//
246.FreqBuf[cnt] = (1000000L * 100) /
247.tmp16;
248.//*100为扩大显示量程
249.Freq_Value[3]=tmp16_CH4;
250.
251.}
252.}
253.//
254.GPIO_WriteBit(GPIOC, GPIO_Pin_13,
255.(BitAction)((1-
GPIO_ReadOutputDataBit(GPIOC,
GPIO_Pin_13))));
256.}
复制代码
中断内四部分代码完全一样,只分析其中一段
输入捕获的原理是,定时器正常计数运行,当外部脉冲到来时,将定时器计数值存起来,当下次脉冲到来时,求出这两次计数值差值,即为这两段脉冲的周期。
例如,定时器计数到10,外部脉冲到来,使用
last_time_CH1存储10,下次脉冲到来,此时定时器计数值运行到110,使用this_time_CH1存储110,之后做差,
tmp16_CH1存储差值100,由于定时器运行于100KHZ,10us 计数值增加一次,所以脉冲周期为100*10=1000us=1ms,即为1KHZ。
当然,定时器会溢出重装,此时需要将差值补偿运算,
tmp16_CH1 = ((0xFFFF - last_time_CH1) +
this_time_CH1);
可测量的范围取决于定时器运行的频率,如果外部频率慢到当定时器整个计数一周后也没有触发两次,会发生溢出,此时计数值已不准确。所以定时器时钟配置取决于外部脉冲频率,应配置得当使得脉冲频率范围不致溢出。
由于每次外部脉冲都会触发中断,尤其是四通道时,所以使用中断方式会略微占用CPU资源,使用DMA可以解决这一问题。
得到脉冲周期后,即可通过运算获得外部频率,进而测速。
哈工大电子设计联盟观海听涛 HRT车队
实验四、计数器电路的设计 一、实验目的 1、掌握计数器电路的设计方法; 2、进一步掌握电路的设计、编译、仿真和下载测试的方法。 二、实验要求 1、基本要求 1)设计一个具有异步复位和同步使能的4位二进制加法计数器 2)设计一个具有异步复位和同步使能、并行置数的加减可控的8位二进制计数器 3)设计一个具有异步复位和同步使能的BCD码加法计数电路, 2、扩展要求 1)设计一个具有异步复位和同步使能的六十进制加法计数电路 2)设计一个具有异步复位和同步使能的二十四进制加法计数电路 三、实验原理 四、实验内容及步骤 1、建立一个工程项目,路径如:D:\A0512301\forth,项目名和顶层实体名为count。 2、设计一个具有异步复位和同步使能的4位二进制计数器,并进行编译仿真与下载测试; 3、设计一个具有异步复位和同步使能、并行置数的加减可控的8位二进制计数器,并进行编译仿真与下载测试; 4、设计一个具有异步复位和同步使能的十进制加法计数电路,并进行编译仿真与下载测 试; 五、参考程序 1、四位加法计数器 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY CNT4 IS PORT ( CLK : IN STD_LOGIC ; Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ) ; END ; ARCHITECTURE bhv OF CNT4 IS SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK = '1' THEN Q1 <= Q1 + 1 ; END IF; END PROCESS ; Q <= Q1 ; END bhv; 2、异步复位,同步使能十进制加法计数器 LIBRARY IEEE;
1.1 4.5.1 切换正常流程 同频切换同时支持同eNodeB切换,同MME的异eNodeB切换,跨MME的异eNodeB切换场景。对于后两种场景依据eNodeB间是否建立X2接口,切换信令流程略有不同。 图4-2 同MME异eNodeB间切换流程 同MME异eNodeB间的同频切换信令流程如图4-2所示: 1.在无线承载建立时,源eNodeB下发RRC Connection Reconfiguration至UE,其中包含 source eNodeB 配置的Measurement Configuration消息,用于控制UE连接态的测量过程。
2.UE根据测量结果上报Measurement Report。 3.源eNodeB根据测量报告进行切换决策。 4.当源eNodeB决定切换后,源eNodeB发出HandoverRequest消息给目标eNodeB,通知 目标eNodeB准备切换。 5.目标eNodeB进行准入判断,若判断为资源准入,再由目标eNodeB依据EPS的QoS信息 执行准入控制。 6.目标eNodeB在L1/L2准备切换并对源eNodeB发送HANDOVER REQUEST ACKNOWLEDGE消息。 1.2 报告配置(A1至A5 B1至B2) 事件触发上报是3GPP 36.331协议中为切换测量与判决定义的一个概念。报告配置包含相应事件的相关参数。目前eNodeB应用以下事件触发相应动作: ●事件A1表示服务小区质量高于一定门限,当满足事件触发条件时UE便上报测量报告,eNodeB 停止异频/异系统测量。但在基于频率优先级的切换中,事件A1用于启动异频测量。 ●事件A2表示服务小区质量低于一定门限,当满足事件触发条件时UE便上报测量报告,eNodeB 启动异频/异系统测量。但在基于频率优先级的切换中,事件A2用于停止异频测量。 ●事件A3表示同频/异频邻区质量相比服务小区质量高出一定门限,当满足事件触发条件的小区信息被上报时,源eNodeB启动同频/异频切换请求。 ●事件A4表示异频邻区质量高于一定门限,满足事件触发条件的小区信息被上报时,源eNodeB 启动异频切换请求。 ●事件A5表示服务小区质量低于一定门限,同时异频邻区质量高于一定门限,满足事件触发条 件的小区信息被上报时,源eNodeB启动异频切换请求。 ●事件B1表示异系统邻区质量高于一定门限,满足事件触发条件的小区信息被上报时,源eNodeB启动异系统切换请求。 ●事件B2表示服务小区质量低于一定门限,同时异系统邻区质量高于一定门限,满足事件触发 条件的小区信息被上报时,源eNodeB启动异系统切换请求。 事件转周期上报 事件被触发并上报之后将转为周期上报满足该事件的测量信息,此方式称为事件转周期上报。UE的测量结果通过事件转周期的方式上报给eNodeB。周期上报将在事件取消条件满足或达到最大上报次数或UE收到切换命令后后取消。 事件转周期上报方式有如下作用: ●可有效防止因测量报告的遗失或内部处理流程的失败对切换造成影响。 ●对于准入拒绝,可以起到重试的作用。 ●测量报告中,邻区可能一次报不完。并且随着UE的移动,会上报不同的邻区,通过事件转周 期可以得到比较完整的测量结果。 1.3 事件A3的触发(LST INTRAFREQHOGROUP) 同频切换通过事件A3触发,且事件上报方式采用事件转周期的上报方式。 事件A3的触发,即邻区质量高于服务小区一定偏置值。参照3GPP协议36.331规定事件 A3的判决公式。 触发条件:Mn+Ofn+Ocn-Hys>Ms+Ofs+Ocs+Off
STM32F4系列共有14个定时器,功能很强大。14个定时器分别为: 2个高级定时器:Timer1和Timer8 10个通用定时器:Timer2~timer5 和 timer9~timer14 2个基本定时器: timer6和timer7 本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。 Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是:1输入捕获——测量脉冲长度。 2 输出波形——PWM 输出和单脉冲输出。 Timer3有4个时钟源: 1:内部时钟(CK_INT ),来自RCC 的TIMxCLK 2:外部时钟模式1:外部输入TI1FP1与TI2FP2 3:外部时钟模式2:外部触发输入TIMx_ETR ,仅适用于TIM2、TIM3、TIM4,TIM3,对应 着PD2引脚 4:内部触发输入:一个定时器触发另一个定时器。 时钟源可以通过TIMx_SMCR 相关位进行设置。这里我们使用内部时钟。 定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK ,故当APBx_Prescaler 不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK ,定时器时钟等于HCLK 。 例如:我们一般配置系统时钟SYSCLK 为168MHz ,内部高速时钟 AHB=168Mhz ,APB1欲分频为4,(因为APB1最高时钟为42Mhz ),那么挂在APB1总线上的timer3时钟为84Mhz 。 《STM32F4xx 中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个, 以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。 1 TIM3 控制寄存器 1 (TIM3_CR1) SYSCLK(最高 AHB_Prescaler APBx_Prescaler
STM32高级定时器死区时间设置探究 一、死区设置位置: 决定死区时间设置的位是‘刹车和死区寄存器TIM1->BDTR’中的DTG[7:0],设置范围是0x00~0xff。 二、死区时间设置公式如下: DT为死区持续时间,TDTS为系统时钟周期时长,Tdtg为系统时钟周期时长乘以倍数后的死区设置时间步进值。 在72M的定时器时钟下TDTS=1/72M=13.89ns. 所以以第一个公式,死区时间能以13.89ns的步进从0调整到127*13.89ns=1764ns 第二个公式则能(64+0)*2*13.89~(64+63)*2*13.89=1777.9ns~3528.88ns 换个角度看,就是(128~254)*13.89
同理,第三个公式就是3555.84ns~7000.56ns 换个角度看,就是(256~504)*13.89 第四个公式就是7111.68ns~14001.12ns 换个角度看,就是(512~1008)*13.89 综上: 死区时间就是不同的公式代表不同范围的死区时间设置,这个范围是互不重叠的。而但是在不同的死区时间范围内死区时间设置步进是不同的。 若某个系统时钟下的死区时间不够,可以通过改变定时器时钟来改变最大死区时间范围。 当根据硬件电路的特性定下死区时间后,可以根据目标死区时间范围来找到相应的公式,然后代入公式求解出相应的整数(有时候不一定是整数,那就选择最近的那个),拼接DTG[7:5]+DTG[4:0]即可。 例子:这样当我需要3us的死区持续时间时,则可这么计算: 3us在第二个公式决定的死区范围之内。所以选择第二个公式。 3000/(13.89*2)=108,所以DTG[5:0]=108-64=44,所以DTG=127+44=171=0Xab TIM1->BDTR|=0xab; 反过来验算//72Mhz,死区时间=13.89nsX108*2=3000us 经示波器验证,完全正确。 By zxx2013.07.18
实验四:计数器的设计 实验室:信息楼247 实验台号: 4 日期: 专业班级:机械1205 姓名:陈朝浪学号: 20122947 一、实验目的 1. 通过实验了解二进制加法计数器的工作原理。 2. 掌握任意进制计数器的设计方法。 二、实验内容 (一)用D触发器设计4位异步二进制加法计数器 由D触发器组成计数器。触发器具有0和1两种状态,因此用一个触发器 就可以表示1位二进制数。如果把n个触发器串起来,就可以表示N位二进制 数。(用两个74LS74设计实现) (二)利用74LS161设计实现任意进制的计数器 设计要求:学生以实验台号的个位数作为所设计的任意进制计数器。 先熟悉用1位74LS161设计十进制计数器的方法。 ①利用置位端实现十进制计数器。 ②利用复位端实现十进制计数器。 提示:设计任意计数器可利用芯片74LS161和与非门设计,74LS00为2输 入与非门,74LS30为8输入与非门。 74LS161为4位二进制加法计数器,其引脚图及功能表如下。
三、实验原理图 1.由4个D触发器改成的4位异步二进制加法计数器 2.由74LS161构成的十进制计数器
四、实验结果及数据处理 1.4位异步二进制加法计数器实验数据记录表 2. 画出你所设计的任意进制计数器的线路图,并说明设计思路。
设计思路:四进制为四个输出Q3Q2Q1Q0=0000,0001,0010,0011循环,第一个无效状态为0100 1,置位法设计四进制计数器:当检测到输入为0011时,先输出显示3,然后再将D 置于低电位,计数器输出Q3Q2Q1Q0复位。 2,复位法设计四进制计数器:当检测到第一个无效状态0100时,通过与非门的反馈计数器的Cr首先置于低电平使计数器复位为0000。 五、思考题 1. 由D触发器和JK触发器组成的计数器的区别? 答:D触发器是cp上升沿触发,JK触发器是下降沿触发。 2. 74LS161是同步还是异步,加法还是减法计数器? 答:同步。加法计数器。 3. 设计十进制计数器时将如何去掉后6个计数状态的? 答:加一个与非门形成负反馈。当计数到第一个无效状态Q3Q2Q1Q0==1010时,Q3和Q1全为1,Q1,Q3接与非门,输出作为复位信号,使所有触发器复位,从而去掉了后6个状态。
买了本《嵌入式系统——使用HCS12微控制器的设计与应用》这本书,看了觉得帮助不大。因为里面有些东西讲得不够详细,并且这本书不是针对XS128来写的。网上也有一些网友写的资料,那都只是针对某一方面的。我觉得最好的资料还是英文版的说明文档,里面好多东西都讲得很详细,虽然看起来有点费劲,但那里值得的。 接下来就自己的学习经历。 TIM中的功能比较多,有输入捕捉、输出比较,还有脉冲累加器。这里主要记一下输入捕捉和输出比较。输入捕捉这个功能很有用,他不仅可以捕捉外界事件的发生(这个功能和51中的外部中断差不多),还可以捕捉外界事件发生的时间。捕捉外界时间这个功能可以运用到驱动超声波测距中去。 IOC0~IOC7是输入捕捉\输出比较的外部针脚。当IOSx=0时(IOSx=1时为输出比较),则将相应的通道配置为输入捕捉了。当输入捕捉检测到有上升沿或下降沿时,就会把那时寄存器的值锁存到TCx中,这样就可以通过查询TCx来确定事件发生的时间了。如果输入捕捉控制寄存器TIE(CxI=1)中允许输入捕捉中断,则捕捉到事件时,系统会产生一次中断。 接下来依次说明一下相关的寄存器设置: TSCR1: TEN是定时器允许位。TEN=1时,允许定时器工作,TEN=0时,禁止定时器工作。其余不常用,设为0即可。 TSCR2: TOI是定时器溢出中断允许位。这个在输入捕捉中没用到,设为0即可。 TCRE是定时器计数寄存器复位允许位。用在输出比较中,允许输出比较寄存器7的事件来复位定时器计数寄存器。这里设为0即可。 PR2~PR0是定时器分频因子选择位。不同的组合可以设定不同的定时器时钟:
TIOS是输入捕捉和输出比较选择寄存器,在这里设定IOC0~IOC7是用于输入捕捉还是用于输出比较。 里面的8位对应着IOC0~IOC7八个通道,相应位位1,则设为输出比较。相应位设为0,则为输入捕捉。 TCTL3和TCTL4是用来设定输入捕捉极性的寄存器,在这里可以设为上升沿、下降沿、上升沿或下降沿触发输入捕捉。 其中EDGxB和EDGxA一起来设相应通道输入捕捉极性,对应的功能如下:
STM32输入捕获简介 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等. 例如:我们用到TIM5_CH1来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候TIM5_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的TIM5_CNT值。这样,前后两次TIM5_CNT之差,就是高电平的脉宽,同时TIM5的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。 首先TIMx_ARR和TIMx_PSC,这两个寄存器用来设自动重装载值和TIMx的时钟分频。 再来看看捕获/比较模式寄存器1:TIMx_CCMR1,这个寄存器在输入捕获的时候,非常有用;TIMx_CCMR1明显是针对2个通道的配置,低八位[7:0]用于捕获/比较通道1的控制,而高八位[15:8]则用于捕获/比较通道2的控制,因为TIMx还有CCMR2这个寄存器,所以可以知道CCMR2是用来控制通道3和通道4(详见《STM32参考手册》290页,14.4.8节)。 这里用到TIM5的捕获/比较通道1,我们重点介绍TIMx_CMMR1的[7:0]位(其实高8位配置类似)。 再来看看捕获/比较使能寄存器:TIMx_CCER; 接下来我们再看看DMA/中断使能寄存器:TIMx_DIER,我们需要用到中断来处理捕获数据,所以必须开启通道1的捕获比较中断,即CC1IE设置为1。 控制寄存器:TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的; 最后再来看看捕获/比较寄存器1:TIMx_CCR1,该寄存器用来存储捕获发生时,TIMx_CNT的值,我们从TIMx_CCR1就可以读出通道1捕获发生时刻的TIMx_CNT值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。 使能捕获和更新中断(设置TIM5的DIER寄存器) 因为我们要捕获的是高电平信号的脉宽,所以,第一次捕获是上升沿,第二次捕获时下降沿,必须在捕获上升沿之后,设置捕获边沿为下降沿,同时,如果脉宽比较长,那么定时器就会溢出,对溢出必须做处理,否则结果就不准了。这两件事,我们都在中断里面做,所以必须开启捕获中断和更新中断。 1void init_tim2_cam(u16 psc, u16 arr, u8 way, u8 dir) 2 { 3 RCC->APB1ENR |= 1<<0; //使能定时器2时钟 4 RCC->APB2ENR |= 1<<2; //使能PortA 5 6switch (way) 7 { 8case1: 9 GPIOA->CRL &= 0xfffffff0; 10 GPIOA->CRL |= 0x00000008; 11break; 12case2:
stm32的定时器输入捕获与输出比较 (2015-09-28 09:26:24) 转载▼ 分类:stm32 标签: it 明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用 输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。 外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。 时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。 输出比较:定时器中计数寄存器在初始化完后会自动的计数。从bottom计数到top。并且有不同的工作模式。 另外还有个比较寄存器。一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。 然后根据不同的工作模式计数寄存器将清零或者计数到top值。
1、朋友,可以解释一下输入捕获的工作原理不? 计数寄存器的初值,是自己写进去的吗? 我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不? timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不? 那输出比较的原理你可以帮我介绍一下不?
比较单元的值是人为设进去的吧? 上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不同的波形了” 设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不? 011:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?
实验二:+0-9999的计数器电路的设计
EDA实验报告学院 电气与信息工程学院(部): 专电子信息工程
业: 学生姓 刘玉文 名: 班 电子信息工程1101 级: 学 11401700430 号: 指导教师姓 谭会生 名: 实验二:0~9999的计数器电路的设计 1.实验目的 (1)进一步熟悉和掌握Quartus II软件的使用。 (2)进一步熟悉和掌握GW48-CK或其他EDA实验开发系统的使用。 (3)学习和掌握VHDL进程语句和元件例化语句的使用。 2.实验内容 设计并调试好一个技术范围为0~9999的4位十进制计数器电路CNT9999,并用GW48-CK或其他EDA实验开发系统(可选用的芯片为ispLSI 1032E-PLCC84或EPM7128S-PL84或XCS05/XCS10-PLCC84芯片)进行硬件验证。 3.实验条件 (1)开发软件:Quartus II8.0。
(2)实验设备:GW48-CK EDA实验开发系统。 (3)拟用芯片:EPM7128S-PL84。 4.实验设计 (1)系统原理框图 为了简化设计并便于显示,本计数器电路CNT9999的设计分为两个层次,其中底层电路包括四个十进制计数器模块CNT10,再由这四个模块按照图所示的原理框图构成顶层电路CNT9999。 CNT9999电路原理框图 (2)VHDL程序 计数器CNT9999的底层和顶层电路均采用VHDL文本输入,有关VHDL程序如下。 1)CNT10的VHDL源程序: --CNT10.VHD LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT10 IS PORT(CLK:IN STD_LOGIC; CLR:IN STD_LOGIC; ENA:IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CO:OUT STD_LOGIC); END ENTITY CNT10; ARCHITECTURE ART OF CNT10 IS SIGNAL CQI:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(CLK,CLR,ENA)IS BEGIN IF CLR='1'THEN CQI<="0000"; ELSIF CLK'EVENT AND CLK='1'THEN IF ENA='1'THEN IF CQI="1001"THEN CQI<="0000";
1.STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。 2.普通定时器TIM2-TIM5 2.1时钟来源 计数器时钟可以由下列时钟源提供: ·内部时钟(CK_INT) ·外部时钟模式1:外部输入脚(TIx) ·外部时钟模式2:外部触发输入(ETR) ·内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。 由于今天的学习是最基本的定时功能,所以采用内部时钟。TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。通过倍频器给定时器时钟的好处是:APB1不但要给TIM2-TIM5提供时钟,还要为其他的外设提供时钟;设置这个倍频器可以保证在其他外设使用较低时钟频率时,TIM2-TIM5仍然可以得到较高的时钟频率。 2.2计数器模式
暨南大学本科实验报告专用纸 课程名称EDA实验成绩评定 实验项目名称计数器电路设计指导教师郭江陵 实验项目编号03 实验项目类型验证实验地点B305 学院电气信息学院系专业物联网工程 组号:A6 一、实验前准备 本实验例子使用独立扩展下载板EP1K10_30_50_100QC208(芯片为EP1K100QC208)。EDAPRO/240H实验仪主板的VCCINT跳线器右跳设定为3.3V;EDAPRO/240H实验仪主板的VCCIO跳线器组中“VCCIO3.3V”应短接,其余VCCIO均断开;独立扩展下载板“EP1K10_30_50_100QC208”的VCCINT跳线器组设定为 2.5V;独立扩展下载板“EP1K10_30_50_100QC208”的VCCIO跳线器组设定为3.3V。请参考前面第二章中关于“电源模块”的说明。 二、实验目的 1、了解各种进制计数器设计方法 2、了解同步计数器、异步计数器的设计方法 3、通过任意编码计数器体会语言编程设计电路的便利 三、实验原理 时序电路应用中计数器的使用十分普遍,如分频电路、状态机都能看到它的踪迹。计数器有加法计数器、可逆计数器、减法计数器、同步计数器等。利用MAXPLUSII已建的库74161、74390分别实现8位二进制同步计数器和8位二——十进制异步计数器。输出显示模块用VHDL实现。 四、实验内容 1、用74161构成8位二进制同步计数器(程序为T3-1); 2、用74390构成8位二——十进制异步计数器(程序为T3-2); 3、用VHDL语言及原理图输入方式实现如下编码7进制计数器(程序为T3-3): 0,2,5,3,4,6,1 五、实验要求 学习使用Altera内建库所封装的器件与自设计功能相结合的方式设计电路,学习计数器电路的设计。 六、设计框图 首先要熟悉传统数字电路中同步、异步计数器的工作与设计。在MAX+PLUS II中使用内建的74XX库选择逻辑器件构成计数器电路,并且结合使用VHDL语言设计转换模块与接口模块,最后将74XX模块与自设计模块结合起来形成完整的计数器电路。并借用前面设计的数码管显示模块显示计数结果。 ◆74161构成8位二进制同步计数器(程序为T3-1)
源程序清单见程序清单1,其中黄色背景红色字体为错误的代码。 该程序的功能是测量方波信号的频率,由串口输出显示。 基本思路是:利用Timer0的TimerB的16位PWM功能产生一个方波作为被测信号,利用Timer2的TimerA定时捕捉功能捕捉被测信号的相邻两个上升沿,利用两次捕捉时的计数值计算出被测信号的频率。 程序清单1 实验源程序(有误) #include "systemInit.h" #include "uartGetPut.h" #include
STM32通用定时器 一、定时器的基础知识 三种STM32定时器区别 通用定时器功能特点描述: STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括: 位于低速的APB1总线上(APB1) 16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: ①输入捕获 ②输出比较 ③ PWM 生成(边缘或中间对齐模式) ④单脉冲模式输出 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。 如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ③输入捕获 ④输出比较 ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路 ⑥触发输入作为外部时钟或者按周期的电流管理 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 定时器框图:
倍频得到),外部时钟引脚,可以通过查看数据手册。也可以是TIMx_CHn,此时主要是实现捕获功能; 框图中间的时基单元 框图下面左右两部分分别是捕获输入模式和比较输出模式的框图,两者用的是同一引脚,不能同时使用。
实验五计数器的设计——实验报告 邱兆丰 15331260 一、实验目的和要求 1.熟悉JK触发器的逻辑功能。 2.掌握用JK触发器设计同步计数器。 二、实验仪器及器件 1、实验箱、万用表、示波器、 2、74LS73,74LS00,74LS08,74LS20 三、实验原理 1.计数器的工作原理 递增计数器----每来一个CP,触发器的组成状态按二进制代码规律增加。递减计数器-----按二进制代码规律减少。 双向计数器-----可增可减,由控制端来决定。 2.集成J-K触发器74LS73 ⑴符号: 图1 J-K触发器符号
⑵功能: 表1 J-K触发器功能表 ⑶状态转换图: 图2 J-K触发器状态转换图
⑷特性方程: ⑸注意事项: ①在J-K触发器中,凡是要求接“1”的,一定要接高电平(例如5V),否则会出现错误的翻转。 ①触发器的两个输出负载不能过分悬殊,否则会出现误翻。 ② J-K触发器的清零输入端在工作时一定要接高电平或连接到实验箱的清零端子。3.时序电路的设计步骤 内容见实验预习。 四、实验内容 1.用JK触发器设计一个16进制异步计数器,用逻辑分析仪观察CP和各输出波形。2.用JK触发器设计一个16进制同步计数器,用逻辑分析仪观察CP和各输出波形。3.设计一个仿74LS194 4.用J-K触发器和门电路设计一个特殊的12进制计数器,其十进制的状态转换图为:5.考虑增加一个控制变量D,当D=0时,计数器按自定义内容运行,当D=1时,反方向运行 五、实验设计及数据与处理 实验一
16进制异步计数器 设计原理:除最低级外,每一级触发器用上一级触发器的输出作时钟输入,JK都接HIGH,使得低一级的触发器从1变0时高一级触发器恰好接收下降沿信号实现输出翻转。实验二 16进制同步计数器 设计原理:除最低级外,每一级的JK输入都为所有低级的输出的“与”运算结果实验三 仿74LS194 设计原理:前两个开关作选择端输入,下面四个开关模仿预置数输入,再下面两个开关模仿左移、右移的输入,最后一个开关模仿清零输入。四个触发器用同一时钟输入作CLK输入。用2个非门与三个与门做成了一个简单译码器。对于每一个触发器,JK输入总为一对相反值,即总是让输入值作为输出值输入。对于每一个输入,当模式“重置”输出为1时,其与预置值结果即触发器输入;当模式“右移”、“左移”输出为1时,其值为上一位或下一位对应值;当各模式输出均为0时各触发器输入为0,使输出为0。 实验四 设计原理: 在12进制同步计数器中,输出的状态只由前一周期的状态决定,而与外来输入无关,因此目标电路为Moore型。而数字电路只有0和1两种状态,因此目标电路要表达12种状态需
STM32 定时器定时时间的计算 假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。RCC_Configuration()的SystemInit()的 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。因此,每次进入中断服务程序间隔时间为: ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒。定时器的基本设置如下: 1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)。 2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)。 3、TIM_TimeBaseStructure.TIM_CounterMode=TIM1_CounterMode_Up; //定时器模式向上计数。 4、 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值。 5、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器2。 6、 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断。 7、 TIM_Cmd(TIM2, ENABLE);//打开定时器或者: TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999,72M/ (35999+1)/2=1Hz 1秒中断溢出一次。 8、 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒。 9、注意使用不同定时器时,要注意对应的时钟频率。例如TIM2对应的是APB1,而TIM1对应的是APB2 通用定时器实现简单定时功能 以TIME3为例作为说明,简单定时器的配置如下: void TIM3_Config(void) { TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_DeInit(TIM3); //复位TIM2定时器 /* TIM2 clock enable [TIM2定时器允许]*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* TIM2 configuration */ TIM_TimeBaseStructure.TIM_Period = 49; // 0.05s定时 TIM_TimeBaseStructure.TIM_Prescaler = 35999; // 分频36000 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */
实验四4 位计数器设计 1. 实验目的 学习quartusii 和modelsim 的使用方法; 学习原理图和veriloghdl 混合输入设计方法; 掌握4位计数器设计的设计及仿真方法。 2. 实验原理 设计其中的计数器模块CNT4E和数码管译码驱动模块DECL7S勺verilogHDL代码,并作出整个系统仿真。 2.1 4位计数器模块代码 module CNT4B(out, CLK, RST); // output out; // in put CLK, RST; // reg [3:0] out; // always (posedge CLK or n egedge RST) // begin if(!RST) // out <= 4'dO; else out <= out + 1; // end en dmodule 低电平复位 每一个clk计数 效果图: 定义模块名和各个端口 定义输出端口 定义输入时钟和复位 定义四位计数器 上升沿时钟和下降沿复位
2.2七段数码管代码 module segled(out1,a); // in put [3:0]a; // output [6:0]out1; // reg [6:0]out1; //reg always(a) // begin case(a) //case 4'b0000:out1<=7'b0111111; 4'b0001:out1<=7'b0000110; 4'b0010:out1<=7'b1011011; 4'b0011:out1<=7'b1001111; 4'b0100:out1<=7'b1100110; 4'b0101:out1<=7'b1101101; 4'b0110:out1<=7'b1111101; 4'b0111:out1<=7'b0000111; 4'b1000:out1<=7'b1111111; 4'b1001:out1<=7'b1101111; 4'b1010:out1<=7'b1110111; 4'b1011:out1<=7'b1111100; 4'b1100:out1<=7'b0111001; 4'b1101:out1<=7'b1011110; 4'b1110:out1<=7'b1111001; 4'b1111:out1<=7'b1110001; endcase end en dmodule // 模 块结束效果图: 定义模块名和输入输出端口 输入一个3位矢量 输出一个6位矢量 型变量用于always语句 语句用于选择输出 CNT4B:b2v inst 敏感信号a
6. avr定时器/计数器1 --TC1 --输入捕捉模式(捕获外部事件模式) T/C 的输入捕捉单元可用来捕获外部事件,并为其赋予时间标记以说明此时间的发生时刻。外部事件发生的触发信号由引脚ICP1 (PD6)输入,也可通过模拟比较器单元来实现。时间标记可用来计算频率、占空比及信号的其它特征,以及为事件创建日志。当引脚ICP1 上的逻辑电平( 事件) 发生了变化,或模拟比较器输出ACO 电平发生了变化,并且这个电平变化为边沿检测器所证实,输入捕捉即被激发:16 位的TCNT1 数据被拷贝到输入捕捉寄存器ICR1,同时输入捕捉标志位ICF1 置位。如果此时ICIE1 = 1,输入捕捉标志将产生输入捕捉中断。中断执行时ICF1 自动清零,或者也可通过软件在其对应的I/O 位置写入逻辑"1”清零。读取ICR1 时要先读低字节ICR1L,然后再读高字节ICR1H。读低字节时,高字节被复制到高字节临时寄存器TEMP。CPU 读取ICR1H 时将访问TEMP 寄存器。 操作步骤: 一、捕获输入端口初始化:捕获输入端ICP1(PD6)设为输入,DDRD&=(0< STM32捕获模式应用。。。。。 1、stm32脉冲方波捕获 脉冲方波长度捕获 a)目的:基础PWM输入也叫捕获,以及中断配合应用。使用前一章的输出管脚P B1(19脚),直接使用跳线连接输入的PA3(13脚),配置为TIM2_CH4,进行实验。 b)对于简单的PWM输入应用,暂时无需考虑TIM1的高级功能之区别,按照目前我的应用目标其实只需要采集高电平宽度,而不必知道周期,所以并不采用PWM 输入模式,而是普通脉宽捕获模式。 c)初始化函数定义: void TIM_Configuration(void); //定义TIM初始化函数 d)初始化函数调用: TIM_Configuration(); //TIM初始化函数调用 e)初始化函数,不同于前面模块,TIM的CAP初始化分为三部分——计时器基本初始化、通道初始化和时钟启动初始化: void TIM_Configuration(void)//TIM2的CAP初始化函数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构 TIM_ICInitTypeDef TIM_ICInitStructure; //通道输入初始化结构 //TIM2输出初始化 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //周期0~FFFF TIM_TimeBaseStructure.TIM_Prescaler = 5; //时钟分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式STM32的捕获模式应用