STM32F103学习笔记——串口通信

2019-10-12来源: eefocus关键字:STM32F103  串口通信  printf  发送数据

在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。


下面就说一下使用printf需要做哪些配置。


有两种配置方法:


一、对工程属性进行配置,详细步骤如下


1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。


2、在main文件中重定义函数。如下:



   int fputc(int ch, FILE *f)   // 发送数据

   {

      USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等

      while (!(USART1->SR & USART_FLAG_TXE));

      return (ch);

   }


   int GetKey (void)            // 接收数据

  {

      while (!(USART1->SR & USART_FLAG_RXNE));

      return ((int)(USART1->DR & 0x1FF));

   }


这样在使用printf时就会调用自定义的fputc函数,来发送字符。


3、在工程属性的 “Target” -> “Code Generation” 选项中勾选 “Use MicroLIB” 

MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。


二、第二种方法是在工程中添加“Regtarge.c”文件 

1、在main文件中包含 “stdio.h” 文件 

2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中在文件中输入如下内容:


#include

#include

#pragma import(__use_no_semihosting_swi)

extern int  SendChar(int ch); // 声明外部函数,在main文件中定义

extern int  GetKey(void);

struct __FILE {

  int handle;                 // Add whatever you need here

};

FILE __stdout;

FILE __stdin;

int fputc(int ch, FILE *f) {

  return (SendChar(ch));

}

int fgetc(FILE *f) {

  return (SendChar(GetKey()));

}

void _ttywrch(int ch) {

SendChar (ch);

}

int ferror(FILE *f) {         // Your implementation of ferror

  return EOF;

}

void _sys_exit(int return_code) {

label:  goto label;           // endless loop

}


3、在main文件中添加定义以下两个函数


int SendChar (int ch)  {

  while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口

  USART1->DR = (ch & 0x1FF);

  return (ch);

}

int GetKey (void)  {

  while (!(USART1->SR & USART_FLAG_RXNE));

  return ((int)(USART1->DR & 0x1FF));

}


至此完成配置,可以在main文件中随意使用 printf 。


关键字:STM32F103  串口通信  printf  发送数据 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476932.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32波特率设置
下一篇:DMA+ADC单通道转换、多通道转换

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F0 ADC学习
开始时候使用的是stdlib的库,最近发现cube库用的越来越广泛了,遂开始使用cube库来完成ADC的多通道采集实验。ADC 的driver 在STM32F0XX_HAL_DRIVER当中,有stm32f0xx_hal_adc.c文件中,我们可以在stm32f0xx_hal_conf.h中开启 宏定义 ADC 模块。ADC有三种工作模式,polling interruptDMA我这里使用了polling的方式来获取多通道的数据。首先是要声明两个参数设置的结构体ADC_HandleTypeDef             AdcHandle
发表于 2019-10-09
STM32F030 使用内部时钟和外部时钟
p;  /* Wait till PLL is ready */  while((RCC->CR & RCC_CR_PLLRDY) == 0)  {  }   /* Select PLL as system clock source */  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));  RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;       /* Wait till PLL is
发表于 2019-10-09
STM32F030F4P6单片机由外部时钟改为内部时钟的步骤
一.看程序运行的时候初始化时钟部分: 二.查看systeminit定义如下: 这就是打开的函数内容这就是使用外部时钟的配置,也就是库函数的默认配置):static void SetSysClock(void){  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;    /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*//* Enable HSE */ //打开外部时钟开关&nbs
发表于 2019-10-09
STM32F030F4P6单片机由外部时钟改为内部时钟的步骤
STM32F4(Flash读保护)
1,目的在实际的产品发布中,如果不对储存在单片机Flash中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link等)把Flash中的程序读取回来,得到bin文件或hex文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把Flash设置成读保护。2,开发环境1,适用芯片:STM32F4全部芯片2,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.03,IDE:MDK5173,程序源码/**************************************************************** * Function
发表于 2019-10-09
stm32F103 DMA通道
发表于 2019-10-09
stm32F103 DMA通道
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved