【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);

}
相關文章
相關標籤/搜索