303|2

414

帖子

10

TA的资源

一粒金砂(高级)

【AG32VH407】+驱动RGB灯带 [复制链接]

本帖最后由 90houyidai 于 2025-3-12 16:57 编辑

接上回,定时器呼吸灯,在中断中调整PWM的占空比来改变LED灯的亮度

这次采用DMA的方式来点亮RGB灯,灯珠采用WS2812

WS2812是单总线RGB灯,采用串联的方式可以方便的点亮多颗灯

image.png    

image.png  

24bit采用GRB888的方式通过IO将0码、1码组合后发送给灯珠

一般的有三种方式来实现时序波形的发送:

1、IO延时

2、SPI

3、定时器PWM

本次使用定时器PWM+DMA,参考GPTIMER例程

#define TIMEBASE 249
#define CODE1  170
#define CODE0  80

uint32_t gpt_pwmbuffer2[48*8*3+50]={};

void TestGpTimerPwmDma()
{
//初始化灯组缓存
  memset(gpt_pwmbuffer2, 0, 48*24+50);

	for (size_t i = 0; i < 8; i++)
{
  gpt_pwmbuffer[i] = CODE1;
  gpt_pwmbuffer2[i] = CODE1;
  gpt_pwmbuffer3[i][2] =  CODE1;
}
for (size_t i = 8; i < 8*2; i++)
{
  gpt_pwmbuffer[i] = CODE0;
  gpt_pwmbuffer2[i] = CODE0;
  gpt_pwmbuffer3[i][2] =  CODE0;
}
for (size_t i = 16; i < 8*3; i++)
{
  gpt_pwmbuffer[i] = CODE0;
  gpt_pwmbuffer2[i] = CODE0;
  gpt_pwmbuffer3[i][2] =  CODE0;
}


  // Use GPTIMER and DMA to generate arbitrary waveform
  SYS_EnableAHBClock(AHB_MASK_DMAC0);
  DMAC_Init();

    pwmdma_lli[0].Control = DMAC_MakeControl(DMAC_ADDR_INCR_ON, DMAC_ADDR_INCR_OFF, DMAC_WIDTH_32_BIT,
    DMAC_WIDTH_32_BIT, DMAC_BURST_1, DMAC_BURST_1, 0, DISABLE);
  for (uint32_t i = 0; i < (48*24+50); i++)
  {
  pwmdma_lli[i].SrcAddr = (uint32_t)&gpt_pwmbuffer2[i];
  pwmdma_lli[i].DstAddr = (uint32_t)&GPTIMER1->CCR0;
  pwmdma_lli[i].LLI     = (i<(48*24+50-1))?(uint32_t)&pwmdma_lli[i+1]:(uint32_t)&pwmdma_lli[0];
  pwmdma_lli[i].Control = pwmdma_lli[0].Control;
  }
  DMAC_ConfigLLI(DMAC_CHANNEL5, DMAC_MEM_TO_PERIPHERAL_PERIPHERAL_CTRL, 0, GPTIMER1_CC_DMA0_REQ, (uint32_t)pwmdma_lli);



  
  GPIO_AF_ENABLE(GPTIMER1_CH0);

  SYS_EnableAPBClock(APB_MASK_GPTIMER1);
  GPTIMER_InitTypeDef tm_init;
  GPTIMER_StructInit(&tm_init);
  tm_init.Autoreload = TIMEBASE;
  GPTIMER_Init(GPTIMER1, &tm_init);

  GPTIMER_OC_InitTypeDef oc_init;
  GPTIMER_OC_StructInit(&oc_init);
  oc_init.OCState = GPTIMER_OCSTATE_ENABLE;
  oc_init.OCMode = GPTIMER_OCMODE_PWM1;
  GPTIMER_OC_Init(GPTIMER1, GPTIMER_CHANNEL_CH0, &oc_init);

  GPTIMER_OC_EnableFast(GPTIMER1, GPTIMER_CHANNEL_CH0);
  GPTIMER_OC_EnablePreload(GPTIMER1, GPTIMER_CHANNEL_CH0);
  GPTIMER_EnableARRPreload(GPTIMER1);
  GPTIMER_EnableDmaUpdate(GPTIMER1);
  GPTIMER_EnableDmaCC0(GPTIMER1);
  GPTIMER_EnableAllOutputs(GPTIMER1);
  GPTIMER_EnableCounter(GPTIMER1);
  GPTIMER_GenerateEventUpdate(GPTIMER1); /* Enable UEV by setting UG bit to Load buffer data into preload registers */
  GPTIMER_GenerateEventUpdate(GPTIMER1); /* Enable UEV by setting UG bit to load data from preload to active registers */
 
}

更新LED数据缓存即可进行调光调色,尝试过使用单个dma.lli,但是地址貌似没有自增操作

IMG_3626

 

 

最新回复

不错   详情 回复 发表于 3 天前

回复
举报

7002

帖子

0

TA的资源

五彩晶圆(高级)

用WS2812的DMA的方式来点亮RGB灯,也挺顺溜的

 


回复

2

帖子

0

TA的资源

一粒金砂(初级)

不错


回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 12

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表