我用的是xmega Atxmega32A4u,
如本例所示,XMega Timer and Microseconds我尝试了一下,但我无法生成1U来切换引脚。
请引导我获得1us的延迟。
我想用这个计时器和1wire协议。
#define OUTFREQ 120000L
static void Timer_OW_ISR(void)
{
gpio_toggle_pin(OW_READER);
}
void Timer_Init_OW(void)
{
tc_enable(&TCC2);
tc_set_overflow_interrupt_callback(&TCC2, Timer_OW_ISR);
tc_set_wgm(&TCC2, TC_WGMODE_FRQ_gc);
tc_write_period(&TCC2, sysclk_get_per_hz() / (64L*2L*OUTFREQ) - 1);
}
void Start_Timer_OW(void)
{
tc_write_clock_source(&TCC2, TC2_CLKSEL_DIV1_gc);
}在主函数中,我调用了Timer_OW_ISR()函数
发布于 2016-01-16 02:21:36
下载manual并查看第171页。您希望在页面底部生成FRQ波形。在本章的其他地方,您可以看到如何启用您想要切换的引脚。
默认情况下,该设备的运行频率为2 2MHz,这一速度足以切换引脚。您可以将时钟更改为32 MHz。
在问题修改后进行编辑。
我看到您正在使用Atmel软件框架。我没有太多的经验。看起来您仍然没有正确使用ASF。
你说过你想每隔一秒就切换一个引脚。对吗?也许你应该在你的问题中更具体地说明你正在尝试做什么。
这么快的频率的困难在于,设备上的时钟运行速度只比这个频率快一点。这表示您不应使用ISR (中断服务例程)。该例程将花费太多时间来运行,并且将无法达到1 MHz频率。(在任何情况下,ISR的目的都是响应中断,而不是从main()调用。)
但您可以在不使用ISR的情况下实现引脚切换。相反,让时钟直接切换引脚。使用FRQ功能。您可以在寄存器中设置周期,并使用事件通道系统将时钟连接到正确的引脚。详细信息应该在手册中。
你一定要用ASF吗?没有它,配置时钟和处理器速度很容易。只需在您自己的C代码中将某些寄存器赋给正确的值即可。
发布于 2016-01-20 01:06:26
如果你只是想切换一个具有特定频率的引脚,那么我会选择一个支持PWM的引脚,并使用CTC PWM模式。
这消除了ISR开销和由ASF框架ISR调度程序代码引入的未知延迟。(如果有--我对这个框架或ATXMegas没有太多经验(只有atmega和attiny))
发布于 2019-04-17 20:00:18
检查Xmega manual的14.8.2节,下面使用内部2 2MHz时钟和FRQ模式(频率波形生成)将引脚PC.0切换到1 2MHz。
#include <avr/io.h>
/*
* FRQ frequency = Fclk/(2N*(CCA+1)
* where N represents the prescaler divider used
* In this example: 1000000 = 2000000/(2*1*(0+1))
*/
int main( void )
{
PORTC_DIR |= 0x01; //Set PC.0 as output port
TCC0_CTRLA |= 0x01; //Clock divider clk/1
TCC0_CTRLB |= 0x01; //FRQ mode
TCC0_CTRLB |= 0x10; //Channel selection CCAEN
TCC0_CCA = 0x00; //Output toggled on each compare match between CNT and CCA registers
while(1);
}https://stackoverflow.com/questions/34790997
复制相似问题