中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

社區(qū)網站如何做長沙seo免費診斷

社區(qū)網站如何做,長沙seo免費診斷,做響應式網站設計師需要做什么,wordpress 移動頂部菜單目錄 一、硬件及工程 1、硬件 2、軟件目的 3、創(chuàng)建.ioc工程 二、 代碼修改 1、串口初始化函數(shù)MX_USART2_UART_Init() (1)MX_USART2_UART_Init()串口參數(shù)初始化函數(shù) (2)HAL_UART_MspInit()串口功能模塊初始化函數(shù) 2、串口…

目錄

一、硬件及工程

1、硬件

2、軟件目的

3、創(chuàng)建.ioc工程

二、 代碼修改

1、串口初始化函數(shù)MX_USART2_UART_Init()

(1)MX_USART2_UART_Init()串口參數(shù)初始化函數(shù)

(2)HAL_UART_MspInit()串口功能模塊初始化函數(shù)

2、串口中斷的執(zhí)行過程

3、啟動串口接收中斷

4、自動生成main函數(shù)

5、啟動串口接收函數(shù)HAL_UART_Receive_IT()

6、修改main.c函數(shù)

7、從定義回調函數(shù)?

8、修改while(1)循環(huán)

三、下載運行

1、安裝串口助手

2、驗證串口通訊結果


一、硬件及工程

1、硬件

? ? ? ? 本文旨在以實例說明STM32單片機通過串口接收數(shù)據(jù)的實現(xiàn)過程。本文中使用ST的開發(fā)板NUCLEO-G474RE,板上MCU型號為STM32G474RET6。配套的擴展板為作者根據(jù)說明書自己設計制造,鏈接:

2、軟件目的

????????實例運行后,通過串口通訊助手發(fā)送0x10時開發(fā)板上的LD2燈亮,其它數(shù)據(jù)燈滅。

3、創(chuàng)建.ioc工程

????????配置GPIO→配置時鐘源和DEBUG→配置外部中斷→配置串口→配置串口中斷→配置系統(tǒng)時鐘→build生成。

???????將PA4、PA5配置為輸出GPIO_Output,PP,Pull up;PC13配置為中斷模式GPIO_EXTI13,上升沿觸發(fā),用于檢測按鍵B1的狀態(tài);PA2、PA3分別配置為串口USART2_TX和USART2_RX;外部時鐘;Debug設置為Serial Wire;USART2的基本參數(shù),波特率115200,數(shù)據(jù)長度8bit,無校驗,停止位1;PA4別名BUZ,PA5別名LED,PC13別名KEY;串口中斷搶占優(yōu)先級1,外部中斷搶占優(yōu)先級4;

二、 代碼修改

????????硬件配置完畢后,啟動代碼生成,IDE自動將配置好的硬件信息轉換成代碼。

????????自動生成的代碼有些需要了解(比如初始化函數(shù)),而有些是需要修改的(比如while(1)循環(huán)里需要增加的代碼,一些注釋對里需要增加的代碼),還有一些需要重寫(比如,重寫弱函數(shù))。

1、串口初始化函數(shù)MX_USART2_UART_Init()

(1)MX_USART2_UART_Init()串口參數(shù)初始化函數(shù)

????????MX_USART2_UART_Init()函數(shù)主要完成對USART2的模式和參數(shù)配置,如波特率、數(shù)據(jù)位、停止位等。因為串口模塊要比GPIO復雜,所以配置參數(shù)也更多。

/*** @brief USART2 Initialization Function* @param None* @retval None*/
static void MX_USART2_UART_Init(void)
{/* USER CODE BEGIN USART2_Init 0 *//* USER CODE END USART2_Init 0 *//* USER CODE BEGIN USART2_Init 1 *//* USER CODE END USART2_Init 1 */huart2.Instance = USART2;huart2.Init.BaudRate = 115200;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(&huart2) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK){Error_Handler();}

????????MX_USART2_UART_Init()自動生成于main.c中;

????????該函數(shù)內部出現(xiàn)的HAL_UART_Init(UART_HandleTypeDef *huart)在stm32g4xx_hal_uart.c中。

(2)HAL_UART_MspInit()串口功能模塊初始化函數(shù)

????????對于串口來說,針對引腳等參數(shù)的配置,是在文件stm32g4xx_hal_msp.c中。msp是MCU support package的縮寫,指的是MCU相關的支持包。關于串口有3個支持包:

