在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)的最小等待时间为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。我可以确认我正在查看正确的pin,因为当我将systick_wait()设置为其他值时,我可以看到切换更改的持续时间。例如,当将systick_wait()设置为7时,我看到GPIO切换为20us。我已经用o型镜测试过好几次了。
在使用systick_wait()时,似乎有15us最小间隔。我以毫秒(~8ms)的间隔触发代码。所以每8毫秒我应该看到GPIO切换到2us,但它切换到15us。
也许在Systick_Wait()得到维修时会影响其他中断?我看到中断向量表中的SVC_Handler(ARM SVCALL)和PENDSV_HANDLER(ARM PENDSV)。也许这些处理程序正在使用15us?
谢谢你的帮助,
亚历克斯
嗨apogostin,
请问您现在在做SDK的哪个项目?你是否有BLE活动或者你正在使用SDK的非BLE示例?我问你的原因是想复制你的问题。
谢谢,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()中看到develop_debug宏的使用(使用CFG_DEVELOPMENT_DEBUG设置为true)。如果将DEVELOPMENT_DEBUG宏设置为false,编译并运行代码会很有趣。无论如何,它仍然不能解释您丢失的~9us -即使直接设置/清除GPIO寄存器。但是,再次感谢您能够复制这个问题,我现在可以围绕它工作了。
谢谢你!
亚历克斯
嗨apogostin,
如果定义了CFG_DEVELOPMENT_DEBUG,您将能够调试固件,并且可以模拟深度睡眠模式,而无需对OTP内存进行编程。通过取消定义CFG_DEVELOPMENT_DEBUG,您将禁用调试模式,因此您将无法热附加调试器并获取调试信息。例如,如果发生硬故障或NMI,您将无法捕获它。
谢谢,PM_Dialog