搜索
bottom↓
回复: 34

请教:STM32F103 DMA PWM驱动WS2812没波形输出

[复制链接]

出0入55汤圆

发表于 2018-8-11 17:01:25 | 显示全部楼层 |阅读模式
单片机用的是 STM32F103RET6,WS2812接在PA8,打算用TIM1_CH1控制。程序如下,结果是死活没反应。。。求助做过的坛友


  1. #ifndef __BPS_WS2812_PWM_H
  2. #define __BPS_WS2812_PWM_H

  3. #include "stm32f10x.h"
  4.             
  5. #define TIMER_PERIOD                                                                                90//(TIMER_CLOCK_FREQ / WS2812_FREQ)
  6. #define LED_NUMBER                                                                                        (4)                                
  7. #define LED_BUFFER_SIZE                                                                                (LED_NUMBER * 24)
  8. #define WS2812_0                                                                                        (TIMER_PERIOD / 3)               
  9. #define WS2812_1                                                                                        (TIMER_PERIOD * 2 / 3)       

  10. void WS2812_Init (void);
  11. void WS2812_SetOneColor ( uint8_t index, uint8_t RED, uint8_t GREEN, uint8_t BLUE );
  12. void WS2812_SetWholeColor(uint8_t red, uint8_t green, uint8_t blue);
  13. void WS2812_Update (void);

  14. #endif /* __BPS_WS2812_PWM_H */
复制代码
  1. #include "yylGlobals.h"

  2. volatile  uint8_t LEDbuffer[LED_BUFFER_SIZE]={0};

  3. void WS2812_Init_buffers(void)
  4. {
  5.         uint16_t i;
  6.         for(i=0;i<LED_BUFFER_SIZE;i++)
  7.         {
  8.                 LEDbuffer[i] = 0;
  9.         }
  10. }
  11. /*************************************************************
  12. * 函 数 名 : WS2812_Init
  13. * 函数描述 : 初始化
  14. * 返 回 值 : none
  15. * 输入参数 : none
  16. * 输出参数 : none

  17. *************************************************************/

  18. void WS2812_Init (void)
  19. {
  20.         GPIO_InitTypeDef GPIO_InitStructure;
  21.         TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
  22.         TIM_OCInitTypeDef TIM_OC_InitStructure;
  23.         DMA_InitTypeDef DMA_InitStructure;
  24.        
  25.         WS2812_Init_buffers( );
  26.   
  27.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
  28.        
  29.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  32.         GPIO_Init( GPIOA, &GPIO_InitStructure );
  33.        
  34.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );
  35.        
  36.         TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  37.         TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  38.         TIM_TimeBase_InitStructure.TIM_Period = TIMER_PERIOD - 1;
  39.         TIM_TimeBase_InitStructure.TIM_Prescaler = 0;
  40.         TIM_TimeBaseInit( TIM1, &TIM_TimeBase_InitStructure );

  41.         TIM_OC_InitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  42.         TIM_OC_InitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  43.         TIM_OC_InitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
  44.         TIM_OC_InitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  45.         TIM_OC_InitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  46.         TIM_OC_InitStructure.TIM_OutputState = TIM_OutputState_Enable;
  47.         TIM_OC_InitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  48.         TIM_OC_InitStructure.TIM_Pulse = 0;
  49.         TIM_OC1Init( TIM1, &TIM_OC_InitStructure );
  50.   
  51.         TIM_CtrlPWMOutputs( TIM1, ENABLE );

  52.         TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Enable );
  53.         TIM_ARRPreloadConfig( TIM1, ENABLE );

  54.         TIM_CCxCmd( TIM1, TIM_Channel_1, TIM_CCx_Enable );
  55. //        TIM_Cmd( TIM1, ENABLE );

  56.         RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1, ENABLE );
  57.   
  58.         DMA_DeInit(DMA1_Channel2);

  59.         DMA_InitStructure.DMA_BufferSize = LED_BUFFER_SIZE;
  60.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1->CCR1;//0x40012C00 - 0x40012FFF TIM1定时器  TIMx_CCR1偏移0x034
  61.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)LEDbuffer;
  62.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  63.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  64.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  65.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  66.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  67.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  68.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  69.         DMA_Init(DMA1_Channel2, &DMA_InitStructure); /* DMA1 CH2 = MEM -> DR */


  70.         TIM_CCxCmd( TIM1, TIM_Channel_1, TIM_CCx_Enable );
  71. //        TIM_Cmd( TIM1, ENABLE );
  72.         DMA_Cmd ( DMA1_Channel2, DISABLE );
  73. //        TIM_DMACmd(TIM1,TIM_DMA_Update, ENABLE);
  74. }

  75. /*************************************************************
  76. * 函 数 名 : WS2812_update
  77. * 函数描述 : DMA发送数据
  78. * 输入参数 : none
  79. * 输出参数 : none
  80. * 返 回 值 : none
  81. *************************************************************/

  82. void WS2812_Update (void)
  83. {
  84.         TIM_Cmd ( TIM1, DISABLE );       
  85.         DMA_Cmd ( DMA1_Channel2, DISABLE );
  86.         DMA_ClearFlag(DMA1_FLAG_TC2);
  87.         DMA_SetCurrDataCounter ( DMA1_Channel2, LED_BUFFER_SIZE );
  88.         DMA_Cmd ( DMA1_Channel2, ENABLE );        
  89.         TIM_Cmd ( TIM1, ENABLE );       
  90. //        while(!DMA_GetFlagStatus(DMA1_FLAG_TC2));

  91.        
  92. //        DMA_Cmd(DMA1_Channel2, DISABLE);
  93. //        DMA_ClearFlag(DMA1_FLAG_TC2);
  94. //        DMA_SetCurrDataCounter ( DMA1_Channel2, LED_BUFFER_SIZE );
  95. //        DMA_Cmd(DMA1_Channel2, ENABLE);
  96. }

  97. /*************************************************************
  98. * 函 数 名 : SetLedColor
  99. * 函数描述 : 设置某一盏LED颜色
  100. * 输入参数 : index  需要点亮的LED序号(第一盏、第二盏.....)
  101. * 输出参数 : none
  102. * 返 回 值 : none
  103. *************************************************************/

  104. void WS2812_SetOneColor ( uint8_t index, uint8_t RED, uint8_t GREEN, uint8_t BLUE )
  105. {
  106.     uint8_t tempBuffer[24] = {0};
  107.     uint8_t i;

  108.     for ( i = 0; i < 8; i++ ) // GREEN data
  109.         tempBuffer[i] = ( ( GREEN << i ) & 0x80 ) ? WS2812_1 : WS2812_0;

  110.     for ( i = 0; i < 8; i++ ) // RED
  111.         tempBuffer[8 + i] = ( ( RED << i ) & 0x80 ) ? WS2812_1 : WS2812_0;

  112.     for ( i = 0; i < 8; i++ ) // BLUE
  113.         tempBuffer[16 + i] = ( ( BLUE << i ) & 0x80 ) ? WS2812_1 : WS2812_0;

  114.     for ( i = 0; i < 24; i++ )
  115.         LEDbuffer[index * 24 + i] = tempBuffer[i];
  116. }

  117. void WS2812_SetWholeColor(uint8_t red, uint8_t green, uint8_t blue)
  118. {
  119.         uint16_t i;
  120.         for ( i = 0; i < LED_NUMBER; i++ )
  121.                 WS2812_SetOneColor ( i, red, green, blue );
  122. }



  123. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入24汤圆

