資料介紹
本文將介紹在MM32F013x上實現UART單線半雙工的功能應用。
UART單線半雙工簡介
在使用數字舵機通訊時所用到的通信方式為UART通信,但舵機只有三根接線,除去VCC和GND,只有一條通信線,也就是說要實現雙向通信,只能使用單線半雙工模式。在單線半雙工模式下,TX 和 RX 引腳在芯片內部互連。
01 配置流程
單線半雙工模式是通過設置UART_SCR寄存器的HDSEL位,在這個模式里UART_SCR 寄存器的SCEN位必須保持清零狀態。
在單線半雙工模式下,TX和RX引腳在芯片內部互聯,使用控制位”HALF DUPLEX SEL”(UART_SCR 中的 HDSEL 位) 選擇半雙工和全雙工通信。
注意
當選擇單線半雙工模式時RX 不再被使用,當有數據需要發送的時候IO才會被UART驅動,沒有數據傳輸時TX總是被釋放,所以使用單線半雙工需要外部加上拉。
除此之外通訊上和正常的UART模式類似。由于是單線半雙工同一時刻總線上只能有一個節點發送,所以需要軟件協議層去管理線上沖突防止多個設備同時發送,當 TXEN 位被設置時,只要數據一寫到數據寄存器上,發送就繼續。
02 UART_SCR寄存器描述
配置UART_SCR 的HDSEL為1
UART_SCR 寄存器的SCEN位清零

