杰理-701-单线灯-ws2812-驱动

杰理-701-单线灯-ws2812-驱动

LED_gradual_open(); //调用后 呼吸灯

set_led_colour(R,G,B);//具体颜色

spi_dma_set_addr_for_isr //spi 配置dma 后灯才亮


#define LED_H 0x7c

#define LED_L 0x40

发送高位和地位的字节,具体使用逻辑分析仪配合灯的时序调试

spi 时钟修改

在这里插入图片描述
在这里插入图片描述

开机初始化spi

在这里插入图片描述

makefile添加led_spi.c

在这里插入图片描述

IO口高低电平输出,若没有led电源没有控制,则忽略

void user_set_gpio(u32 gpio, bool level)
{gpio_set_pull_down(gpio, 0);gpio_set_pull_up(gpio, 0);gpio_set_die(gpio, 1);gpio_set_hd(gpio, 0);//看需求是否需要开启强推,会导致芯片功耗大gpio_set_hd0(gpio, 0);gpio_set_direction(gpio, 0);gpio_set_output_value(gpio, level); //1高0低
}
#include "system/includes.h"
#include "app_config.h"
#include "asm/spi.h"#if G_log_total#if 1#define G_log(format, ...)       printf("->>>---    GZH    ---<<<-" format "\r\n", ## __VA_ARGS__)#else#define G_log(...)#endif
#else#define G_log(...)
#endif#if SINGLE_LEDstatic const u8 SPI1_DO[2] = {IO_PORTB_01,//'A'IO_PORTC_05 //'B'
};
static const u8 SPI2_DO[2] = {IO_PORTB_10,//'A'IO_PORT_DM  //'B'
};
#define LED_SPI                 JL_SPI2
#define LED_SPI_PORT            'A'
#define LED_SPI_DAT_BAUD        8000000
#define LED_SPI_REST_BAUD       1000000
#define LED_SPI_CLOCK_BASE		clk_get("lsb")static OS_SEM led_spi_sem;
static u32 spi_do = 0;
static u8 led_spi_busy = 0;
static u8 led_spi_sus = 0;void user_led_spi_test(void);___interrupt
void led_spi_isr()
{LED_SPI->CON &= ~BIT(13);   //关闭中断LED_SPI->CON |=  BIT(14);   //清pndingos_sem_post(&led_spi_sem);led_spi_busy = 0;
}void led_spi_init(void)
{if ((u32)LED_SPI == (u32)JL_SPI1) {// spi_do = SPI1_DO[LED_SPI_PORT - 'A'];SFR(JL_IOMAP->OCH_CON1, 4, 1, LED_SPI_PORT - 'A');request_irq(IRQ_SPI1_IDX, 0, led_spi_isr, 0);} else {// spi_do = SPI2_DO[LED_SPI_PORT - 'A'];SFR(JL_IOMAP->OCH_CON1, 5, 1, LED_SPI_PORT - 'A');request_irq(IRQ_SPI2_IDX, 0, led_spi_isr, 0);}gpio_set_die(TCFG_HW_SPI2_PORT_DO, 1);gpio_set_direction(TCFG_HW_SPI2_PORT_DO, 0);gpio_set_pull_up(TCFG_HW_SPI2_PORT_DO, 0);gpio_set_pull_down(TCFG_HW_SPI2_PORT_DO, 0);gpio_write(TCFG_HW_SPI2_PORT_DO, 0);os_sem_create(&led_spi_sem, 1);LED_SPI->CON = 0x4021;
}void led_spi_rgb_to_24byte(u8 r, u8 g, u8 b, u8 *buf, int idx)
{buf = buf + idx * 24;u32 dat = ((g << 16) | (r << 8) | b);for (u8 i = 0; i < 24; i ++) {if (dat & BIT(23 - i)) {*(buf + i) = 0x7c;} else {*(buf + i) = 0x60;}}
}void led_spi_rest()
{u8 tmp_buf[16] = {0};LED_SPI->BAUD = LED_SPI_CLOCK_BASE / LED_SPI_REST_BAUD - 1;LED_SPI->CON |= BIT(14);LED_SPI->ADR = (u32)tmp_buf;LED_SPI->CNT = 16;while (!(LED_SPI->CON & BIT(15)));LED_SPI->CON |= BIT(14);
}void led_spi_send_rgbbuf(u8 *rgb_buf, u16 led_num) //rgb_buf的大小 至少要等于 led_num * 24
{if (!led_num) {return;}while (led_spi_sus) {os_time_dly(1);}led_spi_busy = 1;// led_spi_rest();LED_SPI->BAUD = LED_SPI_CLOCK_BASE / LED_SPI_DAT_BAUD - 1;LED_SPI->CON |= BIT(14);LED_SPI->ADR = (u32)rgb_buf;LED_SPI->CNT = led_num * 24;while (!(LED_SPI->CON & BIT(15)));LED_SPI->CON |= BIT(14);led_spi_busy = 0;
}void led_spi_send_rgbbuf_isr(u8 *rgb_buf, u16 led_num) //rgb_buf的大小 至少要等于 led_num * 24
{if (!led_num) {return;}while (led_spi_sus) {os_time_dly(1);}led_spi_busy = 1;os_sem_pend(&led_spi_sem, 0);led_spi_rest();LED_SPI->BAUD = LED_SPI_CLOCK_BASE / LED_SPI_DAT_BAUD - 1;LED_SPI->CON |= BIT(14);LED_SPI->ADR = (u32)rgb_buf;LED_SPI->CNT = led_num * 24;LED_SPI->CON |= BIT(13);//打开中断
}u8 led_spi_suspend(void)
{if (led_spi_sus) {return 1;}if (led_spi_busy) {return 1;}LED_SPI->CON |=  BIT(14);LED_SPI->CON &= ~BIT(0);led_spi_sus = 1;return 0;
}u8 led_spi_resume(void)
{if (!led_spi_sus) {return 0;}gpio_set_die(TCFG_HW_SPI2_PORT_DO, 1);gpio_set_direction(TCFG_HW_SPI2_PORT_DO, 0);gpio_set_pull_up(TCFG_HW_SPI2_PORT_DO, 0);gpio_set_pull_down(TCFG_HW_SPI2_PORT_DO, 0);gpio_write(TCFG_HW_SPI2_PORT_DO, 0);LED_SPI->CON = 0x4021;led_spi_sus = 0;return 0;
}// static u8 spi_dat_buf[24 * 20] __attribute__((aligned(4)));#define LED_NUM    12
#define LED_H   0x7c
#define LED_L   0x40u8 spi_dat_buf[24*LED_NUM] = {0};//设置全部灯的颜色
void set_led_colour(u8 red, u8 green, u8 blue)
{printf(" red = %d  green = %d  blue = %d ",red,green,blue);
#if 1for(u8 i=0;i<LED_NUM;i++){for(u8 j=0;j<8;j++){spi_dat_buf[(i*24)+j] = (green & BIT(7-j)) ? LED_H : LED_L;}for(u8 j=0;j<8;j++){spi_dat_buf[(i*24)+j+8] = (red & BIT(7-j)) ? LED_H : LED_L;}for(u8 j=0;j<8;j++){spi_dat_buf[(i*24)+j+16] = (blue & BIT(7-j)) ? LED_H : LED_L;}}
#endif// put_buf(spi_dat_buf,sizeof(spi_dat_buf));
}extern void wdt_clear();void user_led_spi_test(void)
{printf("******************  led spi test  *******************\n");u8 spi_pro=SPI2;spi_open(spi_pro);u8 cnt = 0;u8 pulse = 0;// local_irq_disable();// memset(spi_dat_buf,LED_L,sizeof(spi_dat_buf));// while (1) {// cnt ++;// led_spi_rgb_to_24byte(cnt, 255 - cnt, 0, spi_dat_buf, 0);// led_spi_rgb_to_24byte(0, 0, cnt, spi_dat_buf, 1);
#if 0spi_dma_send(spi_pro,spi_dat_buf, sizeof(spi_dat_buf));        //等待的方式,建议用在发的数据量小的场合
#elsespi_dma_set_addr_for_isr(spi_pro,spi_dat_buf, 24*LED_NUM,0);    //中断的方式,建议用在发的数据量大的场合
#endifprintf(" ----- ");os_time_dly(50);wdt_clear();}
}void led_spi_test(void)
{user_led_spi_test();printf("******************  led spi test  *******************\n");led_spi_init();u8 cnt = 0;u8 pulse = 0;// local_irq_disable();while (1) {// cnt ++;// led_spi_rgb_to_24byte(cnt, 255 - cnt, 0, spi_dat_buf, 0);// led_spi_rgb_to_24byte(0, 0, cnt, spi_dat_buf, 1);
#if 0led_spi_send_rgbbuf(spi_dat_buf, sizeof(spi_dat_buf));        //等待的方式,建议用在发的数据量小的场合
#elseled_spi_send_rgbbuf_isr(spi_dat_buf, sizeof(spi_dat_buf));    //中断的方式,建议用在发的数据量大的场合
#endifprintf(" +++++  ");os_time_dly(50);wdt_clear();}
}#define  HIGT_BRIGHT    150
#define  LOW_BRIGHT      0
#define  HIGT_STEP       10static u16 gradual_timer = 0;
static int colour[3] = {0};
static u8 type = 0;void gradual_timer_func(void)
{ // G_log(" 0  type = %d   R = %d  G = %d   B = %d   ",type,colour[0],colour[2],colour[2]);user_set_gpio(IO_PORTB_06,0);switch(type){case 0:colour[0] += HIGT_STEP;colour[1] = 0;colour[2] = 0;if(colour[0] >= HIGT_BRIGHT ){type = 1;colour[0] = HIGT_BRIGHT;}break;case 1:colour[0] -= HIGT_STEP;colour[1] = 0;colour[2] = 0;if(colour[0] <= LOW_BRIGHT ){type = 2;}break;case 2:colour[0] = 0;colour[1] += HIGT_STEP;colour[2] = 0;if(colour[1] >= HIGT_BRIGHT ){type = 3;colour[1] = HIGT_BRIGHT;}break;case 3:colour[0] = 0;colour[1] -= HIGT_STEP;colour[2] = 0;if(colour[1] <= LOW_BRIGHT ){type = 4;}break;case 4:colour[0] = 0;colour[1] = 0;colour[2] += HIGT_STEP;if(colour[2] >= HIGT_BRIGHT ){colour[2] = HIGT_BRIGHT;type = 5;}break;case 5:colour[0] = 0;colour[1] = 0;colour[2] -= HIGT_STEP;if(colour[2] <= LOW_BRIGHT ){type = 0;}break;}// G_log(" 1  type = %d   R = %d  G = %d   B = %d   ",type,colour[0],colour[2],colour[2]);set_led_colour(colour[0],colour[1],colour[2]);// user_led_spi_test();spi_dma_set_addr_for_isr(SPI2,spi_dat_buf, 24*LED_NUM,0);
}void LED_gradual_close(void)
{user_set_gpio(IO_PORTB_06,1);if(gradual_timer){sys_timer_del(gradual_timer);gradual_timer = 0;}set_led_colour(0,0,0);spi_dma_set_addr_for_isr(SPI2,spi_dat_buf, 24*LED_NUM,0);memset(colour,0,sizeof(colour));type = 0;
}void LED_gradual_open(void)
{LED_gradual_close();if(!gradual_timer){gradual_timer = sys_timer_add(NULL,gradual_timer_func,50);}}#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.5.12 机器学习周报

引言 Abstract 文献阅读 1、题目 Deep High-Resolution Representation Learning for Human Pose Estimation 2、引言 在本文中&#xff0c;我们感兴趣的是人类姿态估计问题&#xff0c;重点是学习可靠的高分辨率表示。大多数现有的方法从由高到低分辨率网络产生的低分辨…

2024OD机试卷-生成哈夫曼树 (java\python\c++)

题目:生成哈夫曼树 题目描述 给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。 请完成一个函数,根据输入的数字数组,生成 哈夫曼树 ,并将哈夫曼树按照中序遍历输出。 为了保证输出的 二叉树中序遍历 结果统一,增加以下限…

K8s是什么?

url address K8s是一个开源的容器编排平台&#xff0c;可以自动化&#xff0c;在部署&#xff0c;管理和扩展容器化应用过程中涉及的许多手动操作。 Kubernetes最初是由Google工程师作为Borg项目开发和设计的&#xff0c;后于2015年捐赠给云原生计算基金会&#xff08;CNCF&a…

YOLOv5改进(二)BiFPN替换Neck网络

前言 针对红绿灯轻量化检测&#xff0c;上一节使用MobileNetv3替换了主干网络&#xff0c;本篇将在使用BiFPN替换Neck的方式优化算法~ 往期回顾 YOLOv5改进&#xff08;一&#xff09;MobileNetv3替换主干网络 目录 一、BiFPN简介二、改进方法一第一步&#xff1a;在common.…

LeetCode509:斐波那契数(使用动态规划)

题目描述 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n > 1…

7.9 证明:$\chi(G-e) = \min \{\chi(G),\chi(G\cdot e) \}$

7.9 证明&#xff1a; χ ( G − e ) min ⁡ { χ ( G ) , χ ( G ⋅ e ) } \chi(G-e) \min \{\chi(G),\chi(G\cdot e) \} χ(G−e)min{χ(G),χ(G⋅e)} 证&#xff1a; 色多项式的递推公式&#xff1a; P k ( G ) P k ( G − e ) − P k ( G ⋅ e ) P_k(G) P_k(G-e)-P_k(G…

D3CTF2024

文章目录 前言notewrite_flag_where【复现】D3BabyEscapePwnShell 前言 本次比赛笔者就做出两道简单题&#xff0c;但队里师傅太快了&#xff0c;所以也没我啥事。然后 WebPwn 那题命令行通了&#xff0c;但是浏览器不会调试&#xff0c;然后就简单记录一下。 note 只开了 N…

封装Springboot基础框架功能-03

在些模块中汇总了一些web开发常用的配置和功能。 模块源码结构 Restful API常用定义 QueryParam请求参数 Data public class QueryParam {private String key;private String value; }RestfulController实现 RestfulController.java&#xff0c;主要汇总一些常用的restful的…

CV每日论文--2024.4.29

1、Make-it-Real: Unleashing Large Multimodal Models Ability for Painting 3D Objects with Realistic Materials 中文标题&#xff1a;实现高仿真3D物体绘制:释放大型多模态模型的能力 简介&#xff1a;物理材料对于增强不同应用场景和光照条件下的3D资产的逼真感至关重要…

4.26.7具有超级令牌采样功能的 Vision Transformer

Vision Transformer在捕获浅层的局部特征时可能会受到高冗余的影响。 在神经网络的早期阶段获得高效且有效的全局上下文建模&#xff1a; ①从超像素的设计中汲取灵感&#xff0c;减少了后续处理中图像基元的数量&#xff0c;并将超级令牌引入到Vision Transformer中。 超像素…

应用软件安全保证措施方案书

系统安全保证措施方案—word原件 软件全套资料进主页获取或者本文末个人名片直接获取。

libhv http client vs cpr

libhv http client 和 cpr 的性能对比 libhv test code static void test_http_async(HttpClient* cli, int seq, int* resp_cnt) {auto req std::make_shared<HttpRequest>();req->method HTTP_GET;req->url "www.baidu.com";req->timeout 1…

html的标签

基础标签 标签描述<h1>-<h6>定义标题&#xff0c;h1最大&#xff0c;h6最小<font>定义文本的字体&#xff0c;字体尺寸&#xff0c;字体颜色<b>定义粗体文本<i>定义斜体文本<u>定义文本下划线<center>定义文本居中<p>定义段落…

windows系统API学习

win代码 1.代码&#xff1a; GetLogicalDriveStrings(1024,(LPWSTR)DStr);解释 DWORD GetLogicalDriveStringsW([in] DWORD nBufferLength,[out] LPWSTR lpBuffer); [in] nBufferLengthTCHAR 中由 lpBuffer 指向的缓冲区的最大大小。 此大小不包括终止 null 字符。 如果此…

Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示

文章目录 一、什么是SSE二、SSE技术的基本原理三、SSE适用于场景四、Node服务端示例1、协议2、格式3、事件3.1、事件3.2、事件唯一标识符3.3、重连事件 4、具体示例 五、客户端示例1、检测客户端是否支持SSE2、创建客户端连接3、事件监听4、接收事件5、自定义事件6、错误处理7、…

嘎嘎好用的虚拟键盘第二弹之中文输入法

之前还在为不用研究输入中文而暗自窃喜 这不新需求就来了&#xff08;新需求不会迟到 它只是在路上飞一会儿&#xff09; 找到了个博主分享的代码 是好使的 前端-xyq 已经和原作者申请转载了 感谢~~ 原作者地址&#xff1a;https://www.cnblogs.com/linjiangxian/p/16223681.h…

Alibaba Cloud Linux 安装mysql及注意事项

1.安装mysql #1.运行以下命令&#xff0c;更新YUM源。 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm#2.&#xff08;可选&#xff09;当操作系统为Alibaba Cloud Linux 3时&#xff0c;执行如下命令&#xff0c;安装MySQL所需的库文件…

java驱动bat脚本执行mysql备份然后自定义mysql备份名

我有个需求按钮触发bat脚本备份mysql,但是怕备份太多找不到最终的&#xff0c;所以可以自定义脚本备份的mysql名称 直接上干货 首先展示java代码 public static void main(String[] args) {// 备份文件名作为参数传入String backupFileName "C:\\Users\\Administrator\…

【Linux进程间通信(六)】深入理解 System V IPC

&#xff08;一&#xff09;引入 &#xff08;二&#xff09;IPC 命名空间 &#xff08;三&#xff09;ipc_ips结构体 &#xff08;四&#xff09;ipc_id_ary结构体 &#xff08;五&#xff09;kern_ipc_perm结构体 &#xff08;六&#xff09;操作系统对IPC资源是如何管理…

视频提取gif怎么制作?试试这个网站一键转换

通过把视频转换成gif动图的操作能够更加方便的在各种平台上分享和传播。相较于视频&#xff0c;gif图片具有较小的文件体积&#xff0c;gif动图能够快速的加载播放&#xff0c;不需要等待就能快速欣赏。很适合从事新媒体之类的小伙伴&#xff0c;可以用来做展示、宣传等。想要实…