杰理-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.hqwc.cn/news/679555.html

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

相关文章

TypeScript学习日志-第十六天(泛型)

泛型 一、函数泛型 当我们有多个函数是一样的不同的的函数的类型不一样时&#xff0c;我们可以使用泛型&#xff0c;这样就可以省去很多重复的书写&#xff0c;例如&#xff1a; 这样的两个函数时一样的&#xff0c;就是类型不一样&#xff0c;我们就可以使用泛型这样写&…

常见C语言基础说明二:位运算问题

一. 简介 前面一篇文章学习了 常见的 C语言基础题&#xff0c;文章如下&#xff1a; 常见C语言基础题说明一-CSDN博客 本文继续上一篇C语言基础题的学习。 二. C语言中 -> 位运算问题 1. 数据在计算机中的存储方式 当前的计算机系统使用的基本上是二进制系统&#…

Linux-进程管理类命令实训

实训1&#xff1a;进程查看&#xff0c;终止&#xff0c;挂起及暂停等操作 1.使用ps命令显示所有用户的进程 2.在后台使用cat命令。查看进程cat&#xff0c;并杀死进程 3.使用top命令只显示某一用户的进程。 4.执行命令cat&#xff0c;把Ctrlz挂起进程&#xff0c;输入jobs命令…

【Qt 开发基础体系】Qt信号与槽机制

文章目录 1.Qt 信号与槽机制原理&#xff08;Signal & Slot&#xff09;2. QObject 类 connect 的介绍3. 信号与槽机制连接方式4. 信号和槽机制优势及其效率&#xff1a;3. 信号与槽机制应用 1.Qt 信号与槽机制原理&#xff08;Signal & Slot&#xff09; &#x1f42…

Day 28 MySQL的数据备份与恢复

数据备份及恢复 1.概述 ​ 所有备份数据都应放在非数据库本地&#xff0c;而且建议有多份副本 备份&#xff1a; 能够防止由于机械故障以及人为误操作带来的数据丢失&#xff0c;例如将数据库文件保存在了其它地方 冗余&#xff1a; 数据有多份冗余&#xff0c;但不等备份&…

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

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

Kafk设计篇01(设计动机+持久化)

背景 本篇文章基于最新版本&#xff1a;kafka 3.7&#xff0c;其他版本的设计&#xff0c;请参考官网&#xff1a; https://kafka.apache.org/documentation/设计动机 任何组件都有它存在的必要&#xff0c;必然是要解决某一类问题的。我们来看看kafka设计的初衷如何。 kaf…

vue2项目升级到vue3经历分享4

后端重构&#xff0c;如果接口做好抽象封装&#xff0c;只需要考虑jar之间的兼容性问题&#xff0c;jdk版本不变&#xff0c;基本不用做太大的调整&#xff0c;但是前端就不一样&#xff0c;除了vue框架本身&#xff0c;css的调整&#xff0c;改起来更是让人头疼。前面写了vue2…

vue3实现电子签名的方法

vue3实现电子签名且对电子签名可进行修改画笔粗细、画笔颜色、撤销、清屏、保存等功能。 实现效果&#xff1a;查看源码 第一种&#xff1a;通过canvas <div class"signaturePad-Box w100 h100 flex-center"><el-space class"mb10" size"…

pinia持久化出现store和storage的数据不一致的问题

问题描述 突然发现menu的store异常&#xff0c;pinia中查看到store数据正确&#xff0c;但是localstorage中的数据始终没有同步&#xff0c;但user的store没问题&#xff0c;具体如下&#xff1a; menu的store&#xff1a; user的store&#xff1a; 问题原因 进入系统…

【文章转载】ChatGPT 提示词十级技巧: 从新手到专家

学习了微博网友宝玉xp老师《ChatGPT 提示词十级技巧: 从新手到专家》 个人学习要点&#xff1a; 1、关于提示中避免使用否定句&#xff0c;播主说&#xff1a;“没有人能准确解释为什么&#xff0c;但大语言模型在你告诉它去做某事时&#xff0c;表现似乎比你让它不做某事时更…

分享《2024年中国企业级SaaS行业研究报告》

&#xff08;文章作者与来源&#xff1a;艾瑞咨询&#xff09; 大浪淘沙&#xff0c;SaaS行业进入关键转折点&#xff0c;企业级SaaS的总体市场规模达到888亿元&#xff0c;同比增长13.0%。内外部因素叠加之下&#xff0c;预计三年未来企业级SaaS市场规模的增速将稳定在15%-20…