日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32/STM8+DMX512协议

發布時間:2023/12/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32/STM8+DMX512协议 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標準DMX512協議:

https://blog.csdn.net/qq_42992084/article/details/98525578

這位大佬有詳細介紹

因為標準DMX512協議在現有的MCU上很難達到或者說很浪費資源,所以大多采用非標準DMX512協議。

標準DMX512的數據包:

1 break + 1 MAB(mark after break) + 1 SC(start code) + 512 slots + 1 MTBP(mark time between packets)

我們這里只是檢測他的break和MAB。

首先,大家要知道UART協議和DMX512協議的共同點就是在空閑時TX都是高電平,數據停止位也是高電平。

譬如:初始化的UART8位數據位,1位停止位,無奇偶校驗,那就是9位,在250k波特率下,4us*9 = 36us

而DMX512協議的break則至少88us的低電平,這個時候不管你的UART是怎么設置的(9為數據位或者8位數據位都是一樣),一定會有一個幀錯誤標志置位,利用這個我們就可以接受DMX512數據包啦。

void USART2_IRQHandler(void) {static uint8_t sync_flag = 0;/*檢測幀錯誤,也就是DMX512協議的break*/if(USART_GetITStatus(USART2,USART_IT_ORE) != RESET){frame_count++; //數據包計數dmx512_dbf_pos = 0;sync_flag = 1; //同步標志USART_ReceiveData(USART2); //接收清標志USART_ClearITPendingBit(USART2,USART_IT_ORE); //函數清標志}else //使能了兩個接收中斷和幀錯誤中斷,不是幀錯誤的話就是接收中斷置位了{if(sync_flag) {if(sync_flag == 1) //剛同步{if(0==USART_ReceiveData(USART2))//512協議之后至少有一個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);//接收數據放入緩沖區else{USART_ReceiveData(USART2);USART_ClearITPendingBit(USART2,USART_IT_RXNE);}}} }

?

總結

以上是生活随笔為你收集整理的STM32/STM8+DMX512协议的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。