www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]在寫單片機程序時我們一般喜歡使用printf來通過串口打印調(diào)試信息,但這個函數(shù)是不可以直接使用的,必須做點對庫函數(shù)的改動。詳細(xì)工程下載地址:http://download.csdn.net/detail/liucheng5037/8847961STM32M CUBE是S

在寫單片機程序時我們一般喜歡使用printf來通過串口打印調(diào)試信息,但這個函數(shù)是不可以直接使用的,必須做點對庫函數(shù)的改動。

詳細(xì)工程下載地址:http://download.csdn.net/detail/liucheng5037/8847961

STM32M CUBE是ST官方提供的庫以及初始化工具,很好很強大,但是在UART方面值提供了如下函數(shù):


HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);

HAL_StatusTypeDefHAL_UART_Receive(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);

HAL_StatusTypeDefHAL_UART_Transmit_IT(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize);

HAL_StatusTypeDefHAL_UART_Receive_IT(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize);

HAL_StatusTypeDefHAL_UART_Transmit_DMA(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize);

HAL_StatusTypeDefHAL_UART_Receive_DMA(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize);


分別實現(xiàn)普通收發(fā),中斷收發(fā),DMA收發(fā),問題是所有函數(shù)要求發(fā)送和接收的buf必須要事先知道長度,也沒有提供對單字節(jié)的收發(fā),無法直接實現(xiàn)printf以及單字節(jié)接收。


其實要實現(xiàn)這些還是很簡單的,首先是實現(xiàn)printf

在main.c 添加如下信息


#include

#ifdef__GNUC__

/*WithGCC/RAISONANCE,smallprintf(optionLDLinker->Libraries->Smallprintf

setto'Yes')calls__io_putchar()*/

#definePUTCHAR_PROTOTYPEint__io_putchar(intch)

#else

#definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f)

#endif/*__GNUC__*/

/**

*@briefRetargetstheClibraryprintffunctiontotheUSART.

*@paramNone

*@retvalNone

*/

PUTCHAR_PROTOTYPE

{

/*Placeyourimplementationoffputchere*/

/*e.g.writeacharactertotheUSART*/

huart1.Instance->DR=(uint8_t)ch;

/*Loopuntiltheendoftransmission*/

while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)==RESET){}

returnch;

}


在這里我們實現(xiàn)了單字節(jié)發(fā)送函數(shù),注意實現(xiàn)這種發(fā)送方式的前提是單字節(jié)發(fā)送的相關(guān)中斷不能打開,否則會進入無限等待,做好之后就可以使用printf了。


voidLED_Task2(voidconst*argument)

{

while(1)

{

HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_14);

printf("LED_Task2rn");

osDelay(2000);

}

}


然后是中斷單字節(jié)接收,修改中斷接收函數(shù)如下:


voidUSART1_IRQHandler(void)

{

/*USERCODEBEGINUSART1_IRQn0*/

staticintcount=0;

/*USERCODEENDUSART1_IRQn0*/

//HAL_UART_IRQHandler(&huart1);

/*USERCODEBEGINUSART1_IRQn1*/

if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)==SET)//有接受到字符串

{

uart_recbuf[count++]=(uint8_t)(huart1.Instance->DR&(uint8_t)0x00FF);//接收

huart1.Instance->DR=uart_recbuf[count-1];//發(fā)送接收的數(shù)據(jù)

if(count==100)count=0;

}

/*USERCODEENDUSART1_IRQn1*/

}


注意使用cube生成的代碼默認(rèn)是沒有打開接收中斷使能的,要在這里打開:


voidHAL_UART_MspInit(UART_HandleTypeDef*huart)

{

GPIO_InitTypeDefGPIO_InitStruct;

if(huart->Instance==USART1)

{

/*USERCODEBEGINUSART1_MspInit0*/

/*USERCODEENDUSART1_MspInit0*/

/*Peripheralclockenable*/

__USART1_CLK_ENABLE();

/**USART1GPIOConfiguration

PA9------>USART1_TX

PA10------>USART1_RX

*/

GPIO_InitStruct.Pin=GPIO_PIN_9|GPIO_PIN_10;

GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull=GPIO_PULLUP;

GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;

GPIO_InitStruct.Alternate=GPIO_AF7_USART1;

HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);

/*Peripheralinterruptinit*/

HAL_NVIC_SetPriority(USART1_IRQn,5,0);

HAL_NVIC_EnableIRQ(USART1_IRQn);

/*USERCODEBEGINUSART1_MspInit1*/

huart->Instance->CR1|=USART_CR1_RXNEIE;//使能接收中斷

/*USERCODEENDUSART1_MspInit1*/

}

}


