資料介紹
在上一次的靈動(dòng)微課堂中和大家分享過MM32F013x-UART 9bit通信實(shí)例,本次微課堂在此實(shí)例的基礎(chǔ)上實(shí)現(xiàn)UART多處理器通信。MM32F013x系列MCU支持UART多處理器通信,其工作原理是主從機(jī)設(shè)備采用復(fù)用漏極開路,主從機(jī)外部接上拉電阻,在空閑時(shí)使從機(jī)處于靜默模式,主機(jī)要控制從機(jī)執(zhí)行任務(wù)時(shí)主機(jī)發(fā)送指令喚醒從機(jī)并發(fā)送數(shù)據(jù)控制從機(jī)執(zhí)行相應(yīng)任務(wù)。
1、UART靜默模式
MM32F013x系列MCU UART靜默模式的特點(diǎn)
- 任何接收狀態(tài)位都不會(huì)被設(shè)置
- 所有的接收中斷都被禁止
- UART_CCR寄存器中的RWU位被置1。RWU可以被硬件自動(dòng)控制或在某個(gè)條件下由軟件寫入。
根據(jù)UART_CCR寄存器中的WAKE位狀態(tài),UART多處理器通信有二種方法進(jìn)入或退出靜默模式分別是:
- WAKE 位被設(shè)置0:進(jìn)行空閑總線檢測。
- WAKE 位被設(shè)置1:進(jìn)行地址標(biāo)記檢測。
空閑總線檢測
空閑幀喚醒可以同時(shí)喚醒所有從機(jī),在從機(jī)處于靜默模式時(shí)主機(jī)發(fā)送空閑幀(即所有位均為1的數(shù)據(jù))實(shí)現(xiàn)多個(gè)從機(jī)同步被喚醒。
地址標(biāo)記檢測
地址標(biāo)記喚醒可以喚醒單個(gè)從機(jī),從機(jī)進(jìn)入靜默模式時(shí),主機(jī)向從機(jī)尋址發(fā)送地址幀,從機(jī)自動(dòng)比對(duì)地址,地址配對(duì)正確則該從機(jī)被喚醒,否則繼續(xù)進(jìn)入靜默模式。這樣只有被主機(jī)尋址的從機(jī)才被喚醒激活并接收數(shù)據(jù),從而減少未被尋址的從機(jī)參與帶來的多余的UART服務(wù)開銷。
2、配置流程
與UART多處理器通信相關(guān)的主要寄存器有UART通用控制寄存器、UART接收地址寄存器UART_RXADDR和UART接收掩碼寄存器UART_RXMASK其描述如下寄存器表所示:

