标准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