stm32f103 USART串口简单实现

原创 2018年04月17日 14:55:35

(基于奋斗stm32_v5开发板)

1、创建工程并编写C程序

#include"stm32f10x.h"
#include"stdarg.h"

void USART1_Config()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	/* 使能USART1的时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE);
	
	/*配置USART1 TX,并设置为复用推挽输出模式*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/*配置USART1 RX,并设置为浮空输入模式*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/*配置USART1模式*/
	USART_InitStructure.USART_BaudRate = 57600;                               //波特率设置为57600//
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;               //配置串口传输的字长8位//
	USART_InitStructure.USART_StopBits = USART_StopBits_1;                    //配置停止位为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;						//配置串口为双线全双工通信,将RX、Tx模式都开启//
	USART_Init(USART1, &USART_InitStructure);																	//向寄存器写入配置参数//
	USART_Cmd(USART1, ENABLE);																								//使能USART1外设// 
}

static char *itoa(int value, char *string, int radix)
{
	int i, d;
	int flag = 0;
	char *ptr = string;
	
	/*此实现只适用于十进制数*/
	if(radix != 10)
	{
		*ptr = 0;
		return string;
  }
	
	if(!value)
	{
		*ptr++ = 0x30;
		*ptr = 0;
		return string;
	}
	
	/*如果这是负值,则插入减号*/
	if(value < 0)
	{
		*ptr++ = '-';
		value *= -1;
	}
	for(i = 10000; i > 0; i /= 10)
	{
		d = value / i;
		if (d || flag)
		{
			*ptr++ = (char)(d + 0x30);
			value -= (d * i);
			flag = 1;
		}
	}
	
	/*NULL终止字符串*/
	*ptr = 0;
	return string;
}

void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
	const char *s;
	int d;
	char buf[16];
	va_list ap;
	va_start(ap, Data);
	while (*Data != 0)                                    //判断是否到达字符串结束符//
	{
		if(*Data == 0x5c)                                   //'\'//
		{
			switch( *++Data )
			{
				case 'r':                                       //回车符//
					USART_SendData(USARTx, 0x0d);
					Data ++;
					break;
				
				case 'n':                                       //换行符//
					USART_SendData(USARTx, 0x0a);
					Data ++;
					break;
				
				default:
					Data ++;
					break;
			}
		}
		else if (*Data == '%')
		{
			switch (*++Data)
			{
				case 's':                                        //字符串//
					s = va_arg(ap, const char *);
				for(;*s; s++)
				{
					USART_SendData(USARTx, *s);
					while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
				}
				Data++;
				break;
				
				case 'd':                                       //十进制//
					d = va_arg(ap, int);
					itoa(d, buf , 10);
					for(s = buf;*s;s++)
					{
						USART_SendData(USARTx, *s);
						while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
					}
					Data++;
					break;
					
					default:
						Data++;
						break;
			}
		}
		else USART_SendData(USARTx, *Data++);
		while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
	}
}

int main(void)
{
	/*初始化串口*/
	USART1_Config();
	
	USART1_printf(USART1,"\r\nHello Word\r\n");
	
	while(1);
}

2、连接J-Link,编译,将程序下载进stm32开发板

3、连接串口,打开串口调试助手进行调试


看到打印Hello World,目标完成

STM32 USART 串口 DMA 接收和发送的源码详解!

硬件平台:STM32F103ZET6;  开发环境:KEIL 4; 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸...
  • u012507643
  • u012507643
  • 2016-01-12 10:05:31
  • 3248

STM32f103 双串口配置和中断

//代码仅仅是配置使能串口和相应的中断处理函数,具体功能需要自己定义  #include "stm32_uart.h" uint8_t card_ture=0; uint16_t add_coun...
  • allen19881119
  • allen19881119
  • 2016-04-11 21:53:13
  • 2931

STM32F103串口例程

  • 2015年12月22日 19:30
  • 996KB
  • 下载

STM32F103_USART_GPIO配置及相应的IO口设置

STM32 系列单片机 GPIO 资料收集及总结 一、GPIO 配置 (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_...
  • andrewgithub
  • andrewgithub
  • 2017-01-05 15:09:47
  • 5470

STM32F103_USART1_DMA_Tx

  • 2013年07月27日 21:33
  • 282KB
  • 下载

Keil5模版——基于STM32F103RD,串口4和串口5的测试

  • 2015年03月04日 09:08
  • 2.1MB
  • 下载

STM32库函数实现USART发送数据(刘凯)

来自刘凯STM32视频教程,软件仿真–参考文件:STM32固件库使用手册的中文翻译版.pdf 如图1 我们先把USART初始化函数添加到主函数,如图二 包括Baudrate,Word Length...
  • cow825
  • cow825
  • 2016-04-24 11:47:47
  • 3590

STM32F407USART1 USART2 采用DMA收发不定长度数据完整版源码,自测OK

  • 2017年06月18日 09:13
  • 551KB
  • 下载

两种方法实现STM32F103向串口一直发送数据(程序源码,已测试)

串口是STM32最为重要的资源,在平时的硬件调试和软件调试中都是不可或缺的工具,最近在测试一块板子的通信功能是否正常,我打算用板子A的串口USART1一直向串口发送数据,用板子B的串口1接收数据,并将...
  • FUBIN0000
  • FUBIN0000
  • 2017-10-24 22:07:56
  • 740

STM32F103学习笔记——串口通信

今天的笔记,是转载的文章,因为我认为对我可能有用,对大家也有参考意义。 原文网址:http://www.stmcu.org/article/id-328056全文转载如下:在STM32串口通信程序中...
  • pietyknight
  • pietyknight
  • 2016-07-07 12:23:19
  • 4086
收藏助手
不良信息举报
您举报文章:stm32f103 USART串口简单实现
举报原因:
原因补充:

(最多只允许输入30个字)