一、问题复现
当串口在10s内没有接收到数据,这时重新初始化串口,重新正常的初始化操作可能导致串口不能正常工作起来,需要加上复位该串口时钟的命令,如下加入:RCC->APB1RSTR|=1<<18; //复位串口3!!! RCC->APB1RSTR&=~(1<<18); //停止复位!!!
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
GPIO_Set(UART_RT3_PORT,UART_RT3_PIN,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE); //PA5推挽输出
CTR1_485_H;
CTR1_485_L; //默认为接收模式
GPIO_Set(UART_RT3_PORT,USART3_TX_PIN | USART3_RX_PIN,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_NONE); //PB10,PB11,复用功能,上拉
GPIO_AF_Set(UART_RT3_PORT,10,7); //PB10,AF7
GPIO_AF_Set(UART_RT3_PORT,11,7); //PB11,AF7
RCC->APB1ENR|=1<<18; //使能串口3时钟
RCC->APB1RSTR|=1<<18; //复位串口3!!!
RCC->APB1RSTR&=~(1<<18); //停止复位!!!
//波特率设置
USART3->BRR=mantissa; // 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
USART3->CR1 |= 1<<2; //串口接收使能