使用用stm32f103串口接收DMX512协议给出代码
以下是使用STM32F103串口接收DMX512协议的示例代码:
#include "stm32f10x.h"
#define DMX_DATA_SIZE 512 // DMX数据包大小 #define DMX_BREAK_TIME 88 // DMX信号中断时间(单位:us) #define DMX_MAB_TIME 8 // DMX信号标记包时间(单位:us)
uint8_t dmx_data[DMX_DATA_SIZE]; // 存放DMX数据的数组 uint8_t dmx_data_received = 0; // 标记DMX数据是否接收完毕
void USART1_IRQHandler(void) { static uint16_t dmx_data_index = 0; // 当前DMX数据索引 static uint8_t dmx_break_received = 0; // 标记DMX信号中断是否接收完毕
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) // 判断是否接收到数据
{
uint8_t data = USART_ReceiveData(USART1);
if (dmx_break_received) // 接收到DMX数据
{
dmx_data[dmx_data_index++] = data;
if (dmx_data_index >= DMX_DATA_SIZE) // 接收完毕
{
dmx_data_received = 1;
dmx_data_index = 0;
}
}
else // 接收到DMX信号中断
{
if (data == 0) // 判断是否接收到正确的信号中断
{
dmx_break_received = 1;
dmx_data_index = 0;
}
}
}
}
int main(void) { USART_InitTypeDef USART_InitStructure;
// 初始化USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitStructure.USART_BaudRate = 250000; // DMX数据传输速率为250000bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
// 配置USART1中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while (1)
{
if (dmx_data_received) // 判断是否接收到完整的DMX数据包
{
// 处理DMX数据包
// ...
dmx_data_received = 0;
}
}
原文地址: https://www.cveoy.top/t/topic/fVbk 著作权归作者所有。请勿转载和采集!