Arm Cortex-M23开发板上手:空调控制项目总结帖

三奇 关注

收藏于 : 2023-09-17 08:21   被转藏 : 1       转藏到我的文章库


踏浪而行,偶尔回首,虽不见印记,却也能望见远处的海岸。

从15年毕业,恍然已八年。

硬件工作了八年。也是爱的深沉。

还记得大学的时候在学生会认识的朋友,他有一天突然跟我推荐单片机开发板,那时候大二,打听过,单片机应该是下学期开始的课程。当时我觉得是一种命运的安排,就斥巨资购买了郭天祥的单片机开发板。鬼使神差的,竟然在大学那松散的时光里,我可以学习到深夜一两点!也是因为一块开发板,我考了两次的计算机二级(虽然后来知道没啥用),就很自然的过了。以前不是很理解的硬件知识,也通畅了。后来参加了学校组织的以及国家级的多次比赛,硬件开始让我爱不释手。在当时我也成为了我们班的专业代表,然而毕业始终给人猝不及防。

后来,经过一番忙碌,进入了现在的企业。

还记得简历上不敢写面试硬件工程师,最终写了个PCB工程师。或许也比较怀疑自己的硬件设计能力吧。

刚入职,大多是熟悉产品,于是我维修了公司的陈年旧板,看原理图,查资料,大部分还是需要自主去弄的。然后PCB的设计,学习cadence软件,设计第一块接口板。

恍惚一年多,五六层板也很轻松了。记得有一次评估PCB尺寸和接口位置,对应产品外观。逼不得已学习了最简单的SolidWorks操作。也算是初涉结构设计,后来我们结构设计工程师离职,我就揽下了这个工作。自古硬件结构不分家。PCB与结构的搭配产生了完美的产品。

就这样一晃就是四年,作为干硬件的竟然连原理图都没弄过,挺遗憾的,正当要得过且过的时候,也不知为啥我的领导开始疯狂输出各种原理图设计给我,并且算得上的手把手教学了,但是时间只给了我一个月,因为他要离职了,并且让我接替。有种悲喜交加的感觉。喜的是升职加薪,悲的是刚好两个项目来了。原理图、PCB、结构...

就从原理图认真开始吧,反正也只能这样。于是参考着参考设计,本想着删删减减就大功告成的,然而就在删电容的时候就卡住了,脑海中全是疑问:这个电容为什么选这个容量的?为什么耐压值是这个?这里没标注电容的材料啊?哎?为啥这个地方要这么多种类的电容啊?算了还是删电阻吧,然后又是疑问:多大电阻?多少精度?多大封装?后来还有电感...

最终的结果是全部保留原样的,反正能用,就不改了。最终导致了bom成本,板卡做的很大等问题。

第一次可以这样做,第二次也可以,但是等产品出来了,市面上同类产品,我们的定价颇高,于是老板请我去他办公室喝茶了。意思很简单,降bom成本。

路漫漫修远
以下是面包板社区“ 瑞萨RA2E1 32位Arm Cortex-M23开发板 ”评测活动, wind_west 评测 连载,分享于此,希望对你有所参考。

目录
(1)点亮LED
(2)硬件IIC 驱动LCD和LM75温度传感器
(3)基于U8G2显示菜单
(4)红外解码-无视通讯协议

(5)红外发射-稳定控制家用空调
(6)空调控制项目-总结帖

前面记录了空调控制的各个模块的开发过程,这篇帖子对于之前的开发过程做一个总结。包含电路介绍、过程演示以及固件,开头主要介绍Flash的操作。

确认存储使用的FLash地址

1、查看Flash:

借助Jlink查看Flash的数据。

连接芯片:

读取整片Flash:

查看Data Flash区域:

写Flash的程序无法运行:R_FLASH_LP_bgo_example()。野火以及官方的资料使用的Flash都是基于外部Flash的,参考意义有限。最终参考FPS包自带的例程进行Flash的操作。

2、参考例程读写 Data Flash

当前方案:采用系统的API加入延时后,Flash写入成功(写入地址:0x4010_0000U):

