杰理-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;重点是学习可靠的高分辨率表示。大多数现有的方法从由高到低分辨率网络产生的低分辨…

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…

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原件 软件全套资料进主页获取或者本文末个人名片直接获取。

html的标签

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

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

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

【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;可以用来做展示、宣传等。想要实…

刷题训练之模拟

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握模拟算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题训…

vue 路由url中去掉#

修改前效果 想要去掉/# 如何实现&#xff1f; 1、typeScript中去掉url中# 找到项目中的router/index.ts-----------去掉createWebHashHistory中的Hash 将createWebHashHistory修改为createWebHistory 2、javaScript中去掉url中# 找到项目中的router/index.js-----------添加…

基于Nios-II的流水灯

基于Nios-II的流水灯 一、Qsys设计&#xff08;一&#xff09;新建项目&#xff08;二&#xff09;Platfrom Designer&#xff08;三&#xff09;设置时钟主频&#xff08;四&#xff09;添加Nios-II Processor并设置&#xff08;五&#xff09;添加JTAG并配置&#xff08;六&a…

做外贸用什么邮箱比较好?

外贸公司在推进公司业务时需要频繁进行跨国沟通&#xff0c;选择一款专业且功能强大的企业邮箱作为业务沟通工具至关重要。外贸企业邮箱需要满足5个基本内容&#xff0c;国际收发能力、安全稳定性、专业形象展示、功能完备性、客户服务与技术支持。本文将探讨做外贸时适合使用的…

Tkinter组件:Checkbutton

Tkinter组件&#xff1a;Checkbutton Checkbutton&#xff08;多选按钮&#xff09;组件用于实现确定是否选择的按钮。Checkbutton 组件可以包含文本或图像&#xff0c;你可以将一个 Python 的函数或方法与之相关联&#xff0c;当按钮被按下时&#xff0c;对应的函数或方法将被…

游戏全自动打金搬砖,单号收益300+ 轻松日入1000+

详情介绍 游戏全自动打金搬砖&#xff0c;单号收益300左右&#xff0c;多开收益更多&#xff0c;轻松日入1000 可矩阵操作。 项目长期稳定&#xff0c;全自动挂机无需人工操作&#xff0c;小白&#xff0c;宝妈&#xff0c;想做副业的都可以。

elementui+vue通过下拉框多选字段进行搜索模糊匹配

从字典中选择的值为["01","03"],在最开始的时候进行的处理是类似于表单提交的时候将json对象转换成了String类型 nature:["01","03"] this.queryParams.nature JSON.stringify(this.queryParams.nature); mapper层 <if test&quo…

springboot+vue+mybatis图书推荐管理系统的设计与实现+PPT+论文+讲解+售后

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;图书推荐管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决…