stm32初始化三个串口

处理器/DSP

871人已加入

描述

  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核,按内核架构分为不同产品:其中STM32F系列有:STM32F103“增强型”系列STM32F101“基本型”系列STM32F105、STM32F107“互联型”系列增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品。

  基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,相当于0.5mA/MHz。

  stm32初始化三个串口

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

  #include “serial.h”

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

  {

  USART_SendData(USART2,(u8)ch);

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

  return ch;

  }

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

  * 函 数 名 : serial_init

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

  * 输 入 : 无

  * 输 出 : 无

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

  void serial1_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的待处理标志位

  }

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

  * 函 数 名 : serial2_init

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

  * 输 入 : 无

  * 输 出 : 无

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

  void serial2_init(u32 bt)

  {

  USART_InitTypeDef USART_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

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

  //使能串口的RCC时钟

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA, ENABLE);

  //串口使用的GPIO口配置

  // Configure USART2 Rx (PA.3) 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 (PA.2) 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 USART2

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

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

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

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

  //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);

  // Enable the USART2

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

  //串口中断配置

  //Configure the NVIC Preemption Priority Bits

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  // Enable the USART2 Interrupt

  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  }

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

  * 函 数 名 : serial1_sned_char

  * 函数功能 : 串口1发送一字节

  * 输 入 : 无

  * 输 出 : 无

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

  void serial1_sned_char(u8 temp)

  {

  USART_SendData(USART1,(u8)temp);

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

  }

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

  * 函 数 名 : serial1_sned_buff

  * 函数功能 : 串口1发送一字符串

  * 输 入 : 无

  * 输 出 : 无

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

  void serial1_sned_buff(u8 buf[],u32 len)

  {

  u32 i;

  for(i=0;i《len;i++)

  serial1_sned_char(buf[i]);

  }

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

  * 函 数 名 : serial2_sned_char

  * 函数功能 : 串口2发送一字节

  * 输 入 : 无

  * 输 出 : 无

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

  void serial2_sned_char(u8 temp)

  {

  USART_SendData(USART2,(u8)temp);

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

  }

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

  * 函 数 名 : serial2_sned_buff

  * 函数功能 : 串口2发送一字符串

  * 输 入 : 无

  * 输 出 : 无

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

  void serial2_sned_buff(u8 buf[],u32 len)

  {

  u32 i;

  for(i=0;i《len;i++)

  serial2_sned_char(buf[i]);

  }

  //--------------------------------------------------------------------------------------------------------

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

  * 函 数 名 : serial3_init

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

  * 输 入 : 无

  * 输 出 : 无

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

  void serial3_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;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  }

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

  * 函 数 名 : serial3_sned_char

  * 函数功能 : 串口3发送一字节

  * 输 入 : 无

  * 输 出 : 无

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

  void serial3_sned_char(u8 temp)

  {

  USART_SendData(USART3,(u8)temp);

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

  }

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

  * 函 数 名 : serial3_sned_buff

  * 函数功能 : 串口3发送一字符串

  * 输 入 : 无

  * 输 出 : 无

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

  void serial3_sned_buff(u8 buf[],u32 len)

  {

  u32 i;

  for(i=0;i《len;i++)

  serial3_sned_char(buf[i]);

  serial.h

  [java] view plain copy**************************************************/

  #ifndef _serial_

  #define _serial_

  #include “stm32f10x.h”

  #include “stdio.h”

  //------------------------------------------------------------------------------------------

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

  * 函 数 名 : fputc

  * 函数功能 : printf会调用

  * 输 入 : 无

  * 输 出 : 无

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

  int fputc(int ch,FILE *p);

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

  * 函 数 名 : serial1_init

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

  * 输 入 : 无

  * 输 出 : 无

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

  void serial1_init(u32 bt);

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

  * 函 数 名 : serial1_sned_char

  * 函数功能 : 串口1发送一字节

  * 输 入 : 无

  * 输 出 : 无

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

  void serial1_sned_char(u8 temp);

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

  * 函 数 名 : serial1_sned_buff

  * 函数功能 : 串口1发送一字符串

  * 输 入 : 无

  * 输 出 : 无

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

  void serial1_sned_buff(u8 buf[],u32 len);

  //-----------------------------------------------------------------------------------------------------

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

  * 函 数 名 : serial2_init

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

  * 输 入 : 无

  * 输 出 : 无

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

  void serial2_init(u32 bt);

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

  * 函 数 名 : serial2_sned_char

  * 函数功能 : 串口2发送一字节

  * 输 入 : 无

  * 输 出 : 无

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

  void serial2_sned_char(u8 temp);

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

  * 函 数 名 : serial2_sned_buff

  * 函数功能 : 串口2发送一字符串

  * 输 入 : 无

  * 输 出 : 无

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

  void serial2_sned_buff(u8 buf[],u32 len);

  //--------------------------------------------------------------------------------------------------------

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

  * 函 数 名 : serial3_init

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

  * 输 入 : 无

  * 输 出 : 无

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

  void serial3_init(u32 bt);

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

  * 函 数 名 : serial3_sned_char

  * 函数功能 : 串口3发送一字节

  * 输 入 : 无

  * 输 出 : 无

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

  void serial3_sned_char(u8 temp);

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

  * 函 数 名 : serial3_sned_buff

  * 函数功能 : 串口3发送一字符串

  * 输 入 : 无

  * 输 出 : 无

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

  void serial3_sned_buff(u8 buf[],u32 len);

  串口中断函数处理部分

  void USART1_IRQHandler(void)

  {

  USART_ClearFlag(USART1,USART_FLAG_TC);

  if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)//检查指定的USART中断发生与否

  {

  u8 k=USART_ReceiveData(USART1);

  serial1_sned_char(k+1);

  }

  }

  void USART2_IRQHandler(void)

  {

  USART_ClearFlag(USART2,USART_FLAG_TC);

  if(USART_GetITStatus(USART2,USART_IT_RXNE)!=Bit_RESET)//检查指定的USART中断发生与否

  {

  u8 k=USART_ReceiveData(USART2);

  serial1_sned_char(k+1);

  }

  }

  void USART3_IRQHandler(void)

  {

  USART_ClearFlag(USART3,USART_FLAG_TC);

  if(USART_GetITStatus(USART3,USART_IT_RXNE)!=Bit_RESET)//检查指定的USART中断发生与否

  {

  u8 k=USART_ReceiveData(USART3);

  serial1_sned_char(k+1);

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • S

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分