定时器计数器(总)包括几个相同的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)这个是调试用的。真正的程序没有这样写的。我这个人达到目地不折手断。
|