STM32通过HAL库的模拟IO驱动WS2812B全彩灯珠


前言

原理部分跳转传送门

一、时钟+GPIO配置

使用的tim1.
在这里插入图片描述
外部高速晶振
在这里插入图片描述
在这里插入图片描述

void OUT_H(void)
{
	
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
}
void OUT_L(void)
{
	GPIOA->BSRR=GPIO_PIN_7;
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
}
void OUT_R(unsigned int r)
{
	
	((r&0x80) == 0x80)? OUT_H():OUT_L();	
	((r&0x40) == 0x40)? OUT_H():OUT_L();
	((r&0x20) == 0x20)? OUT_H():OUT_L();
	((r&0x10) == 0x10)? OUT_H():OUT_L();
	((r&0x08) == 0x08)? OUT_H():OUT_L();
	((r&0x04) == 0x04)? OUT_H():OUT_L();
	((r&0x02) == 0x02)? OUT_H():OUT_L();
	((r&0x01) == 0x01)? OUT_H():OUT_L();
}
void OUT_G(unsigned int g)
{
	((g&0x80) == 0x80)? OUT_H():OUT_L();
	((g&0x40) == 0x40)? OUT_H():OUT_L();
	((g&0x20) == 0x20)? OUT_H():OUT_L();
	((g&0x10) == 0x10)? OUT_H():OUT_L();
	((g&0x08) == 0x08)? OUT_H():OUT_L();
	((g&0x04) == 0x04)? OUT_H():OUT_L();
	((g&0x02) == 0x02)? OUT_H():OUT_L();
	((g&0x01) == 0x01)? OUT_H():OUT_L();	
}
void OUT_B(unsigned int b)
{
	((b&0x80) == 0x80)? OUT_H():OUT_L();
	((b&0x40) == 0x40)? OUT_H():OUT_L();
	((b&0x20) == 0x20)? OUT_H():OUT_L();
	((b&0x10) == 0x10)? OUT_H():OUT_L();
	((b&0x08) == 0x08)? OUT_H():OUT_L();
	((b&0x04) == 0x04)? OUT_H():OUT_L();
	((b&0x02) == 0x02)? OUT_H():OUT_L();
	((b&0x01) == 0x01)? OUT_H():OUT_L();	
}
void OUT_GRB(unsigned int g,unsigned int r,unsigned int b)
{
	OUT_G(g);
	OUT_R(r);
	OUT_B(b);
	for(int i=0;i<100;i++);
}

二、使用步骤

调用OUT_GRB函数,其中三个参数分别对应RGB三色中的G/R/B,最大255表示最亮,0表示最暗

	for(int i=1;i<=4;i++)
	{
		OUT_GRB(255,255,255);//4个灯白色最高亮
	}	
	for(int j=1;j<=4;j++)
	{
		OUT_GRB(0,0,255);//4个灯蓝最高亮,其他颜色灭
	}	

最终效果是前4个灯白色,后四个灯蓝色

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是ws2812b-16的STM32F407IGT6 HAL库驱动代码,你可以参考一下: ```c #include "main.h" #include "stm32f4xx_hal.h" #define LED_NUM 16 TIM_HandleTypeDef htim1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM1_Init(void); uint8_t led_data[LED_NUM * 3]; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, led_data, LED_NUM * 3); while (1) { for (int i = 0; i < LED_NUM * 3; i++) { led_data[i] = 0; } led_data[0] = 255; led_data[1] = 0; led_data[2] = 0; led_data[3] = 0; led_data[4] = 255; led_data[5] = 0; led_data[6] = 0; led_data[7] = 0; led_data[8] = 255; HAL_Delay(500); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 16; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } static void MX_TIM1_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 84; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim1); } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void Error_Handler(void) { } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { } #endif ``` 这段代码使用了STM32F407IGT6的TIM1模块和DMA功能,通过PWM信号控制ws2812b-16灯带的亮度和颜色。具体实现方式是通过DMA将亮度和颜色数据写入TIM1的占空比寄存器,然后通过PWM信号输出控制LED灯带。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zctbjy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值