如上圖1所示為UART通用控制寄存器UART_CCR,在MM32F013x UM手冊(cè)的第489和第490頁有關(guān)于該寄存器位的詳細(xì)描述。本實(shí)例UART多處理器通信要用到的相關(guān)于UART通用控制寄存器UART_CCR位的說明如下:
Bit13
WAKE(rw,reset:0x00)喚醒方法,該位決定UART多機(jī)通信從機(jī)喚醒的方法。
1:地址標(biāo)記喚醒。
庫函數(shù)設(shè)置:
UART_WakeUpConfig(UART1,UART_WakeUp_AddressMark);
0:空閑總線喚醒。
庫函數(shù)設(shè)置:
UART_WakeUpConfig(UART1, UART_WakeUp_IdleLine);
Bit12
RWU(rw, reset:0x00)接收喚醒,該位用來決定是否把UART置于靜默模式。該位可以由軟件設(shè)置或清除。當(dāng)喚醒序列到來時(shí),硬件也會(huì)自動(dòng)將其清零。
1:接收器處于靜默模式。
庫函數(shù)設(shè)置:
UART_ReceiverWakeUpCmd(UART1, ENABLE);
0:接收器處于正常工作模式。
庫函數(shù)設(shè)置:
UART_ReceiverWakeUpCmd(UART1, DISABLE);
注:在設(shè)置地址標(biāo)記喚醒時(shí),如果接收 buffer 非空則不能軟件修改。
Bit11
B8EN(rw, reset:0x00)UART同步幀發(fā)送第9bit使能控制位。該位使能后校驗(yàn)使能PEN不起作用。
1:使能同步幀第9bit發(fā)送。
庫函數(shù)設(shè)置:
UART_Enable9bit(UART1, ENABLE);
0:禁止同步幀第9bit發(fā)送。
庫函數(shù)設(shè)置:
UART_Enable9bit(UART1, DISABLE);
Bit10
B8TOG(rw,reset:0x00)UART同步幀發(fā)送第9bit自動(dòng)翻轉(zhuǎn)控制位。
1:使能第9bit自動(dòng)翻轉(zhuǎn)。
庫函數(shù)設(shè)置:
UART_Set9bitAutomaticToggle(UART1, ENABLE);
0:禁止第9bit自動(dòng)翻轉(zhuǎn)。
庫函數(shù)設(shè)置:
UART_Set9bitAutomaticToggle(UART1, DISABLE);
注:在 B8TXD 和 B8POL 的值相同時(shí),在配置完寄存器后傳輸?shù)牡诙€(gè)數(shù)據(jù)開始翻轉(zhuǎn),第一個(gè)數(shù)據(jù)默認(rèn)為地址位。
Bit8
B8TXD(rw,reset:0x00)UART同步幀發(fā)送數(shù)據(jù)第9bit。
1:發(fā)送同步幀第9bit為高電平。
庫函數(shù)設(shè)置:
UART_Set9bitLevel(UART1, ENABLE);
0:發(fā)送同步幀第9bit為低電平。
庫函數(shù)設(shè)置:
UART_Set9bitLevel(UART1, DISABLE)

如上圖2所示為UART接收地址寄存器UART_RXADDR,在MM32F013x UM手冊(cè)的第491頁有關(guān)于該寄存器位的詳細(xì)描述。本實(shí)例UART多處理器通信要用到的相關(guān)于UART_RXADDR接收地址寄存器位的說明如下:
Bit31:8:
Reserved,始終讀為0x00
Bit7:0:
RXADDR(rw,reset:0x00)UART 同步幀數(shù)據(jù)本機(jī)匹配地址。
庫函數(shù)設(shè)置:
UART_SetRXAddress(UART1, SLAVEADDR);
其中地址參數(shù)SLAVEADDR可以設(shè)置為宏定義形式。
如果 RXMASK =0xFF時(shí)接收到的同步幀數(shù)據(jù)與本機(jī)匹配地址相同時(shí),產(chǎn)生RXB8_INTF。地址 0是廣播地址,收到后都會(huì)響應(yīng)。

