沁恒微WCH32v003驱动ST7735S硬件spi+DMA调试小坑(2)

        上一篇文章解决了spi+dma传输数据时DC线操作时序不匹配的问题,但是屏幕依旧没有点亮,所以这一篇文章继续找还存在的问题。上一篇文章:沁恒微WCH32v003驱动ST7735S硬件spi+DMA调试小坑-CSDN博客

        老规矩,先用逻辑分析仪抓取一下波形。

//全屏清除函数
void LCD_Clear(uint16_t color)
{uint16_t i=0, j=0;uint8_t data[4] = {0};  //color是16bit的,每个像素点需要两个字节的显存/* 将16bit的color值分开为两个单独的字节 */data[0] = color >> 8;data[1] = color;/* 显存的值需要逐字节写入 */for(j = 0;j < LCD_Buf_Size/2; j++){lcd_buf[j * 2] =  data[0];lcd_buf[j * 2 + 1] =  data[1];}/* 指定显存操作地址为全屏幕 */Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);/* 指定接下来的数据为数据 */LCD_DC_SET;/* 将显存缓冲区的数据全部写入缓冲区 */LCD_Writ_Bus(data,4);for(i = 0;i <(LCD_TOTAL_BUF_SIZE/LCD_Buf_Size); i++){LCD_Writ_Bus(lcd_buf, (uint16_t)LCD_Buf_Size);} 
}

        这是我的全屏清除函数,用数组作为缓存,dma打包发送。

        

        代码中我发送的全是oxff,但是实际上只有前面一半是0xff后面全是错乱的顺序,缩小给大家看一下。

        正常来说全是0xff的话sda应该是一直高电平,但是有一半时间是不正常的,所以说明每次缓存区中都有一半的数据丢失了,使用数组的时候如果发现后面的数据不正常,大概率是因为数组访问越界了。

        

        SPI+DMA的传输方式是发送地址不变,源地址不断自加,不断将源地址内的数据取出发送,所以我猜测是内存大小配置跟缓存区数组大小不匹配导致的。我们来验证一下这个猜测。

        找到DMA的配置页面,其中标出的Halfwork就是半字的意思,也就是16位。

        而我定义的缓存区是uint8_t,即是8位,所以也正好印证了我的猜想,就是DMA的内存位移跟缓存区的数据类型大小不匹配,DMA每次位移16位,而我的缓存区一个只有8位,因为数组中内存地址是连续的,所以DMA会在缓存区中隔一个数据发送,导致有一半的数据漏掉了,最后的一半数据都是数组越界访问得到的垃圾数据,所以后面一半数据是错乱的毫无意义的。

        

        问题找到了,既然他们不匹配,那就让他们匹配呗,把uint8_t改成uint16_t不就就好了?

        这个办法是可以的,可以看到数据已经全部变成0xff,说明传输已经正常了。但是有个问题,内存浪费,明明只有u8大小的数据却要用u16来存放,有一半的空间被浪费掉了,很明显不是最优选,那还要一个办法就是将DMA改成u8的。

        修改完成,编译下载。

        传输正常,问题完美解决。

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

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

相关文章

【任职资格】某国有通信集团任职资格体系搭建管理咨询项目纪实

A公司是某通信集团为强化经营&#xff0c;管理集团重要客户市场而成立的专业化分公司&#xff0c;是当前信息通信行业发展的重要蓝海。A公司成立于2010年10月&#xff0c;短短几年得到了迅速的发展&#xff0c;目前&#xff0c;A公司客户数已超过200万家&#xff0c;所管理的集…

openssl3.2 - .pod文件的查看方法

文章目录 .pod文件的查看方法概述笔记初步的解决方法备注 - pod2html.bat的详细用法好像Perl就自带这个BATEND .pod文件的查看方法 概述 看到openssl源码目录下有很多.pod文件, 软件发布的帮助内容都在里面. 当make install后, 大部分的.pod都会转成html文件, 但是有一部分…

Redis -- 单线程模型

失败是成功之母 ——法国作家巴尔扎克 目录 单线程模型 Redis为什么这么快 单线程模型 redis只使用一个线程&#xff0c;处理所有的命令请求&#xff0c;不是说redis服务器进场内部真的就只有一个线程&#xff0c;其实也有多个线程&#xff0c;那就是处理网络和io的线程。 R…

【每日一题】6.LeetCode——轮转数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

光杆司令如何部署大模型?

1、背景 今天这种方式非常贴合低配置笔记本电脑的小伙伴们, 又没有GPU资源, 可以考虑使用api方式,让模型服务厂商提供计算资源 有了开放的api,让你没有显卡的电脑也能感受一下大模型管理知识库,进行垂直领域知识的检索和问答.算是自己初步玩一下AI agent 之前有写过一篇《平民…

关于Spring框架的 @Configuration 与@Service 加载顺序哪个先后(某些环境加载是随机的)

很多资料都说Configuration 优先加载&#xff0c;Service后加载&#xff0c;如下图&#xff1a; 本来也是以为 Configuration 优先加载于 Service &#xff0c;那参数处理放在Configuration注入完后&#xff0c;service构建时就可以拿来用的&#xff0c;在我在IDEA的调试时下断…

Excel没有内置统计字数功能,但可以用一些变通的方法

是否需要计算Excel工作簿中某个单元格或单元格范围内的单词数? 出于多种原因,你可能需要计算文本数据中的字数。也许你有逗号分隔的列表,需要计算每个列表中的项目数。 不幸的是,Excel没有内置的单词计数方法。但是有一些聪明的方法可以得到你需要的结果。 这篇文章将向…

代码随想录算法训练营第二十天|669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树,总结篇

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

【深入浅出SpringCloud原理及实战】「Netflix系列之Hystrix」针对于限流熔断组件Hystrix的回退降级实现方案和机制

针对于限流熔断组件Hystrix的回退降级实现方案和机制 依赖隔离依赖隔离之线程&线程池高延迟请求的例子 线程池的优势线程池的弊端线程池的开销线程池开销 信号量 依赖隔离 Hystrix通过使用『舱壁模式』&#xff08;注&#xff1a;将船的底部划分成一个个的舱室&#xff0c;…

2024年2月3日(星期六)骑行卧龙古渔村

2024年2月3日 (星期六) 骑行卧龙古渔村&#xff0c;早8:30到9:00&#xff0c; 大观公园门囗集合&#xff0c;9:30准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门囗集合 &#xff0c;家住东&#xff0c;南&#xff0c;北的骑友…

少儿编程教育市场分析:行业规模有望在2025年达到约500亿元

少儿编程教育是通过编程游戏启蒙、可视化图形编程等课程&#xff0c;培养学生的计算思维和创新解难能力的课程。与成人的编程不同&#xff0c;少儿编程教育并非高等教育那样学习如何写代码、编制应用程序&#xff0c;而是通过编程游戏启蒙、可视化图形编程等课程&#xff0c;培…

MySQL基础(三)-学习笔记

一.innodb引擎&#xff1a; 1). 表空间&#xff1a;表空间是InnoDB存储引擎逻辑结构的最高层&#xff0c;启用了参数 innodb_file_per_table(在 8.0版本中默认开启) &#xff0c;则每张表都会有一个表空间&#xff08;xxx.ibd&#xff09;&#xff0c;一个mysql实例可以对应多个…