串口資源
資源配置
CH32V208 系列,是基于 RISC-V 指令架構(gòu)設(shè)計(jì)的 32 位 RISC 內(nèi)核 MCU,根據(jù)封裝的不同,可用的USART串口資源如下表所示:
且USART具有如下主要特征:
(1)全雙工或半雙工的同步或異步通信
(2) 支持分?jǐn)?shù)波特率發(fā)生器,最高 9Mbps
(3)可編程數(shù)據(jù)長(zhǎng)度、停止位長(zhǎng)度
(4)支持 LIN,IrDA 編碼器,智能卡
(5)支持 DMA
(6)支持多種中斷
其內(nèi)部模塊圖實(shí)現(xiàn)如下:
同步模式
和其他單片機(jī)不同的是,ch32V208處理器的USART還支持同步模式,就是說系統(tǒng)在使用 USART 模塊時(shí)可以輸出時(shí)鐘信號(hào)。在開啟同步模式對(duì)外發(fā)送數(shù)據(jù)時(shí),CK引腳會(huì)同時(shí)對(duì)外輸出時(shí)鐘。 要開啟同步模式,只需要對(duì)控制寄存器 2(R16_USARTx_CTLR2)的 CLKEN 位置位,即可,但有兩點(diǎn)注意:
(1)開啟同步模式同時(shí)需要關(guān)閉LIN 模式、智能卡模式、紅外模式和半雙工模式,即保證 SCEN、HDSEL 和 IREN 位處于復(fù)位狀態(tài),這三位在控制寄存器 (R16_USARTx_CTLR3)中。
(2)USART 模塊同步模式只工作在主模式,即 CK 引腳只輸出時(shí)鐘,不接收輸入;
只在 TX 引腳輸出數(shù)據(jù)時(shí)輸出時(shí)鐘信號(hào);
單線半雙工模式
半雙工模式支持使用單個(gè)引腳(只使用 TX 引腳)來接收和發(fā)送,TX 引腳和 RX 引腳在芯片內(nèi)部連接。 開啟半雙工模式的方式是對(duì)控制寄存器 3(R16_USARTx_CTLR3)的 HDSEL 位置位,但同時(shí)需要關(guān)閉 LIN 模式、智能卡模式、紅外模式和同步模式,即保證 SCEN、CLKEN 和 IREN 位處于復(fù)位狀態(tài),這三位在控制寄存器 2 和 3(R16_USARTx_CTLR2 和 R16_USARTx_CTLR3)中。 設(shè)置成半雙工模式之后,需要把 TX 的 IO 口設(shè)置成浮空輸入或開漏輸出高模式。在 TE 置位的情況下,只要將數(shù)據(jù)寫到數(shù)據(jù)寄存器上,就會(huì)發(fā)送出去。
中斷
ch32V208處理器的USART 模塊支持多種中斷源,包括發(fā)送數(shù)據(jù)寄存器空(TXE)、CTS、發(fā)送完成(TC)、接收數(shù)據(jù)就緒(TXNE)、數(shù)據(jù)溢出(ORE)、線路空閑(IDLE)、奇偶校驗(yàn)出錯(cuò)(PE)、斷開標(biāo)志(LBD)、噪聲(NE)、多緩沖通信的溢出(ORE)和幀錯(cuò)誤(FE)等等。
DMA
ch32V208處理器的USART 模塊支持 DMA 功能,可以利用 DMA 實(shí)現(xiàn)快速連續(xù)收發(fā)。當(dāng)啟用 DMA 時(shí),TXE 被置位時(shí),DMA就會(huì)從設(shè)定的內(nèi)存空間向發(fā)送緩沖區(qū)寫數(shù)據(jù)。當(dāng)使用 DMA 接收時(shí),每次 RXNE 置位后,DMA 就會(huì)將接收緩沖區(qū)里的數(shù)據(jù)轉(zhuǎn)移到特定的內(nèi)存空間。
串口的初始化
ch32V208處理器的USART通信模式較多,下面以最常用的雙工通信模式為例來介紹實(shí)現(xiàn)過程,本例程中,使用USART1和USART2,通過外部交叉連接實(shí)現(xiàn)全雙工的串口通信功能,實(shí)現(xiàn)代碼如下
void USARTx_CFG(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
USART_InitTypeDef USART_InitStructure = {0};
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
/* USART1 TX-->B.6 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /* Only Configure TX Pin */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
/* USART2 TX-->A.2 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /* Only Configure TX Pin */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
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_Tx | USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
USART_Cmd(USART2, ENABLE);
USART_HalfDuplexCmd(USART1, ENABLE);
USART_HalfDuplexCmd(USART2, ENABLE);
}文章來源:http://www.zghlxwxcb.cn/news/detail-646532.html
串口通信的實(shí)現(xiàn)
雙串口的收發(fā)通信實(shí)現(xiàn)包括兩部分,USART1的發(fā)送和USART2的接收,以及USART1的發(fā)送和USART1的接收兩個(gè)過程,實(shí)現(xiàn)方法是完全一樣的,USART1—>USART2的實(shí)現(xiàn)如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-646532.html
while(TxCnt1 < TxSize1) /* USART1--->USART2,TxSize1為發(fā)送個(gè)數(shù) */
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
/* 等待串口1的當(dāng)前數(shù)據(jù)發(fā)送完成 */
{
}
USART_SendData(USART1, TxBuffer1[TxCnt1++]);
//等待接收完成
while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)
{
}
RxBuffer2[RxCnt2++] = USART_ReceiveData(USART2);
//把接收數(shù)據(jù)存放到usart2的接收緩沖區(qū)
}
到了這里,關(guān)于沁恒ch32V208處理器開發(fā)(四)串口通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!