STM32之UASRT试验

一、实验目的

1.实现STM32F407开发板与上位机工具通讯,中断方式

 具体实现的效果:上电后,下位机主动发送hello world ,上位机收到并显示;上位机发送数字0~9 ,回复: zero ~ nine

2.通讯协议,后面补充

3.硬件使用野火开发版STM32F407

4.与开发板连接的接口是Usb转串口,根据原理图看出选择的GPIO引脚是PA9 和 PA10

5.根据STM32F407的数据手册,将PA9 和 PA10复用到 USART1 (通用同步异步收发器1)

二、外设配置

1.GPIO 通用输入输出

  1) 引脚选择PA9  和 PA10,端口:GPIOA

  2) 初始化函数GPIO_Init(GPIOx, GPIO_InitStruct )  ,参数1 :端口号,参数2:CPIO初始化结构体

    配置如下:1.模式,复用模式 GPIO_Mode_AF

          2.输出类型, 推挽输出 GPIO_OType_PP

         3.上拉/下拉:上拉  GPIO_PuPd_UP

         4.速度:50Mhz GPIO_Speed_50MHz

         5.引脚设置:  接受数据的引脚:GPIO_Pin_9;发送数据的引脚号:   GPIO_Pin_10

  3)将GPIOA的引脚 9 和 10 复用到 USART1上, 映射函数 

void  GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
参数1:端口号
参数2:引脚序号
参数3:复用选择,具体参考函数源码或数据手册
当前的选择:
GPIO_AF_USART1

 

2.配置嵌套中断向量

00134 static void NVIC_Config(void)
00135 {
00136   NVIC_InitTypeDef NVIC_InitStructure;
00137 
00138   /* Enable the USARTx Interrupt */
00139   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  //中断源
00140   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
00141   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//子优先级
00142   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断使能或失能
00143   NVIC_Init(&NVIC_InitStructure);
00144 }

在stm32f4xx_it.c 文件中,编写中断服务函数USART1_IRQHandler ,用来处理接受或发送的数据。

注:中断服务函数USART1_IRQHandler 在启动文件中  startup_stm32f40xx.s  已经定义,因为是汇编代码,所以F12无法导航。

 

3.配置串口USART1

 功能引脚

TX:发送数据输出引脚。
RX:接收数据输入引脚。
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS:请求以发送 (Request To Send),n 表示低电平有效。如果使能 RTS 流控制,当 USART 接
收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高
电平。该引脚只适用于硬件流控制。
nCTS:清除以发送 (Clear To Send),n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下
一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完
当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。
 

引脚复用映射表

 

几个重要标志位

 

串口初始化结构体:USART_InitTypeDef

USART_InitTypeDef

Data Fields

uint32_t  USART_BaudRate 波特率
uint16_t  USART_HardwareFlowControl 硬件控制流
uint16_t  USART_Mode 发送/接受模式
uint16_t  USART_Parity 校验位
uint16_t  USART_StopBits 停止位
uint16_t  USART_WordLength 字长

 

初始化示例:

 USART_InitStructure.USART_BaudRate = 115200;
  /* 字长(数据位+校验位):8 */
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  /* 停止位:1个停止位 */
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  /* 校验位选择:不使用校验 */
  USART_InitStructure.USART_Parity = USART_Parity_No;
  /* 硬件流控制:不使用硬件流 */
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  /* USART模式控制:同时使能接收和发送 */
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  /* 完成USART初始化配置 */
  USART_Init(DEBUG_USART, &USART_InitStructure);

 

在配置完嵌套中断向量后,使能

 

/* 使能串口接收中断 */
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   //当设备一上电的时候,就向串口发送一串数据
 
  /* 使能串口 */
  USART_Cmd(USART1, ENABLE);

 

串口函数讲解


1.使能指定串口的中断方式

void
USART_ITConfig ( USART_TypeDef * USARTx, //串口号              uint16_t USART_IT, //中断方式                FunctionalState NewState //使能 or 失能
)

2.获取指定串口的状态标志(具体标志信息前文有)

FlagStatus USART_GetFlagStatus ( USART_TypeDef * USARTx, //串口号

                                  uint16_t USART_FLAG ) //指定要检查的标志

3.发送一个单个数据  

void USART_SendData ( USART_TypeDef * USARTx //串口号

                     , uint16_t Data ) //要发送的数据



4.接受一个单个数据
uint16_t USART_ReceiveData  ( USART_TypeDef *  USARTx )  //串口号

 

 
posted @ 2024-04-26 16:56  码好每一天  阅读(43)  评论(0编辑  收藏  举报