STM32 printf函数重映射
- 格式:docx
- 大小:10.61 KB
- 文档页数:2
STM32的功能引脚重映射和复用功能STM32中有很多内置外设的输入输出引脚都具有重映射(remap)的功能,本文对一些在使用引脚重映射时所遇到的有关问题加以说明。
我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出脚位都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的脚位外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的脚位。
下面是STM32F103xC中有关USART3引脚的摘要片段;从这里可以看出,USART3_TX的默认引出脚是PB10,USART3_RX的默认引出脚是PB11;但经过重映射后,可以变更USART3_TX的引出脚为PD8,变更USART3_RX的引出脚为PD9。
STM32中的很多内置外设都具有重映射的功能,比如USART、定时器、CAN、SPI、I2C等,详细请看STM32参考手册(RM0008)和STM32数据手册。
有些模块(内置外设)的重映射功能还可以有多种选择,下面是RM0008上有关USART3输入输出引脚的重映射功能表:从这个表中可以看出,USART3的TX和RX引脚默认的引出脚位是PB10和PB11,根据配置位的设置,可以重映射到PC10和PC11,还可以重映射到PD8和PD9。
一个模块的功能引脚不管是从默认的脚位引出还是从重映射的脚位引出,都要通过GPIO端口模块实现,相应的GPIO端口必须配置为输入(对应模块的输入功能,如USART的RX)或复用输出(对应模块的输出功能,如USART的TX),对于输出引脚,可以按照需要配置为推挽复用输出或开漏复用输出。
上图是STM32的GPIO端口模块,使用复用功能时的配置。
从图中可以看出,配置为复用输出时,该端口对应的GPIO输出功能将不起作用。
例如当配置PB10对应的引脚为复用输出功能时,操作PB10对应的输出寄存器将不影响引脚上的信号。
STM32部分重映射和完全重映射(查看数据⼿册)
数据⼿册如何查找对应的映射:
打开官⽹直接搜索STM32F可以看到数据⼿册,⾥⾯有关于,输⼊第6页的页码,点击9.3中的9.3x可打开对应的链接。
举例说明:
STM32中拥有重映射功能,可以使硬件电路的设计更加简洁⽅便,在配置GPIO_PinRemapConfig()函数时,发现⼊⼝参数有两种重映射,分为部分重映射(Partial Remap)和完全重映射(Full Remap),那么这两个有什么区别呢?
标题以TIM3为例
根据图⽚可以看到,TIM3的部分重映射和完全重映射对应的引脚是不同的,所以在配置选择部分重映射和完全重映射的时候要考虑⼀下。
重映射引脚分配图在哪
这⼀部分其实并不在STM32的数据⼿册中,⽽在STM32的官⽅⼿册的8.3节,⾥⾯有所有功能的引脚分配情况。
stm32printf函数STM32是一种基于ARMCortex-M内核的微控制器,它提供了广泛的外围设备和高性能计算能力。
在使用STM32进行开发时,printf 函数是一个非常有用的工具,它可以用于输出调试信息、错误信息和运行时状态等内容。
在本文中,我们将介绍如何在STM32中使用printf函数,以及它的一些常见应用场景。
一、printf函数的基本使用printf函数是C语言中的一个标准库函数,它可以将格式化的数据输出到终端设备上。
在STM32中,我们可以使用printf函数将数据输出到串口、LCD屏幕等外设上,以便进行调试和监测。
在使用printf函数之前,我们需要先配置串口或LCD屏幕的相关参数。
例如,对于串口,我们需要配置波特率、数据位、停止位和奇偶校验等参数,然后通过USART_SendData函数将数据发送到串口缓冲区中。
当缓冲区中有数据时,我们就可以使用printf函数输出数据了。
下面是一个简单的示例代码,演示了如何使用printf函数输出字符串和变量:#include <stdio.h>#include 'stm32f10x.h'void USART_Config(void){USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_ART_BaudRate = 115200;USART_ART_WordLength =USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1; USART_ART_Parity = USART_Parity_No;USART_ART_Mode = USART_Mode_Tx;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART1, &USART_InitStructure);USART_Cmd(USART1, ENABLE);}int main(void){USART_Config();printf('Hello, STM32!r');int num = 1234;printf('The number is: %dr', num);while(1);}在这个示例代码中,我们首先调用USART_Config函数配置了串口的相关参数,然后使用printf函数输出了一条字符串和一个变量。
STM32程序添加printf后无法运行的解决方法标准库函数的默认输出设备是显示器,要实现在串口或LCD 输出,必须重定义标准库函数里调用的与输出设备相关的函数.例如:printf 输出到串口,需要将fputc 里面的输出指向串口(重定向),方法如下:#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{/* Place your implementation of fputc here *//* e.g. write a character to the USART */USART_SendData(USART1, (uint8_t) ch);/* Loop until the end of transmission */while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);return ch;}因printf()之类的函数,使用了半主机模式。
使用标准库会导致程序无法运行,以下是解决方法:方法1.使用微库,因为使用微库的话,不会使用半主机模式.方法2.仍然使用标准库,在主程序添加下面代码:#pragmaimport(__use_no_semihosting)_sys_exit(intx){x=x;}struct__FILE{inthandle;/ *Whateveryourequirehere.Iftheonlyfileyouareusingis*//*standardoutputusingprintf()f ordebugging,nofilehandling*//*isrequired.*/};/*FILEistypedefdinstdio.h.*/FILE__std out;tips:感谢大家的阅读,本文由我司收集整编。
STM32功能引脚端口复用和重映射
在STM32系列微控制器中,每个引脚都有一个默认的功能。
通过端口复用,我们可以将一个引脚的默认功能改变为其他的功能。
每个引脚都有一个对应的功能选择字,可以通过设置这个字来实现不同的功能。
引脚的功能可以是GPIO输入输出、模拟输入输出、定时器输入输出、串行通信等等。
端口复用功能使我们可以在同一个引脚上实现多种不同功能的选择。
比如,一个IO引脚默认是用作GPIO输入输出的,可以通过端口复用将其改为定时器的输入或输出引脚,实现定时器功能。
在一些情况下,系统的引脚数量有限,无法满足需求,此时就可以使用引脚重映射来实现更多的功能。
引脚重映射是将一个引脚的默认功能映射到其他引脚上,可以实现多个引脚共享一个功能。
引脚重映射需要特定的硬件支持,不是所有引脚都支持重映射。
可以通过引脚映射寄存器来设置引脚重映射。
引脚重映射的功能让系统设计更加灵活和可扩展。
在一个引脚只能实现一个功能的情况下,通过重映射可以将多个引脚的功能映射到一个引脚上,实现多个功能的共享。
端口复用和重映射的具体实现方式和寄存器设置是根据不同型号的STM32微控制器而有所不同的。
在开发过程中,需要查阅相关的文档和手册,了解具体的端口复用和重映射的功能和设置方法。
总之,STM32微控制器的功能引脚可以通过端口复用和重映射实现多种不同的功能。
端口复用可以改变引脚的默认功能,而重映射可以实现多个引脚共享一个功能。
这些功能增强了系统的灵活性和可扩展性。
在实际
应用中,需要根据具体需求选择适当的引脚复用和重映射方式,以满足系统的需求。
stm32重定向printf的原理在嵌入式系统中,调试是一个非常重要的环节。
而在调试过程中,printf函数是最常用的调试手段之一。
在STM32中,printf函数默认是向串口发送数据,但是有时候我们需要将printf函数的输出重定向到其他设备或者接口上。
本文将以STM32为例,介绍如何实现printf函数的重定向。
一、printf函数的实现原理printf函数是C语言标准库中的一个输出函数,其原型为:int printf(const char *format, ...);。
printf函数的作用是将格式化的字符串输出到标准输出设备上。
在STM32中,默认情况下,printf 函数的输出设备是串口。
其实现原理如下:1.调用stm32fxxx_hal_uart.c中的HAL_UART_Transmit函数,将格式化的字符串发送到串口中。
2.在stm32fxxx_hal_uart.c中,HAL_UART_Transmit函数通过USARTx_SR寄存器判断发送是否完成,如果未完成,则等待发送完成。
3.发送完成后,HAL_UART_Transmit函数返回。
二、printf函数的重定向在某些情况下,我们需要将printf函数的输出重定向到其他设备或接口上,例如:SD卡、LCD屏幕、WiFi模块等。
这时候,我们需要自定义一个输出函数,并将其与printf函数关联起来,实现printf函数的重定向。
下面,我们将以重定向printf函数输出到LCD 屏幕为例,介绍如何实现printf函数的重定向。
1.定义一个输出函数我们先定义一个输出函数,将其命名为LCD_Printf,其实现原理如下:void LCD_Printf(char *str){/* 将格式化的字符串输出到LCD屏幕上 */}2.将LCD_Printf函数与printf函数关联在main函数中,我们需要将LCD_Printf函数与printf函数关联起来,代码如下:/* 重定向printf函数 */int fputc(int ch, FILE *f){/* 将字符转换成字符串 */char str[2] = {0};str[0] = ch;/* 调用LCD_Printf函数,将字符输出到LCD屏幕上 */LCD_Printf(str);return ch;}在上述代码中,我们定义了一个名为fputc的函数,该函数的作用是将printf函数的输出重定向到LCD屏幕上。
STM32 程序无法使用printf,产生停留BEAB BKPT
0xAB 处问题的解决
在网上搜了下,发现有很多这样的问题,我也遇到了,最后解决了,我在
此总结一下:
问题1(与编译软件无关):在程序中加入printf 语句实现串口输出,但未
写重定向函数fputc,出现编译无任何警号和错误直接下载无法运行,软件仿真
可以运行至MAIN 函数,硬件仿真在汇编窗口看到停留在“0x0800XXXX BEAB BKPT 0xAB //进入调试模式”处无法继续运行。
解决办法:编写fputc 函数如下:
1 int fputc(int ch, FILE *f)
2 {
3 USART_SendData(USART1, (uint8_t) ch);
4 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
5 {}
6 return ch;
7 }
问题2(与编译软件有关):重定向函数fputc 编写无误,使用的是
MDK4.22-3.40 之间的编译环境,未使用微库,即MiclroLIB,因printf()之类的
函数,使用了半主机模式。
使用微库的话,不会使用半主机模式,所以就没有
问题。
解决办法:在option for target->target 对话框中,选择Use MiclroLIB,重新编译程序即可。
问题3:重定向函数fputc 编写无误,不用微库,即MiclroLIB,依然可以使。
STM32功能引脚端口复用和重映射端口复用是指一个引脚可以同时用于不同的外设功能。
每个引脚都有一个默认的功能,但根据需要,可以将其配置为其他功能。
这样,同一个引脚可以在不同的时间用于不同的外设,从而实现更灵活的系统设计。
重映射是指将一个引脚的默认功能切换到另一个引脚。
这样可以实现更多的功能引脚的分配和灵活性。
在STM32系列微控制器中,端口复用和重映射功能是通过复用矩阵和AFIO寄存器来实现的。
复用矩阵是一个硬件单元,用于控制引脚的端口复用。
每个引脚可以配置为多达数个复用功能之一、通过配置相应的复用矩阵,可以选择所需的功能。
AFIO寄存器是配置引脚的重映射功能的控制寄存器。
通过设置相应的寄存器位,可以将一些引脚的默认功能重映射到另一个引脚,同时也可以取消重映射,恢复到默认功能。
引脚端口复用和重映射的具体步骤如下:首先,需要确定所需的引脚功能。
查阅相关的参考手册或数据手册,可以了解到每个引脚的默认功能以及所有可能的复用功能。
然后,根据需要配置复用矩阵。
复用矩阵通常是通过设置GPIO口模式寄存器来实现的。
配置复用矩阵时,需要注意以下几点:1.每个引脚只能选择一种功能,不能同时选择多种功能。
2.不同的引脚可能有不同的复用功能选项,需要确保所选择的功能是合适的。
3.复用功能是互斥的,即其中一个引脚的复用功能被选中后,其他引脚将失去该功能选项。
最后,如果需要进行重映射,可以通过配置AFIO寄存器来实现。
重映射功能通常是通过设置AFIO复用寄存器来完成的。
配置重映射时,需要注意以下几点:1.不是所有的引脚都支持重映射功能,需要查阅相关的参考手册或数据手册来确定。
2.每个引脚的重映射功能选项可能不同,需要确保所选择的选项是合适的。
3.需要小心使用重映射功能,确保不会影响其他外设的正常工作。
端口复用和重映射功能可以极大地增加STM32微控制器的灵活性。
通过合理地使用这些功能,可以最大限度地利用资源,实现更复杂和功能强大的系统设计。
STM32单片机编程printf()函数重定向
在stm32 单片机编程中,可以重定向printf()函数来输出调试信息。
编写fputc()函数其实printf()函数在头文件中被定义成了一个宏,会调用到
fputc()函数,但在stm32 单片机编程中不可以直接调用标准库的fputc()函
数进行输出信息,需要自己编写fputc()函数供printf()函数来调用。
编译
器进行编译时首先会调用自己编写的fputc()函数,而不是库函数。
intfputc(int ch,FILE*f)
{
USART_SendData(USART1, (uint16_t)ch); //通过串口输出
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) !=SET);//等待输出完毕
return ch;
}
此时假定串口1 即USART1 可以正常通讯,fputc()函数的作用就是把
printf()函数重定向到串口1 上输出信息。
配置自己动手写好fputc()后,要在文件中包含stdio.h 文件。
#include 在MDK 软件界面单击Target options 按钮,在Code Genetation 一栏中选择Use MicroLIB 选项,即完成了配置,此时printf()函数一定重定向到了串口1 即USART1 上,可以正常使用printf()函数。
tips:感谢大家的阅读,本文由我司
收集整编。
仅供参阅!。
stm32使用printf打印注意问题STM32使用printf打印输出注意事项和易错点,如果打印结果不能正常显示,按照这个步奏修正。
在程序中使用 C 语言中的printf()函数大家一开始学习C 语言的时候,都接触过printf()函数,使用起来很方面,我们是否可以在我们的STM32程序使用这个函数来作为串口的输出呢?其实是可以的。
要是用printf()函数,就需要将它重新定向一下。
怎么做呢:1) 第一步。
我们需要重新写int fputc(int ch, FILE *f)这么个函数,我们将它转化为STM32 串口输出的函数如下:int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用{USART_SendData(USART1,(u8)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==R ESET);return ch;}通过上面库函数的学习,我们可以知道,这个函数其实就是用来设置通过USART1 发送一个8 位的数据。
2) 第二步。
添加它的头文件,也就是stdio.h,接下来的设置我们有两个方法:1. 第一个方法是:打开KEIL 的Target Options,选择里面的Target 位置选择Use MicroLIB。
然后编译就可以了。
2. 第二个方法的呢,再添加一下代码#pragma import(__use_no_semihosting)/* 标准库需要的支持函数*/struct __FILE{int handle;/* Whatever you require here. If the only file you are using is *//* standard output using printf() for debugging, no file handling *//* is required. */};/* FILE is typedef’d in stdio.h. */FILE __stdout;/* 定义_sys_exit()以避免使用半主机模式*/_sys_exit(int x){x = x;}然后编译,就可以使用了。
STM32 printf 函数重映射
/* Private function prototypes -----------------------------------------------*/#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__ */
/** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */PUTCHAR_PROTOTYPE{ /* Place your implementation of fputc here */ /* Loop until the end of transmission */ while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} /* write a character to the USART */ USART_SendData(EVAL_COM1, (uint8_t) ch);
return ch;}
某人的解释:
这段代码的意思是将C 语言的库函数printf 重定向,或重映射,这词有点太专业,简单的讲:就是C 语言的库中printf 函数会调用PUTCHAR_PROTOTYPE 这个硬
件接口函数,向显示器上输出char 型变量,用来显示,STM32 当然是没有显示器的,所以就用UART 输出Char 型变量到PC 机,由PC 机的超级终端来显示,说白了,就
是原来送到显示器上的显示数据,现在送到STM32 的串口上;如果调不过去,你要
注意两点:1.你的板子上用的是不是USART1,如果是,那连到PC 的串口,就可以
在超级终端上,看到打印出来的东西了,如果不是,请参考第2 点.2.先将你的板子
上的USART 初始化,然后把PUTCHAR_PROTOTYPE 函数体中的USART1 换
成你现在用的那个USART.于免费送一个注意点,当然以上也都免费,呵呵
1.STM32 的外设输出引脚可以重映射,如USART2,要注意板子上,是按原来的引。