我正在与一个外部设备接口,我在一个GPIO中发送信号。这个协议是私有的,所以我不能使用任何提供的硬件外围设备。现在我使用这样一个函数来延迟执行:
无效usDelay(uint32_t nof_us)
{
而(nof_us——){
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
}
}
我从adc.c函数adc_usDelay中获得了这段代码。
问题是,这是不准确的,有时它延迟100us准确和下一个(测量示波器)它延迟110us代替,协议混乱,我不能传输数据。我过去做这个与AVR核心和延时函数与nops工作得很好,这里它不出于某些原因。
我知道定时器外围设备,但我不知道如何在如此短的时间间隔内使用它们,并且不添加可能改变代码计时的开销。
有人知道吗?
设备:
如果不是在睡眠模式:-
空白delay_us (uint16_t time_us)
{
Uint32_t time_gone = 0;
SysTick -> CTRL = 0;
SysTick ->LOAD = 0xFFFFFF;
SysTick - > VAL = 0;
SysTick-> CTRL = 0x5;
而(time_limit < = time_us)
{
time_gone = (0xFFFFFF - SysTick->VAL)/16;
}
SysTick - > CTRL = 0;
}
嗨kr105,
该函数应该足够准确,您确定没有任何中断发出,而该函数正在执行?
由于MT_dialog
我这样做是为了避免那样:
GLOBAL_INT_STOP ();
...代码…
GLOBAL_INT_START ();
据我所知,这样可以避免这个问题,对吧?
嗨kr105,
是的,通过禁用中断,延迟功能应该是好的,应该工作足够准确,请检查你正在使用的时钟,也许这是造成你看到的偏移。
由于MT_dialog
如果蓝牙工作正常,那就意味着时钟没问题,对吗?我使用一个16mhz晶体和一个32khz晶体(我不使用任何睡眠模式,所以可能是多余的)。我不认为这是开销的if/for/调用,正在进行的算法上,因为Attiny能够处理他们在11mhz没有问题,代码主要是从那里复制粘贴。我也在循环上做GPIO高/低操作,并建立一个活动的ble链路(没有数据流量)。
为了澄清,信号似乎在比特砰砰过程中缓慢偏移,它总是这样做信号:HIGH - 100us - LOW - 105us - HIGH - 110us -等等,在代码中它被指定为(简化):
为…
GPIO高
delay100us
GPIO低
delay100us
结束了
还有更多的想法吗?我在写这篇文章的时候得到了一些,我明天会测试它们,但任何帮助都会很好。
嗨kr105,
我刚刚在分析仪上测试了这个.....在app_async_trm中放置了以下代码:
(我= 0;我< 15;我+ +)
{
GPIO_SetActive (GPIO_PORT_1 GPIO_PIN_0);
adc_usDelay (100);
GPIO_SetInactive (GPIO_PORT_1 GPIO_PIN_0);
adc_usDelay (100);
}
脉搏足够准确,而且始终稳定。
由于MT_dialog
我解决了这个问题。我还没有深入的原因,但有一个像下面这样的循环产生了我正在寻找的时机。也许我的嵌套函数,如果/else等造成了额外的延迟,但到目前为止,这是我的工作。
(我= 0;我< 15;我+ +)
{
GPIO_SetActive (GPIO_PORT_1 GPIO_PIN_0);
adc_usDelay (100);
GPIO_SetInactive (GPIO_PORT_1 GPIO_PIN_0);
adc_usDelay (96);
}
嗨kr105,
很高兴你成功了。
由于MT_dialog