在学STM32的USART1,用Printf函数向超级终端打印信息。为啥超级终端没有反应?求帮助。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在学STM32的USART1,用Printf函数向超级终端打印信息。为啥超级终端没有反应?求帮助。相关的知识,希望对你有一定的参考价值。
程序如下:
#include "stm32f10x.h"
#include <stdio.h>
int main(void)
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
USART_ClearFlag(USART1, USART_FLAG_TC);
//while(1)
//
printf("\r\n this is a printf demo \r\n");//不加上面的循环超级终端没有反应,加上超级终端却能成功打印,为什么?
//
int fputc(int ch, FILE *f)
USART_SendData(USART1, (unsigned char) ch);
while (!(USART1->SR & USART_FLAG_TXE));
return (ch);
望采纳!!! 参考技术A int fputc(int ch, FILE *f)这函数涉及到文件指针了,但函数主体却是对串口的操作,是不是你搞错了,应该是putc()函数? 参考技术B 应该是串口启动速度较慢导致的,我以前单步运行试过进入串口中断的,一般会过几条程序才跳进中断。你可以把while去掉,然后用一个delay延时代替。 参考技术C 不加主死循环程序都跑飞了。追问
但是我在主函数末尾加死循环,超级终端也没反应
#include "stm32f10x.h"
#include
int main(void)
...........
USART_ClearFlag(USART1, USART_FLAG_TC);
printf("\r\n this is a printf demo \r\n");
while(1)
把清除标志位去了试试看
追问没有用???
追答好奇怪……我的是可以的
追问你把你的全部程序贴出来,我看看
STM32G0学习手册——多串口同时使用printf输出
目录
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
项目地址:GitHub
新建工程
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
2、 设置时钟树,HCLK=64MHz
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
USART1:PA10,PA9。USART2:PA2,PA3。USART3:PB10,PB11。USART4:PA0,PA1
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1
5、 项目管理填好信息。生成代码"GENERATE CODE"
6、使用MDK打开工程,debug选项中勾上“Reset and Run”
代码部分
1、usart.h中添加如下代码
#include <stdarg.h>
/* USER CODE BEGIN Prototypes */
void USART4_printf(char *fmt,...); //重写usart4的printf函数
void USART3_printf(char *fmt,...);
void USART2_printf(char *fmt,...);
/* USER CODE END Prototypes */
2、usart.c添加如下代码
/* USER CODE BEGIN 0 */
#include <stdio.h>
#include <string.h>
#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 */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
#define USART_TXBUFF_SIZE 256 //定义串口发送缓冲区大小 256字节
__align(8) char usart_txBuff[USART_TXBUFF_SIZE]; //字节对齐缓冲区
//usart4的printf()
void USART4_printf(char *fmt,...)
uint32_t i,length;
va_list ap;
va_start(ap,fmt);
vsprintf(usart_txBuff,fmt,ap);
va_end(ap);
length=strlen((const char*)usart_txBuff);
while((USART4->ISR&0x40)==0);
for(i=0;i<length;i++)
USART4->TDR=usart_txBuff[i];
while((USART4->ISR&0x40)==0);
//usart3的printf()
void USART3_printf(char *fmt,...)
uint32_t i,length;
va_list ap;
va_start(ap,fmt);
vsprintf(usart_txBuff,fmt,ap);
va_end(ap);
length=strlen((const char*)usart_txBuff);
while((USART3->ISR&0x40)==0);
for(i=0;i<length;i++)
USART3->TDR=usart_txBuff[i];
while((USART3->ISR&0x40)==0);
//usart2的printf()
void USART2_printf(char *fmt,...)
uint32_t i,length;
va_list ap;
va_start(ap,fmt);
vsprintf(usart_txBuff,fmt,ap);
va_end(ap);
length=strlen((const char*)usart_txBuff);
while((USART2->ISR&0x40)==0);
for(i=0;i<length;i++)
USART2->TDR=usart_txBuff[i];
while((USART2->ISR&0x40)==0);
/* USER CODE END 0 */
3、main.c中添加如下代码
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
int main(void)
while (1)
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
USART4_printf("This is the signal from serial port 4.\\r\\n");
USART3_printf("This is the signal from serial port 3.\\r\\n");
USART2_printf("This is the signal from serial port 2.\\r\\n");
printf("This is the signal from serial port 1.\\r\\n");
/* USER CODE END 3 */
4、最后编译,烧录固件,串口输出如图
以上是关于在学STM32的USART1,用Printf函数向超级终端打印信息。为啥超级终端没有反应?求帮助。的主要内容,如果未能解决你的问题,请参考以下文章
STM32F103RCT6的pb6 pb7作为usart1,但用库函数初始化ADC和DAC以后,串口就不能用了,找了一下午,求指点