如上圖3所示為UART接收掩碼寄存器UART_RXMASK,在MM32F013x UM手冊(cè)的第492頁有關(guān)于該寄存器位的詳細(xì)描述。本實(shí)例UART多處理器通信要用到的相關(guān)于UART_RXMSK接收掩碼寄存器位的說明如下:
Bit31:8:
Reserved,始終讀為0x00
Bit7:0:
RXMASK(rw,reset:0xFF)UART數(shù)據(jù)位全為“0”時(shí),接收到任何數(shù)據(jù)都產(chǎn)生同步幀中斷請(qǐng)求。如果數(shù)據(jù)位為“1”,RDR和RXADDR的相應(yīng)位匹配時(shí),產(chǎn)生同步幀中斷請(qǐng)求。
庫函數(shù)設(shè)置:
UART_SetRXMASK(UART1,SLAVEADDR); 其中地址參數(shù)SLAVEADDR可以設(shè)置為宏定義形式。
根據(jù)上文與UART 9bit多處理器通信相關(guān)的寄存器位的描述,本實(shí)例從機(jī)喚醒模式使用標(biāo)記從機(jī)地址方式,在MM32F013x-UART 9bit通信實(shí)例的基礎(chǔ)上增加從機(jī)UART 9bit多處理器通信相關(guān)的寄存器位的初始化,這里以庫函數(shù)方式給出,增加的4行代碼如下所示:
//Wake up method UART_WakeUpConfig(UART1, UART_WakeUp_AddressMark); //Synchronous frame match address UART_SetRXAddress(UART1, SLAVEADDR); //Synchronous frame match address mask UART_SetRXMASK(UART1,SLAVEADDR); //Receive wake up method UART_ReceiverWakeUpCmd(UART1, ENABLE);
3、程序配置
01、初始化主機(jī)MM32F013x UART1 9bit通信
本實(shí)例使用MM32F0133C7P核心板作為UART多處理器通信,主機(jī)初始化代碼如下所示:
bsp_UART1_Master_irq_9Bit_Init(u32 baudrate) { GPIO_InitTypeDef GPIO_InitStructure; UART_InitTypeDef UART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); 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); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); UART_StructInit(&UART_InitStructure); UART_InitStructure.BaudRate = baudrate; UART_InitStructure.WordLength = UART_WordLength_8b; UART_InitStructure.StopBits = UART_StopBits_1; UART_InitStructure.Parity = UART_Parity_No; UART_InitStructure.HWFlowControl = UART_HWFlowControl_None; UART_InitStructure.Mode = UART_Mode_Rx | UART_Mode_Tx; UART_Enable9bit(UART1, ENABLE); UART_Set9bitLevel(UART1, DISABLE); UART_Set9bitAutomaticToggle(UART1, ENABLE); UART_Init(UART1, &UART_InitStructure); UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); UART_Cmd(UART1, ENABLE); }
02、初始化從機(jī)MM32F013x UART1 9bit通信
MM32F0133C7P UART1從機(jī)初始化代碼如下所示:
注意:多從機(jī)通信,初始化從機(jī)串口時(shí)需要修改從機(jī)地址宏為0x01、0x02等。
#define SLAVEADDR (0x01) void bsp_UART1_Slave_irq_9Bit_Init(u32 baudrate) { GPIO_InitTypeDef GPIO_InitStructure; UART_InitTypeDef UART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); 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_OD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOA, &GPIO_InitStructure); UART_StructInit(&UART_InitStructure); UART_InitStructure.BaudRate = baudrate; UART_InitStructure.WordLength = UART_WordLength_8b; UART_InitStructure.StopBits = UART_StopBits_1; UART_InitStructure.Parity = UART_Parity_No; UART_InitStructure.HWFlowControl = UART_HWFlowControl_None; UART_InitStructure.Mode = UART_Mode_Rx | UART_Mode_Tx; UART_WakeUpConfig(UART1, UART_WakeUp_AddressMark); UART_WakeUpConfig(UART1, UART_WakeUp_IdleLine); UART_SetRXAddress(UART1, SLAVEADDR); UART_SetRXMASK(UART1,0x02); UART_ReceiverWakeUpCmd(UART1, ENABLE); UART_Enable9bit(UART1, ENABLE); UART_Set9bitLevel(UART1, DISABLE); UART_Set9bitAutomaticToggle(UART1, ENABLE); UART_Init(UART1, &UART_InitStructure); UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); UART_Cmd(UART1, ENABLE); }
03、編寫MM32F013x UART1主機(jī)中斷服務(wù)函數(shù)
MM32F0133C7P UART1主機(jī)中斷服務(wù)函數(shù),代碼如下所示:
#define RX_MASTER_LEN (3) u8 g_Rx_Master_Buf[RX_MASTER_LEN] = {0x00}; u8 g_Rx_Master_Cnt = 0; void UART1_IRQHandler(void) { u8 res; if(UART_GetITStatus(UART1, UART_IT_RXIEN) != RESET) { UART_ClearITPendingBit(UART1, UART_IT_RXIEN); res = UART_ReceiveData(UART1); g_Rx_Master_Buf[g_Rx_Master_Cnt] = res; if(g_Rx_Master_Cnt < RX_MASTER_LEN-1) { g_Rx_Master_Cnt++; } else { g_Rx_Master_Cnt = 0; } } }
04、編寫MM32F013x UART1從機(jī)中斷服務(wù)函數(shù)
MM32F0133C7P UART1從機(jī)中斷服務(wù)函數(shù),代碼如下所示:
#define RX_SLAVE_LEN (3) u8 g_Rx_Slave_Buf[RX_SLAVE_LEN] = {0x00}; u8 g_Rx_Slave_Cnt = 0; void UART1_IRQHandler(void) { u8 res; if(UART_GetITStatus(UART1, UART_IT_RXIEN) != RESET) { UART_ClearITPendingBit(UART1, UART_IT_RXIEN); res = UART_ReceiveData(UART1); g_Rx_Slave_Buf[g_Rx_Slave_Cnt] = res; if(g_Rx_Slave_Cnt < RX_SLAVE_LEN-1) { g_Rx_Slave_Cnt++; } else { g_Rx_Slave_Cnt = 0; } } }
05、編寫MM32F013x UART1主從機(jī)
通用發(fā)送數(shù)據(jù)函數(shù)
MM32F0133C7P UART1主從機(jī)通用發(fā)送函數(shù),代碼如下所示:
u8 g_Tx_Master_Buf[2] = {0xAA,0x55}; void bsp_UART_Send_Byte_Data(UART_TypeDef* uart,u8 data) { UART_SendData(uart, data); while(!UART_GetFlagStatus(uart, UART_FLAG_TXEPT)); } void bsp_UART_Send_Bytes_Data(UART_TypeDef* uart, u8* buf, u16 len) { while(len--) { bsp_UART_Send_Byte_Data(uart,*buf++); } }
06、編寫MM32F013x UART1主機(jī)發(fā)送從機(jī)地址函數(shù)
MM32F0133C7P UART1主機(jī)發(fā)送從機(jī)地址函數(shù),代碼如下所示:
u8 g_Tx_Master_Buf[2] = {0xAA,0x55}; #define SLAVEADDR1 (0x01) #define SLAVEADDR2 (0x02) void bsp_UART_Send_SlaveAddr(UART_TypeDef* uart,u8 data) { UART_SendData(uart, data); while(!UART_GetFlagStatus(uart, UART_FLAG_TXEPT)); }
07、編寫MM32F013x UART1主機(jī)按鍵
發(fā)送從機(jī)地址和數(shù)據(jù)函數(shù)
宏定義按鍵GPIO端口和管腳,本實(shí)例只用到MM32F013x核心板的PA0作為KEY1對(duì)應(yīng)核心板。
#define KEY1_GPIO_Port GPIOA #define KEY1_Pin GPIO_Pin_0 #define KEY2_GPIO_Port GPIOB #define KEY2_Pin GPIO_Pin_2 #define KEY3_GPIO_Port GPIOB #define KEY3_Pin GPIO_Pin_10 #define KEY4_GPIO_Port GPIOB #define KEY4_Pin GPIO_Pin_11 #define KEY1 GPIO_ReadInputDataBit(KEY1_GPIO_Port,KEY1_Pin) //read key1 #define KEY2 GPIO_ReadInputDataBit(KEY2_GPIO_Port,KEY2_Pin) //read key2 #define KEY3 GPIO_ReadInputDataBit(KEY3_GPIO_Port,KEY3_Pin) //read key3 #define KEY4 GPIO_ReadInputDataBit(KEY4_GPIO_Port,KEY4_Pin) //read key4 #define KEY1_DOWN_VALUE 1 //KEY1 #define KEY2_DOWN_VALUE 0 //KEY2 #define KEY3_DOWN_VALUE 0 //KEY3 #define KEY4_DOWN_VALUE 0 //KEY4 #define KEY1_PRES 1 //KEY1 #define KEY2_PRES 2 //KEY2 #define KEY3_PRES 3 //KEY3 #define KEY4_PRES 4 //KEY4 //Init Key GPIO void bsp_Key_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB ,ENABLE); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = KEY1_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = KEY2_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(KEY2_GPIO_Port, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = KEY3_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(KEY3_GPIO_Port, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = KEY4_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(KEY4_GPIO_Port, &GPIO_InitStructure); } u8 bsp_Key_Scan(u8 mode) { static u8 key_up = 1; if(mode) { key_up = 1; } if(key_up && ((KEY1 == KEY1_DOWN_VALUE) || (KEY2 == KEY2_DOWN_VALUE) || / (KEY3 == KEY3_DOWN_VALUE) || (KEY4 == KEY4_DOWN_VALUE))) { DELAY_Ms(10); key_up = 0; if(KEY1 == KEY1_DOWN_VALUE) { return KEY1_PRES; } else if(KEY2 == KEY2_DOWN_VALUE) { return KEY2_PRES; } else if(KEY3 == KEY3_DOWN_VALUE) { return KEY3_PRES; } else if(KEY4 == KEY4_DOWN_VALUE) { return KEY4_PRES; } } else if((KEY1 != KEY1_DOWN_VALUE) && (KEY3 != KEY3_DOWN_VALUE) && / (KEY4 != KEY4_DOWN_VALUE) && (KEY2 != KEY2_DOWN_VALUE)) { key_up = 1; } return 0; } u8 Key_Nnum = 0; void bsp_Process_Key_Task(void) { static u8 Key_Value = 0; Key_Value = bsp_Key_Scan(0); switch(Key_Value) { case KEY1_PRES: if(Key_Nnum == 0) { Key_Nnum = 1; bsp_UART_Send_SlaveAddr(UART1, SLAVEADDR1); //Send SlaveAddr1 bsp_UART_Send_Bytes_Data(UART1, g_Tx_Master_Buf, sizeof(g_Tx_Master_Buf)); //Send data } else if(Key_Nnum == 1) { Key_Nnum = 0; bsp_UART_Send_SlaveAddr(UART1, SLAVEADDR2); //Send SlaveAddr2 bsp_UART_Send_Bytes_Data(UART1, g_Tx_Master_Buf, sizeof(g_Tx_Master_Buf)); //Send data } break; case KEY2_PRES: break; case KEY3_PRES: break; case KEY4_PRES: break; default : break; } }
08、編寫MM32F013x UART1主機(jī)
接收從機(jī)返回的數(shù)據(jù)函數(shù)
處理MM32F0133C7P UART1主機(jī)接收數(shù)據(jù)函數(shù),代碼如下所示:
void bsp_UART_Master_Rec_Task(void) { if(((g_Rx_Master_Buf[0] == SLAVEADDR1 ) || (g_Rx_Master_Buf[0] == SLAVEADDR2)) && (g_Rx_Master_Buf[1] == 0xAA) && (g_Rx_Master_Buf[2] == 0x55)) { LED1_TOGGLE(); g_Rx_Master_Cnt = 0; memset(g_Rx_Master_Buf,0,sizeof(g_Rx_Master_Buf)); } }
09、編寫MM32F013x UART1從機(jī)
接收主機(jī)發(fā)送的數(shù)據(jù)函數(shù)
處理MM32F0133C7P UART1主機(jī)接收數(shù)據(jù)函數(shù),代碼如下所示:
注意:g_Rx_Slave_Buf[1]為主機(jī)發(fā)送給從機(jī)的地址由從機(jī)接收判斷,多從機(jī)通信需要修改從機(jī)地址宏:#define SLAVEADDR (0x02)等。
void bsp_UART_Slave_Rec_Task(void) { if((g_Rx_Slave_Buf[0] == SLAVEADDR) && (g_Rx_Slave_Buf[1] == 0xAA) && (g_Rx_Slave_Buf[2] == 0x55)) { LED1_TOGGLE(); bsp_UART_Send_Bytes_Data(UART1, g_Rx_Slave_Buf, sizeof(g_Rx_Slave_Buf)); g_Rx_Slave_Cnt = 0; memset(g_Rx_Slave_Buf,0,sizeof(g_Rx_Slave_Buf)); } }
10、MM32F013x UART1 9bit多處理器通信功能演示
MM32F0133C7P多處理器通信功能演示:
主機(jī)main函數(shù)中調(diào)用DELAY_Init、LED_Init、bsp_Key_GPIO_Init和主機(jī)串口初始化函數(shù)bsp_UART1_Master_irq_9Bit_Init,在while(1)后臺(tái)調(diào)用按鍵發(fā)送從機(jī)地址和發(fā)送數(shù)據(jù)函數(shù)bsp_Process_Key_Task以及處理接收從機(jī)返回?cái)?shù)據(jù)函數(shù)bsp_UART_Master_Rec_Task代碼如下所示:
s32 main(void) { //SysTick init DELAY_Init(); //LED Init LED_Init(); //Key GPIO Init bsp_Key_GPIO_Init(); //UART1 9Bit irt Init bsp_UART1_Master_irq_9Bit_Init(115200); while(1) { //Key processing multi-processor communication bsp_Process_Key_Task(); //Processing master receiving tasks bsp_UART_Master_Rec_Task(); } }
從機(jī)main函數(shù)中調(diào)用LED_Init和從機(jī)串口初始化函數(shù)bsp_UART1_Slave_irq_9Bit_Init,在while(1)后臺(tái)調(diào)用處理從機(jī)接收任務(wù)函數(shù)bsp_UART_Slave_Rec_Task代碼如下所示:
s32 main(void) { //LED Init LED_Init(); //UART1 9bit init bsp_UART1_Slave_irq_9Bit_Init(115200); while(1) { //Processing slave receiving tasks bsp_UART_Slave_Rec_Task(); } }
分別編譯以上主機(jī)和從機(jī)工程代碼,然后燒錄軟件到MM32F0133C7P核心板上,燒錄多從機(jī)時(shí)需修改從機(jī)工程代碼的從機(jī)地址宏SLAVEADDR,編譯后再燒錄。本實(shí)例從機(jī)燒錄0x01和x02為例作為演示,即1臺(tái)主機(jī)和2臺(tái)從機(jī)作為演示。
4、接線方式
MM32F0133C7P多處理器通信UART主機(jī)和從機(jī)接線方法:
各從機(jī)TX線與連接,RX線與連接,從機(jī)線與連接的TX接到主機(jī)RX端,從機(jī)線與連接的RX接到主機(jī)的TX端,主從機(jī)分別外接5.1~10K值范圍之一的上拉電阻,本實(shí)例接5.1K上拉電阻。
MM32F0133C7P UART多處理器通信演示1臺(tái)主機(jī)和2臺(tái)從機(jī)分別發(fā)送和接收數(shù)據(jù):
主機(jī)第1次按下MM32F0133C7P核心板上的S1按鍵,主機(jī)發(fā)送1字節(jié)從機(jī)地址0x01,接著發(fā)送2字節(jié)數(shù)據(jù)0xAA和0x55,從機(jī)1(地址0x01)在靜默模式下自動(dòng)比對(duì)主機(jī)尋址從機(jī)的地址0x01比對(duì)成功從機(jī)1被喚醒繼續(xù)接收0xAA和0x55數(shù)據(jù),收到完整的3字節(jié)數(shù)據(jù)時(shí)從機(jī)LED1狀態(tài)翻轉(zhuǎn)LED1亮并原樣返回收到的數(shù)據(jù)給主機(jī),此時(shí)從機(jī)2仍處于靜默模式,主機(jī)完全收到從機(jī)1返回的3字節(jié)數(shù)據(jù)即0x01,0XAA,0x55時(shí)主機(jī)LED1狀態(tài)翻轉(zhuǎn)LED亮,實(shí)物現(xiàn)象如下圖4所示。

主機(jī)第2次按下MM32F0133C7P核心板上的S1按鍵,主機(jī)發(fā)送1字節(jié)從機(jī)地址0x02,接著發(fā)送2字節(jié)數(shù)據(jù)0xAA和0x55,從機(jī)2(地址0x02)在靜默模式下自動(dòng)比對(duì)主機(jī)尋址從機(jī)的地址0x02比對(duì)成功從機(jī)2被喚醒繼續(xù)接收0xAA和0x55數(shù)據(jù),收到完整的3字節(jié)數(shù)據(jù)時(shí)從機(jī)LED1狀態(tài)翻轉(zhuǎn)LED1亮并原樣返回收到的數(shù)據(jù)給主機(jī),此時(shí)從機(jī)1仍處于靜默模式其LED1維持上次點(diǎn)亮狀態(tài),主機(jī)完全收到從機(jī)2返回的3字節(jié)數(shù)據(jù)時(shí)即0x02,0XAA,0x55時(shí)主機(jī)LED1狀態(tài)翻轉(zhuǎn)LED滅,實(shí)物現(xiàn)象如下圖5所示:

5、波形抓取
邏輯分析儀抓取到的MM32F0133C7多處理器通信波形圖如下圖6和圖7所示:
圖6上波形紅色框注為主機(jī)發(fā)送:0x01、0xAA、0x55尋址從機(jī)1,從機(jī)(地址0x01)從靜默模式喚醒并收到主機(jī)發(fā)送的數(shù)據(jù)0xAA和0x55時(shí)原樣返回給主機(jī)如圖6下波形藍(lán)色框注:0x01、0xAA、0x55,此時(shí)從機(jī)2(地址0x02)并未作響應(yīng)仍處于靜默模式。

圖7上紅色框注為主機(jī)發(fā)送:0x02、0xAA、0x55尋址從機(jī)2,從機(jī)(地址0x02)從靜默模式喚醒并收到主機(jī)發(fā)送的數(shù)據(jù)0xAA和0x55時(shí)原樣返回給主機(jī)如圖7下波形藍(lán)色框注:0x02、0xAA、0x55,此時(shí)從機(jī)1(地址0x01)并未作響應(yīng)仍處于靜默模式。

轉(zhuǎn)自:靈動(dòng)MM32MCU
- 基于VPX6-460的多處理器通信設(shè)計(jì)
- 基于VPX6—460的多處理器通信設(shè)計(jì)
- MM32F013x——ADC任意通道工作模式
- MM32F013x——RTC鬧鐘定時(shí)喚醒
- MM32F013x——移植EasyLogger組件
- MM32F013x——UART 多處理器通信
- MM32F013x——UART 極性取反通信
- MM32F013x——UART 單線半雙工通信
- MM32F013x——UART ISO7816-3協(xié)議的應(yīng)用
- MM32F013x——ADC任意通道工作模式
- MM32F013x——萬年歷
- MM32F013x——移植EasyLogger組件
- 基于ARM Cortex M0的微控制器MM32F013x 22次下載
- MM32F013x——UART 單線半雙工通信
- MM32F013x——UART 極性取反通信
- 對(duì)稱多處理器的特點(diǎn)是什么 480次閱讀
- 對(duì)稱多處理器系統(tǒng)中的進(jìn)程分配包括 311次閱讀
- Cache技術(shù)在星辰處理器中的應(yīng)用 818次閱讀
- 淺談ARM處理器的基礎(chǔ)知識(shí) 2662次閱讀
- 基于多處理器系統(tǒng)的串行通信方式研究 2067次閱讀
- 深度解讀多處理器調(diào)度問題 2989次閱讀
- 采用WISHBONE總線有效地解決IP核可移植性、設(shè)計(jì)復(fù)用問題 972次閱讀
- 基于Verilog的UART串行通信接口電路設(shè)計(jì) 2461次閱讀
- 在異構(gòu)處理器上跑Linux方法介紹 1493次閱讀
- 基于64位多核處理器的共享緩存結(jié)構(gòu)電路設(shè)計(jì) 1813次閱讀
- 基于RS485總線設(shè)計(jì)的多處理器RS485通信網(wǎng)絡(luò) 3941次閱讀
- 一文讀懂異構(gòu)多處理系統(tǒng) 4957次閱讀
- 全球十大平板電腦處理器廠商盤點(diǎn) 9669次閱讀
- 提高FPGA處理總線性能的RapidIO節(jié)點(diǎn)設(shè)計(jì) 3051次閱讀
- 利用異步通信芯片16C552實(shí)現(xiàn)PC機(jī)與DSP的串行通訊 1765次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論