STM32通过HAL库实现DMX512控制灯

这篇具有很好参考价值的文章主要介绍了STM32通过HAL库实现DMX512控制灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DMX512协议是什么

关于DMX512协议的解释下面这篇文章写的十分详尽:
链接:作者:夏沫の浅雨

实现DMX512协议

通过串口模拟

通过上文我们可以得知,数据帧需要1位低电平+8位数据位+2位高电平,这种格式与串口通信协议的格式可以说是几乎一模一样,因为平日基本上都是使用串口8N1格式。因此,若是不考虑接收基于DMX512协议的数据,也就是本文这种情况,完全可以使用8位数据位+2位停止位的串口通信方式模拟DMX512协议。

串口配置(通过cubmx):

dmx512,stm32,单片机,嵌入式硬件
为实现发送一位数据用4us,配置波特率250000bit/s,8位数据位,2位停止位,无校验。

发送函数:

由于break段与MAB段很长,串口不能模拟,所以得先把串口所用引脚复用给变成输出,去模拟:

void UartPortModeChang(uint8_t mode){
	
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	if(mode){
		GPIO_InitStruct.Pin = GPIO_PIN_2;
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
		HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	}else{
		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);
	}
}

接下来就是发送数据了,us延时很多,随便使用一种方法都可以,本文使用定时器6产生:

void DMX512_Send(uint8_t buff[],uint16_t num){//num为数据长度,因为有0X00所以不能用strlen计算长度
	uint8_t delay_num = 80;
	uint8_t send_buff[50] = {0};
	for(uint8_t i = 0;i <= num;++i){
		if(i == 0){
			send_buff[0] = 0X00;
		}else{
			send_buff[i] = buff[i-1];
		}
	}
	huart2.TxXferCount = num;
	UartPortModeChang(1);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
	delay_us(88);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
	while(delay_num--);
	UartPortModeChang(0);
	HAL_UART_Transmit(&huart2,send_buff,num+1,0xff);//此处为可以发0X00进行了一点修改
}

关于HAL串口发送函数的修改如下:

	while (huart->TxXferCount > 0U)
    {
      if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
      {
        return HAL_TIMEOUT;
      }
//      if (pdata8bits == NULL)
//      {
//        huart->Instance->DR = (uint16_t)(*pdata16bits & 0x01FFU);
//        pdata16bits++;
//      }
//      else
//      {
        huart->Instance->DR = (uint8_t)(*pdata8bits & 0xFFU);
        pdata8bits++;
//      }
      huart->TxXferCount--;
    }

注释掉这个判断是因为NULL等于0X00,故而会转而发送pdata16bits,这个变量是在配置串口为9位数据位无校验时用于存储待发送数据的。至此就能通过这个函数发送数据控制灯了。

一些问题

为什么不用寄存器方式发

一开始网上能找到的有限的教程都是寄存器方式发送,按照一般逻辑这种方式应该也是最快的,所以我也是照着写了一次拿逻辑分析仪看了看:
dmx512,stm32,单片机,嵌入式硬件
代码如下:

void DMX512_Send(uint8_t buff[],uint16_t num){

	uint8_t delay_num = 80;
	uint16_t num_div = num;
	huart2.TxXferCount = num;
	huart2.gState = HAL_UART_STATE_BUSY_TX;
	UartPortModeChang(1);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
	delay_us(88);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
	while(delay_num--);
	UartPortModeChang(0);
	huart2.Instance->DR = 0X00;
	while((huart2.Instance->SR & 0X40) == 0);
	huart2.Instance->DR = buff[0];
	while((huart2.Instance->SR & 0X40) == 0);
	while (huart2.TxXferCount > 0U){
		huart2.Instance->DR = *(++buff);
		while((huart2.Instance->SR & 0X40) == 0);
		huart2.TxXferCount--;
	}
	huart2.gState = HAL_UART_STATE_READY;
}

再看通过本文写的方法模拟的DMX512协议发送同样的数据通过逻辑分析仪获取效果:
dmx512,stm32,单片机,嵌入式硬件
相信区别是很明显的,虽然实际使用起来没什么区别,但是就是看着别扭,至于为什么多一个位高电平我也不清楚,若是有大佬能解释还请告知,不胜感激!文章来源地址https://www.toymoban.com/news/detail-849087.html

