日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

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

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


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


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


其實要實現這些還是很簡單的,首先是實現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;

}


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


voidLED_Task2(voidconst*argument)

{

while(1)

{

HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_14);

printf("LED_Task2rn");

osDelay(2000);

}

}


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


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ā)送接收的數據

if(count==100)count=0;

}

/*USERCODEENDUSART1_IRQn1*/

}


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


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*/

}

}


這樣就實現了這些功能,但是之前cube的默認功能,中斷收發(fā)已經不能用了。


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

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

關鍵字: C語言 printf

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

關鍵字: 硬件調試 printf

在實際項目中,我們經常需要提取一個數值的某些位的數碼,比如用數碼管來顯示數值或將一個數值轉成字符串,都會涉及到這一操作。

關鍵字: 數值 數碼 printf

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

關鍵字: printf 嵌入式

大伙估計在多任務程序中使用printf打印一些信息是非常歡樂的一件事,運氣不錯的話偶爾錯幾個數據、亂幾個碼也不是什么大問題,倒霉點的可能就直接掛機、卡死了,那這些到底是什么原因導致的呢?

關鍵字: printf 可重入函數

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

關鍵字: printf 嵌入式

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

關鍵字: printf 函數

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

關鍵字: printf 串口

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

關鍵字: C語言 printf 編程

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

關鍵字: printf STM32 串口通信 usart打印
關閉