HAL_MspInit(void)
HAL_UART_MspInit(UART_HandleTypeDef *huart)
HAL_UART_MspDeInit(UART_HandleTypeDef *huart)

????????由函數(shù)名可見,其中都帶有MspInit字樣。這類函數(shù)的作用是進行MCU功能模塊(譬如串口、定時器、ADC等)的初始化。在固件庫中,通常是采用這種方式將MCU的模塊初始化代碼集中起來,以方便代碼在不同型號的MCU上移植。

????????上述函數(shù)中,第一個是初始化全局Msp。后面兩個函數(shù)的參數(shù)完全一樣,函數(shù)名也很類似;區(qū)別是后一個函數(shù)名中多了兩個字母“De”,是Default的縮寫。

????????HAL_UART_MspInit()函數(shù)可以對串口硬件初始化、配置引腳模式以及設置中斷優(yōu)先級并使能中斷,與對GPIO進行初始化的MX_GPIO_Init()函數(shù)所完成的功類似。

????????HAL_UART_MspDeInit()函數(shù)可以把串口復位成初始值,關閉串口并關閉串口中斷。

????????HAL_UART_MspInit()函數(shù)是由函數(shù)HAL_UART_Init()(在stm32g4xx_hal_uart.c文件中定義)調用的。而HAL_UART_Init()是由MX_USART2_UART_Init()函數(shù)調用的(在if語句的條件表達式中調用)。

2、串口中斷的執(zhí)行過程

????????由于配置了串口的中斷功能,所以當中斷發(fā)生后就會調用相應的中斷服務函數(shù)來完成一定的任務。

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{... .../*if no error occurs */errorflags = (isrflags & (uint32_t)(USART_ISR_PE|USART_ISR_FE|USART_ISR_ORE|USART_ISR_NE));if(errorflags == 0U){/*------UART in mode Receiver-------*/if(((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && (((crlits & USART_CR1_RXNEIE_RXFNEIE) != 0U)||((cr3its & USART_CR3_RXFTIE) != 0U))){if(huart->RxISR != NULL){huart->RxISR(huart);}return;}}
... ...
}

????????當程序執(zhí)行到huart →RxISR(huart)時,會調用UART_RxISR_8BIT()函數(shù)(如果配置數(shù)據(jù)字長為7位或8位,則調用此函數(shù);如果數(shù)據(jù)字長為9位,則會調用另一函數(shù)UART_RxISR_16BIT),并且在該函數(shù)中會調用回調函數(shù)HAL_UART_RxCpltCallback()。這個回調函數(shù)是在stm32g4xx_hal_ uart.c中定義的弱函數(shù)。用戶需要重寫該函數(shù),可以寫在main.c中。

3、啟動串口接收中斷

????????在使用中斷之前,還要用到函數(shù)HAL_UART_Receive_IT()。該函數(shù)的格式如下:

HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t?*pData,uint16_t Size)

????????該函數(shù)是給將要接收的數(shù)據(jù)定義一個緩沖區(qū)pData,并指定接收數(shù)據(jù)的長度為Size(也就是要接收的字節(jié)數(shù))。這個Size決定了調用回調函數(shù)的頻率。如果Size大于1,則不會每次中斷都調用回調函數(shù),而是到Size次之后,才會調用一次回調函數(shù)。此外,這個函數(shù)還有開啟接收中斷的功能,所以需要在main函數(shù)的初始化代碼中調用一次HAL_UART_Receive_IT()函數(shù)。這樣就可以確保開啟接收中斷。在執(zhí)行一次回調函數(shù)時,接收中斷會關閉,所以還需要再次開啟接收中斷。這個再次開啟中斷的動作,也可以在回調函數(shù)中通過調用HAL_UART_Receive_IT()函數(shù)來實現(xiàn)。

4、自動生成main函數(shù)

????????完成上面的硬件配置,并自動生成代碼后,然后在main.c中的初始化部分調用HAL_UART_ Receive _IT()函數(shù)設置參數(shù)并開啟接收中斷,然后寫回調函HAL_UART_RxCpltCallback(),以便對接收的數(shù)據(jù)進行處理。刪除了一些注釋對。

#include "main.h"
UART_HandleTypeDef huart2;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 *//* USERCODE END 2 */while(1){}
}