到了这里,关于STM32通过HAL库实现DMX512控制灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2-远程升级篇(自建物联网平台)-STM32通过EC800使用http或https下载程序文件升级程序(APP通过MQTT控制单片机更新)

    1,用户在APP上点击 \\\"固件升级\\\" 按钮, APP使用MQTT发送:  {\\\"data\\\":\\\"updata\\\",\\\"cmd\\\":\\\"DeviceInfo\\\"} //询问设备固件信息 2,设备通过MQTT收到该消息以后,发送 {\\\"data\\\":\\\"updata\\\",\\\"cmd\\\":\\\"DeviceInfo\\\",\\\"DeviceModel\\\":\\\"STM32EC800BKAPP\\\",\\\"FirmwareVersion\\\":\\\"0.0.0\\\"} (STM32EC800BKAPP是设备的型号;  0.0.0是设备当前的固件版本) 3,APP收到

    2024年04月16日
    浏览(134)
  • 手把手教你,通过HAL库实现STM32的超声波测距--以SR-04为例

    目录 0、SR-04基本原理 1、准备工作 2、连线  3、STM32CUBEMX设置 3.1新建工程 3.2芯片通用设置 3.3定时器捕获设置 ​3.4其他设置 3.5生成工程  4、程序完善 4.1完善打印输出函数  4.2完善tim.c 4.3完善gpio.c  4.4完善main函数   5、总结 声波遇到障碍物会反射,而声波的速度已知,所以

    2024年02月14日
    浏览(39)
  • STM32单片机PWM控制实现电机调速度(小车运动,STM32F103C8T6&TB6612&TT电机)

    作者:公子易平 时间:2023/6/6 前段时间做一个智能小车的相关项目时,发现很少有人能够将STM32的PWM控制讲清楚,故而书此文,希望对后来的学习者有所帮助。 STM32F103C8T6最小系统板 直流TT电机 电机驱动芯片(TB6612) 杜邦线若干 接线情况: TB6612引脚说明: STM32主控芯片与TB6612接

    2024年02月15日
    浏览(37)
  • STM32单片机学习3--STM32控制键盘

    单片机型号:STM32F103C8T6 开发环境:Keil5 4种输入模式 上拉输入模式:在默认状态下(GPIO引脚无输入),读取得的GPIO引脚数据为1,高电平(与Vdd相连的为上拉电阻); 下拉输入模式:在默认状态下(GPIO引脚无输入),读取得的GPIO引脚数据为0,低电平(与Vss相连的为下拉电

    2024年02月10日
    浏览(41)
  • STM32单片机学习4--STM32控制八段码

    数码管:实际上是多个LED按照一定顺序排列,并加上遮罩所构成的元件。 八段码一般会引出9个引脚,其中7个引脚显示数字(或某些字母),1个显示小数点,1个作为片选端。 根据连接方式的不同,数码管分为 共阳 和 共阴 。 共阳在这端输出低电平时点亮,高电平时会熄灭

    2024年01月23日
    浏览(37)
  • stm32cubemx hal学习记录:电机控制

    1、配置RCC、SYS,SYS的Timebase Source选择TIM6 2、配置USART1、时钟84MHz 3、激活FreeRTOS,选择CMSIS_V1,Config parameters种USE_TIMERS选择ENABLE 1、选用TIM3的编码器模式  2、驱动使用L298N,将PB6、PB7设置为输出模式  3、使用TIM2的CH1输出1kHz的PWM 1、设置两个软件定时器,一个用于总控制,一个

    2024年02月17日
    浏览(32)
  • STM32控制矩阵按键,HAL库,cubeMX配置

    我使用的是STM32F103RCT6这款单片机,HAL库,使用cubeMX配置。 使用矩阵按键实现功能的方法为轮询法 1.首先矩阵键盘原理图如下: 2.实物图 按照矩阵键盘接法,16个按键需要8个io口,我选择了PC口的0~7号引脚,前四个依次接矩阵键盘的行,后四个依次接矩阵键盘的列;矩阵键盘的

    2023年04月17日
    浏览(52)
  • STM32F407单片机HAL库CAN2不能接收数据解决方法

      最近在使用stm32F407的片子调试can通信,直接在正点原子的代码上修改调试,调试can1的时候,基本没啥问题,收发都正常,使用查询模式和中断模式都可以。但是当修改到can2的时候,可以正常发送数据,但是中断函数始终进不去。折腾了一两个小时终于搞定了。下面将解

    2024年02月16日
    浏览(31)
  • STM32---SG90舵机控制(HAL库,含源码)

    写在前面: 在嵌入式的项目中,舵机是一个十分常见的元器件模块,其主要的功能是实现机械转动,实质上舵机是一个伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。例如在机器人的电控制器系统中,飞行器设计,遥控机器人等。舵机的使用需要PWM信号

    2024年04月13日
    浏览(26)
  • STM32(HAL库)通过ADC读取MQ2数据

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置  2.4 项目生成  3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代 3.4 效果展示 本文通过STM32F103C8T6单片机通过HAL库方式对MQ2烟雾传感器进行数据的读取,并通过

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包