使用HAL库驱动WS2812 LED的STM32F401代码示例

2023-05-16

使用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(使用前将#替换为@)

使用HAL库驱动WS2812 LED的STM32F401代码示例 的相关文章

  • Podman设置容器开机自启

    Podman设置容器开机自启 1 podman管理员容器开机自启动 span class token number 1 span span class token operator span span class token operato
  • Linux中tty、pty、pts的概念区别

    http blog sina com cn s blog 638ac15c01012e0v html 基本概念 xff1a 1 gt tty 终端设备的统称 tty一词源于Teletypes xff0c 或teletypewriters x
  • Linux下vnc的安装、使用以及设置开机启动

    安装和使用VNC resbian系统自带realvnc vnc server 启动vnc服务 vncserver 1 xff08 1类似与端口号 xff0c 也可以理解为桌面序号 xff09 关闭vnc服务 vncserver kill 1
  • 单例模式与双重锁

    设计模式中 xff0c 最为基础与常见的就是单例模式 这也是经常在面试过程中被要求手写的设计模式 下面就先写一个简单的单例 xff1a public class Singleton private static Singleton sing
  • tensorflow安装时成功,但引用时提示:Could not load dynamic library ‘cudart64_101.dll‘…… if you do not have a GPU

    问题 xff1a 前几天tensorflow已经安装成功 xff0c 并顺利引用 但是这几天安装了与之冲突的包 xff1b 在重新调整各个包的版本后 xff0c 引用tensorflow提示出错 xff1a gt gt gt import
  • 【Linux】线程实例 | 简单线程池

    今天来写一个简单版本的线程池 1 啥是线程池 池塘 xff0c 顾名思义 xff0c 线程池就是一个有很多线程的容器 我们只需要把任务交到这个线程的池子里面 xff0c 其就能帮我们多线程执行任务 xff0c 计算出结果 与阻塞队列不同的是
  • pandas数据读取与清洗视频05-批量读取excel文件并合并

    本系列课程适用人群 xff1a python零基础数据分析的朋友 xff1b 在校学生 xff1b 职场中经常要处理各种数据表格 xff0c 或大量数据 xff08 十万级以上 xff09 的朋友 xff1b 喜欢图表可视化的朋友 xff1
  • 解决Xp提示未激活状态

    今天不知是什么原因电脑突然桌面背景变为黑色 xff0c 右下角提示 You may be a victim of software counterfeiting xff0c 如下图 所示 解决方法 xff1a xff08 亲测可以解决 xf
  • 微软软件运行库下载 (DirectX,.NET Framework,VC++库..)

    运行库是程序在运行时所需要的库文件 xff0c 运行库中一般包括编程时常用的函数 xff0c 如字符串操作 文件操作 界面等内容 不同的语言所支持的函数通常是不同的 xff0c 所以使用的库也是完全不同的 xff0c 这就是为什么有VB运行
  • 解决笔记本win7系统玩游戏不能全屏办法

    我们在使用笔记本win7系统玩游戏时 xff0c 经常会发现屏幕居中两边有黑条 而有一些台式机的宽屏显示器也经常出现下玩游戏不能全屏的问题 下面系统之家给大家介绍游戏不能全屏问题通用解决方法 1 修改注册表中的显示器的参数设置 Win键 4
  • MouseWithoutBorders无界鼠标安装配置教程

    第一步 xff1a 怎样修改系统计算机全名 xff08 链接教程 xff09 win7如何修改计算机的名字 百度经验 所有虚拟机必须改成不一样的名字 xff08 至关重要 xff09 第二步 xff1a 必须防火墙为开启的状态 xff08
  • 更换 PVE7 软件仓库源和 CT模板(LXC)源为国内源

    PVE7 安装后默认配置的 apt 软件源和 CT LXC 容器模板源均是官方默认的 xff0c 国内使用性能不佳 xff0c 建议替换为 清华 Tuna 提供的国内镜像源 xff0c 速度将有一个较大的提升 如果 pve 官网 iso 镜
  • Proxmox 7.3 换国内源安装

    Proxmox 7 2 默认来自官方的源 xff0c 国内慢的一逼高峰期只有个几KB的速度 xff0c 所以换源 Debian系统源 阿里云源 和中科大proxmox源 一 更换阿里云的源 vi etc apt sources list 替
  • 在x86平台制作龙芯版debian 10系统(mips64el)

    OS ubuntu 18 04 使用debootstrap制作根文件系统会分成两个阶段 第一阶段是 xff0c 使用debootstrap命令来下载软件包 第二阶段是安装软件包 安装debootstap 等相关工具 sudo apt ins
  • Mac安装homebrew报错curl: (7) Failed to connect to raw.githubusercontent.com port 443: Operation的解决办法

    在mac上安装homebrew的时候一般都是在终端输入以下的命令安装的 xff1a bin bash c 34 curl fsSL https raw githubusercontent com Homebrew install maste
  • 深度强化学习-DQN算法

    论文地址 xff1a https arxiv org abs 1312 5602 先讲下在线 xff0c 离线 xff0c 同策略和异策略 同策略 xff08 on policy xff09 和异策略 xff08 off policy xf
  • 再忙也要及时输出

    最近项目比较忙 xff0c 加班到很晚 xff0c 所以没有太多时间来更新博客 在做事情的过程中有过许多想法因为没有及时记录下来 xff0c 已经回想不起来了 xff0c 这是一种损失 不论再忙碌 xff0c 也要去反思和输出自己思考的东西
  • 通过Navicat 连接的数据库 查看数据库密码

    有时候数据库密码弄丢了 但是navicat能正常连接 想着到navicat连接处 复制一个 发现复制不了 可以用下面的方法查看 一 xff1a 导出连接 选择要导出数据库 勾选导出密码 导出的结果 里面打开就有加密后的密码 二 xff1a
  • 波长与频率的关系

    波长的定义 沿着波的传播方向 xff0c 在波的图形中相对平衡位置的位移时刻相同的两个质点之间的距离 横波与纵波的波长 在横波中波长通常是指相邻两个波峰或波谷之间的距离 在纵波中波长是指相邻两个密部或疏部之间的距离 波长在物理中表示为 xf
  • Python中的yield详细解释

    Python中的yield详细解释 yield是一个六级词汇 xff0c 常见意思有 产量 xff0c 屈服 动词 这里的yield大概率解释为一个僻义 缴出 咱们在什么情况下 xff0c 会用到yield呢 xff1f 答 xff1a 处

随机推荐