STM32的半主机与MicroLIB机制
一、半主机模式
半主机机制的作用 半主机是作用于ARM目标的一种机制,可以将来自STM32单片机应用程序的输入与输出请求传送至运行仿真器的PC主机上。使用此机制可以启用C库中的函数,如printf()和scanf()等输入与输出函数,使得PC主机的屏幕和键盘。
**简单来说:**MDK上开启半主机模式需要SWO线(也就是说需要使用JTAG仿真器),通过PC电脑与STM32进行输入与输出。当目标板脱离仿真器单独运行时,需要退出半主机模式,通过串口进行输入与输出,否则程序会出现卡死等现象。
关闭半主机模式 在任何c文件中加入以下代码就可以退出半主机模式(STM32默认是开启半主机模式)。
/* 告知连接器不从C库链接使用半主机的函数 */ // 标准库需要的支持函数 struct __FILE { int handle; }; // 定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } FILE __stdout;
非半主机模式中使用printf()函数 退出半主机模式后使用printf()函数通过串口打印数据时,需要定义串口的引脚,并重定义fputc函数,代码如下所示
//重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch; }
二、MicroLIB(微库)
什么是MicroLIB **来自ARM-MDK官方的解释:**MicroLib 是一个高度优化的库,适用于用 C 编写的基于 ARM 的嵌入式应用程序。与 ARM 编译器工具链中包含的标准 C 库相比,MicroLib 提供了许多嵌入式系统所需的显着代码大小优势。
MicroLib 和标准 C 库之间的主要区别是:
- MicroLib 专为深度嵌入式应用而设计。
- MicroLib 经过优化,可以使用比使用 ARM 标准库更少的代码和数据存储器。
- MicroLib 设计为无需操作系统即可工作,但这并不妨碍它与任何操作系统或 RTOS(例如 Keil RTX)一起使用。
- MicroLib 不包含文件 I/O 或宽字符支持。
- 由于 MicroLib 已经过优化以最小化代码大小,因此某些函数的执行速度将比 ARM 编译工具中可用的标准 C 库例程更慢。
- MicroLib 和 ARM 标准库都包含在 Keil MDK-ARM 中。
- 使用MicroLib的优缺点
- 使用MicroLIB,简化嵌入式开发操作,例如你用printf()函数的时候,就会从串口1输出字符串,当然也可以重定义到其他串口;
- 使用MicroLIB会优化代码空间,但会降低某些程序的执行效率(比如: memcpy()),效率换空间;
- 由于MicroLIB不支持浮点运算,所以在有FPU单元的MCU上,使用MicroLIB并开启FPU会让程序死机或跑飞。
- Microlib不支持C++,在使用C++开发MCU时,首要条件是不能使用Microlib;
MDK中使用MicroLib模式 在点开MDK软件的魔术棒,勾选Target选卡中的"Use MicroLIB"。这样就可以使用printf()函数通过USART输出数据到电脑串口助手。如下图所示:
同一个程序使用Microlib的文件大小 不使用Microlib的文件大小 使用Microlib的文件大小 从上图中可以看出同一程序使用Microlib时,所需的空间更小。
Microlib模式下使用printf()函数 在Microlib模式下使用printf()函数,重定义fputc和GetKey函数的代码如下
/*使用microLib的方法*/ int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; } int GetKey (void) { while (!(USART1->SR & USART_FLAG_RXNE)); return ((int)(USART1->DR & 0x1FF)); }
参考文献
STM32的半主机机制:http://www.360doc.com/content/12/0121/07/2690044_1006677990.shtml STM32程序不运行与MicroLIB讲解https://blog.csdn.net/qq_36098477/article/details/117666808
- 使用ITM机制实现调试stm32单片机
- Solaris主机间的信任关系机制
- STM32时钟安全机制(CSS)研究及实现
- STM32编程:动画深度演示栈机制、栈溢出
- 009:semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机(转)
- STM32单片机的FSMC机制FlaSh存储器扩展
- STM32双机SPI中断通信机制
- Stm32调试之assert_param() 断言机制
- STM32的断言机制——函数assert_param()
- 分布式系统基于缓存机制的实时开关系统——可将一个指令同时推送给N个主机
- STM32之SPI主机例程
- STM32 printf半主机模式
- 关于stm32用J-link,ITM机制下动态调试
- 移植FreeModbus+ModbusMaster(主机)+STM32至RT-Thread(3、4阶段)
- 监控之nagios的安装部署(监控本机及其他主机的配置+警报机制的配置)
- STM32定时器的输入滤波机制
- httpd虚拟主机,压缩机制,https实现,压力测试
- 使用IDR机制管理MMC的宿主机
- 资源池开启HA后主机保护机制分析
- stm32定时器使用注册机制复用