初始化UART1
從官網上下載MM32F013x例程,里面有UART普通模式的配置,在這個基礎上我們直接調用UART_HalfDuplexCmd(UART1,ENABLE);函數接口將串口配置成單線半雙工模式,然后IO口初始化只需要配置PA9 TX即可,如下:
void UART1_NVIC_Init(u32 baudrate) { UART_InitTypeDef UART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); //UART1 NVIC NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //Baud rate UART_StructInit(&UART_InitStructure); UART_InitStructure.BaudRate = baudrate; //The word length is in 8-bit data format. UART_InitStructure.WordLength = UART_WordLength_8b; UART_InitStructure.StopBits = UART_StopBits_1; //No even check bit. UART_InitStructure.Parity = UART_Parity_No; //No hardware data flow control. UART_InitStructure.HWFlowControl = UART_HWFlowControl_None; UART_InitStructure.Mode = UART_Mode_Rx | UART_Mode_Tx; UART_Init(UART1, &UART_InitStructure); UART_HalfDuplexCmd(UART1,ENABLE); //Half Duplex Enable UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE); UART_Cmd(UART1, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); //UART1_TX GPIOA.9 GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); }
功能驗證測試
UART單線半雙工功能測試我們現在拿兩個MM32F0133的板子一個做主機一個做從機進行單線收發測試,主機先發送一包數據給從節點,當從節點收到這包數據后再把這包數據發回給主機,然后主機和從機兩個板子PA9短接到一起,外部在加一個4.7K上拉電阻。
主機函數處理:
uint8_t txbuff[10]= {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA};
s32 main(void)
{
CONSOLE_Init(115200);//UART2 printf打印
UART1_NVIC_Init(115200);
printf("UART Half Duplex TX Test /r/n");
UART1_Send_Group(txbuff,sizeof(txbuff));
printf("TX Data: ");
for(index=0;index
主機UART的中斷服務函數里面,將接從機發送的數據存放在Rx_buff里面,當收到一包數據后通過printf打印到串口,和原始發送的數據進行對比。
void UART1_IRQHandler(void)
{
u8 recvbyte;
// Send packet
if (UART_GetITStatus(UART1, UART_IT_TXIEN) != RESET)
{
UART_ClearITPendingBit(UART1, UART_IT_TXIEN);
}
// Recv packet
if (UART_GetITStatus(UART1, UART_ISR_RX) != RESET)
{
UART_ClearITPendingBit(UART1, UART_ISR_RX);
recvbyte = UART_ReceiveData(UART1);
Rx_buff[rx_cnt] = recvbyte;
rx_cnt++;
if(rx_cnt == 10)
{
gUartRxSta = 1;
rx_cnt = 0;
}
}
}
從機函數處理:
s32 main(void)
{
CONSOLE_Init(115200);//UART2 printf打印
UART1_NVIC_Init(115200);
printf("UART Half Duplex RX Test/r/n");
while(1)
{
if(gUartRxSta == 1)//收到一包數據
{
gUartRxSta = 0;
UART1_Send_Group(Rx_buff,10);
memset(Rx_buff,0x00,10);
}
}
//return 0;
}
從機UART的中斷服務函數里面,將接主機發送的數據存放在Rx_buff里面,當收到一包數據后通過單線半雙工這個串口發送回去。
void UART1_IRQHandler(void)
{
u8 recvbyte;
// Send packet
if (UART_GetITStatus(UART1, UART_IT_TXIEN) != RESET)
{
UART_ClearITPendingBit(UART1, UART_IT_TXIEN);
}
// Recv packet
if (UART_GetITStatus(UART1, UART_ISR_RX) != RESET)
{
UART_ClearITPendingBit(UART1, UART_ISR_RX);
recvbyte = UART_ReceiveData(UART1);
Rx_buff[rx_cnt] = recvbyte;
rx_cnt++;
if(rx_cnt == 10)
{
gUartRxSta = 1;
rx_cnt = 0;
}
}
}
觀察測試結果:
然后我們通過主機UART2 的printf打印可以看到主機TX Data 和從機返回的RX Data數據是一樣的。

再看看下圖邏輯分析儀抓取的邏輯波形,可以也可以看到主機發送的波形和從機返回的波形數據是一樣的。

- MM32F013x——ADC任意通道工作模式
- MM32F013x——RTC鬧鐘定時喚醒
- MM32F013x——移植EasyLogger組件
- MM32F013x——UART 9bit 通信
- MM32F013x——UART 多處理器通信
- MM32F013x——UART 極性取反通信
- MM32F013x——UART 單線半雙工通信
- MM32F013x——UART ISO7816-3協議的應用
- MM32F013x——ADC任意通道工作模式
- MM32F013x——萬年歷
- MM32F013x——移植EasyFlash組件
- MM32F013x——移植EasyLogger組件
- 基于ARM Cortex M0的微控制器MM32F013x 22次下載
- MM32F013x——UART 極性取反通信
- MM32F013x——UART 多處理器通信
- SN65HVD485E半雙工RS - 485收發器:電子工程師的理想選擇 145次閱讀
- 全雙工對講系統對比半雙工優勢在哪? 370次閱讀
- ADM2491E 5 kV信號隔離、高速(16 Mbps)、ESD保護、全/半雙工RS-485收發器技術手冊 1.1k次閱讀
- UART通信協議介紹和數據傳輸工作流程 3.1k次閱讀
- 單工、半雙工和全雙工傳輸模式的區別 4.8k次閱讀
- 節省IO的小技巧:GD32 MCU如何使用一個GPIO實現串口半雙工收發 3k次閱讀
- RS-485適配器將數據線從全雙工轉換為半雙工 5.4k次閱讀
- UART串口通信協議詳解 8.9k次閱讀
- STM32F407入門開發: 串口配置 1.3w次閱讀
- 基于半雙工機制實現3線制雙向SPI模塊的設計與應用 5.8k次閱讀
- 巧用網卡的半雙工模式解決網絡連接故障 6.6k次閱讀
- 全雙工和半雙工的區別 2.1w次閱讀
- 基于FPGA芯片的UART接口電路設計 2.7k次閱讀
- 半雙工RF收發器CC900主要技術特點 1.7k次閱讀
- 移動通信技術的TDD與FDD雙工技術對比 4.9k次閱讀
下載排行
本周
- 1冷柜-電氣控制系統講解
- 13.68 MB | 4次下載 | 10 積分
- 2安川A1000變頻器中文版說明書
- 20.16 MB | 3次下載 | 3 積分
- 3直流電路的組成和基本定律
- 1.67 MB | 2次下載 | 免費
- 4丹佛斯2800系列變頻器說明書
- 8.00 MB | 1次下載 | 5 積分
- 5PC8011同步開關型降壓3.5A單節鋰電池充電管理電路技術手冊
- 0.74 MB | 1次下載 | 免費
- 6ES7243E+ES8311音頻錄制與播放電路資料
- 0.06 MB | 1次下載 | 5 積分
- 7SDM02 激光測距模塊產品手冊
- 0.43 MB | 1次下載 | 免費
- 8SDFM 激光測距模塊模組手冊
- 0.54 MB | 1次下載 | 免費
本月
- 1CH341編程器軟件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下載 | 1 積分
- 22025智能家居傳感器市場分析及創新應用
- 3.11 MB | 43次下載 | 免費
- 3RV1126B系列開發板產品資料
- 4.19 MB | 18次下載 | 免費
- 4CH341編程軟件下載
- 2.50 MB | 16次下載 | 5 積分
- 5全志系列-米爾基于T153核心板開發板 四核異構、3路千兆網,賦能多元化工業場景
- 3.05 MB | 12次下載 | 免費
- 6【開源】60余套STM32單片機、嵌入式Linux、物聯網、人工智能項目案例及入門學習資源包
- 10.55 MB | 8次下載 | 免費
- 7冷柜-電氣控制系統講解
- 13.68 MB | 4次下載 | 10 積分
- 8特斯拉MODEL S車載充電機主電路回路原理圖
- 0.81 MB | 4次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233094次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191448次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183356次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81604次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73824次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發燒友App





創作
發文章
發帖
提問
發資料
發視頻
上傳資料賺積分
評論