1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、USART串口通信实践 1、实验环境 参考资料 野火官方的 《零死角玩转STM32—F103指南者》 ① 野火指南者(STM32F103VE)② IDE:KEIL5 MDK ③ 实验所用串口:USART1 硬件原理图: 这里 CH340G芯片 的作用是将电脑的USB电平转换为串口的TTL电平。 2、实验要求 STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。当上位机给stm32发送“Stop,stm32”后,stm32停止发送。 3、新建工程 在已建好的工程文件(已经引用了STM32的固件库)中,新建一个main.c,bsp_usart.h、bsp_usart.c文件 并将头文件的路径引入到工程中。 4、在 bsp_usart.h 中添加如下代码 #ifndef __BSP_USART_H__ #define __BSP_USART_H__ #include "stm32f10x.h" #include #include /****************************************************** 串口的宏定义:总线时钟宏和GPIO的宏 *******************************************************/ // 串口USART1 #define DEBUG_USARTx USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200 // USART GPIO 引脚宏定义 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10 #define DEBUG_USART_IRQ USART1_IRQn #define DEBUG_USART_IRQHandler USART1_IRQHandler // 函数 void USART_Config(void); void Usart_SendByte(USART_TypeDef * pUSARTx, uint8_t ch); void Usart_SendString(USART_TypeDef * pUSARTx, char *str); void delay_ms(uint16_t delay_ms); #endif /*__BSP_USART_H__*/ 5、在 bsp_usart.c 中添加如下代码 #include "bsp_usart.h" /************************************************** 配置嵌套向量中断控制器NVIC **************************************************/ static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; // 嵌套向量中断控制器组选择 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置USART为中断源 NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ; // 抢断优先级 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 子优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 使能中断 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 初始化配置NVIC NVIC_Init(&NVIC_InitStructure); } /************************************************** USART初始化配置 **************************************************/ void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 打开串口GPIO的时钟 DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE); // 打开串口外设的时钟 DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE); // 将USART Tx的GPIO配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure); // 将USART Rx的GPIO配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure); // 配置串口的工作参数 // 配置波特率 USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE; // 配置 针数据字长 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(DEBUG_USARTx, &USART_InitStructure); // 串口中断优先级配置 NVIC_Configuration(); // 使能串口接收中断 USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE); // 使能串口 USART_Cmd(DEBUG_USARTx, ENABLE); } /************************************************** 发送一个字节 **************************************************/ void Usart_SendByte(USART_TypeDef * pUSARTx, uint8_t ch) { // 发送一个字节数据到USART USART_SendData(pUSARTx, ch); // 等待发送数据寄存器为空 while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); } /************************************************** 发送字符串 **************************************************/ void Usart_SendString(USART_TypeDef * pUSARTx, char *str) { do { Usart_SendByte(pUSARTx, *str++); }while(*str != ' |