使用stm32通过HAL库控制DMX512灯带(RGBW四通道)

一、DMX512协议

关于DMX512协议的解释,下面这篇文章写的十分详尽,这里不再赘述。DMX512协议-CSDN博客文章浏览阅读2.3w次,点赞23次,收藏110次。写在前面:本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。DMX512(digital multiplex)其实就是主机向从机整包单向广播发送的协议(protocol),从机自取所需。DMX512数据协议是美国舞台灯光协会(USITT)于1990年发布的一种灯光控制器与灯具设备进行..._dmx512协议https://blog.csdn.net/qq_42992084/article/details/98525578

二、配置stm32

2.1 使用器件

stm32F407VET6,RGBW四通道DMX512灯带,HAL库。

2.2 配置串口

        可通过stm32CubeMX来配置。DMX512协议一帧一共有11位,分别是1位开始位、8位数据位,2位停止位。故可将stm32串口设置为1位开始位、8位数据位、2位停止位。

void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 250000;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_2;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */

  /* USER CODE END USART2_Init 2 */

}

 

三、 发送DMX512数据

 3.1 产生复位信号

        每次发送完整的DMX512协议帧均需要BREAK和MAB信号,作为复位信号。而串口模式下,PA2无法通过  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);   让引脚拉输出低电平88us以上,所以需要切换串口发送引脚的模式为普通IO口模式。

/*
由于每次发送完整的DMX512协议帧需要BREAK和MAB信号,所以我们写一个串口发送引脚的模式切换,
通过形参可以切换串口发送引脚的复用模式和普通IO口模式
*/
void SwitchUSART2TxPinMode(uint8_t mode)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if (mode == 1) // 串口模式
  {
    GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;	//复用推挽
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
  else if (mode == 0) // 普通IO模式
  {
    GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}

接着产生复位信号:

//复位信号
void Reset(void)
{
	SwitchUSART2TxPinMode(0);//普通IO模式
	
	// 设置USART2_TX引脚为低电平,模拟BREAK信号
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    delay_us(300); // BREAK信号持续时间300μs

	// 设置USART2_TX引脚为高电平,模拟MAB信号
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
    delay_us(100); // MAB信号持续时间100μs
	
	SwitchUSART2TxPinMode(1);//串口模式

}

3.2 发送DMX数据函数

//简单的测试代码
void DMX512_SendData(uint8_t R,uint8_t G,uint8_t B,uint8_t W,uint16_t led_num)
{
	Reset();			//复位信号
	Send_8bits(0x00);	//起始字节
	while(led_num--)
	{
		Send_8bits(R);  //R
		Send_8bits(G);  //G
		Send_8bits(B);  //B
		Send_8bits(W);  //w
	}
	
	HAL_Delay(1000);	//帧间间隔,时间可以自己修改
}

四、 源码获取

感兴趣的可与我私聊获取,非开源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值