同时使用两个串口可以正常的发送,但是不能接收,单独使用的时候既可以发送又可以接收,并且单独使用的时候发送的时候可以使用printf进行发送,一起使用的使用就不能用printf了,为什么?下面是对两个串口的配置,最开始串口接收中断是没有屏蔽的,最后接受不了才屏蔽的。
/** ****************************************************************************** * @file bsp_usart.c * @author fire * @version V1.0 * @date 2013-xx-xx * @brief 重定向c库printf函数到usart端口 ****************************************************************************** * @attention * * 实验平台:秉火STM32 F103-霸道 开发板 * 论坛 :http://www.firebbs.cn * 淘宝 :https://fire-stm32.taobao.com * ****************************************************************************** */ #include "bsp_usart.h"void USART1_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 打开串口GPIO的时钟 DEBUG_USART1_GPIO_APBxClkCmd(DEBUG_USART1_GPIO_CLK ENABLE); // 打开串口外设的时钟 DEBUG_USART1_APBxClkCmd(DEBUG_USART1_CLK ENABLE); // 将USART Tx的GPIO配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART1_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DEBUG_USART1_TX_GPIO_PORT &GPIO_InitStructure); // 将USART Rx的GPIO配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART1_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(DEBUG_USART1_RX_GPIO_PORT &GPIO_InitStructure); // 配置串口的工作参数 // 配置波特率 USART_InitStructure.USART_BaudRate = DEBUG_USART1_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_USART1 &USART_InitStructure); // 串口中断优先级配置 /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置USART为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART1_IRQ; /* 抢断优先级*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); // 使能串口接收中断 USART_ITConfig(DEBUG_USART1 USART_IT_RXNE ENABLE); // 使能串口 USART_Cmd(DEBUG_USART1 ENABLE); }//void USART1_IRQHandler(void) //中断处理函数;//{// uint8_t ucTemp;// if(USART_GetITStatus(DEBUG_USART1USART_IT_RXNE)!=RESET)// { // ucTemp = USART_ReceiveData(DEBUG_USART1);// USART_SendData(DEBUG_USART1ucTemp); // } //} void USART2_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ENABLE ); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2 TX; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA &GPIO_InitStructure); //端口A; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2 RX; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入; GPIO_Init(GPIOA &GPIO_InitStructure); //端口A; USART_InitStructure.USART_BaudRate = 9600; //波特率; USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位; USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(USART2 &USART_InitStructure);//配置串口参数; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级; NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //中断号; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART2 USART_IT_RXNE ENABLE); USART_Cmd(USART2 ENABLE); //使能串口;}//void USART2_IRQHandler(void) //中断处理函数;//{//// u8 res; //// if(USART_GetITStatus(USART2 USART_IT_RXNE) == SET) //判断是否发生中断;//// {//// USART_ClearFlag(USART2 USART_IT_RXNE); //清除标志位;//// res=USART_ReceiveData(USART2); //接收数据;//// USART2_SendByte(res); //用户自定义;//// } // // uint8_t ucTemp;// if(USART_GetITStatus(DEBUG_USART2USART_IT_RXNE)!=RESET)// { // ucTemp = USART_ReceiveData(DEBUG_USART2);// USART_SendData(DEBUG_USART2ucTemp); // } //} /***************** 发送一个字符 **********************/void Usart_SendByte( USART_TypeDef * pUSARTx uint8_t ch){ /* 发送一个字节数据到USART */ USART_SendData(pUSARTxch); /* 等待发送数据寄存器为空 */ 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(pUSARTxUSART_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(pUSARTxtemp_h); while (USART_GetFlagStatus(pUSARTx USART_FLAG_TXE) == RESET); /* 发送低八位 */ USART_SendData(pUSARTxtemp_l); while (USART_GetFlagStatus(pUSARTx USART_FLAG_TXE) == RESET); }