一、实验目的
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 ) //串口号
标签:NVIC,USART,引脚,UASRT,STM32,试验,uint16,InitStructure,GPIO From: https://www.cnblogs.com/zhanghongfei/p/17519030.html