几篇好的博文:
STM32程序不运行与MicroLIB讲解-CSDN博客https://blog.csdn.net/qq_36098477/article/details/117666808
可能是坑:
1. 可能会在stm32进行调试时,进入 LDR R0, =SystemInit卡死;
2. 勾选microLib的话,fatfs有点问题,不勾选就FATFS正常,但是程序脱离仿真器跑不起来,这样退出半主机模式就可以跑起来了。
3. MicroLIB不支持浮点运算,所以在有FPU单元的MCU上,使用MicroLIB并开启FPU会让程序死机或跑飞。
我的困惑:
1. 按照博文1,勾选MicroLIB,我的keil debug调试的时候,始终无法使用Debug(prinrf) Viewer,接到的信息是空白,而外接的串口线,软件是有信息输出的;没有找到原因。
后续解惑:
1. 关于 Debug(prinrf) Viewer使用:把和串口有关系的初始化屏蔽掉,把下面的代码也屏蔽掉,选择MicroLIB。 Debug(prinrf) Viewer与真实串口输出不能同时存在。
#if 0
/* 告知连接器不从C库链接使用半主机的函数 */
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
// 不同芯片的串口标志位不一定相同!
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
//串口发送完成,将该字符发送
USART1->DR = (u8) ch;
return ch;
}
//重定义,重定向scanf函数到串口
int fgetc(FILE * F) {
uint8_t ch = 0;
HAL_UART_Receive(&huart1,&ch, 1, 0xffff);///<普通串口接收数据
while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET){}///<等待发送完成
return ch;
}
#endif
Manage real-time enviroment>Compiler>STDOUT 选择EVR,选择ITM没有成功。