发表于 2018-8-11 17:15:45 | 显示全部楼层
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1->CCR1;
取地址

出0入55汤圆

 楼主| 发表于 2018-8-11 17:38:28 | 显示全部楼层
20061002838 发表于 2018-8-11 17:15
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1->CCR1;
取地址

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(TIM1->CCR1));//0x40012C00 - 0x40012FFF TIM1定时器  TIMx_CCR1偏移0x034

还是没输出。。。

出0入24汤圆

发表于 2018-8-11 17:43:14 | 显示全部楼层
jssd 发表于 2018-8-11 17:38
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(TIM1->CCR1));//0x40012C00 - 0x40012FFF TIM ...

TIM_DMACmd() 这个函数需要使用

1,检查时钟,检查外设的寄存器配置
2,TIM输出固定脉冲检查设置是否正确

出0入55汤圆

 楼主| 发表于 2018-8-11 17:48:35 | 显示全部楼层
20061002838 发表于 2018-8-11 17:43
TIM_DMACmd() 这个函数需要使用

1,检查时钟,检查外设的寄存器配置


非常感谢回复!
TIM_DMACmd() 这个用了,有波形输出,但只是一个大概6~8uS的方波(一直在这个范围动),无其他波形。

出0入24汤圆

发表于 2018-8-11 18:01:49 | 显示全部楼层
思路不对吧
想让TIM每一次CC事件触发DMA传输一个数据到CCR寄存器,直到传输完N个数据为止。
想法很好,但是TIM的DMA不是这么工作的,他会一次触发之后把所有的数据连续、不停顿传输完成,根本不是你预计的那样

咦,之前调试SPI的也是你,还准备推荐SPI,翻到之前的帖子发现是同一个人

出0入55汤圆

 楼主| 发表于 2018-8-11 18:07:35 | 显示全部楼层
20061002838 发表于 2018-8-11 18:01
思路不对吧
想让TIM每一次CC事件触发DMA传输一个数据到CCR寄存器,直到传输完N个数据为止。
想法很好,但是 ...

SPI调通了,可以工作,只是一个STM32才两个SPI,SPI要其他用,所以只能用PWM。。。

出0入24汤圆

发表于 2018-8-11 18:58:57 | 显示全部楼层
jssd 发表于 2018-8-11 18:07
SPI调通了,可以工作,只是一个STM32才两个SPI,SPI要其他用,所以只能用PWM。。。 ...

但是此路不通啊
换种思路,使用USART呢,同步模式,外部用个D触发器锁存信号,避免起始位置和结束位的影响

出0入24汤圆

发表于 2018-8-11 20:13:30 | 显示全部楼层

应该是可以的
波特率设置到8Mbps,一位是0.125us,8个数据位,1个停止位,一个字节数据总共10位,1.25us
起始位置和停止位经过D触发器之后输出低电平,占用0.25us
输出0时,USART发送0xE0,高电平0.375us,低电平0.875us
输出1时,USART发送0xFE,高电平0.875us,低电平0.375us
复位信号,USART输出0x00即可

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入55汤圆

 楼主| 发表于 2018-8-12 15:43:43 | 显示全部楼层
本帖最后由 jssd 于 2018-8-12 15:47 编辑
20061002838 发表于 2018-8-11 20:13
应该是可以的
波特率设置到8Mbps,一位是0.125us,8个数据位,1个停止位,一个字节数据总共10位,1.25us
...


我又来了。参考了网上的一些程序,修改了可以输出了,但显示出来的灯有些问题
1、每次亮11个灯,不多不少,无论怎么改。。。
2、3次一个轮回,不论怎么改。。。
3、不按颜色出,但每一次都是固定的颜色,不会变成其他颜色
麻烦大侠看看,多谢多谢!