????????main函數(shù)中出現(xiàn)了一個串口初始化函數(shù)MX_USART2_UART_Init()。此外,在main.c中,首先定義了一個全局變量huart2,類型為UART_HandleTypeDef。huart2是一個結構體變量,通常也稱為串口句柄。這個結構體是關于UART的,它的成員有很多,有的成員本身也是結構體類型。這個結構體有些復雜。在串口初始化函數(shù)MX_USART2_UART_Init中,使用了huart2變量。

static void MX_USART2_UART_Init(void)
{huart2.Instance = USART2;huart2.Init.BaudRate = 115200;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl =UART_HWCONTROL_NONE;... ...
}

????????由此可見,在MX_USART2_UART_Init函數(shù)中,第一句huart2.Instance =USART2,就將前面配置的USART2與結構體變量huart2關聯(lián)了起來。

5、啟動串口接收函數(shù)HAL_UART_Receive_IT()

????????要實現(xiàn)串口接收中斷,需要在主程序的初始化代碼中調用HAL_UART_Receive_IT()函數(shù)。該函數(shù)的結構如下:

HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t?*pData,uint16_t Size)

????????該函數(shù)有三個參數(shù),第一個參數(shù)的類型就是UART_HandleTypeDef,所以要將該參數(shù)與USART2關聯(lián)起來。因此,HAL_UART_Receive_IT()函數(shù)的調用要可將該函數(shù)放到MX_USART2 _UART_Init()函數(shù)之后的注釋對中。

????????HAL_UART_Receive_IT()函數(shù)的第二個參數(shù)是設置接收數(shù)據(jù)的緩沖區(qū),可以定義一個長度為RXBUFFERSIZE的數(shù)組RxBuffer [RXBUFFERSIZE],當然這個數(shù)組以及RXBUFFERSIZE都需要另外定義(后面會將它們定義為全局變量)。

????????HAL_UART_Receive_IT()函數(shù)的第三個參數(shù)用于指定接收數(shù)據(jù)的長度,這個數(shù)據(jù)長度可以與接收緩沖區(qū)的長度相同,即RXBUFFERSIZE。

????????將RxBuffer[RXBUFFERSIZE]定義為全局變量(需要放到注釋對中),并將對HAL_UART_ Receive_IT()函數(shù)的調用放置到MX_USART2_UART_Init()語句之后的注釋對/* USER CODE BEGIN 2 */與/* USER CODE END 2 */中。

6、修改main.c函數(shù)

#include "main.h"
UART_HandleTypeDef huart2;
/* USER CODE BEGIN PV */
/* 直接使用了變量RXBUFFERSIZE */
uint8_t RxBuffer[RXBUFFERSIZE];
/* USER CODE END PV */
/*Private function prototypes */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init();/* USER CODE BEGIN2 */HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuffer,RXBUFFERSIZE);/* USER CODE END2 */while(1){}
}

????????上面直接使用了變量RXBUFFERSIZE。對該變量的定義可以放到main.h頭文件中,可以用define宏(也需放置到注釋對中):

/*?USER CODE BEGIN Private defines */
#define RXBUFFERSIZE 1 //接收緩沖區(qū)的長度
/*?USER CODE END Private defines */

????????將RXBUFFERSIZE定義為1,也就是1字節(jié)。

7、從定義回調函數(shù)?

????????重定義串口中斷接收的回調函數(shù)HAL_UART_RxCpltCallback()。這個函數(shù)已經在stm32g4xx_ hal_uart.c中有定義,只不過被定義為弱函數(shù),實際就是一個空函數(shù)。需要重寫它。與寫EXTI的回調函數(shù)類似,也將該函數(shù)寫在main.c中。

????????串口有數(shù)據(jù)送來,會執(zhí)行中斷服務函數(shù)USART2_IRQHandler(),然后該函數(shù)又會調用函數(shù)HAL_UART_IRQHandler()。調用一定次數(shù)的HAL_UART_IRQHandler()函數(shù)后,就會自動執(zhí)行回調函數(shù)HAL_UART_RxCpltCallback()。這里的“一定次數(shù)”是由HAL_UART_Receive_IT()函數(shù)的第三個參數(shù)決定的,也就是前面在主程序中用到的常量RXBUFFERSIZE。由于把RXBUFFERSIZE定義為1,所以串口收到1字節(jié)的數(shù)據(jù)后,會調用一次回調函數(shù)HAL_UART_RxCpltCallback()。當調用回調函數(shù)之時,1字節(jié)的數(shù)據(jù)已經放到了接收緩沖區(qū)中,也就是放到前面定義的數(shù)組RxBuffer中。?

