完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本文展示了STM32 USART串口的 识别操作 内容涉及 : USART串口的识别 IO口输入输出 按键的外部中断处理 前言 STM32 的 USART 简介 通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一 个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个 UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同 步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输 出,我们平时用的串口通信基本都是 UART。 : Git 代码 一、 编程要点 USART: 1) 使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟; 2) 初始化 GPIO,并将 GPIO 复用到 USART 上; 3) 配置 USART 参数; 4) 配置中断控制器并使能 USART 接收中断; 5) 使能 USART; 6) 在 USART 接收中断服务函数实现数据接收和发送。 二、使用步骤 1.理解原理图 代码如下: : STM32F103ZET6 串口引脚位PA9 : STM32F103ZET6 输出口为PB5低电平点有效 : STM32F103ZET6 Key检测脚为PA8 2.建立USART串口的 头文件 USART_book.h 代码如下(示例): #ifndef __USART_BOOK_H_ #define __USART_BOOK_H_ #include "stm32f10x.h" #include "stm32f10x_usart.h" #include "stm32f10x_rcc.h" //串口的宏定义 不同的串口挂在的总线和IO不一样 //串口1 #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_TX_GPIO_MODE GPIO_Mode_AF_PP #define _DEBUG_USART_RX_GPIO_PORT GPIOA #define _DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10 #define _DEBUG_USART_RX_GPIO_MODE GPIO_Mode_IN_FLOATING #define _DEBUG_NVIC_USART_IRQ USART1_IRQn #define _DRBUG_USART_IRQHandler USART1_IRQHandler void fn_USART_IO_Config(void); void fn_USART_Config(void); void fn_Usart_Send_Byte(USART_TypeDef * pUSARTx , uint8_t ch ); void fn_Usart_SendString(USART_TypeDef *pUSARTx , char * str); void Usart_SendHalf_32_Word( USART_TypeDef * pUSARTx, uint32_t ch); void _DRBUG_USART_IRQHandler(void); #endif 3.建立USART串口的 头文件 USART_book.c 代码如下(示例): #include "USART_book.h" /************************************************************** * @brief * void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , * LED_Corporate_state_t _LED_Corporate_state_t ); * @param * //串口1 * #define _DEBUG_NVIC_USART_IRQ USART1_IRQn * #define _DRBUG_NVIC_USART_IRQHandler USART1_IRQHandler * @retval *************************************************************/ static void NVIC_Configuration(void){ NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制寄存器组选择*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置 USART 为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = _DEBUG_NVIC_USART_IRQ; /* 抢断优先级为 1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级为 1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置 NVIC */ NVIC_Init(&NVIC_InitStructure); } /************************************************************** * @brief * void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , * LED_Corporate_state_t _LED_Corporate_state_t ); * @param * //串口1 * // 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_TX_GPIO_MODE GPIO_Mode_AF_PP * #define _DEBUG_USART_RX_GPIO_PORT GPIOA * #define _DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10 * #define _DEBUG_USART_RX_GPIO_MODE GPIO_Mode_AF_FLOATING * @retval *************************************************************/ void fn_USART_IO_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; // 打开串口 GPIO 的时钟 _DEBUG_USART_GPIO_APBxCLKCmd(_DEBUG_USART_GPIO_CLK , ENABLE); //将USART TX 的GPIO配置为推挽模式 GPIO_InitStructure.GPIO_Pin = _DEBUG_USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = _DEBUG_USART_TX_GPIO_MODE; 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 = _DEBUG_USART_RX_GPIO_MODE; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(_DEBUG_USART_RX_GPIO_PORT,&GPIO_InitStructure); } /************************************************************** * @brief * void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , * LED_Corporate_state_t _LED_Corporate_state_t ); * @param * //串口1 * #define _DEBUG_USARTx USART1 * #define _DEBUG_USART_CLK RCC_APB2Periph_USART1 * #define _DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd * #define _DEBUG_USART_BAUDRATE 115200 * @retval *************************************************************/ void fn_USART_Config(void){ USART_InitTypeDef USART_InitStructure; // 打开串口外设的时钟 _DEBUG_USART_APBxClkCmd(_DEBUG_USART_CLK , ENABLE); //配置串口的工作参数 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);// 使能串口 } /************************************************************** * @brief * void fn_Usart_Send_Byte(USART_TypeDef * pUSARTx , uint8_t ch ); * @param * //串口1 * #define _DEBUG_USARTx USART1 * #define _DEBUG_USART_CLK RCC_APB2Periph_USART1 * #define _DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd * #define _DEBUG_USART_BAUDRATE 115200 * @retval *************************************************************/ void fn_Usart_Send_Byte(USART_TypeDef * pUSARTx , uint8_t ch ){ /*发送一个字节数据到USART*/ USART_SendData(pUSARTx , ch); /*等待发送数据寄存器为空*/ while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)==RESET); } /************************************************************** * @brief * void fn_Usart_SendString(USART_TypeDef *pUSARTx , char * str); * @param * //串口1 * #define _DEBUG_USARTx USART1 * #define _DEBUG_USART_CLK RCC_APB2Periph_USART1 * #define _DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd * #define _DEBUG_USART_BAUDRATE 115200 * @retval *************************************************************/ void fn_Usart_SendString(USART_TypeDef *pUSARTx , char * str){ unsigned int k = 0; do{ fn_Usart_Send_Byte(pUSARTx,*(str + k++)); }while(*(str + k)!=' |