- 前言:
项目中正好用到多个串口对不同的上位机输出数据,正好就折腾一下STM32多串口同时使用。
实际使用后,还是使用的是分时串口发送,没有用中断发送,因为我要使用printf,用中断,担心有函数重入的问题,没有这样尝试。
我为啥要写这个呢,因为网上写的这些,都不符合我的需求,我就想用printf格式化输出,但是网上居然有自己去解析格式的做法,我看了一下,也就是把常用的几个解析了,并没有做到真正的和printf一样。
- 正文
先贴代码, 代码内容就是初始化串口。这个很好理解。
bsp_usart.c
#include "bsp_usart.h"
USART_TypeDef * DEBUG_USARTx = USART1;
void USART_Config(void)
{
uart1_init(115200);
uart2_init(115200);
uart3_init(115200);
}
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
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)
{
}
}
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);
}
int fputc(int ch, FILE *f)
{
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return (ch);
}
void uart1_init(u32 bt)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure