




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
任務(wù)2報(bào)警開(kāi)關(guān)功能設(shè)計(jì)與開(kāi)發(fā)成都職業(yè)技術(shù)學(xué)院成都卓物科技有限公司任務(wù)情報(bào)USART在微控制器編程中是經(jīng)常用到的,各個(gè)廠(chǎng)家微控制器使用方法大同小異,基本思路是一樣的;只是華大單片機(jī)在USART功能引腳映射上更靈活,在內(nèi)部事件標(biāo)志上更細(xì)分,也更靈活。HC32F460上有4個(gè)USART單元,可通過(guò)Timer0模塊配合支持UART接收TIMEOUT功能,USART系統(tǒng)框圖如圖所示。USART引腳一共有5個(gè),分別為:USARTn_CK:時(shí)鐘引腳;USARTn_TX:發(fā)送數(shù)據(jù)管腳;USARTn_RX:接收數(shù)據(jù)管腳;USARTn_CTS:調(diào)制解調(diào)器操作管腳、清除發(fā)送管腳;USARTn_RTS:調(diào)制解調(diào)器操作管腳、請(qǐng)求發(fā)送管腳。n:1~4,表示USART單元號(hào)。一般串口常用模式使用全雙工異步通信,這種模式只會(huì)用到串口引腳RX和TX,能節(jié)約芯片的引腳。HC32F460的串口中斷支持常用的發(fā)送和接收中斷,還有串口超時(shí)中斷,其他串口中斷,如表所示。UART可以選擇內(nèi)部波特率生成器生成的時(shí)鐘(內(nèi)部時(shí)鐘源)或USARTn_CK管腳輸入的時(shí)鐘(外部時(shí)鐘源)作為通信的時(shí)鐘源。一般選用內(nèi)部時(shí)鐘源,內(nèi)部波特率生成器生成的波特率計(jì)算公式為:B=C/(8×(2-OVER8)×(DIV_Integer+1)) B:波特率單位:MBps。
C:USARTn_PR.PSC[1:0]位設(shè)定的時(shí)(PCLK,PCLK/4,PCLK/16,PCLK/64)單位:MHz。
OVER8:UART過(guò)采樣模式設(shè)定的值。
DIV_Integer:USARTn_BRR.DIV_Integer設(shè)定值最高波特率為PCLK/8(MBps)。UART模式時(shí)一幀數(shù)據(jù)是由開(kāi)始位,數(shù)據(jù)位,校驗(yàn)位和停止位組成。開(kāi)始位:開(kāi)始位固定有一位的低電平構(gòu)成。數(shù)據(jù)位:數(shù)據(jù)位可以配置成8位或者9位。校驗(yàn)位:校驗(yàn)位可以配置成1位偶校驗(yàn)或1位奇校驗(yàn)或無(wú)校驗(yàn)位。停止位:停止位固定為高電平,可以配置成1位或者2位。在HC32F460微控制器中,串口(UART)具備超時(shí)功能(TIMEOUT)。當(dāng)UART接收到數(shù)據(jù)的停止位時(shí),TIMEOUT計(jì)數(shù)器開(kāi)始計(jì)時(shí)。如果在設(shè)定的TIMEOUT時(shí)間(以接收位數(shù)為單位)內(nèi)沒(méi)有檢測(cè)到下一幀數(shù)據(jù),便會(huì)觸發(fā)超時(shí)(TIMEOUT)。如果在超時(shí)發(fā)生時(shí)控制寄存器1(USARTn_CR1)中的接收使能位(RE)被設(shè)置為1,則TIMEOUT狀態(tài)標(biāo)志(USARTn_SR.RTOF)會(huì)被置位。如果在超時(shí)發(fā)生時(shí)USARTn_CR1.RE為0,那么在USARTn_CR1.RE再次被設(shè)置為1后,TIMEOUT狀態(tài)標(biāo)志(USARTn_SR.RTOF)才會(huì)被置位。HC32的UART和Timer0具體對(duì)應(yīng)關(guān)系如下所示:USART1:Timer0Unit1A通道。USART2:Timer0Unit1B通道。USART3:Timer0Unit2A通道。USART4:Timer0Unit2B通道。本次任務(wù)常用寄存器:控制寄存器(USART_CRx)預(yù)分頻寄存器(USART_PR)波特率寄存器(USART_BRR)發(fā)送數(shù)據(jù)寄存器(USART_TDR)接收數(shù)據(jù)寄存器(USART_RDR)狀態(tài)寄存器(USART_SR)HC32F460的串口控制寄存器包括USART_CR1、USART_CR2、USART_CR3,這些寄存器用于配置串口的接收使能、發(fā)送使能、接收超時(shí)使能、接收超時(shí)中斷使能、數(shù)據(jù)位配置、停止位配置等一系列參數(shù),這3個(gè)寄存器配置的參數(shù)過(guò)多,這里便省略了,請(qǐng)使用HC32F460軟件手冊(cè)查看。預(yù)分頻寄存器(USART_PR)負(fù)責(zé)設(shè)置USART模塊的波特率預(yù)分頻值,通過(guò)控制一個(gè)預(yù)分頻器來(lái)調(diào)整串口的時(shí)鐘頻率,從而實(shí)現(xiàn)所需的波特率設(shè)置。USART_BRR寄存器用于設(shè)定USART(通用同步/異步接收器/發(fā)送器)的波特率。這個(gè)寄存器通過(guò)配置波特率因子來(lái)確定USART的通信速率,是確保USART模塊正確通信的核心部分。發(fā)送數(shù)據(jù)寄存器(USART_TDR)是一個(gè)16位寄存器,用于存儲(chǔ)待發(fā)送的數(shù)據(jù)字節(jié)。接收數(shù)據(jù)寄存器(USART_RDR)是一個(gè)16位寄存器,包含USART接收的數(shù)據(jù)。狀態(tài)寄存器(USART_SR)用于提供USART(通用同步/異步接收器/發(fā)送器)模塊的運(yùn)行狀態(tài)信息。這個(gè)寄存器包含各種狀態(tài)標(biāo)志,用于監(jiān)控USART模塊的當(dāng)前狀態(tài)以及各種操作(如發(fā)送、接收)的結(jié)果和錯(cuò)誤情況。該寄存器狀態(tài)標(biāo)志位過(guò)多,選用UART常用的幾個(gè)標(biāo)志位,如表所示。USART編程說(shuō)明小華半導(dǎo)體公司提供的驅(qū)動(dòng)庫(kù)包含了HC32F460芯片的UART驅(qū)動(dòng),相關(guān)的定義和說(shuō)明可以在hc32_ll_uart.C和hc32_ll_uart.h文件中找到。USART編程定義說(shuō)明在HC32F460.h文件中HC32F460的串口有4個(gè)單元,如下所示:#defineCM_USART1((CM_USART_TypeDef*)CM_USART1_BASE)#defineCM_USART2((CM_USART_TypeDef*)CM_USART2_BASE)#defineCM_USART3((CM_USART_TypeDef*)CM_USART3_BASE)#defineCM_USART4((CM_USART_TypeDef*)CM_USART4_BASE)在hc32_ll_usart.c文件中串口初始化的參數(shù)比較復(fù)雜,結(jié)構(gòu)體stc_usart_uart_init_t如下所示:typedefstruct{uint32_tu32ClockSrc;uint32_tu32ClockDiv;uint32_tu32CKOutput;uint32_tu32Baudrate;uint32_tu32DataWidth;uint32_tu32StopBit;uint32_tu32Parity;uint32_tu32OverSampleBit;uint32_tu32FirstBit;uint32_tu32StartBitPolarity;uint32_tu32HWFlowControl;}stc_usart_uart_init_t;串口時(shí)鐘源選擇:u32ClockSrc串口時(shí)鐘源只有兩個(gè)時(shí)鐘:外部時(shí)鐘源和內(nèi)部時(shí)鐘源。#defineUSART_CLK_SRC_INTERNCLK(0UL)#defineUSART_CLK_SRC_EXTCLK(USART_CR2_CLKC_1)串口時(shí)鐘分頻選擇:u32ClockDivUSART一共有4分頻方式,分別為1、4、16、64分頻。#defineUSART_CLK_DIV1(0UL)/*!<CLK*/#defineUSART_CLK_DIV4(1UL)/*!<CLK/4*/#defineUSART_CLK_DIV16(2UL)/*!<CLK/16*/#defineUSART_CLK_DIV64(3UL)/*!<CLK/64*/串口時(shí)鐘輸出選擇:u32CKOutputUSART使用內(nèi)部波特率生成器生成的時(shí)鐘,時(shí)鐘輸出到USARTn_CK管腳,輸出時(shí)鐘頻率和波特率相同。#defineUSART_CK_OUTPUT_DISABLE(0UL)#defineUSART_CK_OUTPUT_ENABLE(USART_CR2_CLKC_0)串口波特率選擇:u32Baudrate輸入自己想要的波特率。波特率最高不超過(guò)PCLK/8(MBps)。串口數(shù)據(jù)位選擇:u32DataWidthUSART的數(shù)據(jù)位可以設(shè)置為8位和9位,一般使用8位數(shù)據(jù)。#defineUSART_DATA_WIDTH_8BIT(0UL)/*!<8bits*/#defineUSART_DATA_WIDTH_9BIT(USART_CR1_M)/*!<9bits*/串口停止位選擇:u32StopBitUSART的停止位可以設(shè)置為1位和2位,一般使用1位停止位。#defineUSART_STOPBIT_1BIT(0UL)/*!<1stopbit*/#defineUSART_STOPBIT_2BIT(USART_CR2_STOP)/*!<2stopbit*/串口奇偶校驗(yàn)選擇:u32ParityUSART的奇偶校驗(yàn)為可以設(shè)置為奇校驗(yàn)和偶校驗(yàn)或沒(méi)有校驗(yàn),因?yàn)檫@個(gè)校驗(yàn)效果一般,所以通常是沒(méi)有校驗(yàn)。#defineUSART_PARITY_NONE(0UL)#defineUSART_PARITY_EVEN(USART_CR1_PCE)#defineUSART_PARITY_ODD(USART_CR1_PCE|USART_CR1_PS)串口過(guò)采樣選擇:u32OverSampleBit串口過(guò)采樣模式是一種串口通信中的一種技術(shù),它可以通過(guò)在接收端采樣多個(gè)數(shù)據(jù)位來(lái)提高通信的可靠性和準(zhǔn)確性。通常情況下,串口通信會(huì)在每個(gè)數(shù)據(jù)位之間進(jìn)行采樣,但在過(guò)采樣模式下,會(huì)在每個(gè)數(shù)據(jù)位的中間進(jìn)行多次采樣,以確保準(zhǔn)確地檢測(cè)到數(shù)據(jù)位的邊界和數(shù)值。#defineUSART_OVER_SAMPLE_16BIT(0UL)#defineUSART_OVER_SAMPLE_8BIT(USART_CR1_OVER8)串口開(kāi)始位選擇:u32FirstBit串口通信中的“開(kāi)始位”是指每個(gè)數(shù)據(jù)字節(jié)傳輸?shù)钠鹗嘉?。通常情況下,串口通信使用異步串行通信方式,其中數(shù)據(jù)字節(jié)的傳輸通過(guò)發(fā)送一個(gè)起始位來(lái)指示數(shù)據(jù)傳輸?shù)拈_(kāi)始。在常見(jiàn)的串口通信中,起始位通常是邏輯上的低電平(0),它標(biāo)志著數(shù)據(jù)傳輸?shù)拈_(kāi)始。當(dāng)接收端檢測(cè)到起始位時(shí),會(huì)開(kāi)始接收后續(xù)的數(shù)據(jù)位,并根據(jù)數(shù)據(jù)位的數(shù)量和數(shù)據(jù)傳輸速率來(lái)解析數(shù)據(jù)。#defineUSART_FIRST_BIT_LSB(0UL)#defineUSART_FIRST_BIT_MSB(USART_CR1_ML)串口起始位檢測(cè)選擇:u32StartBitPolarityUSART的起始位檢測(cè)支持高電平和低電平檢測(cè),一般是低電平開(kāi)始。#defineUSART_START_BIT_LOW(0UL)#defineUSART_START_BIT_FALLING(USART_CR1_SBS)串口硬件流控制選擇:u32HWFlowControl串口通信中的硬件流控制是一種機(jī)制,用于控制數(shù)據(jù)的流動(dòng),以防止數(shù)據(jù)的丟失或溢出。它通過(guò)向數(shù)據(jù)傳輸?shù)碾p方發(fā)送特定的控制信號(hào)來(lái)實(shí)現(xiàn)。在串口通信中,常見(jiàn)的硬件流控制包括RTS/CTS(請(qǐng)求發(fā)送/清除發(fā)送)和DTR/DSR(數(shù)據(jù)終端就緒/數(shù)據(jù)機(jī)就緒)。#defineUSART_HW_FLOWCTRL_CTS(USART_CR3_CTSE)#defineUSART_HW_FLOWCTRL_RTS(USART_CR3_CTSE>>1U)USART應(yīng)用函數(shù)說(shuō)明串口1初始化函數(shù)打開(kāi)BSP_UART.h文件,可以看到如下預(yù)定義:/*USBUSART1*/#defineUSART1_RX_PORT(GPIO_PORT_A)/*PA10:USART1_RX*/#defineUSART1_RX_PIN(GPIO_PIN_10)#defineUSART1_RX_GPIO_FUNC(GPIO_FUNC_33)#defineUSART1_TX_PORT(GPIO_PORT_A)/*PA09:USART1_TX*/#defineUSART1_TX_PIN(GPIO_PIN_09)#defineUSART1_TX_GPIO_FUNC(GPIO_FUNC_32)/*USART1interruptdefinition*/#defineUSART1_RX_RI_IRQn(INT001_IRQn)#defineUSART1_RX_RI_INT_SRC(INT_SRC_USART1_RI)#defineUSART1_RX_ERR_IRQn(INT002_IRQn)#defineUSART1_RX_ERR_INT_SRC(INT_SRC_USART1_EI)#defineUSART1_RX_TIMEOUT_IRQn(INT003_IRQn)#defineUSART1_RX_TIMEOUT_INT_SRC(INT_SRC_USART1_RTO)#defineUSART1_TX_CPLT_IRQn(INT004_IRQn)#defineUSART1_TX_CPLT_INT_SRC(INT_SRC_USART1_TCI)/*USARTtimeoutbitsdefinition*/#defineUSART_TIMEOUT_BITS(2000U)這里預(yù)定義了USART1的引腳、中斷、中斷號(hào)以及串口超時(shí)值。串口轉(zhuǎn)USB使用的芯片是CH340,在ZW-M607可穿戴系統(tǒng)應(yīng)用板卡中與HC32F460硬件連接PA9/U1_TX、PA10/U1_RX,代碼中預(yù)定義串口引腳如下所示:/*USBUSART1*/#defineUSART1_RX_PORT(GPIO_PORT_A)/*PA10:USART1_RX*/#defineUSART1_RX_PIN(GPIO_PIN_10)#defineUSART1_RX_GPIO_FUNC(GPIO_FUNC_33)#defineUSART1_TX_PORT(GPIO_PORT_A)/*PA09:USART1_TX*/#defineUSART1_TX_PIN(GPIO_PIN_09)#defineUSART1_TX_GPIO_FUNC(GPIO_FUNC_32)引腳PA09和PA10在HC32硬件手冊(cè)中屬于Func_Grp1,如圖所示。在Func_Grp1它可以映射串口1和串口2,這里選擇串口1。在BSP_UART.h文件中定義了串口接收發(fā)送數(shù)據(jù)結(jié)構(gòu)體,如下所示:///@brief串口接收發(fā)送數(shù)據(jù)結(jié)構(gòu)體typedefstruct{uint16_tUsart_RX_Len;//接收到的數(shù)據(jù)長(zhǎng)度
uint16_tUsart_RX_Count;//接收數(shù)據(jù)計(jì)數(shù)長(zhǎng)度
volatileuint8_tUsart_RX_End;//串口接收狀態(tài)標(biāo)志位
volatileuint8_tUsart_TX_End;//串口發(fā)送狀態(tài)標(biāo)志位
uint8_tu8Usart_RX_Buf[USART_RXTX_LEN_MAX];//串口接收數(shù)據(jù)區(qū)
uint8_tu8Usart_TX_Buf[USART_RXTX_LEN_MAX];//串口發(fā)送數(shù)據(jù)區(qū)}stc_usart_rxtx_data;打開(kāi)BSP_UART.c文件,定義了串口1和串口2接收發(fā)送結(jié)構(gòu)體。/*Usart1數(shù)據(jù)接收發(fā)送結(jié)構(gòu)體。*/stc_usart_rxtx_datastcUsart1RXTXData={NULL};/*Usart2數(shù)據(jù)接收發(fā)送結(jié)構(gòu)體。*/stc_usart_rxtx_datastcUsart2RXTXData={NULL};看到USART1_Init()函數(shù)先定義USART和中斷的結(jié)構(gòu)體,如下所示:
stc_usart_uart_init_tstcUartInit;stc_irq_signin_config_tstcIrqSigninConfig;1)配置串口引腳RX和TXGPIO_SetFunc(USART1_RX_PORT,USART1_RX_PIN,USART1_RX_GPIO_FUNC);GPIO_SetFunc(USART1_TX_PORT,USART1_TX_PIN,USART1_TX_GPIO_FUNC);2)使能串口時(shí)鐘USART1/*Enableperipheralclock*/FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USART1,ENABLE);3)初始化串口
(void)USART_UART_StructInit(&stcUartInit);stcUartInit.u32ClockDiv=USART_CLK_DIV4;stcUartInit.u32CKOutput=USART_CK_OUTPUT_ENABLE;stcUartInit.u32Baudrate=Baudrate;stcUartInit.u32OverSampleBit=USART_OVER_SAMPLE_8BIT;while(LL_OK!=USART_UART_Init(CM_USART1,&stcUartInit,NULL));這里選擇串口分頻為4分頻,將串口時(shí)鐘輸出引腳使能,填入自己波特率,串口過(guò)采樣率設(shè)置為8位。4)串口發(fā)送完成中斷stcIrqSigninConfig.enIRQn=USART1_TX_CPLT_IRQn;//發(fā)送完成中斷stcIrqSigninConfig.enIntSrc=USART1_TX_CPLT_INT_SRC;stcIrqSigninConfig.pfnCallback=&USART1_TxComplete_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSigninConfig);NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);NVIC_SetPriority(stcIrqSigninConfig.enIRQn,DDL_IRQ_PRIO_DEFAULT);NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);5)串口接收中斷stcIrqSigninConfig.enIRQn=USART1_RX_RI_IRQn;//接收中斷stcIrqSigninConfig.enIntSrc=USART1_RX_RI_INT_SRC;stcIrqSigninConfig.pfnCallback=&USART1_RX_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSigninConfig);NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);NVIC_SetPriority(stcIrqSigninConfig.enIRQn,DDL_IRQ_PRIO_DEFAULT);NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);6)串口接收超時(shí)中斷stcIrqSigninConfig.enIRQn=USART1_RX_TIMEOUT_IRQn;//接收超時(shí)中斷stcIrqSigninConfig.enIntSrc=USART1_RX_TIMEOUT_INT_SRC;stcIrqSigninConfig.pfnCallback=&USART1_RxTimeout_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSigninConfig);NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);NVIC_SetPriority(stcIrqSigninConfig.enIRQn,DDL_IRQ_PRIO_DEFAULT);NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);7)串口接收錯(cuò)誤中斷stcIrqSigninConfig.enIRQn=USART1_RX_ERR_IRQn;//接受錯(cuò)誤中斷stcIrqSigninConfig.enIntSrc=USART1_RX_ERR_INT_SRC;stcIrqSigninConfig.pfnCallback=&USART1_RxError_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSigninConfig);NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);NVIC_SetPriority(stcIrqSigninConfig.enIRQn,DDL_IRQ_PRIO_DEFAULT);NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);8)串口功能使能USART_FuncCmd(CM_USART1,(USART_RX|USART_INT_RX|USART_RX_TIMEOUT|USART_INT_RX_TIMEOUT),ENABLE);這里開(kāi)啟了USART1的接收、接收中斷、接收超時(shí)、接收超時(shí)中斷,默認(rèn)USART1的發(fā)送功能不開(kāi)啟,在發(fā)送數(shù)據(jù)時(shí)開(kāi)啟USART1的發(fā)送功能。串口1接收超時(shí)配置函數(shù)由于串口使用了接收超時(shí)功能,所以還需要配置TIM0,找到TMR0_USART_Config()函數(shù)。/***@description:串口接收超時(shí)定時(shí)器初始化函數(shù)(USART1、USART2、USART3、USART4)*@return{*}*/voidTMR0_USART_Config(void){uint16_tu16Div;uint16_tu16Delay;uint16_tu16CompareValue;stc_tmr0_init_tstcTmr0Init;FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR0_1,ENABLE);FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR0_2,ENABLE);/*InitializeTMR0basefunction.*/stcTmr0Init.u32ClockSrc=TMR0_CLK_SRC_XTAL32;stcTmr0Init.u32ClockDiv=TMR0_CLK_DIV8;stcTmr0Init.u32Func=TMR0_FUNC_CMP;if(TMR0_CLK_DIV1==stcTmr0Init.u32ClockDiv){u16Delay=7U;}elseif(TMR0_CLK_DIV2==stcTmr0Init.u32ClockDiv){u16Delay=5U;}elseif((TMR0_CLK_DIV4==stcTmr0Init.u32ClockDiv)||(TMR0_CLK_DIV8==stcTmr0Init.u32ClockDiv)||(TMR0_CLK_DIV16==stcTmr0Init.u32ClockDiv)){u16Delay=3U;}else{u16Delay=2U;}u16Div=(uint16_t)1U<<(stcTmr0Init.u32ClockDiv>>TMR0_BCONR_CKDIVA_POS);u16CompareValue=((USART_TIMEOUT_BITS+u16Div-1U)/u16Div)-u16Delay;stcTmr0Init.u16CompareValue=u16CompareValue;(void)TMR0_Init(CM_TMR0_1,TMR0_CH_A,&stcTmr0Init);(void)TMR0_Init(CM_TMR0_1,TMR0_CH_B,&stcTmr0Init);(void)TMR0_Init(CM_TMR0_2,TMR0_CH_A,&stcTmr0Init);(void)TMR0_Init(CM_TMR0_2,TMR0_CH_B,&stcTmr0Init);TMR0_HWStartCondCmd(CM_TMR0_1,TMR0_CH_A,ENABLE);TMR0_HWStartCondCmd(CM_TMR0_1,TMR0_CH_B,ENABLE);TMR0_HWStartCondCmd(CM_TMR0_2,TMR0_CH_A,ENABLE);TMR0_HWStartCondCmd(CM_TMR0_2,TMR0_CH_B,ENABLE);}串口1接收中斷函數(shù)找到USART1_RX_IrqCallback()函數(shù),這個(gè)函數(shù)里使用stcUsart1RXTXData.u8Usart_RX_Buf接收數(shù)據(jù),并且stcUsart1RXTXData.Usart_RX_Count接收計(jì)數(shù)增加,清除中斷標(biāo)志位。staticvoidUSART1_RX_IrqCallback(void){stcUsart1RXTXData.u8Usart_RX_Buf[stcUsart1RXTXData.Usart_RX_Count++]=(uint8_t)USART_ReadData(CM_USART1);USART_ClearStatus(CM_USART1,USART_FLAG_RX_FULL);}串口1接收超時(shí)中斷函數(shù)找到USART1_RxTimeout_IrqCallback()函數(shù),當(dāng)接收超時(shí)后就會(huì)觸發(fā)該函數(shù),表示接收完一包數(shù)據(jù)。將串口接收計(jì)數(shù)的值(stcUsart1RXTXData.Usart_RX_Count)賦給串口接收長(zhǎng)度(stcUsart1RXTXData.Usart_RX_Len),然后將計(jì)數(shù)值清零,串口接收標(biāo)志位置一,最后清除串口接收超時(shí)中斷。staticvoidUSART1_RxTimeout_IrqCallback(void){stcUsart1RXTXData.Usart_RX_Len=stcUsart1RXTXData.Usart_RX_Count;stcUsart1RXTXData.Usart_RX_Count=0;stcUsart1RXTXData.Usart_RX_End=1;USART_ClearStatus(CM_USART1,USART_FLAG_RX_TIMEOUT);}串口1接收錯(cuò)誤中斷函數(shù)找到USART1_RxError_IrqCallback()函數(shù),串口發(fā)送錯(cuò)誤中斷時(shí)才會(huì)進(jìn)入此函數(shù),主要清除串口溢出、校驗(yàn)、幀錯(cuò)誤中斷。staticvoidUSART1_RxError_IrqCallback(void){(void)USART_ReadData(CM_USART1);USART_ClearStatus(CM_USART1,(USART_FLAG_PARITY_ERR|USART_FLAG_FRAME_ERR|USART_FLAG_OVERRUN));}串口1發(fā)送中斷函數(shù)找到USART1_TxComplete_IrqCallback()函數(shù),當(dāng)串口發(fā)送完數(shù)據(jù)時(shí)會(huì)產(chǎn)生發(fā)送完成中斷進(jìn)入此函數(shù),先把串口發(fā)送完成標(biāo)志位置一,然后關(guān)閉串口發(fā)送和串口發(fā)送完成,這是為了防止意外發(fā)送才關(guān)閉,最后清除串口發(fā)送完成標(biāo)志位。//串口1發(fā)送完成中斷函數(shù)staticvoidUSART1_TxComplete_IrqCallback(void){stcUsart1RXTXData.Usart_TX_End=1;USART_FuncCmd(CM_USART1,(USART_TX|USART_INT_TX_CPLT),DISABLE);USART_ClearStatus(CM_USART1,USART_FLAG_TX_CPLT);}串口1發(fā)送一包數(shù)據(jù)函數(shù)找到USART1_Send_BUF()函數(shù),通過(guò)形參傳輸需要發(fā)送的數(shù)據(jù)地址和數(shù)據(jù)長(zhǎng)度,使用for語(yǔ)句循環(huán)通過(guò)USART_WriteData()函數(shù)循環(huán)發(fā)送數(shù)據(jù)。/***@description:串口1發(fā)送一包數(shù)據(jù)函數(shù)*@param{uint8_t}*buf:發(fā)送一包數(shù)據(jù)地址。*@param{uint32_t}len:發(fā)送數(shù)據(jù)長(zhǎng)度。*@return{*}*/voidUSART1_Send_BUF(uint8_t*buf,uint32_tlen)//發(fā)送數(shù)據(jù)包{
uint8_ti;for(i=0;i<len;i++){while(USART_GetStatus(CM_USART1,USART_FLAG_TX_EMPTY)==RESET);USART_FuncCmd(CM_USART1,USART_TX,ENABLE);//默認(rèn)串口發(fā)送引腳是關(guān)閉的,這里需要打開(kāi)
USART_WriteData(CM_USART1,*(buf+i));}}在發(fā)送數(shù)據(jù)前,需要檢查發(fā)送寄存器是否為空,然后把串口發(fā)送引腳打開(kāi),才能發(fā)送數(shù)據(jù)。串口1打印Printf函數(shù)在BSP_UART.c文件最后,有一個(gè)fputc()函數(shù)重定義。#pragmaimport(__use_no_semihosting)//標(biāo)準(zhǔn)庫(kù)需要支持的函數(shù)struct__FILE{inthandle;};FILE__stdout;//定義_sys_exit()以避免工作在半主機(jī)狀態(tài)void_sys_exit(intx){x=x;}//重定義fputc函數(shù)//這個(gè)需要根據(jù)MCU和我們希望printf從哪個(gè)串口輸出來(lái)確認(rèn)__WAIT_TODO__intfputc(intch,FILE*f){//循環(huán)等待直到發(fā)送緩沖區(qū)為空(TXEmpty)此時(shí)可以發(fā)送數(shù)據(jù)到緩沖區(qū)
while(USART_GetS
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 業(yè)務(wù)培訓(xùn)與人才培養(yǎng)責(zé)任承諾書(shū)9篇
- 2025年湖南省各市州湘能農(nóng)電服務(wù)有限公司聯(lián)合招聘780人考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解(網(wǎng)校專(zhuān)用)
- 2025年西安明珠電力安裝工程有限公司招聘(2人)模擬試卷及參考答案詳解一套
- 采購(gòu)管理標(biāo)準(zhǔn)化流程及工具
- 合同簽訂關(guān)鍵點(diǎn)風(fēng)險(xiǎn)防控檢查清單
- 2025年甘肅省河西學(xué)院附屬?gòu)堃慈嗣襻t(yī)院非事業(yè)編制護(hù)理崗位工作人員招聘20人考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解(名校卷)
- 2025年河北承德醫(yī)學(xué)院附屬醫(yī)院招聘工作人員20名考前自測(cè)高頻考點(diǎn)模擬試題及完整答案詳解1套
- 科技研發(fā)成果承諾函6篇范文
- 食品安全檢測(cè)達(dá)標(biāo)承諾書(shū)9篇范文
- 租房人員安全培訓(xùn)課件
- 《路基構(gòu)造》課件
- 2025年秋新北師大版數(shù)學(xué)二年級(jí)上冊(cè)全冊(cè)教案
- 2025年排污許可試題及答案
- 《大學(xué)美育(AIGC版微課版)》課件 項(xiàng)目二 繪畫(huà)之美
- .新課7 必修第一冊(cè)Unit4 Loo.king good,feeling good (詞匯+課文)(譯林版2020)(解析版)2025年初升高英語(yǔ)無(wú)憂(yōu)銜接(通.用版)
- 復(fù)發(fā)轉(zhuǎn)移性宮頸癌診療指南(2025版)解讀課件
- 檢驗(yàn)科質(zhì)量標(biāo)準(zhǔn)手冊(cè)
- 工業(yè)煤氣安全知識(shí)培訓(xùn)課件
- 初三數(shù)學(xué)二次函數(shù)測(cè)試試卷及答案
- 急診科多發(fā)創(chuàng)傷搶救流程指南
- 曲臂式高空作業(yè)車(chē)專(zhuān)項(xiàng)施工方案
評(píng)論
0/150
提交評(píng)論