Flash操作关键代码(注意:去掉了擦除检查,加上了延时!):

                    
                      
                        
                          
                            void
                          
                          
                            R_FLASH_LP_basic_example
                          
                          
                            (
                            
                              void
                            
                            )
                          
                        
                      
                    
                    
                      
                        {
                      
                    
                    
                      
                        
                          /* Initialize p_src to known data */
                        
                      
                    
                    
                      
                        vTaskDelay (
                        
                          10
                        
                        );
                      
                    
                    
                      
                        
                          for
                        
                         (
                        
                          uint32_t
                        
                         i = 
                        
                          0
                        
                        ; i < TRANSFER_LENGTH; i++)
                      
                    
                    
                      
                        {
                      
                    
                    
                      
                        g_src = (
                        
                          uint8_t
                        
                        ) (
                        
                          'A'
                        
                         + (i % 
                        
                          26
                        
                        ));
                      
                    
                    
                      
                        }
                      
                    
                    
                      
                        
                          /* Open the flash lp instance. */
                        
                      
                    
                    
                      
                        err = R_FLASH_LP_Open(&g_flash0_ctrl, &g_flash0_cfg);
                      
                    
                    
                      
                        assert(FSP_SUCCESS == err);
                      
                    
                    
                      
                        vTaskDelay (
                        
                          10
                        
                        );
                      
                    
                    
                      
                        
                          /* Erase 1 block of data flash starting at block 0. */
                        
                      
                    
                    
                      
                        err = R_FLASH_LP_Erase(&g_flash0_ctrl, FLASH_DF_BLOCK_0, 
                        
                          1
                        
                        );
                      
                    
                    
                      
                        assert(FSP_SUCCESS == err);
                      
                    
                    
                      
                        vTaskDelay (
                        
                          10
                        
                        );
                      
                    
                    
                      
                        
/* Write 32 bytes to the first block of data flash. */ err = R_FLASH_LP_Write(&g_flash0_ctrl, ( uint32_t ) g_src, FLASH_DF_BLOCK_0, TRANSFER_LENGTH); assert(FSP_SUCCESS == err); vTaskDelay ( 10 );
memcpy (( uint32_t )g_dest, FLASH_DF_BLOCK_0, FLASH_LP_EXAMPLE_WRITE_SIZE); ///<将数据使用串口发送出去 buff_len = FLASH_LP_EXAMPLE_WRITE_SIZE; //strlen(g_dest); err = R_SCI_UART_Write(&g_uart0_ctrl, g_dest, buff_len); if (FSP_SUCCESS != err) __BKPT(); while (uart_send_complete_flag == false ){} uart_send_complete_flag = false ; }

3、采用共用体存储浮点型数据

参考:https://code84.com/454972.html

4、当前存储遇到的问题

存储数据读取数据有问题,写入数据读取回来的数据匹配不上。

存取的数据为:

读取的数据:



首先定位:保存数据(进行Flash写操作)其实已经出问题了:

修改代码后,当前保存的数据没有问题:

解码的数据  保存的数据


保存数据到127时出错(读取回来的数据为144):

定位到原因:当前数据量太大了,1片扇区为1024字节,1个温度数据就高达600个字节,每次默认只擦除1个扇区,所以在1K地址外的数据没有擦除就执行了写入,发生错误。

5、设置每一个电平的时间为32bit,使用4字节存储

26摄氏度的命令存储地址:

实际上,按照高电平+低电平的存储,每一条控制命令的存储字节为1200字节(后面想办法再压缩)。

1个电平存储的时间使用32bit数据来存储,也就是4字节存储。当前默认1条命令为139个PWM,为了预留部分空间,每一条命令分配150*2*4字节进行存储。

当前在Data Flash中,开辟了3块区域,分别存储2条温度指令,以及1条关机指令。

6、温度控制逻辑

1、解码温度数据,测试命令能够成功控制空调;可以成功控制,将数据保存到Flash,温度控制的时候将数据读取出来,等待信号控制。

2、大于27摄氏度,打开空调;温度低于26摄氏度,关闭空调。

保存温度数据:

选择保存数据的地址:

7、系统构成

整个系统为了后期可以方便增加或者减少模块,所有采用杜邦线连接各个模块。因为红外发射模块的有效距离小于3米,所以使用了延长线-模块如前面介绍。

引脚分配:
I2C引脚:SDA0-P401,SCL0-P400;
红外接收GPIO引脚:P102 -INPUT;
红外发射GPIO引脚:P213 -PWM;

固件代码:

oled12864.zip(60.26 KB)

oled12864 - code.zip(9.43 MB)

复制链接https://mbb.eet-china.com/forum/topic/130402_1_1.html,或点击阅读原文帖内下载。

END




文章点评
相关文章
三奇 关注

文章收藏:1886

TA的最新收藏
藏友最新收藏
好网角移动端
好网角APP
手机一键收藏