STM32--同时应用三个串口的应用代码

发布者:学海飘香最新更新时间:2019-07-12 来源: eefocus关键字:STM32  三个串口 手机看文章 扫描二维码
随时随地手机看文章

uart.c


#include "uart.h"    


int fputc(int ch,FILE *p)       //在使用printf时系统自动条用此函数    

{    

    USART_SendData(USART2,(u8)ch);      

    while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);    

    return ch;    


}    

/*******************************************************************************  

* 函 数 名         : uart_init  

* 函数功能         : IO端口及串口1,时钟初始化函数    A9,A10    

* 输    入         : 无  

* 输    出         : 无  

*******************************************************************************/    

void uart1_init(u32 bt)    

{    

    GPIO_InitTypeDef GPIO_InitStructure;    //声明一个结构体变量,用来初始化GPIO    

    NVIC_InitTypeDef NVIC_InitStructure;     //中断结构体定义    

    USART_InitTypeDef  USART_InitStructure;   //串口结构体定义    


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);    


    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX    

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;    

    GPIO_Init(GPIOA,&GPIO_InitStructure);    

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX    

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;    

    GPIO_Init(GPIOA,&GPIO_InitStructure);    



    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);     

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;     

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;     

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     

    NVIC_Init(&NVIC_InitStructure);    



    USART_InitStructure.USART_BaudRate=bt;   //波特率设置为bt    

    USART_InitStructure.USART_WordLength=USART_WordLength_8b;    

    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);    

    USART_Cmd(USART1, ENABLE);    

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能或者失能指定的USART中断 接收中断    

    USART_ClearFlag(USART1,USART_FLAG_TC);//清除USARTx的待处理标志位     

}    


/*******************************************************************************  

* 函 数 名         : uart2_init  

* 函数功能         : IO端口及串口2,时钟初始化函数     A2,A3   

* 输    入         : 无  

* 输    出         : 无  

*******************************************************************************/    

void uart2_init(u32 bt)    

{    

     USART_InitTypeDef USART_InitStructure;    

  NVIC_InitTypeDef NVIC_InitStructure;     

    GPIO_InitTypeDef GPIO_InitStructure;    //声明一个结构体变量,用来初始化GPIO    

   //使能串口的RCC时钟    

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能UART3所在GPIOB的时钟    

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    


   //串口使用的GPIO口配置    

   // Configure USART2 Rx (PB.11) as input floating      

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;    

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    

   GPIO_Init(GPIOA, &GPIO_InitStructure);    


   // Configure USART2 Tx (PB.10) as alternate function push-pull    

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    

   GPIO_Init(GPIOA, &GPIO_InitStructure);    


   //配置串口    

   USART_InitStructure.USART_BaudRate = bt;    

   USART_InitStructure.USART_WordLength = USART_WordLength_8b;    

   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;    



   // Configure USART3     

   USART_Init(USART2, &USART_InitStructure);//配置串口3    


  // Enable USART1 Receive interrupts 使能串口接收中断    

   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);    

   //串口发送中断在发送数据时开启    

   //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);    


   // Enable the USART3     

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


   //串口中断配置    

   //Configure the NVIC Preemption Priority Bits       

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);    


   // Enable the USART3 Interrupt     

   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;    

   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    

   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    

   NVIC_Init(&NVIC_InitStructure);    

}    



/*******************************************************************************  

* 函 数 名         : uart3_init  

* 函数功能         : IO端口及串口3,时钟初始化函数   B10,B11     

* 输    入         : 无  

* 输    出         : 无  

*******************************************************************************/    

void uart3_init(u32 bt)    

{    

    USART_InitTypeDef USART_InitStructure;    

  NVIC_InitTypeDef NVIC_InitStructure;     

    GPIO_InitTypeDef GPIO_InitStructure;    //声明一个结构体变量,用来初始化GPIO    

   //使能串口的RCC时钟    

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能UART3所在GPIOB的时钟    

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);    


   //串口使用的GPIO口配置    

   // Configure USART2 Rx (PB.11) as input floating      

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;    

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    

   GPIO_Init(GPIOB, &GPIO_InitStructure);    


   // Configure USART2 Tx (PB.10) as alternate function push-pull    

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    

   GPIO_Init(GPIOB, &GPIO_InitStructure);    


   //配置串口    

   USART_InitStructure.USART_BaudRate = bt;    

   USART_InitStructure.USART_WordLength = USART_WordLength_8b;    

   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;    



   // Configure USART3     

   USART_Init(USART3, &USART_InitStructure);//配置串口3    


  // Enable USART1 Receive interrupts 使能串口接收中断    

   USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);    

   //串口发送中断在发送数据时开启    

   //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);    


   // Enable the USART3     

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


   //串口中断配置    

   //Configure the NVIC Preemption Priority Bits       

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);    


   // Enable the USART3 Interrupt     

   NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;    

[1] [2] [3]
关键字:STM32  三个串口 引用地址:STM32--同时应用三个串口的应用代码

