完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
原因已找到: 由于调度器启动前进入了Systick中断导致系统运行异常。上电后就调用__set_PRIMASK(1);关闭中断,后续考虑参考ST官方的方法,判断系统是否启动再决定是否调用OS的时基。 原问题: 以下是开始时提出问题,现在更新问题,发现不是串口的问题,如果初始化后配置时钟后在OS启动前加个while(1);,同样会进入hardfault.不知为何 原问题如下: 遇到一个问题,freeRTOS启动调度器前使用printf会进入HardFault,单步调试就可以正常打印,而且printf语句放到任务中是可以正常打印的,不知是何原因。 #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE { print_log_putchar(ch);//封装串口发送 return ch; } //会死在下面这个函数中, void print_log_register_io(struct print_log_interface fio) { fprint_log = fio; print_log("print log inited!rn");//printf_log就是printf进行宏定义,完整文件见附件。 } |
|
相关推荐
7个回答
|
|
print_log_register_io进行初始化调用了没有,我理解的是,要先进行初始化后,才能正常工作。
|
|
|
|
调用了,不调用也没事,不掉用的话就不会打印信息,这里用了指针,调用后才会打印 |
|
|
|
你的指针这里指向的是否是需要串口输出的函数,可以仿真一下。
|
|
|
|
串口相关的代码如下 int uart_putc(unsigned char c) { LL_USART_TransmitData8(UART_INSTANCE, c); while(LL_USART_IsActiveFlag_TC(UART_INSTANCE)==RESET); return c; } fprint_log.put_char = uart_putc; print_log_register_io(fprint_log); |
|
|
|
关于以上问题,应该不是printf的问题,目前使用串口直接发送也会进入hardfault
|
|
|
|
楼主,应该看一下在执行到哪一步的时候进入的错误,可能的原因是找不到指针,从代码上看,楼主应该检查一下UART_INSTANCE定义是否正确。
|
|
|
|
UART_INSTANCE是USART2,宏定义。单步调试可以正常通过,全速就挂了 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32串口接受中断使用C++STL中的queue导致所有中断失效
6014 浏览 1 评论
3031 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1325 浏览 0 评论
3869 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
3704 浏览 4 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-12 16:00 , Processed in 0.662431 second(s), Total 52, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191