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

當(dāng)前位置: 首頁(yè) > news >正文

社區(qū)網(wǎng)站如何做口碑營(yíng)銷怎么做

社區(qū)網(wǎng)站如何做,口碑營(yíng)銷怎么做,怎么樣自己建設(shè)一個(gè)網(wǎng)站,江西做網(wǎng)站的公司目錄 一、硬件及工程 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í)行過(guò)程

3、啟動(dòng)串口接收中斷

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

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

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

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

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

三、下載運(yùn)行

1、安裝串口助手

2、驗(yàn)證串口通訊結(jié)果


一、硬件及工程

1、硬件

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

2、軟件目的

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

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

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

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

二、 代碼修改

????????硬件配置完畢后,啟動(dòng)代碼生成,IDE自動(dòng)將配置好的硬件信息轉(zhuǎn)換成代碼。

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

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

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

????????MX_USART2_UART_Init()函數(shù)主要完成對(duì)USART2的模式和參數(shù)配置,如波特率、數(shù)據(jù)位、停止位等。因?yàn)榇谀K要比GPIO復(fù)雜,所以配置參數(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()自動(dòng)生成于main.c中;

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

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

????????對(duì)于串口來(lái)說(shuō),針對(duì)引腳等參數(shù)的配置,是在文件stm32g4xx_hal_msp.c中。msp是MCU support package的縮寫,指的是MCU相關(guān)的支持包。關(guān)于串口有3個(gè)支持包:

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

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

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

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

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

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

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

????????由于配置了串口的中斷功能,所以當(dāng)中斷發(fā)生后就會(huì)調(diào)用相應(yīng)的中斷服務(wù)函數(shù)來(lái)完成一定的任務(wù)。

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;}}
... ...
}

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

3、啟動(dòng)串口接收中斷

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

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

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

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

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

#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)了一個(gè)串口初始化函數(shù)MX_USART2_UART_Init()。此外,在main.c中,首先定義了一個(gè)全局變量huart2,類型為UART_HandleTypeDef。huart2是一個(gè)結(jié)構(gòu)體變量,通常也稱為串口句柄。這個(gè)結(jié)構(gòu)體是關(guān)于UART的,它的成員有很多,有的成員本身也是結(jié)構(gòu)體類型。這個(gè)結(jié)構(gòu)體有些復(fù)雜。在串口初始化函數(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;... ...
}

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

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

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

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

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

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

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

????????將RxBuffer[RXBUFFERSIZE]定義為全局變量(需要放到注釋對(duì)中),并將對(duì)HAL_UART_ Receive_IT()函數(shù)的調(diào)用放置到MX_USART2_UART_Init()語(yǔ)句之后的注釋對(duì)/* 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。對(duì)該變量的定義可以放到main.h頭文件中,可以用define宏(也需放置到注釋對(duì)中):

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

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

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

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

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

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

/*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);	//延時(shí)HAL_GPIO_WritePin(BUZ_GPIO_Port,BUZ_Pin,GPIO_PIN_SET);
}
/*USER CODE END 4 */

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

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

????????根據(jù)串口送來(lái)的數(shù)據(jù),控制發(fā)光二極管的亮滅。當(dāng)接收到的數(shù)據(jù)為0x10(十六進(jìn)制)時(shí),點(diǎn)亮LD2;當(dāng)接收到的數(shù)據(jù)不是0x10時(shí),熄滅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 */

三、下載運(yùn)行

1、安裝串口助手

????????好用的 Win10 串口調(diào)試助手 + 網(wǎng)口調(diào)試 - 知乎 ?https://zhuanlan.zhihu.com/p/109941792?eqid=a328954a0002e745000000066477efb6&utm_id=0

2、驗(yàn)證串口通訊結(jié)果

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

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

相關(guān)文章:

  • 做網(wǎng)站比較好的公司有哪些競(jìng)價(jià)托管外包代運(yùn)營(yíng)
  • 醫(yī)院網(wǎng)站建設(shè)原理知乎關(guān)鍵詞搜索
  • 深圳網(wǎng)絡(luò)品牌百度seo是啥意思
  • app開(kāi)發(fā)網(wǎng)站建設(shè)培訓(xùn)班揭陽(yáng)百度快照優(yōu)化排名
  • 什么是全網(wǎng)營(yíng)銷推廣朝陽(yáng)seo建站
  • 怎么用dw建設(shè)自己的網(wǎng)站蘇州百度推廣公司地址
  • 貴陽(yáng)做網(wǎng)站的公司有哪些發(fā)帖推廣平臺(tái)
  • 微商怎么做 和淘寶網(wǎng)站一樣嗎今日頭條淄博新聞
  • 商務(wù)網(wǎng)站建設(shè)實(shí)驗(yàn)書網(wǎng)站片區(qū)
  • 網(wǎng)站建設(shè)有哪些軟件有哪些推廣軟件的渠道有哪些
  • 一站式外貿(mào)綜合服務(wù)平臺(tái)網(wǎng)站建設(shè)是干什么的
  • 訂貨商城小程序源碼游戲優(yōu)化大師手機(jī)版
  • 中國(guó)建筑建設(shè)通的網(wǎng)站百度推廣登錄官網(wǎng)入口
  • 做平面設(shè)計(jì)應(yīng)該在哪個(gè)網(wǎng)站求職推廣策略都有哪些
  • 網(wǎng)站建設(shè)在作用是什么青島網(wǎng)站建設(shè)
  • 網(wǎng)站建設(shè)推廣費(fèi)用優(yōu)化營(yíng)商環(huán)境條例解讀
  • wordpress博客功能網(wǎng)站關(guān)鍵詞seo優(yōu)化公司
  • 網(wǎng)站虛擬空間更新緩存b2b平臺(tái)運(yùn)營(yíng)模式
  • 免費(fèi)自己創(chuàng)建個(gè)人網(wǎng)站營(yíng)銷型網(wǎng)站建設(shè)套餐
  • 淄博公司制作網(wǎng)站有哪些網(wǎng)絡(luò)推廣公司排行榜
  • 網(wǎng)站申請(qǐng)微信登錄谷歌aso優(yōu)化
  • php制作網(wǎng)站小程序平臺(tái)
  • 建材網(wǎng)站制作黑馬培訓(xùn)是正規(guī)學(xué)校嗎
  • 如何個(gè)網(wǎng)站做優(yōu)化長(zhǎng)沙網(wǎng)站seo技術(shù)廠家
  • 用asp.net做網(wǎng)站的書深圳網(wǎng)站開(kāi)發(fā)制作
  • 昆明網(wǎng)站建設(shè)多少錢快手秒贊秒評(píng)網(wǎng)站推廣
  • 政府內(nèi)網(wǎng)網(wǎng)站建設(shè)合肥網(wǎng)絡(luò)seo
  • 黔南住房和城鄉(xiāng)建設(shè)委員會(huì)網(wǎng)站鄭州seo學(xué)校
  • 工業(yè)設(shè)計(jì)網(wǎng)站排名軟文營(yíng)銷的成功案例
  • 域名備案不是網(wǎng)站公司做的龍巖網(wǎng)站推廣