STM32/STM8+DMX512协议
生活随笔
收集整理的這篇文章主要介紹了
STM32/STM8+DMX512协议
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
標準DMX512協(xié)議:
https://blog.csdn.net/qq_42992084/article/details/98525578
這位大佬有詳細介紹
因為標準DMX512協(xié)議在現(xiàn)有的MCU上很難達到或者說很浪費資源,所以大多采用非標準DMX512協(xié)議。
標準DMX512的數(shù)據(jù)包:
1 break + 1 MAB(mark after break) + 1 SC(start code) + 512 slots + 1 MTBP(mark time between packets)
我們這里只是檢測他的break和MAB。
首先,大家要知道UART協(xié)議和DMX512協(xié)議的共同點就是在空閑時TX都是高電平,數(shù)據(jù)停止位也是高電平。
譬如:初始化的UART8位數(shù)據(jù)位,1位停止位,無奇偶校驗,那就是9位,在250k波特率下,4us*9 = 36us
而DMX512協(xié)議的break則至少88us的低電平,這個時候不管你的UART是怎么設(shè)置的(9為數(shù)據(jù)位或者8位數(shù)據(jù)位都是一樣),一定會有一個幀錯誤標志置位,利用這個我們就可以接受DMX512數(shù)據(jù)包啦。
void USART2_IRQHandler(void) {static uint8_t sync_flag = 0;/*檢測幀錯誤,也就是DMX512協(xié)議的break*/if(USART_GetITStatus(USART2,USART_IT_ORE) != RESET){frame_count++; //數(shù)據(jù)包計數(shù)dmx512_dbf_pos = 0;sync_flag = 1; //同步標志USART_ReceiveData(USART2); //接收清標志USART_ClearITPendingBit(USART2,USART_IT_ORE); //函數(shù)清標志}else //使能了兩個接收中斷和幀錯誤中斷,不是幀錯誤的話就是接收中斷置位了{if(sync_flag) {if(sync_flag == 1) //剛同步{if(0==USART_ReceiveData(USART2))//512協(xié)議之后至少有一個8us的MAB,要判斷這個sync_flag = 0;elsesync_flag = 2;}else{USART_ReceiveData(USART2);USART_ClearITPendingBit(USART2,USART_IT_RXNE); }}else{if(dmx512_dbf_pos < (uint16_t)(sizeof(dmx512_dbf)))dmx512_dbf[dmx512_dbf_pos++] = USART_ReceiveData(USART2);//接收數(shù)據(jù)放入緩沖區(qū)else{USART_ReceiveData(USART2);USART_ClearITPendingBit(USART2,USART_IT_RXNE);}}} }?
總結(jié)
以上是生活随笔為你收集整理的STM32/STM8+DMX512协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下安装oracle insta
- 下一篇: 【Windows】多显示器亮度调节工具