定时器计数器(总)包括几个相同的16位或32位定时器计数器通道。TC通道数是特定设备,请参阅设备特定数据表的更多信息。 每个通道可以独立编程来执行一个广泛的功能,包括频率测量,事件计数,间隔测量,脉冲产生,延迟时间,脉冲宽度调制。 每个通道有三个外部时钟输入,五个内部时钟输入,2个多功能输入/输出信号,可由用户配置。每个通道都可以驱动一个内部中断信号,可以被编程来产生处理器中断。 定时器计数器(TC)嵌入一个正交解码逻辑连接在前面的计时器。在启用时,正交解码器进行输入行滤波,正交信号的解码,并连接到定时器/计数器,以读取电机的位置和速度。
今天搞定时器模块,首先建立ASF工程后加入TC模块:
然后打开ASF EXPLORER,打开API文档,找到EXAMPLE的文档
跟据提示,形成相应的程序。然后调式。
程序如下:
#include <asf.h>
/* Use TC Peripheral 0. */
#define TC TC0
#define TC_PERIPHERAL 0
/* Configure TC0 channel 2 as capture input. */
#define TC_CHANNEL_CAPTURE 2
#define ID_TC_CAPTURE ID_TC2
#define PIN_TC_CAPTURE PIN_TC0_TIOA2
#define PIN_TC_CAPTURE_MUX PIN_TC0_TIOA2_MUX
/* Use TC2_Handler for TC capture interrupt. */
#define TC_Handler TC2_Handler
#define TC_IRQn TC2_IRQn
#define TC_CAPTURE_TIMER_SELECTION TC_CMR_TCCLKS_TIMER_CLOCK3
static void tc_capture_initialize(void)
{
/* Configure the PMC to enable the TC module */
sysclk_enable_peripheral_clock(ID_TC_CAPTURE);
#if SAMG55
/* Enable PCK output */
pmc_disable_pck(PMC_PCK_3);
pmc_switch_pck_to_mck(PMC_PCK_3, PMC_PCK_PRES_CLK_1);
pmc_enable_pck(PMC_PCK_3);
#endif
/* Init TC to capture mode. */
tc_init(TC, TC_CHANNEL_CAPTURE,
TC_CAPTURE_TIMER_SELECTION /* Clock Selection */
| TC_CMR_LDRA_RISING /* RA Loading: rising edge of TIOA */
| TC_CMR_LDRB_FALLING /* RB Loading: falling edge of TIOA */
| TC_CMR_ABETRG /* External Trigger: TIOA */
| TC_CMR_ETRGEDG_FALLING /* External Trigger Edge: Falling edge */
);
}
void TC_Handler(void)
{
while(1);
}
int main (void)
{
/* Insert system clock initialization code here (sysclk_init()). */
sysclk_init();
board_init();
tc_capture_initialize();
/* Insert application code here, after the board has been initialized. */
}
从上边程序可以清楚看出,用的是 TIOA
那么,我应怎么做呢?首先通过数据手册找到TIOA管脚是PA15
在49脚上,而我的开发板在SD卡上,如图:
我于是就用镊子轻触SD卡第九脚对地,模拟个下降沿,没有想到居然进到中断里边了。
就这样程序调通,当然我的中断用个while(1)这个是调试用的。真正的程序没有这样写的。我这个人达到目地不折手断。
|