在調試電機驅動程序的時候,是不能隨便利用中斷來進行一些寄存器或數據的查看的,不然你在運行的時候突然來一下,如果占空比大的話那可能直接就把MOS管給燒了,所以我們很多情況下只能使用USART(串口)來進行程序的調試和數據的監控了。
對於STM32來說,由於很多內容都是有庫來實現的,那就省了很多時間,直接看個例子就可以寫了,大致有4步步驟:
1 1、RCC始終初始化,對端口和USARTX使能時鍾 2 2、初始化端口功能,RX設置為輸入懸空,TX設置為復用功能的推挽輸出,注意GPIO_SPEED要設置下,我沒設置弄了半天都沒輸出 3 3、設置USARTX寄存器,波特率、數據位、校驗位、停止位等 4 4、看需要是否開中斷,我這里沒開
設置完后其實是可以發簡單的數據了,不過如果要實現一些復雜的輸出就需要自己去寫相應的函數,還不一定能都實現,那該怎么才能跟好實現串口的數據輸出呢?
這里就可以用到Printf函數,之前一直看個可以重定向這個函數來出現輸出,就是以前片子資源少,就沒想過用這個函數了,現在就有機會試試了。查了下,發現其實還是很簡單的,就是重定向一個函數就好了。
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了,對於調試來說還是相當好用的。
初始化設置:
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); }