程序如下
  1. #include "WS2812B.h"
  2. /* Buffer that holds one complete DMA transmission
  3. *
  4. * Ensure that this buffer is big enough to hold
  5. * all data bytes that need to be sent
  6. *
  7. * The buffer size can be calculated as follows:
  8. * number of LEDs * 24 bytes + 42 bytes
  9. *
  10. * This leaves us with a maximum string length of
  11. * (2^16 bytes per DMA stream - 42 bytes)/24 bytes per LED = 2728 LEDs
  12. */
  13. //#define TIM3_CCR3_Address 0x4000043c         // physical memory address of Timer 3 CCR1 register
  14. //#define TIM3_CCR1_Address 0x40000434        // physical memory address of Timer 3 CCR1 register
  15. #define TIM1_CCR1_Address 0x40012C34
  16.        
  17. #define TIMING_ONE  61
  18. #define TIMING_ZERO 29
  19. uint16_t LED_BYTE_Buffer[1242];
  20. //---------------------------------------------------------------//

  21. void Timer2_init(void)
  22. {
  23.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  24.   TIM_OCInitTypeDef  TIM_OCInitStructure;
  25.   GPIO_InitTypeDef GPIO_InitStructure;
  26.   DMA_InitTypeDef DMA_InitStructure;
  27.        
  28.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  29.         /* GPIOA Configuration: TIM2 Channel 1 as alternate function push-pull */
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  32.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  33.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  34.        
  35.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  36.         /* Compute the prescaler value */
  37.         //PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
  38.         /* Time base configuration */
  39.         TIM_TimeBaseStructure.TIM_Period = 90-1; // 800kHz
  40. //        TIM_TimeBaseStructure.TIM_Period = 100; // 800kHz
  41.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  42. //        TIM_TimeBaseStructure.TIM_Prescaler = 3000;
  43.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  44.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  45.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  46.         /* PWM1 Mode configuration: Channel1 */
  47.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  48.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  49.         TIM_OCInitStructure.TIM_Pulse = 0;
  50. //        TIM_OCInitStructure.TIM_Pulse = 10;
  51.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  52.         TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;
  53.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  54.        
  55. //        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  56.                
  57.         /* configure DMA */
  58.         /* DMA clock enable */
  59.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  60.        
  61.         /* DMA1 Channel6 Config */
  62.         DMA_DeInit(DMA1_Channel5);

  63.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1_CCR1_Address;        // physical address of Timer 3 CCR1
  64.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)LED_BYTE_Buffer;                // this is the buffer memory
  65.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                                // data shifted from memory to peripheral
  66.         DMA_InitStructure.DMA_BufferSize = sizeof(LED_BYTE_Buffer)/2;
  67.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  68.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                        // automatically increase buffer index
  69.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  70.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  71.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                                        // stop DMA feed after buffer size is reached
  72.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  73.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  74.        
  75.         DMA_Init(DMA1_Channel5, &DMA_InitStructure);
  76.        
  77.         DMA_ClearFlag(DMA1_FLAG_TC5);                                 // clear DMA1 Channel 6 transfer complete flag
  78.        
  79.         DMA_ITConfig( DMA1_Channel5, DMA_IT_TC, ENABLE );

  80.                 /* TIM3 CC1 DMA Request enable */
  81.         TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);
  82. //        TIM_Cmd(TIM1, ENABLE);
  83.         TIM_CtrlPWMOutputs(TIM1, ENABLE);
  84. }

  85. /* This function sends data bytes out to a string of WS2812s
  86. * The first argument is a pointer to the first RGB triplet to be sent
  87. * The seconds argument is the number of LEDs in the chain
  88. *
  89. * This will result in the RGB triplet passed by argument 1 being sent to
  90. * the LED that is the furthest away from the controller (the point where
  91. * data is injected into the chain)
  92. */
  93. void WS2812_send(uint8_t (*color)[3], uint16_t len)
  94. {
  95.         uint8_t i;
  96.         uint16_t memaddr;
  97.         uint16_t buffersize;
  98.         buffersize = (len*24)+43;        // number of bytes needed is #LEDs * 24 bytes + 42 trailing bytes
  99.         memaddr = 0;                                // reset buffer memory index

  100.         while (len)
  101.         {       
  102.                 for(i=0; i<8; i++) // GREEN data
  103.                 {
  104.                         LED_BYTE_Buffer[memaddr] = ((color[0][0]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
  105.                         memaddr++;
  106.                 }
  107.                 for(i=0; i<8; i++) // RED
  108.                 {
  109.                                 LED_BYTE_Buffer[memaddr] = ((color[0][1]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
  110.                                 memaddr++;
  111.                 }
  112.                 for(i=0; i<8; i++) // BLUE
  113.                 {
  114.                                 LED_BYTE_Buffer[memaddr] = ((color[0][2]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
  115.                                 memaddr++;
  116.                 }
  117.                 len--;
  118.         }
  119. //===================================================================//       
  120. //bug:最后一个周期波形不知道为什么全是高电平,故增加一个波形
  121.           LED_BYTE_Buffer[memaddr] = ((color[0][2]<<8) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
  122. //===================================================================//       
  123.           memaddr++;       
  124.                 while(memaddr < buffersize)
  125.                 {
  126.                         LED_BYTE_Buffer[memaddr] = 0;
  127.                         memaddr++;
  128.                 }

  129.                 DMA_SetCurrDataCounter(DMA1_Channel5, buffersize);         // load number of bytes to be transferred
  130.                 DMA_Cmd(DMA1_Channel5, ENABLE);                         // enable DMA channel 6
  131.                 TIM_Cmd(TIM1, ENABLE);                                                 // enable Timer 3
  132.                 while(!DMA_GetFlagStatus(DMA1_FLAG_TC5)) ;         // wait until transfer complete
  133.                 TIM_Cmd(TIM1, DISABLE);         // disable Timer 3
  134.                 DMA_Cmd(DMA1_Channel5, DISABLE);                         // disable DMA channel 6
  135.                 DMA_ClearFlag(DMA1_FLAG_TC5);                                 // clear DMA1 Channel 6 transfer complete flag
  136. }

复制代码

  1. int main(void)
  2. {       
  3.         delay_init();            //延时函数初始化          
  4.         LED_Init();                          //初始化与LED连接的硬件接口
  5.         Timer2_init();
  6.          
  7.         while(1)
  8.         {
  9.                 WS2812_send(rgb0,50);
  10.                 delay_ms(1000);
  11.                 WS2812_send(rgb4,50);
  12.                 delay_ms(1000);
  13.                 WS2812_send(rgb5,50);
  14.                 delay_ms(1000);
  15.                 WS2812_send(rgb6,50);
  16.                 delay_ms(1000);
  17. //                for(i=0;i<53;i++)
  18. //                {
  19. //                        WS2812_send(&rgb1[i],8);
  20. //                        delay_ms(50);
  21. //                }
  22. //                for(i=0;i<53;i++)
  23. //                {
  24. //                        WS2812_send(&rgb2[i],8);
  25. //                        delay_ms(50);
  26. //                }
  27. //                for(i=0;i<53;i++)
  28. //                {
  29. //                        WS2812_send(&rgb3[i],8);
  30. //                        delay_ms(50);
  31. //                }
  32.         }
  33. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入55汤圆

 楼主| 发表于 2018-8-12 15:50:11 | 显示全部楼层
20061002838 发表于 2018-8-11 18:58
但是此路不通啊
换种思路,使用USART呢,同步模式,外部用个D触发器锁存信号,避免起始位置和结束位的影 ...

这个还要增加外部元件。。。还不如用SPI呀

出0入24汤圆

发表于 2018-8-12 21:30:19 | 显示全部楼层
jssd 发表于 2018-8-12 15:43
我又来了。参考了网上的一些程序,修改了可以输出了,但显示出来的灯有些问题
1、每次亮11个灯,不多不少 ...

之前是我理解过了,确实是一次TIM事件触发一次DMA传输,跟另外一个帖子里面的搞混了
我用标准库自带例程测试是可以输出800Khz PWM,并且DMA控制占空比,不需要CPU干预
你的代码,我没办法编译,一大堆错误,还缺少文件
你该买个逻辑分析仪了

出0入0汤圆

发表于 2018-8-12 21:50:32 | 显示全部楼层
本帖最后由 zhangyun2743 于 2018-8-12 21:52 编辑

贴出我的代码参考一下吧   平台stm32f767
举例:要显示红色
        unsigned int color=0xff00;
        for(int i=0;i<24;i++)
        {
                if (color>>i & 1)
                        led[23-i] = T1;
                else
                        led[23-i] = T0;
        }
        TIM2->CR1 |= 1;
        DMA1_Stream5->CR |= 1;       

出0入0汤圆

发表于 2018-8-12 21:51:16 | 显示全部楼层
void delay_ms(volatile unsigned int i);
void delay_us(unsigned int i);
unsigned char LED_Free=1;
unsigned int led[25];
//F=800KHZ
void led_init(void)
{
        TIM2->CR1 = CK_DIV | Auto_relod | TIM2_DIR;
        TIM2->DIER = 1<<14 | 1<<9 | 1<<8;       
        TIM2->CCMR1 = oc1m_bit3 | OC1CE | OC1M_bit0_2 | OC1PE |\
                                                                OC1FE | CC1S;
        TIM2->CCER =         CC1P | CC1E;

        TIM2->PSC = 1-1;

        TIM2->ARR = 135;
        //TIM2->CCR2 = 135;
        TIM2->CCR1 = 0;
        //TIM2->DCR = 0x11<<8;
//        TIM2->CR1 |= CEN;       
       
       
        DMA1_Stream5->CR = 3<<25 | MBURST | PBURST | PL |\
                                                                                MSIZE | PSIZE | MINC | PINC | CIRC |\
                                                                                DMA_DIR | PFCTRL | TCIE;
        DMA1_Stream5->NDTR = sizeof(led)/4;//number of data
        DMA1_Stream5->PAR = (unsigned int )&TIM2->CCR1;
        DMA1_Stream5->M0AR = (unsigned int)led;
       
}

void led_reset(void)
{
        for(int i=0;i<24;i++)
        {
                        led[i] = T0;
        }
        TIM2->CR1 |= 1;
        DMA1_Stream5->CR |= 1;
}


下面是头文件

#define T0 45
#define T1 75

出0入0汤圆

发表于 2018-8-12 23:46:35 来自手机 | 显示全部楼层
给lz参考代码

出0入0汤圆

发表于 2018-8-13 07:19:57 | 显示全部楼层
直接汇编驱动IO不方便多了,还剩了定时器!!
效果也不差:https://www.amobbs.com/thread-5691611-1-1.html

出100入976汤圆

发表于 2018-8-13 08:47:27 | 显示全部楼层
可以参考我的贴子,https://www.amobbs.com/thread-5686533-1-1.html

出0入0汤圆

发表于 2018-8-13 10:45:24 来自手机 | 显示全部楼层
确定下gpio口复用定时器pwm端口选对没,就是AF设定

出0入0汤圆

发表于 2018-8-13 10:47:20 来自手机 | 显示全部楼层
我也刚使用pwm+dma完成了8个灯的控制,首先用示波器看看波形对了没先。

出0入55汤圆

 楼主| 发表于 2018-8-14 15:07:41 | 显示全部楼层
20061002838 发表于 2018-8-12 21:30
之前是我理解过了,确实是一次TIM事件触发一次DMA传输,跟另外一个帖子里面的搞混了
我用标准库自带例程 ...




现在可以正常控制灯了,不过有一个问题,看以下代码,
1、如果关了总中断,那灯显示完全没问题,但总中断不能关,因为我的串口在每时每刻接收数据,试过总中断关了后,会丢数据。
2、如果不关总中断,那第一个灯老是不受控制地闪烁,只是第一个灯,其他都正常。
  1. void WS2812_Reflash(void)
  2. {
  3.         __set_PRIMASK(1);        //关总中断,不关中断会导致第一个灯闪烁
  4.         DMA_SetCurrDataCounter(DMA1_Channel2, 1027);         // load number of bytes to be transferred
  5.         DMA_Cmd(DMA1_Channel2, ENABLE);                         // enable DMA channel 6
  6.         TIM_Cmd(TIM2, ENABLE);                                                 // enable Timer 3
  7.         while(!DMA_GetFlagStatus(DMA1_FLAG_TC2)) ;         // wait until transfer complete
  8.         TIM_Cmd(TIM2, DISABLE);         // disable Timer 3
  9.         DMA_Cmd(DMA1_Channel2, DISABLE);                         // disable DMA channel 6
  10.         DMA_ClearFlag(DMA1_FLAG_TC2);                                 // clear DMA1 Channel 6 transfer complete flag
  11.         __set_PRIMASK(0);        //开总中断
  12. }
复制代码


另:逻辑分析仪先不想了,公司不肯掏钱,自己又不想垫。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入55汤圆

 楼主| 发表于 2018-8-14 15:11:20 | 显示全部楼层
zhangyun2743 发表于 2018-8-12 21:51
void delay_ms(volatile unsigned int i);
void delay_us(unsigned int i);
unsigned char LED_Free=1;

感谢!我的代码配置也可以了,只是有些参数不知道怎么回事,现在有一点问题如楼上所说,工程也是可以编译的,如果有空不麻烦的话,帮帮忙看看,非常感谢!

出0入55汤圆

 楼主| 发表于 2018-8-14 15:12:45 | 显示全部楼层
appfan 发表于 2018-8-13 07:19
直接汇编驱动IO不方便多了,还剩了定时器!!
效果也不差:https://www.amobbs.com/thread-5691611-1-1.htm ...

我的板不只控制灯,还有好多东西要控制。。比如串口屏,比如U盘,比如NFC等等。。。

出0入55汤圆

 楼主| 发表于 2018-8-14 15:27:09 | 显示全部楼层
linccfzu 发表于 2018-8-13 08:47
可以参考我的贴子,https://www.amobbs.com/thread-5686533-1-1.html

也有下载看了,只是水平低,不大看得明白。也不知道怎样改。。。

出0入55汤圆

 楼主| 发表于 2018-8-14 15:28:53 | 显示全部楼层
Eiman 发表于 2018-8-13 10:47
我也刚使用pwm+dma完成了8个灯的控制,首先用示波器看看波形对了没先。

现在我也可以控制灯了,41个灯也可以,就是开了中断会对第一个有影响,看楼上的楼上的楼上。。。有工程。。

出0入24汤圆

发表于 2018-8-14 15:43:18 | 显示全部楼层
jssd 发表于 2018-8-14 15:07
现在可以正常控制灯了,不过有一个问题,看以下代码,
1、如果关了总中断,那灯显示完全没问题,但总中 ...

没逻辑分析仪纯粹就是试程序了

即使要关中断,也是在DMA传输完成之后关
另外DMA传输完成的时候TIM的最后一个周期还没有发送完成,可以添加一个空白的周期输出低电平,复位
TIM不需要每一次都停止,输出低电平就行了

出0入55汤圆

 楼主| 发表于 2018-8-14 16:32:09 | 显示全部楼层
本帖最后由 jssd 于 2018-8-14 16:38 编辑
20061002838 发表于 2018-8-14 15:43
没逻辑分析仪纯粹就是试程序了

即使要关中断,也是在DMA传输完成之后关


真是非常感谢你!谢谢!

确实在试程序。不关中断,初始化时打开定时器(TIM_Cmd(TIM2, ENABLE); )之后不停止,第一个灯不闪烁了,不过还是有一点不稳定,有时候前16个灯会闪烁(输出两种颜色,比如红色和绿色一起,绿色和蓝色一起,单色就没闪烁)
另外,对于这句不是很了解:DMA传输完成的时候TIM的最后一个周期还没有发送完成,可以添加一个空白的周期输出低电平,复位 ,怎样添加一个空白周期输出,怎样复位?

出0入24汤圆

发表于 2018-8-14 17:07:38 | 显示全部楼层
jssd 发表于 2018-8-14 16:32
真是非常感谢你!谢谢!

确实在试程序。不关中断,初始化时打开定时器(TIM_Cmd(TIM2, ENABLE); )之后 ...

DMA额外多传输1-2个数据,内容是0,定时器输出低电平,对于WS2812而言是复位信号

出0入55汤圆

 楼主| 发表于 2018-9-15 22:18:20 | 显示全部楼层
20061002838 发表于 2018-8-14 17:07
DMA额外多传输1-2个数据,内容是0,定时器输出低电平,对于WS2812而言是复位信号 ...

这个问题困扰我很久,后来一个不经意改了一下低电平(0)和高电平(1)的比例(#define TIMING_ONE  60 和 #define TIMING_ZERO 25),就没问题的。。估计之前刚好在临界值,导致第一个灯不大行。现在测试已经OK,程序如下

  1. #include "WS2812B.h"
  2. #include "bsp_usart1.h"
  3. #include "bsp_usart2.h"
  4. /* Buffer that holds one complete DMA transmission
  5. *
  6. * Ensure that this buffer is big enough to hold
  7. * all data bytes that need to be sent
  8. *
  9. * The buffer size can be calculated as follows:
  10. * number of LEDs * 24 bytes + 42 bytes
  11. *
  12. * This leaves us with a maximum string length of
  13. * (2^16 bytes per DMA stream - 42 bytes)/24 bytes per LED = 2728 LEDs
  14. */
  15. //#define TIM3_CCR3_Address 0x4000043c         // physical memory address of Timer 3 CCR1 register
  16. //#define TIM3_CCR1_Address 0x40000434        // physical memory address of Timer 3 CCR1 register
  17. #define TIM2_CCR1_Address 0x40000034
  18.        
  19. #define TIMING_ONE  60
  20. #define TIMING_ZERO 25


  21. #define LED_MIDNUM                25
  22. #define LED_OUTNUM                16
  23. #define LED_SUMNUM                (LED_MIDNUM + LED_OUTNUM)
  24. #define LED_BUFFSIZE        LED_SUMNUM*24+42

  25. uint16_t LED_BYTE_Buffer[LED_BUFFSIZE];
  26. //---------------------------------------------------------------//

  27. uint16_t numMid = 60;
  28. uint16_t patternMid = 1;
  29. uint16_t patternOut = 1;
  30. uint16_t speedMid = 20;
  31. uint16_t speedOut = 20;

  32. uint8_t ledMode = 0;
  33. uint8_t sbtState = 0;
  34. uint8_t sbtStateBack = 0;
  35. uint8_t err = 0;
  36. uint8_t isWin = 0;

  37. const uint8_t rgb0[][3] = {0x00,0x00,0x00};
  38. const uint8_t rgbr[][3] = {0xff,0x00,0x00};

  39. /*********************************** 外圈花样定义 *************************************/
  40. const uint8_t rgbO_Mono[][3] =        //r
  41.                                                                 {{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  42.                                                                 ,{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  43.                                                                 ,{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  44.                                                                 ,{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  45.                                                                 //r
  46.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
  47.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
  48.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
  49.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
  50.                                                                 //g
  51.                                                                 ,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
  52.                                                                 ,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
  53.                                                                 ,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
  54.                                                                 ,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
  55.                                                                 //g
  56.                                                                 ,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
  57.                                                                 ,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
  58.                                                                 ,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
  59.                                                                 ,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}       
  60.                                                                 //b
  61.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}
  62.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}
  63.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}
  64.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}       
  65.                                                                 //b
  66.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff}
  67.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff}
  68.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff}
  69.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff}                                                               
  70.                                                                 };
  71.                                                                
  72. const uint8_t rgbO_Move[][3] =        //r6
  73.                                                                 {{0xff,0x00,0x00},{0xf0,0x00,0x00},{0xe1,0x00,0x00},{0xd2,0x00,0x00}
  74.                                                                 ,{0xc3,0x00,0x00},{0xb4,0x00,0x00},{0xa5,0x00,0x00},{0x96,0x00,0x00}
  75.                                                                 ,{0x87,0x00,0x00},{0x78,0x00,0x00},{0x69,0x00,0x00},{0x5a,0x00,0x00}
  76.                                                                 ,{0x4b,0x00,0x00},{0x3c,0x00,0x00},{0x2d,0x00,0x00},{0x1e,0x00,0x00}
  77.                                                                
  78.                                                                 ,{0x00,0xff,0x00},{0x00,0xf0,0x00},{0x00,0xe1,0x00},{0x00,0xd2,0x00}
  79.                                                                 ,{0x00,0xc3,0x00},{0x00,0xb4,0x00},{0x00,0xa5,0x00},{0x00,0x96,0x00}
  80.                                                                 ,{0x00,0x87,0x00},{0x00,0x78,0x00},{0x00,0x69,0x00},{0x00,0x5a,0x00}
  81.                                                                 ,{0x00,0x4b,0x00},{0x00,0x3c,0x00},{0x00,0x2d,0x00},{0x00,0x1e,0x00}
  82.                                                                
  83.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0xf0},{0x00,0x00,0xe1},{0x00,0x00,0xd2}
  84.                                                                 ,{0x00,0x00,0xc3},{0x00,0x00,0xb4},{0x00,0x00,0xa5},{0x00,0x00,0x96}
  85.                                                                 ,{0x00,0x00,0x87},{0x00,0x00,0x78},{0x00,0x00,0x69},{0x00,0x00,0x5a}
  86.                                                                 ,{0x00,0x00,0x4b},{0x00,0x00,0x3c},{0x00,0x00,0x2d},{0x00,0x00,0x1e}
  87.                                                                 };
  88.        
  89. /*********************************** 中间花样定义 *************************************/
  90. //数字0~9
  91. const uint8_t rgbM_Num[][3] =        //0
  92.                                                                 {{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  93.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  94.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  95.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  96.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  97.                                                                         //1
  98.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  99.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  100.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  101.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  102.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  103.                                                                         //2
  104.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  105.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  106.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  107.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  108.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  109.                                                                         //3
  110.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  111.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  112.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  113.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  114.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  115.                                                                         //4
  116.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  117.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  118.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  119.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  120.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  121.                                                                         //5
  122.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  123.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  124.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  125.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  126.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  127.                                                                         //6
  128.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  129.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  130.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  131.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  132.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  133.                                                                         //7
  134.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  135.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  136.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  137.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  138.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  139.                                                                         //8
  140.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  141.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  142.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  143.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  144.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  145.                                                                         //9
  146.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  147.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  148.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  149.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  150.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  151.                                                                 };

  152. const uint8_t rgbM_Pattern1[][3] =        //花样1   内向外扩散
  153.                                                                 {{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  154.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  155.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x55,0x55,0x55},{0x00,0x00,0x00},{0x00,0x00,0x00}
  156.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  157.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  158.                                                                 //
  159.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  160.                                                                 ,{0x00,0x00,0x00},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x00,0x00,0x00}
  161.                                                                 ,{0x00,0x00,0x00},{0x55,0x55,0x55},{0x00,0x00,0x00},{0x55,0x55,0x55},{0x00,0x00,0x00}
  162.                                                                 ,{0x00,0x00,0x00},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x00,0x00,0x00}
  163.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  164.                                                                         //
  165.                                                                 ,{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55}
  166.                                                                 ,{0x55,0x55,0x55},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x55,0x55,0x55}
  167.                                                                 ,{0x55,0x55,0x55},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x55,0x55,0x55}
  168.                                                                 ,{0x55,0x55,0x55},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x55,0x55,0x55}
  169.                                                                 ,{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55}
  170.                                                                         //r
  171.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  172.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  173.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  174.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  175.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  176.                                                                         //r
  177.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  178.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  179.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  180.                                                                 ,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
  181.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  182.                                                                         //r
  183.                                                                 ,{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00}
  184.                                                                 ,{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
  185.                                                                 ,{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
  186.                                                                 ,{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
  187.                                                                 ,{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00}
  188.                                                                         //g
  189.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  190.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  191.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  192.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  193.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  194.                                                                         //g
  195.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  196.                                                                 ,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
  197.                                                                 ,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
  198.                                                                 ,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
  199.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  200.                                                                         //g
  201.                                                                 ,{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00}
  202.                                                                 ,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
  203.                                                                 ,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
  204.                                                                 ,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
  205.                                                                 ,{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00}
  206.                                                                         //b
  207.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  208.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  209.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0x00}
  210.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  211.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  212.                                                                         //b
  213.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  214.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0x00}
  215.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}
  216.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0x00}
  217.                                                                 ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  218.                                                                         //b
  219.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff}
  220.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0xff}
  221.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0xff}
  222.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0xff}
  223.                                                                 ,{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff}
  224.                                                                 };
  225.                                                                
  226. /************************** 底层初始化 ******************************************/
  227. void Timer2_init(void)
  228. {
  229.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  230.   TIM_OCInitTypeDef  TIM_OCInitStructure;
  231.   GPIO_InitTypeDef GPIO_InitStructure;
  232.   DMA_InitTypeDef DMA_InitStructure;
  233.        
  234.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  235.         /* GPIOA Configuration: TIM2 Channel 1 as alternate function push-pull */
  236.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  237.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  238.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  239.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  240.        
  241.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  242.         /* Compute the prescaler value */
  243.         //PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
  244.         /* Time base configuration */
  245.         TIM_TimeBaseStructure.TIM_Period = 90-1; // 800kHz
  246.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  247.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  248.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  249.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  250.         /* PWM1 Mode configuration: Channel1 */
  251.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  252.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  253.         TIM_OCInitStructure.TIM_Pulse = 0;
  254.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  255.         TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  256.                
  257.         /* configure DMA */
  258.         /* DMA clock enable */
  259.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  260.        
  261.         /* DMA1 Channel6 Config */
  262.         DMA_DeInit(DMA1_Channel2);

  263.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM2_CCR1_Address;        // physical address of Timer 3 CCR1
  264.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)LED_BYTE_Buffer;                // this is the buffer memory
  265.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                                // data shifted from memory to peripheral
  266.         DMA_InitStructure.DMA_BufferSize = LED_BUFFSIZE;
  267.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  268.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                        // automatically increase buffer index
  269.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  270.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  271.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                                        // stop DMA feed after buffer size is reached
  272.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  273.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  274.        
  275.         DMA_Init(DMA1_Channel2, &DMA_InitStructure);

  276.                 /* TIM3 CC1 DMA Request enable */
  277.         TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);
  278. }

  279. /* This function sends data bytes out to a string of WS2812s
  280. * The first argument is a pointer to the first RGB triplet to be sent
  281. * The seconds argument is the number of LEDs in the chain
  282. *
  283. * This will result in the RGB triplet passed by argument 1 being sent to
  284. * the LED that is the furthest away from the controller (the point where
  285. * data is injected into the chain)
  286. */

  287. void WS2812_Reflash(void)
  288. {
  289.         DMA_SetCurrDataCounter(DMA1_Channel2, LED_BUFFSIZE);         // load number of bytes to be transferred
  290.         DMA_Cmd(DMA1_Channel2, ENABLE);                         // enable DMA channel 6
  291.         TIM_Cmd(TIM2, ENABLE);                                                 // enable Timer 3
  292.         while(!DMA_GetFlagStatus(DMA1_FLAG_TC2)) ;         // wait until transfer complete
  293.         TIM_Cmd(TIM2, DISABLE);         // disable Timer 3
  294.         DMA_Cmd(DMA1_Channel2, DISABLE);                         // disable DMA channel 6
  295.         DMA_ClearFlag(DMA1_FLAG_TC2);                                 // clear DMA1 Channel 6 transfer complete flag
  296. }



  297. void WS2812_SetOne(const uint8_t (*color)[3],uint16_t index)
  298. {
  299.         uint16_t tempBuffer[24] = {0};
  300.     uint16_t i;
  301.        
  302. //        for ( i = 0; i < 1027; i++ ) // GREEN data
  303. //        LED_BYTE_Buffer[i] = TIMING_ZERO;

  304.     for ( i = 0; i < 8; i++ ) // GREEN data
  305.         tempBuffer[i] = ( ( color[0][1] << i ) & 0x0080 ) ? TIMING_ONE : TIMING_ZERO;

  306.     for ( i = 0; i < 8; i++ ) // RED
  307.         tempBuffer[8 + i] = ( ( color[0][0] << i ) & 0x0080 ) ? TIMING_ONE : TIMING_ZERO;

  308.     for ( i = 0; i < 8; i++ ) // BLUE
  309.         tempBuffer[16 + i] = ( ( color[0][2] << i ) & 0x0080 ) ? TIMING_ONE : TIMING_ZERO;
  310.        
  311.         for ( i = 0; i < 24; i++ )
  312.         LED_BYTE_Buffer[index * 24 + i] = tempBuffer[i];
  313. }


  314. /*********************** 中间25个灯 花样 ********************************/       
  315. /*********************** 显示0~9 ********************************/

  316. uint8_t WS2812_MiddleNum(uint16_t num)
  317. {
  318.         static uint16_t tim = 0;
  319.         uint16_t i;
  320.        
  321.         if(num>9) return 0;        //只显示0~9
  322.        
  323.         if(++tim<speedMid) return 0;
  324.         tim = 0;
  325.        
  326.         for(i=0;i<LED_MIDNUM;i++)
  327.         {
  328.                 WS2812_SetOne(&rgbM_Num[num*LED_MIDNUM+i],i+LED_OUTNUM);
  329.         }
  330.         return 1;
  331. }


  332. /*********************** 显示花样 ********************************/
  333. void WS2812_Mid_Mode1(void)
  334. {
  335.         static uint8_t dex = 0;
  336.         static uint16_t color = 0;
  337.         uint16_t i;
  338.        
  339.         if(++dex>2)
  340.         {
  341.                 dex = 0;
  342.                 if(++color>3) color = 0;
  343.         }
  344.         for(i=0;i<LED_MIDNUM;i++)
  345.                 WS2812_SetOne(&rgbM_Pattern1[(color*3+dex)*LED_MIDNUM+i],i+LED_OUTNUM);
  346.        
  347. }

  348. uint8_t WS2812_MiddlePattern(uint16_t pat)
  349. {
  350.         static uint16_t tim = 0;
  351.         uint16_t i;
  352.        
  353.         if(++tim<speedMid) return 0;
  354.         tim = 0;
  355.        
  356.         switch(pat)
  357.         {
  358.                 case 1:
  359.                         WS2812_Mid_Mode1();
  360.                         break;
  361.                 default:
  362.                         for(i=0;i<LED_MIDNUM;i++)
  363.                         {
  364.                                 WS2812_SetOne(rgb0,i+LED_OUTNUM);
  365.                         }
  366.                         break;
  367.         }
  368.         return 1;
  369. }

  370. /*********************** 外圈16个灯 花样 ********************************/       
  371. /*********************** 显示花样 ********************************/



  372. //const uint8_t rgbO_Move[][3] =        //r6
  373. //                                                                {{0xff,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0xff},{0xff,0x00,0x00}
  374. //                                                                ,{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  375. //                                                                ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
  376. //                                                                ,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}


  377. void WS2812_Out_Mode1(void)    //间隔闪烁
  378. {
  379.         static uint8_t dex = 0;
  380.         static uint16_t color = 0;
  381.         uint16_t i;
  382.         if(++dex>1)
  383.         {
  384.                 dex = 0;
  385.                 if(++color>2) color = 0;
  386.         }
  387.         for(i=0;i<LED_OUTNUM;i++)
  388.                 WS2812_SetOne(&rgbO_Mono[(color*2+dex)*LED_OUTNUM+i],i);
  389. }

  390. void WS2812_Out_Mode2(void)    //向左旋转
  391. {
  392.         static uint8_t Q=0; //每一次进来时的起点
  393.         int i,R=Q;
  394.         static uint8_t dex = 0;
  395.         for(i=0;i<LED_OUTNUM;i++){
  396.                 WS2812_SetOne(&rgbO_Move[dex*LED_OUTNUM+R],i);
  397.                 if(++R>=LED_OUTNUM)R=0; //环形
  398.         }
  399.         if(++Q>=LED_OUTNUM)
  400.         {
  401.                 Q=0; //起点移动
  402.                 if(++dex>2) dex = 0;
  403.         }
  404. }

  405. uint8_t WS2812_OutPattern(uint16_t pat)
  406. {
  407.         static uint16_t tim = 0;
  408.         uint16_t i;
  409.        
  410.         if(++tim<speedOut) return 0;
  411.         tim = 0;
  412.        
  413.         switch(pat)
  414.         {
  415.                 case 1:
  416.                         WS2812_Out_Mode1();
  417.                         break;
  418.                 case 2:                       
  419.                         WS2812_Out_Mode2();
  420.                         break;
  421.                 default:
  422.                         for(i=0;i<LED_OUTNUM;i++)
  423.                         {
  424.                                 WS2812_SetOne(rgb0,i);
  425.                         }
  426.                         break;
  427.         }
  428.         return 1;
  429. }

  430. /************************* 空闲 呼吸灯***********************************/
  431. const uint8_t LED_Table_Breath[100]={        1,1,1,1,1,1,1,2,2,2,
  432.                                                                                 2,2,2,2,2,2,3,3,3,3,
  433.                                                                                 3,3,4,4,4,4,4,5,5,5,
  434.                                                                                 6,6,6,7,7,7,8,8,9,9,
  435.                                                                                 10,10,11,11,12,13,14,14,15,16,
  436.                                                                                 17,18,19,20,21,22,24,25,26,28,
  437.                                                                                 29,31,33,35,37,39,41,43,46,48,
  438.                                                                                 51,54,57,60,64,67,71,75,80,84,
  439.                                                                                 89,94,99,105,111,117,124,131,139,147,
  440.                                                                                 155,164,173,183,193,204,216,228,241,255};
  441. uint8_t WS2812_IdlePattern(void)
  442. {
  443.         static uint16_t tim = 0;
  444.         static uint16_t color = 0;
  445.         static uint16_t tabDex = 0;
  446.         uint8_t rgbTemp[1][3];
  447.         uint16_t i = 0;
  448.        
  449.         if(++tim<5)         return 0;
  450.         tim = 0;
  451.        
  452.         if(color==0)
  453.         {
  454.                 rgbTemp[0][0] = LED_Table_Breath[tabDex];
  455.                 rgbTemp[0][1] = 255 - LED_Table_Breath[tabDex];;
  456.                 rgbTemp[0][2] = 0;
  457.         }
  458.         else if(color==1)
  459.         {
  460.                 rgbTemp[0][0] = 255 - LED_Table_Breath[tabDex];;
  461.                 rgbTemp[0][1] = 0;
  462.                 rgbTemp[0][2] = LED_Table_Breath[tabDex];
  463.                
  464.         }
  465.         else
  466.         {
  467.                 rgbTemp[0][0] = 0;
  468.                 rgbTemp[0][1] = LED_Table_Breath[tabDex];
  469.                 rgbTemp[0][2] = 255 - LED_Table_Breath[tabDex];
  470.         }

  471.         for(i=0;i<LED_SUMNUM;i++)
  472.         {
  473.                 WS2812_SetOne(rgbTemp,i);
  474.         }
  475.         if(++tabDex>=100)
  476.         {
  477.                 tabDex = 0;
  478.                 if(++color>2) color = 0;
  479.         }
  480.         return 1;
  481. }

  482. /************************* 移动 动作***********************************/
  483. uint8_t  WS2812_MovePattern(void)
  484. {
  485.         static uint16_t tim = 0;
  486.        
  487.         if(++tim<15)         return 0;
  488.         tim = 0;
  489.        
  490.         WS2812_Out_Mode2();
  491.         WS2812_Mid_Mode1();
  492.        
  493.         return 1;
  494. }



  495. /************************* 中奖 ***********************************/
  496. uint8_t WS2812_WinPattern(void)
  497. {
  498.         static uint16_t tim = 0;
  499.         if(++tim<5)         return 0;
  500.         tim = 0;
  501.         WS2812_Out_Mode1();
  502.         WS2812_Mid_Mode1();
  503.         return 1;
  504. }

  505. /************************* 错误 ***********************************/
  506. uint8_t WS2812_ErrorPattern(void)
  507. {
  508.         static uint16_t tim = 0;
  509.         static uint8_t dex = 0;
  510.         uint16_t i = 0;
  511.         if(++tim<50)         return 0;
  512.         tim = 0;
  513.         if(dex>0)
  514.         {
  515.                 for(i=0;i<LED_SUMNUM;i++)
  516.                 {
  517.                         WS2812_SetOne(rgbr,i);
  518.                 }
  519.         }
  520.         else
  521.         {
  522.                 for(i=0;i<LED_SUMNUM;i++)
  523.                 {
  524.                         WS2812_SetOne(rgb0,i);
  525.                 }
  526.         }
  527.         if(++dex>1) dex = 0;
  528.         return 1;
  529. }

  530. /**************** 灯处理 **********************/
  531. //uint8_t ledMode = 0;
  532. //uint8_t sbtState = 0;
  533. //uint8_t sbtStateBack = 0;
  534. //uint8_t err = 0;
  535. //uint8_t isWin = 0;
  536. void WS2812_Process(void)
  537. {
  538.         uint8_t reflash = 0;
  539.        
  540.         if(err>0)
  541.                 ledMode = 3;
  542.         else if(isWin>0)
  543.                 ledMode = 2;
  544.         else if(sbtState>0)
  545.                 ledMode = 1;
  546.         else
  547.                 ledMode = 0;
  548.        
  549.         switch(ledMode)
  550.         {
  551.                 case 0:
  552.                         if(WS2812_IdlePattern()>0)
  553.                                 reflash = 1;
  554.                         break;
  555.                 case 1:
  556.                         if(WS2812_MovePattern()>0)
  557.                                 reflash = 1;
  558.                         break;
  559.                 case 2:
  560.                         if(WS2812_WinPattern()>0)
  561.                                 reflash = 1;
  562.                         break;
  563.                 case 3:
  564.                         if(WS2812_ErrorPattern()>0)
  565.                                 reflash = 1;
  566.                         break;
  567.                 default:break;
  568.         }
  569.        
  570.         if(reflash>0)
  571.                 WS2812_Reflash();
  572. }
