【stm32】实现STM32的串口数据发送和printf函数重定向

    在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,否则你在运行的时候忽然来一下,若是占空比大的话那可能直接就把MOS管给烧了,因此咱们不少状况下只能使用USART(串口)来进行程序的调试和数据的监控了。函数

    对于STM32来讲,因为不少内容都是有库来实现的,那就省了不少时间,直接看个例子就能够写了,大体有4步步骤:spa

1 1、RCC始终初始化,对端口和USARTX使能时钟
2 2、初始化端口功能,RX设置为输入悬空,TX设置为复用功能的推挽输出,注意GPIO_SPEED要设置下,我没设置弄了半天都没输出
3 3、设置USARTX寄存器,波特率、数据位、校验位、中止位等
4 4、看须要是否开中断,我这里没开

    设置完后实际上是能够发简单的数据了,不过若是要实现一些复杂的输出就须要本身去写相应的函数,还不必定能都实现,那该怎么才能跟好实现串口的数据输出呢?调试

     这里就能够用到Printf函数,以前一直看个能够重定向这个函数来出现输出,就是之前片子资源少,就没想过用这个函数了,如今就有机会试试了。查了下,发现其实仍是很简单的,就是重定向一个函数就行了。code

 1 #include <stdio.h>//标准的库函数
 2 
 3 //重写这个函数就能够了
 4 #ifdef _PRINTF_
 5 int fputc(int ch, FILE *f)
 6 {
 7    USART_SendData(USART3, (u8) ch);
 8 
 9    while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))
10    {
11    }
12 
13    return ch;
14 }
15 #endif

    还有修改下IDE的设置,个人是用IAR,进到option->general option->library configuration下,把library从normal改成full,好了,下面使用printf输出数据就OK了,对于调试来讲仍是至关好用的。orm

 

初始化设置:blog

void Uart_RccInit(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
}

void Uart_GpioInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    //PB10做为US1的TX端,打开复用,负责发送数据
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置可能致使无输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    //PB11做为US1的RX端,负责接收数据
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void Uart_UartInit(void)
{
    USART_InitTypeDef USART_InitStructure;
    
    USART_StructInit(&USART_InitStructure);
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART3, &USART_InitStructure);
    
   // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART3, ENABLE);

}
相关文章
相关标签/搜索