سلام
من برنامه ws2811 با میکرو آرم نوشتم . مشکلم اینه از ال ای دی پنجم به بعد به هم میریزه رنگ ها . کسی این مشکل داشته یا کتابخانه آماده داره
این نمونه کد من
من برنامه ws2811 با میکرو آرم نوشتم . مشکلم اینه از ال ای دی پنجم به بعد به هم میریزه رنگ ها . کسی این مشکل داشته یا کتابخانه آماده داره
این نمونه کد من
[HASHTAG="t15999"]include[/HASHTAG] "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
[HASHTAG="t25971"]define[/HASHTAG] DELAY_LEN 40
[HASHTAG="t25971"]define[/HASHTAG] LED_COUNT 16
[HASHTAG="t25971"]define[/HASHTAG] ARRAY_LEN DELAY_LEN + LED_COUNT*24
[HASHTAG="t25971"]define[/HASHTAG] HIGH 65
[HASHTAG="t25971"]define[/HASHTAG] LOW 25
unsigned char WS281x_FLAG;
//--------------------------------------------------
[HASHTAG="t25971"]define[/HASHTAG] BitIsSet(reg, bit) ((reg & (1<<bit)) != 0)
//--------------------------------------------------
void ws281x_init(void);
void ws281x_pixel_rgb_to_buf_dma(uint8_t Rpixel , uint8_t Gpixel, uint8_t Bpixel, uint16_t posX);
void ws281x_light(void);
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim1;
DMA_HandleTypeDef hdma_tim1_ch1;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_TIM1_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_TIM1_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//----------------------------------------------------------------------------
//extern TIM_HandleTypeDef htim3;
//----------------------------------------------------------------------------
uint16_t BUF_DMA [ARRAY_LEN] = {0};
//------------------------------------------------------------------
void ws281x_init(void)
{
int i;
for(i=DELAY_LEN;i<ARRAY_LEN;i++) BUF_DMA[i] = LOW;
}
////------------------------------------------------------------------
void ws281x_pixel_rgb_to_buf_dma(uint8_t Rpixel , uint8_t Gpixel, uint8_t Bpixel, uint16_t posX)
{
volatile uint16_t i;
for(i=0;i<8;i++)
{
if (BitIsSet(Rpixel,(7-i)) == 1)
{
BUF_DMA[DELAY_LEN+posX*24+i+8] = HIGH;
}else
{
BUF_DMA[DELAY_LEN+posX*24+i+8] = LOW;
}
if (BitIsSet(Gpixel,(7-i)) == 1)
{
BUF_DMA[DELAY_LEN+posX*24+i+0] = HIGH;
}else
{
BUF_DMA[DELAY_LEN+posX*24+i+0] = LOW;
}
if (BitIsSet(Bpixel,(7-i)) == 1)
{
BUF_DMA[DELAY_LEN+posX*24+i+16] = HIGH;
}else
{
BUF_DMA[DELAY_LEN+posX*24+i+16] = LOW;
}
}
}
////------------------------------------------------------------------
void ws281x_light(void)
{
WS281x_FLAG=1;
HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t*)&BUF_DMA,ARRAY_LEN);
}
//------------------------------------------------------------------
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
//MX_DMA_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,HIGH);
while(1){
}
//ws281x_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
for(char i=0 ; i<26 ; i++){
ws281x_pixel_rgb_to_buf_dma(255,0,0,i);
ws281x_light();
HAL_Delay(100);
}
for(char i=0 ; i<26 ; i++){
ws281x_pixel_rgb_to_buf_dma(0,255,0,i);
ws281x_light();
HAL_Delay(100);
}
for(char i=0 ; i<26 ; i++){
ws281x_pixel_rgb_to_buf_dma(0,0,255,i);
ws281x_light();
HAL_Delay(100);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}