前面记录了空调控制的各个模块的开发过程,这篇帖子对于之前的开发过程做一个总结。包含威廉希尔官方网站 介绍、过程演示以及固件,开头主要介绍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,为了预留部分空间,每一条命令分配15024字节进行存储。
当前在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)
全部0条评论
快来发表一下你的评论吧 !