stm32f103双串口收发(调试通过)

2019-10-23来源: eefocus关键字:stm32f103  双串口  收发

实现功能:


初始化三个串口,调用两个,一个串口发送一个串口接收


串口数据接收除接收数据外还需给出帧有效数据字节长度;


串口可使用USART1、USART2、USART3,串口参数能自由设置;


实现不定长数据帧的串口收发


设计思路及流程:


将中断串口参数设置初始化,中断函数的处理写在USART.C 文件里面,再使用主函数文件进行调用。


1. 建立usart.c  usart.h 文件


3个串口的串口参数能自由设置,结构体初始化


Usart1:

 

 

Usart2:

 

Usart3:

 

 

中断函数编写:


定义中断函数数组

 

串口一中断函数;


if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)//


接收中断,每接收一个字节(8位二进制数据),中断一次,每次中断(即每接收一个数据)都执行一次下列程序

 

 

串口二中断函数;

 

 

串口三中断函数;

 

 

字符串处理函数:

 

Usaert.h


设置最大接收字节数,使能串口


 

2.主函数实现:


Main.c


包含头文件,定义数组

 

定义变量,延时,串口初始化

 

While 循环内 设置数组长度length每次接收到一个字节的数据后usart1_in++,

 

2. 实际功能实现任意两个串口收发


 引脚设置:   PA9  USART1_TX


            PA10  USART1_RX


  发送串口修改选择箭头所示的串口名,可以修改为USART2,USART3

到目前为止这种方法编写的程序只能进入debug模式进行演示,还必须得分步调试,其它串口才能收到,如图所示

话不多说,直接上代码


串口二接收情况

串口三接收情况

完整代码

USART.C  


#include "sys.h"

#include "usart.h"

#include

#include

#if SYSTEM_SUPPORT_UCOS

#include "includes.h"

#endif

 

#if 1

#pragma import(__use_no_semihosting)

                                     //±ê×¼¿âÐèÒªµÄÖ§³Öº¯Êý

struct __FILE

{

int handle; 

};

 

FILE __stdout;

                                     //±ÜÃâʹÓðëÖ÷»úģʽ   

 

_sys_exit(int x)

{

x = x;

}

                                     //Öض¨Òåfputcº¯Êý

int fputc1(int ch, FILE *f)

{

while((USART1->SR&0X40)==0);//Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï

    USART1->DR = (u8) ch;

return ch;

}

 

int fputc2(int ch, FILE *f)

{

while((USART2->SR&0X40)==0);//Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï

    USART2->DR = (u8) ch;

return ch;

}

 

 

int fputc3(int ch, FILE *f)

{

while((USART3->SR&0X40)==0);//Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï

    USART3->DR = (u8) ch;

return ch;

}

#endif

 

#if EN_USARTx_RX   //Èç¹ûʹÄÜÁ˽ÓÊÕ

//´®¿Ú1ÖжϷþÎñ³ÌÐò

 

u8 USART_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.

//½ÓÊÕ״̬

//bit15£¬ ½ÓÊÕÍê³É±êÖ¾

//bit14£¬ ½ÓÊÕµ½0x0d

//bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿

u16 USART_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç

 

void usart1_init(u32 bound)

{

    //GPIO¶Ë¿ÚÉèÖÃ

    GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//ʹÄÜUSART1£¬GPIOAʱÖÓÒÔ¼°¸´Óù¦ÄÜʱÖÓ

//USART1_TX   PA.9

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    //USART1_RX   PA.10

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

   //Usart1 NVIC ÅäÖÃ

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//ÇÀÕ¼ÓÅÏȼ¶1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //×ÓÓÅÏȼ¶0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //IRQͨµÀʹÄÜ

NVIC_Init(&NVIC_InitStructure);                          //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷

 

 

   //USART ³õʼ»¯ÉèÖÃ

 

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ

USART_InitStructure.USART_StopBits = USART_StopBits_2;//Ò»¸öֹͣλ

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_ITConfig(USART1, USART_IT_TXE, ENABLE);//ʹÄÜÖжÏ

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÖжÏ

    USART_Cmd(USART1, ENABLE);                    //ʹÄÜ´®¿Ú

}

 

void usart2_init(u32 bound)

{

//GPIO¶Ë¿ÚÉèÖÃ

    GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_AFIO, ENABLE); //ʹÄÜUSART2£¬GPIOAʱÖÓÒÔ¼°¸´Óù¦ÄÜʱÖÓ

