在DA14580上使用SDK 5.0.4。不能让systick_wait()在15us下工作。下面的代码切换GPIO高15us。我尝试过使用回调异常(在systick.c中使用systick_register_callback()),并看到了相同的结果。我可以用systick_wait(7)设置GPIO为20us切换。因此,似乎systick_wait(2)的系统等待时间最小为15us,而systick_wait(7)的系统等待时间增加了5微秒,最终达到20us。这是一个普通的SDK 5.0.4版本——除了添加用户模板外,没有对任何代码进行任何修改。
GPIO_SetActive (GPIO_PORT_0 GPIO_PIN_2);
systick_wait (2);
GPIO_SetInactive (GPIO_PORT_0 GPIO_PIN_2);
谢谢你的帮助,
亚历克斯
设备:
嗨apogostin,
传递给systick_wait函数的参数以微秒为单位。所以你能确保GPIO在20us后切换吗?另外,你能解释一下你想要完成的任务吗?您想要切换GPIO一次还是让它闪烁?
谢谢,PM_Dialog
当systick_wait()设置为2us时,GPIO切换为15us。我可以确认我查看的是正确的引脚,因为当我将systick_wait()设置为其他值时,我可以看到切换更改的持续时间。例如,当设置systick_wait()为7时,我看到GPIO切换为20us。我用o型镜测试了好几次。
当使用systick_wait()时,似乎有一个15us的最小间隔。我以毫秒(~8ms)的间隔触发代码。所以每8ms我应该看到GPIO切换到2us,但它切换到15us。
也许在Systick_Wait()得到维修时会影响其他中断?我看到中断向量表中的SVC_Handler(ARM SVCALL)和PENDSV_HANDLER(ARM PENDSV)。也许这些处理程序正在使用15us?
谢谢你的帮助,
亚历克斯
嗨apogostin,
请问您现在在做SDK的哪个项目?你有BLE活动或你正在使用任何非BLE SDK的例子?我问你的原因是想重复你的问题。
谢谢,PM_DIalog
正如我在前一篇文章中所述,我使用的是一个普通的SDK 5.0.4 SDK——除了添加用户模板之外没有任何修改。我正在使用您的文档(DA1458x Software Developer's Guide UM-B-050,日期为2016年7月22日)来创建用户模板。请参见第9章创建BLE应用程序。我使用了这些说明来创建用户模板。
再次感谢你的帮助,
亚历克斯
嗨apogostin,
我试图复制你的问题,你是对的。根据你发布的代码,我得到了18.08 uSec延迟。原因是等待周期(2 uSec)非常低。您可以通过显式写入GPIO寄存器而不调用GPIO_SetActive() / GPIO_SetInactive() api来减少等待时间。通过下面的代码片段,我将时间从18.08 uSec减少到9.083 uSec:
谢谢,PM_Dialog
谢谢你的确认。我可以在GPIO_SetActive()中看到DEVELOPMENT_DEBUG宏的使用(在CFG_DEVELOPMENT_DEBUG中设置为true)。将DEVELOPMENT_DEBUG宏设置为false编译并运行代码会很有趣?无论如何,它仍然不能解释你丢失的~9us -即使直接设置/清除GPIO寄存器。但是,再次非常感谢你能够复制这个问题,我现在可以解决它。
谢谢你!
亚历克斯
嗨apogostin,
如果定义了CFG_DEVELOPMENT_DEBUG,您将能够调试您的固件,并且您可以在不编程OTP内存的情况下模拟深度睡眠模式。通过取消定义CFG_DEVELOPMENT_DEBUG,您将禁用调试模式,因此您将不能热连接调试器并获得调试信息。例如,如果出现硬故障或NMI,您将无法捕获它。
谢谢,PM_Dialog