串口通訊 (Serial Communication) 是一種設(shè)備間非常常用的串行通訊方式,因?yàn)樗?jiǎn)單便捷,大部分電子設(shè)備都支持該通訊方式。串口在CKS32上應(yīng)用最多的莫過于“打印”程序信息,一般在硬件設(shè)計(jì)時(shí)都會(huì)預(yù)留一個(gè)串口連接電腦,用于在調(diào)試程序時(shí)可以把一些調(diào)試信息“打印”在電腦端的串口調(diào)試助手工具上,從而了解程序運(yùn)行是否正確、指出程序運(yùn)行出錯(cuò)位置等等。
CKS32F4xx系列產(chǎn)品串口介紹
CKS32F4xx系列最多可提供6路串口,其中四個(gè)USART和兩個(gè)UART。USART和UART在引腳上的區(qū)別是:UART只有RX和TX引腳,而USART除了這兩個(gè)引腳之外,還有流控引腳RTS和CTS,以及時(shí)鐘引腳SCLK。CKS32F4xx系列產(chǎn)品的USART1和USART6時(shí)鐘來源于APB2總線時(shí)鐘,其最大頻率為84MHz,因此這兩個(gè)串口的通信速度最高可達(dá)10.5Mbit/s。而其它四個(gè)的時(shí)鐘來源于APB1總線時(shí)鐘,其最大頻率為42MHz,因此這四個(gè)串口的通信速度最高可達(dá)5.25Mbit/s。因?yàn)閁SART有SCLK引腳,因此CKS32F4xx系列產(chǎn)品的USART具有同步通信功能,而UART只有異步通信功能。同時(shí)USART還支持ISO7816的智能卡接口。但是當(dāng)USART和UART都用在異步通信的時(shí)候,兩者是沒有什么區(qū)別的。CKS32F4xx系列的6個(gè)串口都支持DMA傳輸。
CKS32F4xx系列產(chǎn)品的串口在發(fā)送數(shù)據(jù)時(shí),當(dāng)發(fā)送使能位TE置1之后,發(fā)送器開始會(huì)先發(fā)送一個(gè)空閑幀(一個(gè)數(shù)據(jù)幀長(zhǎng)度的高電平),然后就可以往USART_DR寄存器寫入要發(fā)送的數(shù)據(jù)。在寫入最后一個(gè)數(shù)據(jù)后,需要等USART狀態(tài)寄存器(USART_SR)的TC位為1,表示數(shù)據(jù)傳輸完成,如果USART_CR1寄存器的TCIE位置1,將產(chǎn)生中斷。串口發(fā)送的一個(gè)字符幀由三個(gè)部分組成:起始位+數(shù)據(jù)幀+停止位。起始位是一個(gè)位周期的低電平;數(shù)據(jù)幀就是我們要發(fā)送的8位或9位數(shù)據(jù),數(shù)據(jù)是從最低位開始傳輸?shù)?;停止位是一定時(shí)間周期的高電平。停止位時(shí)間長(zhǎng)短是可以通過USART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可選0.5個(gè)、1個(gè)、1.5個(gè)和2個(gè)停止位。默認(rèn)使用1個(gè)停止位。2個(gè)停止位適用于正常USART模式、單線模式和調(diào)制解調(diào)器模式。0.5個(gè)和1.5個(gè)停止位用于智能卡模式。
CKS32F4xx系列產(chǎn)品的串口在接收數(shù)據(jù)時(shí),需要先將USART_CR1寄存器的RE 位置1,使能USART接收,使得接收器在RX線開始搜索起始位。在確定到起始位后就根據(jù)RX線電平狀態(tài)把數(shù)據(jù)存放在接收移位寄存器內(nèi)。接收完成后就把接收移位寄存器數(shù)據(jù)移到RDR內(nèi),并把USART_SR寄存器的RXNE位置1,同時(shí)如果 USART_CR2寄存器的RXNEIE置1的話可以產(chǎn)生中斷。
CKS32F4xx系列產(chǎn)品控制器的USART支持奇偶校驗(yàn)。當(dāng)使用校驗(yàn)位時(shí),串口傳輸?shù)拈L(zhǎng)度將是8位的數(shù)據(jù)幀加上1位的校驗(yàn)位總共9位,奇偶校驗(yàn)由硬件自動(dòng)完成。啟動(dòng)了奇偶校驗(yàn)控制之后,在發(fā)送數(shù)據(jù)幀時(shí)會(huì)自動(dòng)添加校驗(yàn)位,接收數(shù)據(jù)時(shí)自動(dòng)驗(yàn)證校驗(yàn)位。接收數(shù)據(jù)時(shí)如果出現(xiàn)奇偶校驗(yàn)位驗(yàn)證失敗,則可以產(chǎn)生奇偶校驗(yàn)中斷。使能了奇偶校驗(yàn)控制后,每個(gè)字符幀的格式將變成:起始位+數(shù)據(jù)幀 +校驗(yàn)位+停止位。
USART有多個(gè)中斷請(qǐng)求事件,具體如下表所示:在串口的中斷服務(wù)函數(shù)里,通過對(duì)這些中斷事件標(biāo)志的檢測(cè),就可以判斷出是何種事件發(fā)生,然后再做出相應(yīng)的處理。
CKS32F4xx系列產(chǎn)品串口的配置
接下來我們講解如何利用CKS32F4xx系列固件庫來完成對(duì)串口的配置使用。首先標(biāo)準(zhǔn)庫函數(shù)定義了一個(gè)串口初始化結(jié)構(gòu)體USART_InitTypeDef,結(jié)構(gòu)體成員用于設(shè)置串口的工作參數(shù),并由外設(shè)初始化配置函數(shù)USART_Init()調(diào)用,從而完成對(duì)串口相應(yīng)寄存器的配置,進(jìn)一步達(dá)到完成對(duì)串口配置的目的。
typedef struct { uint32_t USART_BaudRate; // 波特率 uint16_t USART_WordLength; // 字長(zhǎng) uint16_t USART_StopBits; // 停止位 uint16_t USART_Parity; // 校驗(yàn)位 uint16_t USART_Mode; // USART 模式 uint16_t USART_HardwareFlowControl; // 硬件流控制 } USART_InitTypeDef;
結(jié)構(gòu)體中各個(gè)成員變量的介紹及初始化時(shí)可被賦的值如下:
1) USART_BaudRate:波特率設(shè)置。一般設(shè)置為 2400、9600、19200、115200。標(biāo)準(zhǔn)庫函數(shù)會(huì)根據(jù)設(shè)定值計(jì)算得到USARTDIV值,并設(shè)置USART_BRR寄存器值。
2) USART_WordLength:數(shù)據(jù)幀字長(zhǎng),可選8位或9位。它設(shè)定USART_CR1 寄存器的M位的值。如果沒有使能奇偶校驗(yàn)控制,一般使用8位數(shù)據(jù)幀長(zhǎng);如果使能了奇偶校驗(yàn)則一般設(shè)置為9位數(shù)據(jù)幀長(zhǎng)。
#define USART_WordLength_8b ((uint16_t)0x0000) #define USART_WordLength_9b ((uint16_t)0x1000)
3) USART_StopBits: 停止位設(shè)置,可選0.5個(gè)、1個(gè)、1.5個(gè)和 2個(gè)停止位,它設(shè)定USART_CR2寄存器的STOP[1:0]位的值,一般我們選擇1個(gè)停止位。
#define USART_StopBits_1 ((uint16_t)0x0000) #define USART_StopBits_0_5 ((uint16_t)0x1000) #define USART_StopBits_2 ((uint16_t)0x2000) #define USART_StopBits_1_5 ((uint16_t)0x3000)
4) USART_Parity: 奇偶校驗(yàn)控制選擇,可選USART_Parity_No(無校驗(yàn))、USART_Parity_Even(偶校驗(yàn))以及USART_Parity_Odd(奇校驗(yàn)),它設(shè)定 USART_CR1寄存器的PCE位和PS位的值。
#define USART_Parity_No ((uint16_t)0x0000) #define USART_Parity_Even ((uint16_t)0x0400) #define USART_Parity_Odd ((uint16_t)0x0600)
5) USART_Mode: USART模式選擇,有USART_Mode_Rx和USART_Mode_Tx,允許使用邏輯或運(yùn)算選擇兩個(gè),它設(shè)定USART_CR1寄存器的RE位和TE位。
#define USART_Mode_Rx ((uint16_t)0x0004) #define USART_Mode_Tx ((uint16_t)0x0008)
6) USART_HardwareFlowControl: 硬件流控制選擇,只有在硬件流控制模式才有效,可選使能RTS、使能CTS、同時(shí)使能RTS和CTS、不使能硬件流。
#define USART_HardwareFlowControl_None ((uint16_t)0x0000) #define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) #define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) #define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)
當(dāng)使用同步模式時(shí)需要配置SCLK引腳輸出脈沖的屬性,標(biāo)準(zhǔn)庫使用一個(gè)時(shí)鐘初始化結(jié)構(gòu)體USART_ClockInitTypeDef來設(shè)置,不使用時(shí)不需要設(shè)置。
typedef struct { uint16_t USART_Clock; // 時(shí)鐘使能控制 uint16_t USART_CPOL; // 時(shí)鐘極性 uint16_t USART_CPHA; // 時(shí)鐘相位 uint16_t USART_LastBit; // 最尾位時(shí)鐘脈沖 } USART_ClockInitTypeDef;
結(jié)構(gòu)體中各個(gè)成員變量的介紹及初始化時(shí)可被賦的值如下:
1) USART_Clock: 同步模式下SCLK引腳上時(shí)鐘輸出使能控制,可選禁止時(shí)鐘輸出(USART_Clock_Disable)或開啟時(shí)鐘輸出(USART_Clock_Enable);如果使用同步模式發(fā)送,一般都需要開啟時(shí)鐘。它設(shè)定USART_CR2寄存器的CLKEN位的值。
#define USART_Clock_Disable ((uint16_t)0x0000) #define USART_Clock_Enable ((uint16_t)0x0800)
2) USART_CPOL: 同步模式下SCLK引腳上輸出時(shí)鐘極性設(shè)置,可設(shè)置在空閑時(shí)SCLK引腳為低電平(USART_CPOL_Low)或高電平(USART_CPOL_High)。它設(shè)定USART_CR2寄存器的CPOL位的值。
#define USART_CPOL_Low ((uint16_t)0x0000) #define USART_CPOL_High ((uint16_t)0x0400)
3) USART_CPHA: 同步模式下SCLK引腳上輸出時(shí)鐘相位設(shè)置,可設(shè)置在時(shí)鐘第一個(gè)變化沿捕獲數(shù)據(jù)(USART_CPHA_1Edge)或在時(shí)鐘第二個(gè)變化沿捕獲數(shù)據(jù)。它設(shè)定USART_CR2寄存器的CPHA位的值。USART_CPHA與USART_CPOL配合使用可以獲得多種模式時(shí)鐘關(guān)系。
#define USART_CPHA_1Edge ((uint16_t)0x0000) #define USART_CPHA_2Edge ((uint16_t)0x0200)
4) USART_LastBit: 選擇在發(fā)送最后一個(gè)數(shù)據(jù)位的時(shí)候時(shí)鐘脈沖是否在 SCLK引腳輸出,可以是不輸出脈沖(USART_LastBit_Disable)、輸出脈沖 (USART_LastBit_Enable)。它設(shè)定USART_CR2寄存器的LBCL位的值。
#define USART_LastBit_Disable ((uint16_t)0x0000) #define USART_LastBit_Enable ((uint16_t)0x0100)
要完成串口正常的收發(fā)數(shù)據(jù),還需要標(biāo)準(zhǔn)庫中的這些函數(shù)配合使用。
(1) void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)函數(shù):
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) { assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_DATA(Data)); USARTx->DR = (Data & (uint16_t)0x01FF); }
該函數(shù)的功能是向串口寄存器USART_DR寫入一個(gè)數(shù)據(jù),有兩個(gè)入口參數(shù),第一個(gè)是選擇是哪個(gè)串口,其可選擇的值為USART1、USART2、USART3、USART6、UART4、UART5。第二個(gè)參數(shù)是待發(fā)送的數(shù)據(jù),其值只要滿足如下條件即可:
#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF)
(2) uint16_t USART_ReceiveData(USART_TypeDef* USARTx)函數(shù):
uint16_t USART_ReceiveData(USART_TypeDef* USARTx) { assert_param(IS_USART_ALL_PERIPH(USARTx)); return (uint16_t)(USARTx->DR & (uint16_t)0x01FF); }
該函數(shù)的功能是從USART_DR寄存器讀取串口接收到的數(shù)據(jù),只有一個(gè)入口參數(shù),即選擇是哪個(gè)串口。
(3) void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)函數(shù):
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) { assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { USARTx->CR1 |= USART_CR1_UE; } else { USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE); } }
要完成串口正常的收發(fā)數(shù)據(jù),還需要標(biāo)準(zhǔn)庫中的這些函數(shù)配合使用。
該函數(shù)的功能是使能串口。有兩個(gè)入口參數(shù),第一個(gè)是選擇是哪個(gè)串口,其可選擇的值為USART1、USART2、USART3、USART6、UART4、UART5。第二個(gè)參數(shù)是使能或者不使能,其值為DISABLE或者ENABLE。
(4) void USART3_IRQHandler(void) 串口中斷服務(wù)程序函數(shù):
當(dāng)發(fā)生中斷的時(shí)候,程序就會(huì)執(zhí)行中斷服務(wù)函數(shù)。然后我們?cè)谥袛喾?wù)函數(shù)中編寫我們相應(yīng)的邏輯代碼即可。
(5) FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)函數(shù):
該函數(shù)的功能是讀取串口的狀態(tài),第一個(gè)入口參數(shù)和上面的一樣。這里重點(diǎn)講解第二個(gè)入口參數(shù),它是標(biāo)示我們要查看串口的哪種狀態(tài),可選的值及其代表的意義如表格所示:
(6) ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)函數(shù):
當(dāng)我們使能了某個(gè)中斷的時(shí)候,當(dāng)該中斷發(fā)生了,就會(huì)設(shè)置狀態(tài)寄存器中的某個(gè)標(biāo)志位。經(jīng)常我們?cè)谥袛嗵幚砗瘮?shù)中,要判斷該中斷是哪種中斷,這時(shí)候就會(huì)使用該函數(shù)。第二個(gè)入口參數(shù)可選的值及其代表的意義如表格所示:
串口接發(fā)通信實(shí)驗(yàn)
接下來我們根據(jù)上面講解的串口通信的知識(shí),實(shí)際編寫一個(gè)軟件程序?qū)崿F(xiàn)串口的接發(fā)通信。代碼實(shí)現(xiàn)的現(xiàn)象是在開發(fā)板一上電時(shí)會(huì)通過print函數(shù)發(fā)送一串字符串“start”給電腦,然后開發(fā)板進(jìn)入中斷接收等待狀態(tài)。如果電腦有發(fā)送數(shù)據(jù)過來,開發(fā)板就會(huì)產(chǎn)生中斷, 我們?cè)谥袛喾?wù)函數(shù)里接收數(shù)據(jù),并將接收到數(shù)據(jù)標(biāo)志位置1,在主函數(shù)里對(duì)標(biāo)志位經(jīng)過判斷之后再把數(shù)據(jù)返回發(fā)送給電腦。
1.編程要點(diǎn)
1) 使能RX和TX引腳GPIO時(shí)鐘和USART3時(shí)鐘;
2) 初始化GPIO,并將GPIO復(fù)用到USART3上;
3) 配置USART3參數(shù);
4) 配置中斷控制器并使能USART3接收中斷;
5) 使能USART3;
6) 在USART3接收中斷服務(wù)函數(shù)里接收數(shù)據(jù)并將接收到數(shù)據(jù)的標(biāo)志位置1。
2.代碼分析
代碼清單1:USART3初始化配置
其初始化串口的過程和我們前面講解的編程要點(diǎn)中的過程是一致的。因?yàn)槲覀兪褂玫搅舜诘闹袛嘟邮?,因此需要開啟串口3的NVIC中斷并對(duì)其進(jìn)行配置。
void uart_init(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //使能RX和TX引腳GPIO時(shí)鐘 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能USART3時(shí)鐘 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //初始化GPIO,并將GPIO復(fù)用到USART3上 GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB,&GPIO_InitStructure); //配置USART3參數(shù) USART_InitStructure.USART_BaudRate = bound;//波特率設(shè)置 USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); //使能USART3 USART_Cmd(USART3, ENABLE); //配置中斷控制器并使能USART3接收中斷; #if EN_USART3_RX USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #endif }
代碼清單2:USART3中斷服務(wù)函數(shù)
當(dāng)USART3有接收到數(shù)據(jù)時(shí)就會(huì)執(zhí)行USART3_IRQHandler函數(shù)。然使用if 語句來判斷是否是真的產(chǎn)生USART3數(shù)據(jù)接收這個(gè)中斷事件,如果是真的就使用 USART數(shù)據(jù)讀取函數(shù)USART_ReceiveData讀取數(shù)據(jù)到指定存儲(chǔ)區(qū)Res,并將自己定義的一個(gè)標(biāo)志位Rxflag置1。
void USART3_IRQHandler(void) { if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { Res =USART_ReceiveData(USART3);//(USART1->DR); Rxflag=1; } }
代碼清單3:字符函數(shù)
//發(fā)送一個(gè)字符函數(shù) static void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch ) { USART_SendData(pUSARTx,ch); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); } //發(fā)送指定長(zhǎng)度字符的函數(shù) void Usart_SendStr_length( USART_TypeDef * pUSARTx, uint8_t *str,uint32_t strlen ) { unsigned int k=0; do { Usart_SendByte( pUSARTx, *(str + k) ); k++; } while(k < strlen); }
Usart_SendByte函數(shù)用來在指定USART發(fā)送一個(gè)ASCLL碼值字符,它有兩個(gè)形參,第一個(gè)為USART,第二個(gè)為待發(fā)送的字符。它是通過調(diào)用庫函數(shù) USART_SendData來實(shí)現(xiàn)的,并且增加了等待發(fā)送完成功能。
Usart_SendString函數(shù)用來發(fā)送一個(gè)字符串,它實(shí)際是調(diào)用 Usart_SendByte函數(shù)發(fā)送每個(gè)字符,直到遇到空字符才停止發(fā)送。最后使用循環(huán)檢測(cè)發(fā)送完成的事件標(biāo)志來實(shí)現(xiàn)保證數(shù)據(jù)發(fā)送完成后才退出函數(shù)。
代碼清單4:printf函數(shù)支持
#if 1 #pragma import(__use_no_semihosting) struct __FILE { int handle; }; FILE __stdout; void _sys_exit(int x) { x = x; } int fputc(int ch, FILE *f) { while((USART3->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢 USART3->DR = (u8) ch; return ch; } #endif
這段代碼是引入printf函數(shù)支持所必須的,加入這段代碼加入之后便可以通過printf函數(shù)向串口發(fā)送我們需要的內(nèi)容,方便開發(fā)過程中查看代碼執(zhí)行情況以及一些變量值。如果我們使用不同的串口,對(duì)這段代碼的修改一般也只是用來改變 printf 函數(shù)針對(duì)的串口號(hào),比如將上述代碼中的USART3改成USART1即可。
代碼清單5:主函數(shù)
u8 Res; u8 Rxflag; u8 USART_RX_BUF[USART_REC_LEN]; u8 usRxCount=0; int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); uart_init(115200); printf("start "); while(1) { if(Rxflag) { if (usRxCount < sizeof(USART_RX_BUF)) { USART_RX_BUF[usRxCount++] = Res; } else { usRxCount = 0; } /* 遇到換行字符,就把數(shù)據(jù)發(fā)送到串口助手*/ if (Res == 0x0A) /* 換行字符 */ { Usart_SendStr_length(USART3,USART_RX_BUF, usRxCount ); usRxCount = 0; } Rxflag=0; } } }
首先我們調(diào)用NVIC_PriorityGroupConfig函數(shù)完成對(duì)NVIC的初始化,然后調(diào)用uart_init函數(shù)完成對(duì)串口的初始化,這里將串口波特率設(shè)置成可115200(位/秒)。接著利用printf函數(shù)發(fā)送一次“start”到串口調(diào)試助手。然后對(duì)Rxflag的值進(jìn)行判斷,當(dāng)接收到了數(shù)據(jù),即Rxflag的值為1時(shí),對(duì)接收的數(shù)據(jù)長(zhǎng)度進(jìn)行判斷,USART_REC_LEN是我們定義的接收最大字節(jié)數(shù),這個(gè)值可以根據(jù)自己的需要進(jìn)行修改。當(dāng)接收的數(shù)據(jù)在最大字節(jié)數(shù)范圍之內(nèi)時(shí),把接收到的數(shù)據(jù)賦值到數(shù)組USART_RX_BUF里,同時(shí)當(dāng)接收到的數(shù)據(jù)為0x0A,即換行字符時(shí),利用Usart_SendStr_length函數(shù)將接收到的數(shù)據(jù)發(fā)送出去。因此在利用串口調(diào)試助手向MCU發(fā)送數(shù)據(jù)時(shí),要勾選“加回車換行符”。
在本程序中我們?cè)O(shè)置串口進(jìn)入中斷的方式為數(shù)據(jù)寄存器非空即進(jìn)一次中斷,因此每個(gè)字節(jié)的接收都會(huì)進(jìn)一次中斷,這會(huì)導(dǎo)致CPU的效率大大降低,因此在下一節(jié)我們將會(huì)講解利用DMA的方式對(duì)串口的數(shù)據(jù)進(jìn)行發(fā)送和接收。
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120376 -
串口
+關(guān)注
關(guān)注
14文章
1554瀏覽量
76522 -
引腳
+關(guān)注
關(guān)注
16文章
1196瀏覽量
50486 -
uart
+關(guān)注
關(guān)注
22文章
1235瀏覽量
101397 -
串口通信
+關(guān)注
關(guān)注
34文章
1626瀏覽量
55529
原文標(biāo)題:MCU微課堂 | CKS32F4xx系列產(chǎn)品串口通信
文章出處:【微信號(hào):中科芯MCU,微信公眾號(hào):中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論