From 697e23bebf67b670491d9a39d8cb3ea5f8f56b99 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 9 Aug 2021 17:24:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debug/HW_Devices/eeprom.su | 12 ++++++------ Debug/m3s.list | 24 ++++++++++++++---------- Debug/m3s.map | 10 +++++----- HW_Devices/eeprom.c | 18 ++++++++++++------ HW_Devices/touch.c | 15 ++++++++------- 5 files changed, 45 insertions(+), 34 deletions(-) diff --git a/Debug/HW_Devices/eeprom.su b/Debug/HW_Devices/eeprom.su index 8e67ce2..9dd1309 100644 --- a/Debug/HW_Devices/eeprom.su +++ b/Debug/HW_Devices/eeprom.su @@ -1,6 +1,6 @@ -eeprom.c:12:6:IIC_SAND_DATE 40 static -eeprom.c:17:6:IIC_READ_DATE 40 static -eeprom.c:23:6:EPPROM_SLOWWRITE_INIT 4 static -eeprom.c:32:6:EEPROM_SLOWWRITE_SERVER 16 static -eeprom.c:58:6:EEPROM_READ_BATY 16 static -eeprom.c:63:6:EEPROM_WRITE_BATY 32 static +eeprom.c:14:6:IIC_SAND_DATE 40 static +eeprom.c:19:6:IIC_READ_DATE 40 static +eeprom.c:27:6:EPPROM_SLOWWRITE_INIT 4 static +eeprom.c:37:6:EEPROM_SLOWWRITE_SERVER 16 static +eeprom.c:64:6:EEPROM_READ_BATY 16 static +eeprom.c:69:6:EEPROM_WRITE_BATY 32 static diff --git a/Debug/m3s.list b/Debug/m3s.list index 075e3e2..a71e87d 100644 --- a/Debug/m3s.list +++ b/Debug/m3s.list @@ -37,11 +37,11 @@ Idx Name Size VMA LMA File off Algn CONTENTS, READONLY, DEBUGGING, OCTETS 16 .debug_macro 0001b17b 00000000 00000000 0002fce8 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS - 17 .debug_line 0000dd99 00000000 00000000 0004ae63 2**0 + 17 .debug_line 0000dd9b 00000000 00000000 0004ae63 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS - 18 .debug_str 00095b47 00000000 00000000 00058bfc 2**0 + 18 .debug_str 00095b47 00000000 00000000 00058bfe 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS - 19 .comment 00000053 00000000 00000000 000ee743 2**0 + 19 .comment 00000053 00000000 00000000 000ee745 2**0 CONTENTS, READONLY 20 .debug_frame 00003cac 00000000 00000000 000ee798 2**2 CONTENTS, READONLY, DEBUGGING, OCTETS @@ -10494,8 +10494,8 @@ void LCD_ShowString(uint16_t x,uint16_t y,uint8_t *p,uint8_t size,uint16_t bg,ui 8004540: 200002a8 .word 0x200002a8 08004544 : -#include "eeprom.h" +//iic硬件接口 extern I2C_HandleTypeDef hi2c2; void IIC_SAND_DATE(uint16_t DEVICE_ADD,uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG) @@ -10567,9 +10567,11 @@ void IIC_READ_DATE(uint16_t DEVICE_ADD,uint16_t IN_DEVICE_ADD,char *DATAS,uint16 80045b8: 20000208 .word 0x20000208 080045bc : - -eeprom_write_buff_info eeprom_write_buffer; -void EPPROM_SLOWWRITE_INIT() +//因为eeprom芯片的写入速度有限,每写入一个字符都需要等待一段时间才能完成写入 +//整个系统不可能等它一个的,传统的解决方法可以使用定时器中断或者多线程开辟子任务在后台保存, +//这里的解决方法是使用状态机,通过一个链表将要保存的数据串起来,再通过状态循环一个个保存,保存延时等于循环用时。 +eeprom_write_buff_info eeprom_write_buffer; //创建链表 +void EPPROM_SLOWWRITE_INIT() //初始化链表 { 80045bc: b480 push {r7} 80045be: af00 add r7, sp, #0 @@ -10585,11 +10587,11 @@ void EPPROM_SLOWWRITE_INIT() 80045cc: 4b07 ldr r3, [pc, #28] ; (80045ec ) 80045ce: 2200 movs r2, #0 80045d0: 605a str r2, [r3, #4] - eeprom_write_buffer.save_timeout=5; + eeprom_write_buffer.save_timeout=5; //避免状态机循环过快导致的保存失败,这个是最少延时。(感觉没必要写在这里,太浪费空间了) 80045d2: 4b06 ldr r3, [pc, #24] ; (80045ec ) 80045d4: 2205 movs r2, #5 80045d6: 741a strb r2, [r3, #16] - eeprom_write_buffer.save_busy=0; + eeprom_write_buffer.save_busy=0; //最小延时内为忙状态 80045d8: 4a04 ldr r2, [pc, #16] ; (80045ec ) 80045da: 7c53 ldrb r3, [r2, #17] 80045dc: f36f 0300 bfc r3, #0, #1 @@ -10604,6 +10606,7 @@ void EPPROM_SLOWWRITE_INIT() 080045f0 : +//循环保存服务,检查链表头是否有数据是否忙。 void EEPROM_SLOWWRITE_SERVER() { 80045f0: b580 push {r7, lr} @@ -10693,6 +10696,7 @@ void EEPROM_SLOWWRITE_SERVER() 0800467c : +//从eeprom读取数据 void EEPROM_READ_BATY(uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG) { 800467c: b580 push {r7, lr} @@ -10716,7 +10720,7 @@ void EEPROM_READ_BATY(uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG) 800469e: bd80 pop {r7, pc} 080046a0 : - +//向eeprom写入数据 void EEPROM_WRITE_BATY(uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG) { 80046a0: b580 push {r7, lr} diff --git a/Debug/m3s.map b/Debug/m3s.map index dd4b07f..672b100 100644 --- a/Debug/m3s.map +++ b/Debug/m3s.map @@ -4359,7 +4359,7 @@ LOAD /Applications/STM32CubeIDE.app/Contents/Eclipse/plugins/com.st.stm32cube.id .debug_macro 0x000000000001ac20 0x1ca ./SW_APPs/windows.o .debug_macro 0x000000000001adea 0x391 ./SW_APPs/windows.o -.debug_line 0x0000000000000000 0xdd99 +.debug_line 0x0000000000000000 0xdd9b .debug_line 0x0000000000000000 0x851 ./Core/Src/main.o .debug_line 0x0000000000000851 0x7a3 ./Core/Src/stm32f1xx_hal_msp.o .debug_line 0x0000000000000ff4 0x76c ./Core/Src/stm32f1xx_it.o @@ -4375,10 +4375,10 @@ LOAD /Applications/STM32CubeIDE.app/Contents/Eclipse/plugins/com.st.stm32cube.id .debug_line 0x00000000000092c9 0xcc8 ./Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_sram.o .debug_line 0x0000000000009f91 0x9b3 ./Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_fsmc.o .debug_line 0x000000000000a944 0x10c1 ./HW_Devices/LCD.o - .debug_line 0x000000000000ba05 0x7ba ./HW_Devices/eeprom.o - .debug_line 0x000000000000c1bf 0xab1 ./HW_Devices/touch.o - .debug_line 0x000000000000cc70 0x749 ./SW_APPs/Main_APP.o - .debug_line 0x000000000000d3b9 0x9e0 ./SW_APPs/windows.o + .debug_line 0x000000000000ba05 0x7bc ./HW_Devices/eeprom.o + .debug_line 0x000000000000c1c1 0xab1 ./HW_Devices/touch.o + .debug_line 0x000000000000cc72 0x749 ./SW_APPs/Main_APP.o + .debug_line 0x000000000000d3bb 0x9e0 ./SW_APPs/windows.o .debug_str 0x0000000000000000 0x95b47 .debug_str 0x0000000000000000 0x8d07d ./Core/Src/main.o diff --git a/HW_Devices/eeprom.c b/HW_Devices/eeprom.c index ea7b6c6..45f7f9b 100644 --- a/HW_Devices/eeprom.c +++ b/HW_Devices/eeprom.c @@ -7,6 +7,8 @@ #include "eeprom.h" + +//iic硬件接口 extern I2C_HandleTypeDef hi2c2; void IIC_SAND_DATE(uint16_t DEVICE_ADD,uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG) @@ -18,17 +20,20 @@ void IIC_READ_DATE(uint16_t DEVICE_ADD,uint16_t IN_DEVICE_ADD,char *DATAS,uint16 { HAL_I2C_Mem_Read(&hi2c2,DEVICE_ADD,IN_DEVICE_ADD,I2C_MEMADD_SIZE_8BIT,DATAS,LONG,100); } - -eeprom_write_buff_info eeprom_write_buffer; -void EPPROM_SLOWWRITE_INIT() +//因为eeprom芯片的写入速度有限,每写入一个字符都需要等待一段时间才能完成写入 +//整个系统不可能等它一个的,传统的解决方法可以使用定时器中断或者多线程开辟子任务在后台保存, +//这里的解决方法是使用状态机,通过一个链表将要保存的数据串起来,再通过状态循环一个个保存,保存延时等于循环用时。 +eeprom_write_buff_info eeprom_write_buffer; //创建链表 +void EPPROM_SLOWWRITE_INIT() //初始化链表 { eeprom_write_buffer.buff=NULL; eeprom_write_buffer.end=NULL; eeprom_write_buffer.head=NULL; - eeprom_write_buffer.save_timeout=5; - eeprom_write_buffer.save_busy=0; + eeprom_write_buffer.save_timeout=5; //避免状态机循环过快导致的保存失败,这个是最少延时。(感觉没必要写在这里,太浪费空间了) + eeprom_write_buffer.save_busy=0; //最小延时内为忙状态 } +//循环保存服务,检查链表头是否有数据是否忙。 void EEPROM_SLOWWRITE_SERVER() { eeprom_write_buff *buff; @@ -55,11 +60,12 @@ void EEPROM_SLOWWRITE_SERVER() } } +//从eeprom读取数据 void EEPROM_READ_BATY(uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG) { IIC_READ_DATE(EEPROM_ADDRESS,IN_DEVICE_ADD,DATAS,LONG); } - +//向eeprom写入数据 void EEPROM_WRITE_BATY(uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG) { //IIC_SAND_DATE(EEPROM_ADDRESS,IN_DEVICE_ADD,DATAS,LONG); diff --git a/HW_Devices/touch.c b/HW_Devices/touch.c index 22a91f4..942231e 100644 --- a/HW_Devices/touch.c +++ b/HW_Devices/touch.c @@ -40,7 +40,7 @@ uint16_t TP_Read_AD(char CMD) TDIN(0); //拉低数据线 TCS(0); //选中触摸屏IC TP_Write_Byte(CMD);//发送命令字 - HAL_GetTick(); + HAL_GetTick(); //稍微延时,ad转换需要时间 HAL_GetTick(); HAL_GetTick(); HAL_GetTick(); @@ -127,18 +127,19 @@ uint8_t TP_Read_XY2(int16_t *x,int16_t *y) } touch_device t0;// t0 yyds~ touch_config tconfig; -//触摸更新服务 +//触摸更新服务,状态机写法,循环获取坐标 void TP_Server() { - if(TPEN==0) + if(TPEN==0) //如果有触摸 { - TP_Read_XY2(&t0.adc_x,&t0.adc_y); - t0.pix_x=(t0.adc_x/tconfig.x_acc)-tconfig.x_offset; + TP_Read_XY2(&t0.adc_x,&t0.adc_y); //先读取ad值 + t0.pix_x=(t0.adc_x/tconfig.x_acc)-tconfig.x_offset;//转换为像素坐标 t0.pix_y=(t0.adc_y/tconfig.y_acc)-tconfig.y_offset; } } - +//校准用,画一个目标坐标 +//r=坐标半径,显示特效用 void TP_DrwaTrage(int x,int y,int r) { Draw_Circle(x,y,r+1,GRAY); @@ -148,7 +149,7 @@ void TP_DrwaTrage(int x,int y,int r) LCD_DrawLine(x,y,x-10,y,RED); LCD_DrawLine(x,y,x,y-10,RED); } - +//触摸屏校准 void TP_adjustment() { //判断是否需要校准,从eeprom获取数据