历史上的今天
返回首页

历史上的今天

今天是:2024年09月07日(星期六)

2019年09月07日 | STM32五个串口同时收发函数配置

2019-09-07 来源:eefocus

#include "user_usart.h"

 

#include "stm32f10x_usart.h"

 

 

 

 

/*使用microLib的方法*/

 /* 

int fputc(int ch, FILE *f)

{

USART_SendData(USART1, (uint8_t) ch);

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}

   

    return ch;

}

int GetKey (void)  { 

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

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

}

*/

 

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

 

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

//串口1中断服务程序

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

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

//接收状态

//bit15, 接收完成标志

//bit14, 接收到0x0d

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

 

u8 checkdata[1]; //检测串口1接收的特定数据数据

 

//串口1队列定义

u8 UART1SendBuff[UART1BuffSize]; //发送数据

u8 UART1ReceBuff[UART1BuffSize]; //接收数据?

u16 UART1ReceIn = 0;//接收状态标记数据位  

u8  UART1ReceFullFlag = 0;//接收完数据标志位

 

//串口2队列定义

u8 UART2SendBuff[UART2BuffSize];

u8 UART2ReceBuff[UART2BuffSize];

u16 UART2ReceIn = 0;

u8  UART2ReceFullFlag = 0;

 

//串口3队列定义

u8 UART3SendBuff[UART3BuffSize];

u8 UART3ReceBuff[UART3BuffSize];

u16 UART3ReceIn = 0;

u8  UART3ReceFullFlag = 0;

 

//串口4队列定义

u8 UART4SendBuff[UART4BuffSize];

u8 UART4ReceBuff[UART4BuffSize];

u16 UART4ReceIn = 0;

u8  UART4ReceFullFlag = 0;

 

//串口5队列定义

u8 UART5SendBuff[UART5BuffSize];

u8 UART5ReceBuff[UART5BuffSize];

u16 UART5ReceIn = 0;

u8  UART5ReceFullFlag = 0;

 

 

u8    usartflag;  //串口中断接收数据的标志位 串口2 串口3

//串口1初始化

void USART1_Configuration(u32 bound)

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

USART_InitTypeDef USART_InitStructure;;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);//开启GPIOA和USART1时钟

//USART1_TX   GPIOA.9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

//USART1_RX   GPIOA.10初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

//Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_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; //收发模式

    USART_Init(USART1, &USART_InitStructure); //初始化串口1

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  //开启串口接收中断

USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

 

//串口2初始化

void USART2_Configuration(u32 bound)

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

USART_InitTypeDef USART_InitStructure;;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA和USART1时钟

//USART2_TX   GPIOA.2

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2

//USART2_RX   GPIOA.3初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3  

//Usart2 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级3  响应

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_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; //收发模式

    USART_Init(USART2, &USART_InitStructure); //初始化串口2

USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);  //开启串口接收中断

USART_Cmd(USART2, ENABLE);                    //使能串口2 

}

 

//串口3初始化

void USART3_Configuration(u32 bound)

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

USART_InitTypeDef USART_InitStructure;;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOA和USART1时钟

//USART3_TX   GPIOB.10

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10

//USART3_RX   GPIOB.3初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11  

//Usart3 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_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; //收发模式

    USART_Init(USART3, &USART_InitStructure); //初始化串口3

USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);  //开启串口接收中断

USART_Cmd(USART3, ENABLE);                    //使能串口3 

}

//串口4初始化

void UART4_Configuration(u32 bound)

{

 

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure; 

 

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE );

 

 

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //UART4 TX;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //UART4 RX;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;

GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;

 

USART_InitStructure.USART_BaudRate = bound; //波特率;

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;

//收发模式;

USART_Init(UART4, &USART_InitStructure);//配置串口参数;

 

 

 

// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; //中断号;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);

USART_Cmd(UART4, ENABLE); //使能串口;

 

}

 

//串口5初始化

void UART5_Configuration(u32 bound)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

 

NVIC_InitTypeDef NVIC_InitStructure; 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE );

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE );

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //UART5 TX;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //UART5 RX;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;

GPIO_Init(GPIOD, &GPIO_InitStructure); //端口D;

 

 

USART_InitStructure.USART_BaudRate = bound; //波特率;

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;

//收发模式;

USART_Init(UART5, &USART_InitStructure);//配置串口参数;

 

//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn; //中断号;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;

推荐阅读

史海拾趣

Global Navigation Systems公司的发展小趣事
如果远程无线防盗报警系统无法报警,首先需要检查各个部件是否正常工作。可以依次检查探测器是否触发、发射机是否发射信号、接收控制器是否接收到信号并触发报警装置等。如果某个部件出现故障,需要及时进行维修或更换。同时,还需要检查系统的电源和通讯是否正常,确保系统能够稳定运行。
国产公司的发展小趣事
如电阻的热噪声、晶体管的散粒噪声等。选择低噪声的元器件可以在一定程度上抑制噪声。
Amaze Electronics Pte Ltd公司的发展小趣事