//USART2_TX   PA.2

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    //USART2_RX   PA.3

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);//¸¡¿ÕÊäÈë

 

   //Usart2 NVIC ÅäÖÃ

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//ÇÀÕ¼ÓÅÏȼ¶1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //×ÓÓÅÏȼ¶0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //IRQͨµÀʹÄÜ

NVIC_Init(&NVIC_InitStructure);                          //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷

 

   //USART ³õʼ»¯ÉèÖÃ

 

USART_InitStructure.USART_BaudRate =115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ

USART_InitStructure.USART_StopBits = USART_StopBits_2;//Ò»¸öֹͣλ

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(USART2, &USART_InitStructure); //³õʼ»¯´®¿Ú

// USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//ʹÄÜÖжÏ

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//¿ªÆôÖжÏ

    USART_Cmd(USART2, ENABLE);                    //ʹÄÜ´®¿Ú

}

 

 

 

 

 

void usart3_init(u32 bound)

{

    //GPIO¶Ë¿ÚÉèÖÃ

    GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//ʹÄÜUSART1£¬GPIOAʱÖÓÒÔ¼°¸´Óù¦ÄÜʱÖÓ

//USART3 _TX   PA.9

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    //USART1_RX   PA.10

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

   //Usart3 NVIC ÅäÖÃ

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//ÇÀÕ¼ÓÅÏȼ¶1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //×ÓÓÅÏȼ¶0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //IRQͨµÀʹÄÜ

NVIC_Init(&NVIC_InitStructure);                          //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷

 

 

   //USART ³õʼ»¯ÉèÖÃ

 

USART_InitStructure.USART_BaudRate = 115200;//Ò»°ãÉèÖÃΪ115200;

USART_InitStructure.USART_WordLength

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

上一篇:STM32F103C8T6学习笔记_串口USART的使用
下一篇:stm32f103之串口实验

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

推荐阅读

stm32f103 c6t6 CAN总线的配置
KEIl5 环境下 中文显示复制过来有问题又懒得打字
发表于 2019-11-13
stm32f103 c6t6 CAN总线的配置
STM8L051F3_01_GPIO应用
本章介绍STM8L051F3的GPIO相关知识。内容分为以下几部分:GPIO简介点亮LED1、GPIO简介GPIO:通用输入/输出口,用于芯片与外部进行数据传输;STM8L051F3的一个I/O端口最多可以有8个Pins(引脚),每个引脚可以独立地配置为数字输入或数字输出。此外,一些I/O端口可能有一些复用功能如模拟输入、外部中断、片上外设的输入输出等,一个引脚不能同时使用多种复用功能。每个I/O端口都分配有一个输出数据寄存器、输入数据寄存器、数据方向寄存器、两个配置寄存器,一个I/O端口工作在输入或输出状态取决于数据方向寄存器。STM8L051F3的GPIO主要性能如下:端口的位(引脚)能独立配置可选择的输入模式:浮空输入
发表于 2019-11-13
STM32F0x2 IWDG(独立看门狗)
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。 以下为stm32f042单片机独立看门狗相关代码:/***********************************************************函数描述:初始化独立看门狗,timeout为1s*函数:void IWDG_Init(unsigned char usb_sw) *参数:无*作者:*日期
发表于 2019-11-12
STM32F1小白系列之四、独立看门狗(IWDG)
:T(ms) == [(4 * 2^pre_Scaler) * reload] / 40;    IWDG_ReloadCounter();//第一次喂狗    IWDG_Enable();//使能看门狗}//喂狗APIvoid feed_iwdg(void){    IWDG_ReloadCounter();//喂狗,使STM32重新加载【IWDG_RLR中的值】到【看门狗计数器里面】。}2、直接配置寄存器/*    函数功能:初始化独立看门狗    函数名:init_iwdg    返回值:void 
发表于 2019-11-12
stm32f0 hal adc配置
Clock Prescaler:和系统时钟同步并且二分频Sampling Time :采样时间,采样时间是你通过寄存器告诉STM32采样模拟量的时间,设置越长越精确
发表于 2019-11-11
stm32f0 hal adc配置
STM32F0xx_看门狗(独立+窗口)配置详细过程
Ⅰ、概述对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗有两种:独立和窗口看门狗。今天提供两种看门狗的软件工程实例,供大家下载。两种看门狗各有各的特点,应用在不同的场合,下面将分别简单总结一下独立和窗口看门狗的功能。Ⅱ、下载文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文
发表于 2019-11-08
STM32F0xx_看门狗(独立+窗口)配置详细过程
小广播
何立民专栏 单片机及嵌入式宝典

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

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