使用HAL库驱动WS2812 LED的STM32F401代码示例:
#include "stm32f4xx_hal.h"
#include <stdlib.h>
#define LED_COUNT 10
TIM_HandleTypeDef htim4;
DMA_HandleTypeDef hdma_tim4_up;
uint8_t led_colors[LED_COUNT * 3];
void init_GPIO(void) {
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void init_TIM(void) {
__HAL_RCC_TIM4_CLK_ENABLE();
TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
htim4.Instance = TIM4;
htim4.Init.Prescaler = 0;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 89;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim4);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_1, (uint32_t*)led_colors, LED_COUNT * 24);
}
int main(void) {
HAL_Init();
init_GPIO();
init_TIM();
while(1) {
// Set LED colors
set_led_color(0, 255, 0, 0);
set_led_color(1, 0, 255, 0);
set_led_color(2, 0, 0, 255);
set_led_color(3, 255, 255, 255);
HAL_Delay(10);
}
}
void set_led_color(uint8_t led_index, uint8_t red_value, uint8_t green_value, uint8_t blue_value) {
led_colors[(led_index * 24)] = (green_value & 0x80) ? 89 : 35;
for(int i = 1; i < 8; i++) {
led_colors[(led_index * 24) + (i * 3)] = (green_value & (0x01 << i)) ? 89 : 35;
}
led_colors[(led_index * 24) + 3] = (red_value & 0x80) ? 89 : 35;
for(int i = 1; i < 8; i++) {
led_colors[(led_index * 24) + (i * 3) + 1] = (red_value & (0x01 << i)) ? 89 : 35;
}
led_colors[(led_index * 24) + 6] = (blue_value & 0x80) ? 89 : 35;
for(int i = 1; i < 8; i++) {
led_colors[(led_index * 24) + (i * 3) + 2] = (blue_value & (0x01 << i)) ? 89 : 35;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)