历史上的今天

今天是:2024年10月23日(星期三)

正在发生

2019年10月23日 | stm32f103双串口收发(调试通过)

发布者:敬亭山人 来源: 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 = 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(USART3, USART_IT_TXE, ENABLE);//ʹÄÜÖжÏ

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

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

}

 

 

 

 

 

 

/* ***************************************ÖжϺ¯Êý ********************************************************/

#define TxBufferSize1 (countof(TxBuffer1)-1)

#define TxBufferSize2 (countof(TxBuffer2)-1)

#define TxBufferSize3 (countof(TxBuffer3)-1)

 

#define RxBufferSize1 (countof(TxBuffer1)-1)

#define RxBufferSize2 (countof(TxBuffer2)-1)

#define RxBufferSize3 (countof(TxBuffer3)-1)

 

#define countof(a) (sizeof(a)/sizeof(*(a)))      //±íʾÊý×éaÖеÄÔªËظöÊý

 

char TxBuffer1[27]="";

char TxBuffer2[27]="";

char TxBuffer3[27]="";

char RxBuffer1[RxBufferSize1];

char RxBuffer2[RxBufferSize2];

char RxBuffer3[RxBufferSize3];

 

__IO uint8_t TxCounter1 = 0;

__IO uint8_t TxCounter2 = 0;

__IO uint8_t TxCounter3 = 0;

__IO uint8_t RxCounter1 = 0;

__IO uint8_t RxCounter2 = 0;

__IO uint8_t RxCounter3 = 0;

 

 

uint8_t NbrOfDataToTransfer1 = TxBufferSize1;

uint8_t NbrOfDataToTransfer2 = TxBufferSize2;

uint8_t NbrOfDataToTransfer3 = TxBufferSize3;

[1] [2]
关键字:stm32f103  双串口  收发 引用地址:stm32f103双串口收发(调试通过)

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

推荐阅读

集微网香港报道(文/Kelven),高通在每年10月份都会在香港举行4G/5G峰会,今年也不例外。如果说2017年大家谈论5G还是在距离大众比较远的状态,那么今年来说5G,已经距离我们越来越近,因为从产业链、终端厂商、运营商等方面都释出了大量的信息,预估2019年5G将会实现预商用,同时2019年第一季度将会有5G终端,包括手机设备的上市面世。        在...
#include "led.h"#include "delay.h"#include "key.h"#include "sys.h"#include "usart.h" /************************************************ ALIENTEK精英STM32开发板 作者:唯恋殊雨 CSDN博客:https://blog.csdn.net/tichimi3375 TX-PA10 RX-PA9************************************************/ int main(voi...
我们使用WiFi时会碰到网速时快时慢的情况,这是为什么呢?中国电信称可能是以下原因导致的:1. WiFi信号拥堵:用户在通过WiFi接入网络的时候,就像收听电台一样,使用的是一个固定频率的无线波段,因此用户所在地区周边有多少类似的信号发射、接收设备就会对WiFi的使用体验构成多大影响。2. 设备无法同时发送/接收数据:由于WiFi信号无法同时发送、接收...
自从智能手机和WiFi普及以来,无线网络就成了大家生活中必不可或缺的一部分,尤其是在视频平台兴起的今天,对于流量的高负载也让WiFi显得格外重要。多年来,都有一种“蹭网”软件在各大应用市场流传,甚至都能常年位列下载排行榜,但需要注意的是,这些App并不能破解WiFi网络密码,甚至还可能会偷走你的信息。今天,上海消保委就通过官方公众号点名了这类A...

史海拾趣

问答坊 | AI 解惑

电流型控制芯片的应用

摘要:电流型控制芯片是目前较流行的开关电源控制芯片。本文详细介绍了一种实用电路。 关键词:电流型控制芯片 …

查看全部问答∨

提供各种各样得synopsys & cadence & mentor & magma 等

有ASIC设计的digital & analog IP可以提供,如需要可email联系-8bit 1T/2T/4T/12T MCU  8bit RISC CPU  16bit MCU  32ibt RISC CPU  Audio Echo Processor  16/24 bit DSP Core - Interface IP:  Usb1.0 controll ...…

查看全部问答∨

ISD4004语音芯片在语音报站器中的应用

ISD4004语音系列芯片是美国ISD公司推出的产品,具有可多次重复录放、存储时间长、使用时不需扩充存储器、所需外围电路简单等特点。介绍了ISD4004芯片在语音报站器中的一个实际应用,并说明了其功能和使用方法,从而使读者对ISD ...…

查看全部问答∨

智能全数字锁相环的设计

摘要: 在FPGA片内实现全数字锁相环用途极广。本文在集成数字锁相环74297的基础上进行改进,设计了锁相状态检测电路,配合CPU对环路滤波参数进行动态智能配置,从而使锁相环快速进入锁定状态,在最短时间内正常工作并且提高输出频率的质量。 关键词 ...…

查看全部问答∨

proteldxp2004破解版的问题

proteldxp2004破解版软件,怎么我在自制原器件时,怎么有很多东西没有呀。比如说放置管脚也没有,新建元件命令也没有…

查看全部问答∨

verilog里面count=count+1;的硬件电路是什么样子的?

用到add模块了是吗? 最后面的1 是如何做的? 如果用count<=count+1; 会有什么不同呢? 我知道一个是 阻塞的 一个是非阻塞的。我问的是实际效果?会导致不期望的逻辑错误吗?…

查看全部问答∨

急求韦根26、34的接收程序

谁有PIC单片机上韦根的接收程序,发我参考下,多谢了。。我自己也写了个是用数组来接收的,不过用不起来。。。 要是C语言的哦。。最好是整个的,包括中断什么的。。。 E-mail:shanligang@vip.qq.com…

查看全部问答∨

功能仿真错误

双击 VHDL Functional Simulation 时出现以下错误:# ** Error: pc720x_top.vhd(2513): Actual (aggregate) for formal \"enb_signal\" is not a static signal name.  其中pc720x_top.vhd是我的工程的顶层文件,enb_signal是顶层调用一 ...…

查看全部问答∨

新手报到,请教了

小弟电子系毕业,一直从事电子产品的硬件开发,之前也用51单片机做过东西,时隔很久,现在大家用什么单片机做DIY产品。硬件电路还有PCB之类的我都能搞定,就是缺少一款顺手的单片机咯,浏览了DIY的帖子,很兴奋,大家快告诉我,有合适的资料发来看 ...…

查看全部问答∨

正从51向msp430过渡,请各位给点意见或指导

正从51向msp430过渡,请各位给点意见或指导,请大家积极分享心得,谢谢…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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