#include "usart.h" uint8_t SendBuff[SENDBUFF_SIZE]; /** * @brief 配置嵌套向量中断控制器NVIC分组 * @param 无 * @retval 无 */ static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); } /** * @brief DEBUG_USART GPIO 配置,工作模式配置。115200 8-N-1 ,中断接收模式 * @param 无 * @retval 无 */ void EBT_USART_Config(void) { USART_InitTypeDef USART_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; // Enable USART6 clock RCC_APB2PeriphClockCmd(EBT_USART_CLK, ENABLE); // Enable GPIOC clock RCC_AHB1PeriphClockCmd(EBT_USART_RX_GPIO_CLK, ENABLE); // Configure USART6 pins GPIO_InitStruct.GPIO_Pin = EBT_USART_RX_PIN | EBT_USART_TX_PIN; // USART6_TX (PC6) and USART6_RX (PC7) GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); // Connect USART6 pins to AF8 GPIO_PinAFConfig(EBT_USART_RX_GPIO_PORT, EBT_USART_RX_SOURCE, EBT_USART_RX_AF); GPIO_PinAFConfig(EBT_USART_TX_GPIO_PORT, EBT_USART_TX_SOURCE, EBT_USART_TX_AF); // Configure USART6 USART_InitStruct.USART_BaudRate = EBT_USART_BAUDRATE; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(EBT_USART, &USART_InitStruct); // Enable USART6 USART_Cmd(EBT_USART, ENABLE); } /** * @brief USART1 TX DMA 配置,内存到外设(USART1->DR) * @param 无 * @retval 无 */ void USART_DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; /*开启DMA时钟*/ RCC_AHB1PeriphClockCmd(EBT_USART_DMA_CLK, ENABLE); /* 复位初始化DMA数据流 */ DMA_DeInit(EBT_USART_DMA_STREAM); /* 确保DMA数据流复位完成 */ while (DMA_GetCmdStatus(EBT_USART_DMA_STREAM) != DISABLE) { } DMA_InitStructure.DMA_Channel = EBT_USART_DMA_CHANNEL; /*设置DMA源:串口数据寄存器地址*/ DMA_InitStructure.DMA_PeripheralBaseAddr = EBT_USART_DR_BASE; /*内存地址(要传输的变量的指针)*/ DMA_InitStructure.DMA_Memory0BaseAddr = (u32)SendBuff; /*方向:从内存到外设*/ DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/ DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE; /*外设地址不增*/ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*内存地址自增*/ DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*外设数据单位*/ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*内存数据单位 8bit*/ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*DMA模式:不断循环*/ DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /*优先级:中*/ DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /*禁用FIFO*/ DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; /*存储器突发传输 16个节拍*/ DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; /*外设突发传输 1个节拍*/ DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; /*配置DMA2的数据流*/ DMA_Init(EBT_USART_DMA_STREAM, &DMA_InitStructure); //配置DMA中断 DMA_ITConfig(EBT_USART_DMA_STREAM, DMA_IT_TC, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*使能DMA*/ DMA_Cmd(EBT_USART_DMA_STREAM, ENABLE); /* 等待DMA数据流有效*/ while(DMA_GetCmdStatus(EBT_USART_DMA_STREAM) != ENABLE) { } } void DMA2_Stream1_IRQHandler() { if (DMA_GetITStatus(DMA2_Stream1, DMA_IT_TCIF1)) { DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1); } } /* 485串口在未配置情况下,初始化的参数 */ void USART_485_config() { USART_InitTypeDef USART_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(USART_485_CLK, ENABLE); RCC_AHB1PeriphClockCmd(USART_485_RX_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin = USART_485_RX_PIN | USART_485_TX_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_PinAFConfig(USART_485_RX_GPIO_PORT, USART_485_RX_SOURCE, USART_485_RX_AF); GPIO_PinAFConfig(USART_485_TX_GPIO_PORT, USART_485_TX_SOURCE, USART_485_TX_AF); USART_InitStruct.USART_BaudRate = USART_485_BAUDRATE; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART_485, &USART_InitStruct); USART_Cmd(USART_485, ENABLE); USART_ITConfig(USART_485,USART_IT_RXNE,ENABLE); USART_ITConfig(USART_485,USART_IT_IDLE,ENABLE); } /* * 函数名:void Config_485_Port(uint32_t baudrate, uint8_t databits, uint8_t stopbits, uint8_t parity, uint8_t flowcontrol) * 输入参数:baudrate,databits,stopbits,parity,flowcontol 串口的配置参数 * 输出参数:无 * 返回值:无 * 函数作用:根据输入参数进行配置485串口参数 */ void Config_485_Port(uint32_t baudrate, uint8_t databits, uint8_t stopbits, uint8_t parity, uint8_t flowcontrol) { uint8_t wordLength; if(parity!=0) { wordLength=databits+1; }else wordLength=databits; USART_InitTypeDef USART_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(USART_485_CLK, ENABLE); RCC_AHB1PeriphClockCmd(USART_485_RX_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin = USART_485_RX_PIN | USART_485_TX_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_PinAFConfig(USART_485_RX_GPIO_PORT, USART_485_RX_SOURCE, USART_485_RX_AF); GPIO_PinAFConfig(USART_485_TX_GPIO_PORT, USART_485_TX_SOURCE, USART_485_TX_AF); USART_InitStruct.USART_BaudRate = baudrate; USART_InitStruct.USART_WordLength = (wordLength== 9) ? USART_WordLength_9b : USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Parity =(parity == 1) ? (USART_Parity_Odd) : (parity == 2 ? USART_Parity_Even : USART_Parity_No); USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART_485, &USART_InitStruct); USART_Cmd(USART_485, ENABLE); USART_ITConfig(USART_485,USART_IT_RXNE,ENABLE); USART_ITConfig(USART_485,USART_IT_IDLE,ENABLE); } //232串口配置 void USART_232_config() { USART_InitTypeDef USART_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(USART_232_CLK, ENABLE); RCC_AHB1PeriphClockCmd(USART_232_RX_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin = USART_232_RX_PIN | USART_232_TX_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_PinAFConfig(USART_232_RX_GPIO_PORT, USART_232_RX_SOURCE, USART_232_RX_AF); GPIO_PinAFConfig(USART_232_TX_GPIO_PORT, USART_232_TX_SOURCE, USART_232_TX_AF); USART_InitStruct.USART_BaudRate = USART_232_BAUDRATE; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART_232, &USART_InitStruct); USART_Cmd(USART_232, ENABLE); USART_ITConfig(USART_232,USART_IT_RXNE,ENABLE); USART_ITConfig(USART_232,USART_IT_IDLE,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) { unsigned int k=0; do { Usart_SendByte( pUSARTx, *(str + k) ); k++; } while(*(str + k)!='\0'); /* 等待发送完成 */ while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET) {} } /***************** 发送一个16位数 **********************/ void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch) { uint8_t temp_h, temp_l; /* 取出高八位 */ temp_h = (ch&0XFF00)>>8; /* 取出低八位 */ temp_l = ch&0XFF; /* 发送高八位 */ USART_SendData(pUSARTx,temp_h); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); /* 发送低八位 */ USART_SendData(pUSARTx,temp_l); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); } ///重定向c库函数printf到串口,重定向后可使用printf函数 int fputc(int ch, FILE *f) { /* 发送一个字节数据到串口 */ USART_SendData(USART_232, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(USART_232, USART_FLAG_TXE) == RESET); return (ch); } ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数 int fgetc(FILE *f) { /* 等待串口输入数据 */ while (USART_GetFlagStatus(USART_232, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(USART_232); } /*********************************************END OF FILE**********************/