實(shí)現(xiàn)STM32的串口數(shù)據(jù)發(fā)送和printf函數(shù)重定向
對(duì)于STM32來說,由于很多內(nèi)容都是有庫來實(shí)現(xiàn)的,那就省了很多時(shí)間,直接看個(gè)例子就可以寫了,大致有4步步驟:
本文引用地址:http://www.ex-cimer.com/article/201611/317101.htm1 1、RCC始終初始化,對(duì)端口和USARTX使能時(shí)鐘2 2、初始化端口功能,RX設(shè)置為輸入懸空,TX設(shè)置為復(fù)用功能的推挽輸出,注意GPIO_SPEED要設(shè)置下,我沒設(shè)置弄了半天都沒輸出3 3、設(shè)置USARTX寄存器,波特率、數(shù)據(jù)位、校驗(yàn)位、停止位等4 4、看需要是否開中斷,我這里沒開
設(shè)置完后其實(shí)是可以發(fā)簡單的數(shù)據(jù)了,不過如果要實(shí)現(xiàn)一些復(fù)雜的輸出就需要自己去寫相應(yīng)的函數(shù),還不一定能都實(shí)現(xiàn),那該怎么才能跟好實(shí)現(xiàn)串口的數(shù)據(jù)輸出呢?
這里就可以用到Printf函數(shù),之前一直看個(gè)可以重定向這個(gè)函數(shù)來出現(xiàn)輸出,就是以前片子資源少,就沒想過用這個(gè)函數(shù)了,現(xiàn)在就有機(jī)會(huì)試試了。查了下,發(fā)現(xiàn)其實(shí)還是很簡單的,就是重定向一個(gè)函數(shù)就好了。
1 #include//標(biāo)準(zhǔn)的庫函數(shù)2 3 //重寫這個(gè)函數(shù)就可以了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的設(shè)置,我的是用IAR,進(jìn)到option->general option->library configuration下,把library從normal改為full,好了,下面使用printf輸出數(shù)據(jù)就OK了,對(duì)于調(diào)試來說還是相當(dāng)好用的。
初始化設(shè)置:
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端,打開復(fù)用,負(fù)責(zé)發(fā)送數(shù)據(jù)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;//速度設(shè)置,不設(shè)置可能導(dǎo)致無輸出GPIO_Init(GPIOB, &GPIO_InitStructure);//PB11作為US1的RX端,負(fù)責(zé)接收數(shù)據(jù)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);}
評(píng)論