新闻中心

EEPW首页>嵌入式系统>设计应用> STM32之串口通信

STM32之串口通信

作者: 时间:2016-11-24 来源:网络 收藏
实验目的:

实现利用串口1 不停的打印一个信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。

本文引用地址: //m.amcfsurvey.com/article/201611/320972.htm

实验平台:

基于STM32F103C8T6的彩屏开发板

硬件接口:

注意:因为我的开发板上的串口和LED共用了PA9和PA10,所以在使用USART1时务必屏蔽LED,不然两者会互相影响而导致实现现象无法呈现。

相关寄存器:

1,串口时钟使能。串口作为STM32 的一个外设,其时钟由外设时钟使能寄存器控制,这

里我们使用的串口1 是在APB2ENR 寄存器的第14 位。

2,串口复位。串口1 的复位是通过配置APB2RSTR 寄存器的第14 位来实现的。。通过向该位写1来复位串口1,写0 结束复位。

3,串口波特率设置。每个串口都有一个自己独立的波特率寄存器USART_BRR

波特率的计算,STM32 的串口波特率计算公式如下:


上式中, 是给串口的时钟(PCLK1 用于USART2、3、4、5,PCLK2 用于USART1);USARTDIV 是一个无符号定点数。我们只要得到USARTDIV 的值,就可以得到串口波特率寄存器USART1->BRR 的值。

4,串口控制。STM32 的每个串口都有3 个控制寄存器USART_CR1~3,串口的很多配置

都是通过这3 个寄存器来设置的

5,数据发送与接收。STM32 的发送与接收是通过数据寄存器USART_DR 来实现的,这是

一个双寄存器,包含了TDR 和RDR。

6,串口状态。串口的状态可以通过状态寄存器USART_SR 读取。

(注:详细的介绍使用请参考ST公司的数据手册)

程序设计:

(注:本人的usart.c usart.h delay.c delay.h sys.c sys.h是引用网上一位网友整理的)

usart.h

#ifndef __USART_H

#define __USART_H

#include

#include "stdio.h"

extern u8 USART_RX_BUF[64];//接收缓冲,最大63个字节.末字节为换行符

extern u8 USART_RX_STA;//接收状态标记

//如果想串口中断接收,请不要注释以下宏定义

#define EN_USART1_RX //使能串口1接收

void uart_init(u32 pclk2,u32 bound);

#endif

usart.c

#include "sys.h"

#include "usart.h"

//加入以下代码,支持printf函数,而不需要选择use MicroLIB

#if 1

#pragma import(__use_no_semihosting)

//标准库需要的支持函数

struct __FILE

{

int handle;

};

FILE __stdout;

//定义_sys_exit()以避免使用半主机模式

_sys_exit(int x)

{

x = x;

}

//重定义fputc函数

int fputc(int ch, FILE *f)

{

while((USART1->SR&0X40)==0);//循环发送,直到发送完毕

USART1->DR = (u8) ch;

return ch;

}

#endif

//end

//////////////////////////////////////////////////////////////////

#ifdef EN_USART1_RX//如果使能了接收

//串口1中断服务程序

//注意,读取USARTx->SR能避免莫名其妙的错误

u8 USART_RX_BUF[64];//接收缓冲,最大64个字节.

//接收状态

//bit7,接收完成标志

//bit6,接收到0x0d

//bit5~0,接收到的有效字节数目

u8 USART_RX_STA=0;//接收状态标记


上一页 1 2 下一页

关键词:STM32串口通

评论


技术专区

关闭