這樣就實現(xiàn)了這些功能,但是之前cube的默認(rèn)功能,中斷收發(fā)已經(jīng)不能用了。


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

C語言的格式化字符串函數(shù)(如printf、sprintf、syslog等)因參數(shù)解析機制的設(shè)計缺陷,成為內(nèi)存攻擊中最經(jīng)典的漏洞類型之一。攻擊者可通過構(gòu)造惡意格式化字符串,讀取任意內(nèi)存地址、篡改棧數(shù)據(jù)甚至執(zhí)行代碼。本文將從...

關(guān)鍵字: C語言 printf

在 20 世紀(jì) 90 年代,在實際硬件上調(diào)試嵌入式軟件主要有兩種基于工具的解決方案:一種是監(jiān)控調(diào)試器,它是在嵌入式系統(tǒng)內(nèi)存中編程的軟件,可響應(yīng)來自外部的調(diào)試器軟件的請求。另一種是在線仿真器,它是一塊(大型)硬件,可通過適...

關(guān)鍵字: 硬件調(diào)試 printf

在實際項目中,我們經(jīng)常需要提取一個數(shù)值的某些位的數(shù)碼,比如用數(shù)碼管來顯示數(shù)值或?qū)⒁粋€數(shù)值轉(zhuǎn)成字符串,都會涉及到這一操作。

關(guān)鍵字: 數(shù)值 數(shù)碼 printf

最近在忙活搞別的事情(太難受了),嚴(yán)重影響了硪那一顆自由飛翔的芯~~所以今天打算分享一個麻省理工小伙寫的printf家族的函數(shù)~說是號稱目前網(wǎng)上嵌入式最好的printf喔.在嵌入式中printf這種功能強大的函數(shù)可謂是c...

關(guān)鍵字: printf 嵌入式

大伙估計在多任務(wù)程序中使用printf打印一些信息是非常歡樂的一件事,運氣不錯的話偶爾錯幾個數(shù)據(jù)、亂幾個碼也不是什么大問題,倒霉點的可能就直接掛機、卡死了,那這些到底是什么原因?qū)е碌哪兀?/p> 關(guān)鍵字: printf 可重入函數(shù)

SWO串行線輸出是單引腳、異步串行通信,可在Cortex-M3/M4/M7上使用,并由主調(diào)試器探測支持,它是利用Cortex內(nèi)核中ITM模塊來實現(xiàn)此功能。

關(guān)鍵字: printf 嵌入式

目的:在串口0上實現(xiàn)printf、scanf等函數(shù),它使用scanf、sscanf、printf等函數(shù)從串口接收一個十進制數(shù)字序列,然后將它轉(zhuǎn)化為十六進制輸出。 大致內(nèi)容和uart實驗類

關(guān)鍵字: printf 函數(shù)

使用IAR驅(qū)動CC2530的串口0,串口1,實現(xiàn)數(shù)據(jù)發(fā)送以及printf,中斷接收數(shù)據(jù)uart.c/**************************************************

關(guān)鍵字: printf 串口

一、什么是可變參數(shù)我們在C語言編程中有時會遇到一些參數(shù)個數(shù)可變的函數(shù),例如printf()函數(shù),其函數(shù)原型為:?int?printf(?const?char*?format,?...);?它除了有一個

關(guān)鍵字: C語言 printf 編程

USART1需要事先進行較為麻煩配置,配置之后發(fā)現(xiàn)即使用HAL函數(shù)發(fā)送語句還要事先以字符串方式定義,實在是麻煩,雖然后面另外自己寫了一個簡單的庫來操作串口,但看到了更簡單的方法,修改標(biāo)準(zhǔn)庫中printf相關(guān)的兩個函數(shù)

關(guān)鍵字: printf STM32 串口通信 usart打印
關(guān)閉