Page 1 of 3
[已解决] 在bootloader中如何使用定时器和串口
Posted: Mon Jul 25, 2022 6:45 am
by Kx_Kevin
Hi
如题,我的基线是IDF-4.0,硬件是ESP32-C3-WROOM-02,正在bootloader上进行第三方SDK的集成,已经完成一部分功能正常运行。还需要使用到定时器和一路串口。
我先进行了定时器的使用,发现bootloader中无法使用软件定时器,因为内部有freertos的相关接口调用。看了文档对“自定义引导程序”的描述,我要把使用到的其他组件源码放到bootloader目录中,于是我按照已经完成移植运行的那部分,把\components\driver\timer.c等相关源文件和头文件放过去,但总是出现各种报错,比如还需要我添加heap相关的源码。 现在还报错找不到_vector_table这些东西,如下图,我不知道该怎么办。
请问我真的需要这么麻烦吗?你们推荐用什么方式在boot中使用定时器和串口等外设呢?
感谢答复
Re: 在bootloader中如何使用定时器和串口
Posted: Mon Jul 25, 2022 11:21 am
by ESP_Gargamel
为何要在 bootloader 中集成这些功能?当前在 bootloader 中并未支持太多功能,IDF 中很多功能在 bootloader 里是不可用的。
Re: 在bootloader中如何使用定时器和串口
Posted: Tue Jul 26, 2022 1:24 am
by Kx_Kevin
Hi
感谢你的回复。
因为我司正在集成的第三方SDK中有这方面的功能需求,在boot中用到了定时器和串口。
其实定时器的作用就是产生一个滴答心跳的能力。 该SDK中有超时业务的处理,通常是使用定时器来完成的。
串口就是完成所有业务数据的收发,需要一个干净数据的串口,我注意到UART_NUM_0和开发板USB的log似乎是连接在一起的。
那么,是否有办法使用外设的硬件操作接口或者其他什么方式,来完成该SDK需要的功能呢?
感谢答复
Re: 在bootloader中如何使用定时器和串口
Posted: Tue Jul 26, 2022 2:03 am
by ESP_Gargamel
bootloader 里应该是可以用到 IDF 中 hal 这层的接口,但不能用到 driver 这层接口。一种方式是你直接使用 hal 的接口实现 bootloader 里的 定时器和串口 驱动。
另外,这个 SDK 的集成为什么不在应用中做,要在 bootloader 里实现?这是什么考量?
UART 要干净的话,可以用其他的 UART 口,默认 UART0 作为整个系统的打印口,从 ROM bootloader 开始。
Re: 在bootloader中如何使用定时器和串口
Posted: Tue Jul 26, 2022 2:24 am
by Kx_Kevin
Hi
感谢回复。
太好了,我会尝试用hal层的接口完成SDK的移植工作。
该套第三方SDK需要boot和app应用的配合,app也已经集成了它的一部分,boot是剩下的一部分。
是的,app中我两个串口都试过。只有UART1是干净的,boot中我也只能用它了。
再次感谢
Re: 在bootloader中如何使用定时器和串口
Posted: Tue Jul 26, 2022 2:32 am
by ESP_Gargamel
不客气的。
这是个新的尝试,静候佳音。
另外,bootloader 里加东西多的话,size 也会变大,相关的 partiton 也需要进行调整,这个也请自行注意。
Re: 在bootloader中如何使用定时器和串口
Posted: Tue Jul 26, 2022 2:45 am
by Kx_Kevin
Hi
好的,谢谢提醒。partition调整这块在编程指南的bootloader章节有提到,我会注意的。
另外,我提问中截图位置的编译报错,刚刚我检查了一下调用hal层这方面是否涉及,发现在注册回调函数时还是会用到内存申请的接口,而且和中断控制器的处理有关系,如下图位置内部的实现,这部分即使调用了hal层,报错中断控制器方面的恐怕我也没法搞定。
请问这部分是要怎么办?
感谢答复
Re: 在bootloader中如何使用定时器和串口
Posted: Tue Jul 26, 2022 2:59 am
by ESP_Gargamel
这个同样不能用,需要自己管理中断。原则是 IDF 中 hal 层之上的,当前在 bootloader 中都不能用。在 bootloader 里的中断,都不需要动态 alloc 了,直接找个空的,固定就行了。
Re: 在bootloader中如何使用定时器和串口
Posted: Tue Jul 26, 2022 3:32 am
by Kx_Kevin
Hi
好的,内存申请在boot不是必要的,也没法使用,我了解了。
ESP_Gargamel wrote:在 bootloader 里的中断,都不需要动态 alloc 了,直接找个空的,固定就行了。
这里你提到直接找个空的固定,是什么意思?—— 按照MCU的使用方式,每个外设都应该对应了一个相应的中断号。在这里是没有一对一的关系了,随便在0-31找个空闲的中断号就行,是这样理解吗?
那怎么知道哪些中断号是空闲的?
我找到了下图这里的interrupt_controller_hal接口,应该就是直接设置中断服务函数的位置了,是否还需要使能中断,清除中断标志这些工作?因为不清楚是否boot里面其他位置有做这个事情,我多做会不会引起什么影响。
- 微信图片_20220726104300.png (18.66 KiB) Viewed 11818 times
感谢答复
Re: 在bootloader中如何使用定时器和串口
Posted: Tue Jul 26, 2022 3:57 am
by ESP_Gargamel
是的,intr alloc 这块,你可以把 idf 中的 log 放开,看是怎么个过程。
中断使能、清除这块是针对具体外设的,比如 UART。
建议你现在 idf 中把你所需要的外设先用起来,然后看他是怎么初始化中断、怎么初始化外设本身的。清楚流程后,再用到 bootloader 中。另外,你也可以用 gdb 来跟踪应用中对 intr 和 所用外设 的寄存器设置。
还有,你 bootloader 跑完后,需要把 定时器和串口 停了,否则跑到应用可能会有异常。