随着业务的不断发展,Amaze Electronics意识到国际市场的巨大潜力。于是,公司积极寻求与国际知名电子企业的合作,共同开发新产品。通过与这些企业的深度合作,Amaze Electronics不仅获得了先进的技术支持,还成功将产品打入国际市场,实现了业务的快速拓展。

Arduino公司的发展小趣事

2005年,意大利Ivrea交互设计学院的副教授Massimo Banzi面临了一个问题:他的学生们无法负担市面上昂贵的微控制器。为了解决这个问题,Banzi与他的同事David Cuartielles开始着手制造一个更便宜、更易于使用的电子平台。他们基于学生Hernando Barragá的Wiring平台,通过拆解和重新设计,最终推出了价格仅为30美元的Arduino电路板。Arduino的名字来源于他们常去的酒吧“di Re Arduino”,以此纪念这个创新的起点。

Electric Imp Inc.公司的发展小趣事

为了进一步提升品牌影响力和市场份额,Electric Imp Inc.公司开始实施国际化战略。公司先后在北美、欧洲、亚洲等地设立了研发中心和分支机构,以便更好地了解当地市场需求和技术趋势。同时,公司还积极参加国际展览、研讨会等活动,与全球同行交流经验、分享技术。这些努力使得公司的国际化水平不断提高。

EDAC公司的发展小趣事

随着全球环保意识的提高,ECS-C公司积极响应国家号召,将绿色环保理念融入到企业的生产经营中。公司采用环保材料和生产工艺,减少废弃物排放和能源消耗。同时,ECS-C公司还积极参与环保公益活动,推动社会环保事业的发展。这些环保举措不仅提升了公司的社会形象,也为企业带来了可持续发展的动力。

问答坊 | AI 解惑

tms320vc5509的例程css3.3

tms320vc5509的例程css3.3 经过测试的…

查看全部问答>

钽电容封装及各种电阻电容封装说明

钽电容 长的话是+-0.2 ,宽是+-0.1 高 (MM) A 型的尺寸 3.2 X1.6 X1.6    俗称: A(3216) B 型的尺寸 3.5 X2.8 X1.9    俗称: B(3528) C 型的尺寸 6.0X 3.2X 2.6    俗称: C(6032) D 型的尺寸 7.3 X4.3 X2.9&nb ...…

查看全部问答>

eboot 下载 nk 出现错误

我用编译好的eboot 下载nk.bin ,老是出现Checksum failure on record , ABORT!!! ****** 不知道是什么原因? 是不是 cs8900a 不稳定造成的?我的平台S3C2440 + 64M NANDFLASH + 64M RAM wince5.0…

查看全部问答>

UNICODE_STRING问题。。。。

一段代码:        //创建设备名称         UNICODE_STRING devName;         RtlInitUnicodeString(&devName,L\"\\\\Device\\\\MyDDKDevice\");         ...…

查看全部问答>

终于可以踏上回家的行程,我兴奋啊!祝福兄弟姐妹们新年快乐!全家幸福!

终于可以踏上回家的行程,我兴奋啊!祝福兄弟姐妹们新年快乐!全家幸福!…

查看全部问答>

把kernel从vivi向u-boot移植的时候遇到问题了!

三星提供的kernel是for vivi 的,但俺想用u-boot来引导,结果移植上去之后,u-boot是跑起来了,但是引导kernel却出问题了 看了kernel的头部的二进制数据,发现kernel的格式竟然还和bootloader的类型有关,for vivi的kernel的头就是适合vivi,不 ...…

查看全部问答>

关于wince下MySqlParameter的一个问题

private void button1_Click(object sender, EventArgs e)         {             MySqlParameter[] paramter =            &nbs ...…

查看全部问答>

问个sdram的问题

对于sdram来说,当片选(CS#)为高时,数据线和地址线处于什么状态啊?好像不是高阻态。…

查看全部问答>

关于51单片机的地址设置

本人用的87c591,调试过程中存在这样的问题 (1)将变量地址设置到0x4000和0x4003,并且将一组数组设置到0x8000为起始地址,数组长度为245,如果设置为大模式,即xdata模式,将程序烧写进eeprom之后无法正常启动,其中寄存器的设置已经更改。 (2 ...…

查看全部问答>

Stellaris® MCU 的 Cortex 微控制器软件接口标准 (CMSIS):DSP 头文件

TI新出的资料 Stellaris® MCU 的 Cortex 微控制器软件接口标准 (CMSIS):DSP 头文件…

查看全部问答>