STM32F429发现-无法将SPI与DMA一起用于驱动WS2812B LED

STM32F429发现-无法将SPI与DMA一起用于驱动WS2812B LED,stm32,spi,led,dma,stm32f4discovery,Stm32,Spi,Led,Dma,Stm32f4discovery,我已使用STM32CubeIDE设置了一个项目,以便与我的STM32F429I-DISC1发现板一起使用。 我想用它来驱动一组WS2812B LED模块,这需要一条高频数据线 我想将SPI与DMA结合使用,以便将数据连续传输到WS2812B LED模块 我目前所做的(已经把事情弄得一团糟,看看有什么可能是错的): main.c /*用户代码开始标题*/ /** ********************************************************************

我已使用STM32CubeIDE设置了一个项目,以便与我的STM32F429I-DISC1发现板一起使用。 我想用它来驱动一组WS2812B LED模块,这需要一条高频数据线

我想将SPI与DMA结合使用,以便将数据连续传输到WS2812B LED模块

我目前所做的(已经把事情弄得一团糟,看看有什么可能是错的):

main.c
/*用户代码开始标题*/
/**
******************************************************************************
*@file:main.c
*@brief:Main program body
******************************************************************************
*@注意
*
*&复制;版权所有(c)2020意法半导体。
*版权所有。
*
*此软件组件由ST根据终极自由许可证授权
*SLA0044,即“许可证”;除非符合以下要求,否则不得使用此文件
*执照。您可以通过以下方式获得许可证副本:
*www.st.com/SLA0044
*
******************************************************************************
*/
/*用户代码结束头*/
/*包括------------------------------------------------------------------*/
#包括“main.h”
/*私人包括----------------------------------------------------------*/
/*用户代码开始包括*/
/*用户代码端包括*/
/*私有类型定义-----------------------------------------------------------*/
/*用户代码开始PTD*/
/*用户代码结束PTD*/
/*私有定义------------------------------------------------------------*/
/*用户代码BEGIN PD*/
/*用户代码结束PD*/
/*私有宏-------------------------------------------------------------*/
/*用户代码开始PM*/
/*用户代码结束PM*/
/*私有变量---------------------------------------------------------*/
CRC_HandleTypeDef hcrc;
I2C_手柄类型定义hi2c3;
RNG_HandleTypeDef hrng;
SPI_HandleTypeDef hspi4;
SPI_HandleTypeDef hspi5;
DMA_HandleTypeDef hdma_spi4_tx;
TIM_HandleTypeDef htim1;
UART_手柄类型定义huart1;
SDRAM_HandleTypeDef hsdram1;
/*用户代码开始PV*/
/*用户代码结束PV*/
/*私有函数原型-----------------------------------------------*/
无效系统时钟配置(无效);
静态void MX_GPIO_Init(void);
静态void MX_DMA_Init(void);
静态void MX_CRC_Init(void);
静态void MX_FMC_Init(void);
静态void MX_I2C3_Init(void);
静态void MX_SPI5_Init(void);
静态void MX_TIM1_Init(void);
静态void MX_USART1_UART_Init(void);
静态void MX_RNG_Init(void);
静态void MX_SPI4_Init(void);
/*用户代码开始PFP*/
/*用户代码端PFP*/
/*专用用户代码---------------------------------------------------------*/
/*用户代码从0开始*/
/*用户代码结束0*/
/**
*@简要介绍应用程序入口点。
*@retval int
*/
内部主(空)
{
/*用户代码开始1*/
/*用户代码结束1*/
/*微控制器配置--------------------------------------------------------*/
/*重置所有外围设备,初始化闪存接口和Systick*/
HAL_Init();
/*用户代码开始初始化*/
/*用户代码结束初始化*/
/*配置系统时钟*/
SystemClock_Config();
/*用户代码BEGIN SysInit*/
/*用户代码结束SysInit*/
/*初始化所有配置的外围设备*/
MX_GPIO_Init();
MX_DMA_Init();
MX_CRC_Init();
MX_FMC_Init();
MX_I2C3_Init();
MX_SPI5_Init();
MX_TIM1_Init();
MX_USART1_UART_Init();
MX_RNG_Init();
MX_SPI4_Init();
/*用户代码开始2*/
//自己设置DMA?
hdma_spi4_tx.Instance=DMA2_Stream1;
hdma_spi4_tx.Init.Channel=DMA_Channel_1;
hdma_spi4_tx.Init.Direction=DMA_MEMORY_TO_PERIPH;
hdma_spi4_tx.Init.PeriphInc=DMA_PINC_DISABLE;
hdma_spi4_tx.Init.MemInc=DMA_MINC_ENABLE;
hdma_spi4_tx.Init.PeriphDataAlignment=DMA_PDATAALIGN_字节;
hdma_spi4_tx.Init.MemDataAlignment=DMA_MDATAALIGN_字节;
hdma_spi4_tx.Init.Mode=DMA_循环;
hdma_spi4_tx.Init.Priority=DMA_Priority_甚高;
hdma_spi4_tx.Init.FIFOMode=DMA_FIFOMode_DISABLE;
HAL_DMA_Init(&hdma_spi4_tx);
/*用户代码结束2*/
/*无限循环*/
/*用户代码在*/
uint8_t LEDData_WS2812B[][3]={
{0x92,0x49,0x24},{0x92,0x49,0x24},{0xDB,0x6D,0xB6}
};
uint8_t LEDData[][3]={//RGB格式
{0x00,0x00,0xFF}
};
HAL_DMA_Start(&hdma_spi4_tx,(uint32_t)LEDData_WS2812B,(uint32_t)和hspi4.Instance->DR,sizeof(LEDData_WS2812B)/sizeof(uint8_t));
HAL_SPI_传输_DMA(&hspi4,(uint8_t*)LEDData_WS2812B,sizeof(LEDData_WS2812B)/sizeof(uint8_t));
而(1)
{
/*用户代码结束时*/
/*用户代码开始3*/
}
/*用户代码结束3*/
}
/**
*@简要系统时钟配置
*@retval无
*/
无效系统时钟配置(无效)
{
RCC_oscintypedef RCC_OscInitStruct={0};
RCC_ClkInitTypeDef RCC_ClkInitStruct={0};
/**配置主内部调节器输出电压
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_电压缩放_配置(PWR_调节器_电压缩放1);
/**根据指定参数初始化RCC振荡器
*在RCC_oscintypedef结构中。
*/
RCC_OscInitStruct.OscillatorType=RCC_OscillatorType_HSE;
RCC_OscInitStruct.HSEState=RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSource_HSE;
RCC_OscInitStruct.PLL.PLLM=4;
RCC_OscInitStruct.PLL.PLLN=160;
RCC_OscInitStruct.PLL.PLLP=RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ=8;
如果(HAL_RCC_OscConfig(&RCC_OscInitStruct)!=HAL_OK)
{
错误处理程序();
}
/**初始化CPU、AHB和APB总线时钟
*/
RCC_ClkInitStruct.ClockType=RCC_ClockType_HCLK | RCC_ClockType_SYSCLK
|RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSource_PLLCLK;
RCC\u ClkInitStruct.AHBCLKDivider=RCC\u SYSCLK\u DIV1;
碾压混凝土
HAL_DMA_Start(&hdma_spi4_tx, (uint32_t)LEDData_WS2812B, (uint32_t)&hspi4.Instance->DR, sizeof(LEDData_WS2812B)/sizeof(uint8_t));

  while (1)
  {
    /* USER CODE END WHILE */
    HAL_SPI_Transmit_DMA(&hspi4, (uint8_t *)LEDData_WS2812B, sizeof(LEDData_WS2812B)/sizeof(uint8_t));
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
#include <FastLED.h>

#define LED_PIN     7   /*What pin to use*/
#define NUM_LEDS    30  /*how many leds in array*/
#define STD_DELAY   50  /*delay until next step in ms*/
#define MIN_VAL     16  /*lowest value RGB can take 0-255*/
#define MAX_VAL     128 /*highest value RGB can take 0-255*/        
#define STEP        8   /*how quickly to change colour (must follow eq. STEP = 2^n (where n is a natural number)*/

CRGB leds[NUM_LEDS];

void setup() { /*set up leds*/
    FastLED.addLeds<WS2813, LED_PIN, GRB>(leds, NUM_LEDS);
}

void loop() {
    unsigned char i = 0;
    unsigned char j = 0;
    unsigned char buf;
    unsigned char R=MAX_VAL;
    unsigned char G=MIN_VAL;
    unsigned char B=MIN_VAL;
    leds[NUM_LEDS-1] = CRGB(MIN_VAL,MIN_VAL,MIN_VAL);
    while (1){
        if (R == MAX_VAL && G < MAX_VAL && B == MIN_VAL){
            G += STEP;
        }
        else if (R > MIN_VAL && G == MAX_VAL && B == MIN_VAL){
            R -= STEP;
        }
        else if (R == MIN_VAL && G == MAX_VAL && B < MAX_VAL){
            B += STEP;
        }
        else if (R == MIN_VAL && G > MIN_VAL && B == MAX_VAL){
            G -= STEP;
        }
        else if (R < MAX_VAL && G == MIN_VAL && B == MAX_VAL){
            R += STEP;
        }
        else if (R == MAX_VAL && G == MIN_VAL && B > MIN_VAL){
            B -= STEP;
        }
        leds[0] = CRGB(R,G,B);
        for (j = NUM_LEDS-1; j > 0; j--){
            leds[j] = leds[j-1];
        }
        FastLED.show(); /*send signal to LEDs*/
        delay(STD_DELAY);

    }
}