完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
stm串口函数在某些条件下想要让其串口打印,但是在某些时候不想让其进行串口打印 本例程就是提供了一个这样的例程: 1.对串口进行初始化配置 void uart_initwBaudRate(void) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; UART_InitTypeDef UART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART2, ENABLE); //使能UART2,GPIOA时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //UART2 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = UART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //UART 初始化设置 GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1); UART_InitStructure.UART_BaudRate = BaudRate;//串口波特率 UART_InitStructure.UART_WordLength = UART_WordLength_8b;//字长为8位数据格式 UART_InitStructure.UART_StopBits = UART_StopBits_1;//一个停止位 UART_InitStructure.UART_Parity = UART_Parity_No;//无奇偶校验位 UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//无硬件数据流控制 UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx; //收发模式 UART_Init(UART2, &UART_InitStructure); //初始化串口1 //UART2->BRR = 9; UART_ITConfig(UART2, UART_IT_RXIEN, ENABLE);//开启串口接受中断 UART_ITConfig(UART2, UART_IT_TXIEN, DISABLE); UART_Cmd(UART2, ENABLE); //使能串口1 //UART2_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 //UART2_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //printf("uart ok"); GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_3); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_3); //RTS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); //CTS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB, GPIO_Pin_7); } 2.串口中断函数: void UART2_IRQHandler(void) //串口1中断服务程序 { if(UART_GetITStatus(UART2, UART_IT_RXIEN) != RESET) //接收中断 { UART_ClearITPendingBit(UART2,UART_IT_RXIEN); rxBuf[RxCont]=UART_ReceiveData(UART2);//串口2接受数据放在rxbuf RxTimeout = SysTick_Count + 1000; RxCont++;//接受数据的数量+1 if(RxCont >= MAX_SIZE)//判断是否到达最大数量 { RxCont = 0;//如果满了清0 } } if(UART_GetITStatus(UART2, UART_IT_TXIEN) != RESET) { UART_ClearITPendingBit(UART2,UART_IT_TXIEN); // TxTimeout = SysTick_Count + (20000/BaudRate); if (PosW < txLen) { UART_SendData(UART2,txBuf[PosW++]); if (PosW == txLen) { txLen = 0; PosW = 0; } } else { UART_ITConfig(UART2, UART_IT_TXIEN, DISABLE); } } } 3.串口发送函数: void Usart2SendByte(char *data,u8 len)//发送一个字节 硬件连接选用的为USART2 { u8 t=0; for(t=0;t RX_DATA_BUFF[t]=data[t]; while((UART2->CSR&0x1)==0);//循环发送,直到发送完毕 while((UART1->SR&0X40)==0);//等待发送结束 UART2->TDR=RX_DATA_BUFF[t]; } UART_RX_STA=0; } 由函数3来进项串口数据的打印也是可以的,但是不能让其在某些时候不打印,本例程想要的结果就是让其在某些条件之下进行选择性的打印 4.一下是本次主要讲解的函数: void printf_uart(char *fmt,...) { long length = 0; va_list ap; char *pt; int index = 0; va_start(ap,fmt); vsprintf((char *)gPrintString,(const char *)fmt,ap); pt = &gPrintString[0]; while(*pt!=' |