????????調用HAL_UART_Receive_IT()函數(shù),不但實現(xiàn)了定義緩沖區(qū)并設置接收數(shù)據(jù)長度的功能,而且還有開啟串口中斷接收的功能。因此,在接收完指定長度的數(shù)據(jù)之后,需要重新開啟接收中斷的功能,否則后面就不會再進入中斷了??梢栽诨卣{函數(shù)HAL_UART_RxCpltCallback()中調用一下HAL_UART_Receive_IT()函數(shù),重新開啟接收中斷。對該函數(shù)的調用,可以連同EXTI的回調函數(shù)HAL GPIO_EXTI_Callback()一起寫在main.c后面的注釋對中:

/*USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Receive_IT(&huart2,(uint8_t *)RxBuffer,RXBUFFERSIZE);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{HAL_GPIO_WritePin(BUZ_GPIO_Port,BUZ_Pin,GPIO_PIN_RESET);HAL_Delay(100);	//延時HAL_GPIO_WritePin(BUZ_GPIO_Port,BUZ_Pin,GPIO_PIN_SET);
}
/*USER CODE END 4 */

????????在EXTI的回調函數(shù)中使用了中斷的方式實現(xiàn):當按鍵按下時,讓蜂鳴器響一聲。

8、修改while(1)循環(huán)

????????根據(jù)串口送來的數(shù)據(jù),控制發(fā)光二極管的亮滅。當接收到的數(shù)據(jù)為0x10(十六進制)時,點亮LD2;當接收到的數(shù)據(jù)不是0x10時,熄滅LD2。

/*USER CODE BEGIN WHILE */
while(1)
{/*USER CODE BEGIN 3 */if(RxBuffer[0] == 0x10)HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);elseHAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
}
/*USER CODE END 3 */

三、下載運行

1、安裝串口助手

????????好用的 Win10 串口調試助手 + 網口調試 - 知乎 ?https://zhuanlan.zhihu.com/p/109941792?eqid=a328954a0002e745000000066477efb6&utm_id=0

2、驗證串口通訊結果

????????開啟串口通訊,發(fā)送0x10,開大坂上的LD2亮,發(fā)送其它內容,比如0x20,LD2滅。

http://www.risenshineclean.com/news/21475.html

相關文章:

  • 網站前置審批流程seo建站公司
  • wordpress免費商城seo網站優(yōu)化軟件價格
  • 付費網站做推廣哪個好產品質量推廣營銷語
  • 青海建設廳網站特種作業(yè)seo怎樣優(yōu)化網站
  • 百度推廣基木魚重慶seo網站管理
  • 肇慶網絡推廣公司重慶做優(yōu)化的網絡公司
  • 幫客戶做插邊球網站谷歌google地圖
  • 網站開發(fā)用技術seo優(yōu)化方案報價
  • 創(chuàng)意網紅墻圖片互聯(lián)網seo是什么
  • 阿里云網站備案好了 怎么建站阿里巴巴運營
  • 莆田的外貿網站營銷軟文范例
  • 中國菲律賓商會win7優(yōu)化大師官網
  • 特色的網站建設百度站長平臺官網登錄入口
  • 哪個網站專業(yè)做商鋪網站建設的一般步驟
  • 企業(yè)級網站開發(fā)項目教程西點培訓學校
  • 國外商業(yè)網站建設無錫百度seo優(yōu)化
  • 做網站干什么用江蘇疫情最新消息
  • 網站建設大致價格2017推廣文案怎么寫吸引人
  • 淘寶上網站開發(fā)退款網絡營銷策劃的具體流程是
  • 上海定制網站建設費用在線磁力搜索神器
  • 泉州做網站開發(fā)公司關聯(lián)詞有哪些關系
  • 政府網站群建設 采購需求做百度關鍵詞排名的公司
  • 做餐飲在環(huán)保局網站備案靠譜的代運營公司
  • 電子設計大賽網站開發(fā)百度怎么免費推廣自己的產品
  • wordpress設置文章期限seo 公司
  • 四川手機響應式網站建設推薦百度競價推廣賬戶優(yōu)化
  • 傻瓜式建站平臺做引流的公司是正規(guī)的嗎
  • 網站變黑白代碼搜一搜排名點擊軟件
  • wordpress 文章評論數(shù)seo搜索引擎優(yōu)化價格
  • 學院網站建設管理規(guī)章制度下載百度app最新版到桌面