复制代码

出0入24汤圆

发表于 2018-9-17 11:49:35 | 显示全部楼层
一个逻辑分析仪惹出来的麻烦
浪费的这几天工资购买一箩筐逻辑分析仪了

出0入55汤圆

 楼主| 发表于 2018-9-17 14:12:29 | 显示全部楼层
20061002838 发表于 2018-9-17 11:49
一个逻辑分析仪惹出来的麻烦
浪费的这几天工资购买一箩筐逻辑分析仪了

确实,说得有理。大侠可否白推荐一个逻辑分析仪?

出0入24汤圆

发表于 2018-9-17 18:29:56 | 显示全部楼层
金沙滩的就很好用

出0入53汤圆

发表于 2022-8-31 16:41:57 | 显示全部楼层
本帖最后由 zhcj66 于 2022-8-31 16:44 编辑
jssd 发表于 2018-8-11 18:07
SPI调通了,可以工作,只是一个STM32才两个SPI,SPI要其他用,所以只能用PWM。。。 ...
(引用自7楼)


我在使用spi调试,发现 数据和数据之间超过了电平允许时间,  这样ws2812接收数据就出现了问题,

你是用spi的mosi管脚驱动的ws2812吗?

能否分享一下你驱动程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入55汤圆

 楼主| 发表于 2022-8-31 17:00:02 | 显示全部楼层
zhcj66 发表于 2022-8-31 16:41
我在使用spi调试,发现 数据和数据之间超过了电平允许时间,  这样ws2812接收数据就出现了问题,

你是用sp ...
(引用自32楼)

28楼就有。完整工程上面的楼层也有,但是有一点问题的,解决方法在28楼

出0入53汤圆

发表于 2022-8-31 17:04:19 | 显示全部楼层
jssd 发表于 2022-8-31 17:00
28楼就有。完整工程上面的楼层也有,但是有一点问题的,解决方法在28楼
(引用自33楼)


spi 模式的还有没,我的T0H超过了380us

出0入55汤圆

 楼主| 发表于 2022-9-1 08:32:53 | 显示全部楼层
zhcj66 发表于 2022-8-31 17:04
spi 模式的还有没,我的T0H超过了380us
(引用自34楼)

求助:类似WS2812b驱动的SM16703P的全彩灯驱动芯片怎样驱动
https://www.amobbs.com/thread-5695000-1-1.html

看16楼。我现在也没有之前的程序了,之前的问题好像出在用的内部晶振,改用外部8M就好了。但按理说内部设置好的话应该也是可以的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 18:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表