上一篇:STM32学习笔记——5个串口的使用方法
下一篇:关于STM32中定义数组的问题

推荐阅读最新更新时间:2024-11-11 23:05

stm32的超频实验
从时钟树中可以看出外接晶振可以接4-16Mhz,经过PLL倍频,最高可以达到16倍晶振的频率。笔者自己是外接的8Mhz晶振,所以说理论上可以达到8*16=128Mhz的频率。 所用芯片:stm32f103 编译工具:keil5 时钟配置子函数如下: void HSE_Init(uint32_t RCC_PLLMul_x)//范围2-16 { ErrorStatus HSEStatus;//定义 //重置RCC,否则不会有效果 RCC_DeInit(); //打开HSE RCC_HSEConfig(RCC_HSE_ON); HSEStatus=RCC_WaitForHSEStartUp();
[单片机]
<font color='red'>stm32</font>的超频实验
STM32的flash进行操作的一些要点
说到STM32的flash,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。当然, FLASH还可以用来装数据。 FLASH分类 根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。 选项字节存储芯片的配置信息及对主存储块的保护信息。
[单片机]
STM32 USART出现乱码
USART使用串口助手调试时出现乱码的情况,一般都是波特率的问题,例如:向串口发送“hello world\r\n”,但是串口助手收到的数据却是这样: 于是我仔细检查代码中设置的波特率的大小,发现没错,也是设置为115200,但是串口助手上显示的还是乱码。我再仔细检查与USART相关的代码,包括UASRT初始化、中断、以及发送数据的类型。。。,很绝望,还是没有找出这个BUG! 以下是我的UASRT相关设置代码: void Uart1_Init(void) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStr
[单片机]
STM32 中断优先级原理
CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。 在 MDK 内,与 NVIC 相关的寄存器,MDK 为其定义了如下的结构体:   typedef struct   {   vu32 ISER ;
[单片机]
<font color='red'>STM32</font> 中断优先级原理
STM32 时钟配置之寄存器操作
1 时钟 1.1时钟树 Stm32 的时钟配置必须要参考时钟树,时钟树决定了时钟的配置的路径,兼着参考RCC寄存器就可以配置不同的时钟频率了。另外STM32外部晶振推荐为8M,所以用外部时钟时最好采用推荐值。 1.2 时钟配置 程序刚启动的时候,stm32采用的为内部高速时钟,通过上图的时钟树可以发现内部8M时钟通过SW成为系统时钟。RCC_CR的复位值为0x000XX83,展开后为HSION为1,也印证了时钟默认为内部高速时钟。如果需要采用外部时钟,需要按照如下的方式配置。 1、时钟初始化,即将时钟的寄存器采用默认值。 2、开始外部时钟且外部时钟起震准备就绪。 3、设置PLLXTPRE(只能在关
[单片机]
<font color='red'>STM32</font> 时钟配置之寄存器操作
stm32 printf输出到USART1
/************************头文件*****************************************/ #include stm32f10x_lib.h //包含所有的头文件 #include stdio.h /*******************************位绑定定义*****************************************/ //#define GPIOA_ODR_A (GPIOA_BASE+0x0C) //#define GPIOA_IDR_A (GPIOA_BASE+0x08) //#define GPIOB_ODR_A (GPIOB
[单片机]
<font color='red'>stm32</font> printf输出到USART1
如何用外设复位修改只读寄存器
有STM32开发者用到STM32F429芯片开发产品,并用到其中的CAN外设。在CAN应用过程中有个专门针对收发出错情况进行次数统计的两个计数器,其值通过错误状态寄存器CAN_ESR中的REC[7:0]和TEC[7:0]两个字段来体现,CAN硬件会根据错误数据大小做适当响应或处理。 根据寄存器描述得知,TEC[7:0]和REC[7:0]的值在这个寄存器里面是只读的。而此时的STM32用户有个强烈的需求,就是期望能适时地对这两个出错记录字段做清零。他自己也尝试编写一些代码想让二者清零,均以失败告终,便邮件咨询有无解决办法。 我们在阅读CAN_ESR寄存器内容时倒有个发现,即该寄存器的复位值是0x00000000。 也就是说
[单片机]
如何用外设复位修改只读寄存器
STM32串口通讯协议浅析
通讯协议是指在嵌入式开发中,不同的硬件系统或者操作系统之间进行数据交换的方式,是一种数据通讯的规约。 通讯协议有很多种,而我今天要说的是串口通讯协议,而且是基于STM32来说的。 首先说串口通信,串口是单片机最常见的外设。常见的UART串口主要有两个线,一个线是发送、一个是接收。至于串口发送数据的时候数据线上的高低电平是怎么变化的,这个大家可以自行查阅相关知识,我们常见的单片机自带的串口已经把这个最底层的电平级别的协议做好了,我们使用的时候,收发都是以一个字节为单位来进行的。 举个例子,我们想使用串口连接STM32的串口1到PC机,然后通过PC上位机给STM32发送一个字节0x01,然后在STM32接收到之后,判断一下
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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