diff --git a/CHANGELOG b/CHANGELOG
index b926938..9d1c6b5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,21 @@
+----------------------------------------------------------------------------
+2020-11-29 V1.40 【重大更新】
+新增功能:
+1.增加SPI Flash脱机烧录功能(需要升级PC软件,更新EMMC磁盘文件)
+2.增加CMSIS-DAP仿真器功能。新增2个参数控制TVCC电压和蜂鸣器使能
+3.增加DS18B20温度传感器驱动接口,D0-D7可外接8个传感器.
+ - 新增lua接口函数 ok,temp = read("DS18B20", 2) --读D2口外接的传感器数据
+ - 数据监视器菜单下新增DS18B20温度表(显示8路温度值)
+
+BUG:
+1.解决串口监视器BUG,ASCII模式如果收到0x00, 则不显示后面的数据。需要将不可见字符转换空格
+2.解决在非lua小程序界面执行lua(PC机下载)无法长按C退出的问题
+
+其他优化:
+1.按键驱动底层忽略从其他状态跳转过来时,第一个长按键和按键弹起事件
+2.上电不显示logo界面(以前有2秒延迟)
+3.lwip初始化代码拆分到 lwip_pro() 中执行,加快界面启动速度
+
----------------------------------------------------------------------------
2020-10-19 V1.35
1.解决CX32芯片机台信号异常(1拖2模式解除SWD保护时,机台GPIO输出解锁脉冲)
diff --git a/Doc/待解决问题.txt b/Doc/待解决问题.txt
index e618848..2d5c508 100644
--- a/Doc/待解决问题.txt
+++ b/Doc/待解决问题.txt
@@ -9,4 +9,24 @@
2020-09-16 V1.31固件
普通触发模式还有遗留问题:拖动触发位置滚动条时,超出波形范围后H7-TOOL程序假死(频繁进入看门狗中断),暂未解决。H7-TOOL界面翻到电压档界面可恢复。
+
+2020-10-26 SPI Flash烧录器接口方案
+ - 待定方案, 口线不够实现4路烧录
+
+ D0 PD14 PA15 PI0 - DIR PH8 CS2
+ D1 PD15 PA8 PH19 - DIR PG8 CS3
+
+ D2 PE6 PD0 PB7 - DIR PD9 MOSI (硬件SPI信号)
+ D3 PE5 PD1 PH11 - DIR PG10 MISO_1 (硬件SPI信号)
+ D4 PE4 PE7 PH12 - DIR PG12 CS1 (软件控制片选)
+ D5 PE2 PE8 PI5 - DIR PG7 SCK (硬件SPI信号)
+ D6 PE9 PD3 PA0 - DIR PD10 CS4
+ D7 PE10 PI6 - DIR PI1 MISO_2 (第2路MISO)
+ D8 PE11 PD4 PI3 - DIR PG9 MISO_3 (第3路MISO)
+ D9 PE12 PD5 - DIR PI12 MISO_4 (第4路MISO)
+
+ RS232_TX - RS232串口机台信号扩展 START BUSY OK NG
+ RS232_RX - RS232串口机台信号扩展
+
+
\ No newline at end of file
diff --git a/Libraries/LwIP/phy_drv/lan8742.c b/Libraries/LwIP/phy_drv/lan8742.c
index 06f3c05..2cef5f0 100755
--- a/Libraries/LwIP/phy_drv/lan8742.c
+++ b/Libraries/LwIP/phy_drv/lan8742.c
@@ -182,7 +182,9 @@ int32_t LAN8742_RegisterBusIO(lan8742_Object_t *pObj, lan8742_IOCtx_t *ioctx)
}
}
}
-
+
+ /* ȴ2 */
+ #if 0
if(status == LAN8742_STATUS_OK)
{
tickstart = pObj->IO.GetTick();
@@ -193,6 +195,9 @@ int32_t LAN8742_RegisterBusIO(lan8742_Object_t *pObj, lan8742_IOCtx_t *ioctx)
}
pObj->Is_Initialized = 1;
}
+ #else
+ pObj->Is_Initialized = 1;
+ #endif
return status;
}
diff --git a/Project/MDK-ARM(uV5)/CopyHex_h7_tool.bat b/Project/MDK-ARM(uV5)/CopyHex_h7_tool.bat
index 6568106..021e8a2 100755
--- a/Project/MDK-ARM(uV5)/CopyHex_h7_tool.bat
+++ b/Project/MDK-ARM(uV5)/CopyHex_h7_tool.bat
@@ -1,5 +1,12 @@
-copy Objects\output.hex ..\h7_tool_app.hex
+copy Objects\output.hex ..\app0.hex
+
+hex2bin ..\app0.hex
+
+LinkBin ..\h7_tool_app.bin =VAR @0x0 ..\app0.bin @0xE0000 ..\dap.bin
+
+del ..\app0.bin
+del ..\app0.hex
+
-hex2bin ..\h7_tool_app.hex
diff --git a/Project/MDK-ARM(uV5)/LinkBin.exe b/Project/MDK-ARM(uV5)/LinkBin.exe
new file mode 100644
index 0000000..19bd513
Binary files /dev/null and b/Project/MDK-ARM(uV5)/LinkBin.exe differ
diff --git a/Project/MDK-ARM(uV5)/project.uvoptx b/Project/MDK-ARM(uV5)/project.uvoptx
index e674322..18b3708 100755
--- a/Project/MDK-ARM(uV5)/project.uvoptx
+++ b/Project/MDK-ARM(uV5)/project.uvoptx
@@ -117,10 +117,15 @@
STLink\ST-LINKIII-KEIL_SWO.dll
+
+ 0
+ CMSIS_AGDI
+ -X"H7-TOOL CMSIS-DAP" -U0001A0000000 -O710 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743IIKx$CMSIS\Flash\STM32H7x_2048.FLM)
+
0
ST-LINKIII-KEIL_SWO
- -U54FF73065182495148362487 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(6BA02477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743IIKx$CMSIS\Flash\STM32H7x_2048.FLM)
+ -U36FF6A065050363440122343 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(6BA02477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743IIKx$CMSIS\Flash\STM32H7x_2048.FLM)
0
@@ -160,6 +165,26 @@
1
g_tModS.TxBuf
+
+ 1
+ 1
+ g_RecMemo
+
+
+ 2
+ 1
+ g_OutText
+
+
+ 3
+ 1
+ _id
+
+
+ 4
+ 1
+ s_DS18B20_TempReg
+
@@ -183,7 +208,7 @@
0
1
- 1
+ 0
0
0
0
@@ -231,7 +256,7 @@
App
- 1
+ 0
0
0
0
@@ -242,8 +267,8 @@
0
0
0
- ..\..\User\app\inc\main.h
- main.h
+ ..\..\User\app\inc\includes.h
+ includes.h
0
0
@@ -499,17 +524,41 @@
0
0
+
+ 1
+ 23
+ 1
+ 0
+ 0
+ 0
+ ..\..\User\app\src\status_ds18b20_meter.c
+ status_ds18b20_meter.c
+ 0
+ 0
+
+
+ 1
+ 24
+ 1
+ 0
+ 0
+ 0
+ ..\..\User\app\src\disp_lib.c
+ disp_lib.c
+ 0
+ 0
+
BSP
- 1
+ 0
0
0
0
2
- 23
+ 25
5
0
0
@@ -521,7 +570,7 @@
2
- 24
+ 26
1
0
0
@@ -533,7 +582,7 @@
2
- 25
+ 27
1
0
0
@@ -545,7 +594,7 @@
2
- 26
+ 28
1
0
0
@@ -557,7 +606,7 @@
2
- 27
+ 29
1
0
0
@@ -569,7 +618,7 @@
2
- 28
+ 30
1
0
0
@@ -581,7 +630,7 @@
2
- 29
+ 31
1
0
0
@@ -593,7 +642,7 @@
2
- 30
+ 32
1
0
0
@@ -605,7 +654,7 @@
2
- 31
+ 33
1
0
0
@@ -617,7 +666,7 @@
2
- 32
+ 34
1
0
0
@@ -629,7 +678,7 @@
2
- 33
+ 35
1
0
0
@@ -641,7 +690,7 @@
2
- 34
+ 36
1
0
0
@@ -653,7 +702,7 @@
2
- 35
+ 37
1
0
0
@@ -665,7 +714,7 @@
2
- 36
+ 38
1
0
0
@@ -677,7 +726,7 @@
2
- 37
+ 39
1
0
0
@@ -689,7 +738,7 @@
2
- 38
+ 40
1
0
0
@@ -701,7 +750,7 @@
2
- 39
+ 41
1
0
0
@@ -713,7 +762,7 @@
2
- 40
+ 42
1
0
0
@@ -725,7 +774,7 @@
2
- 41
+ 43
1
0
0
@@ -737,7 +786,7 @@
2
- 42
+ 44
1
0
0
@@ -749,7 +798,7 @@
2
- 43
+ 45
1
0
0
@@ -761,7 +810,7 @@
2
- 44
+ 46
1
0
0
@@ -773,7 +822,7 @@
2
- 45
+ 47
1
0
0
@@ -785,7 +834,7 @@
2
- 46
+ 48
1
0
0
@@ -797,7 +846,7 @@
2
- 47
+ 49
1
0
0
@@ -809,7 +858,7 @@
2
- 48
+ 50
1
0
0
@@ -821,7 +870,7 @@
2
- 49
+ 51
1
0
0
@@ -833,7 +882,7 @@
2
- 50
+ 52
1
0
0
@@ -845,7 +894,7 @@
2
- 51
+ 53
1
0
0
@@ -857,7 +906,7 @@
2
- 52
+ 54
1
0
0
@@ -869,7 +918,7 @@
2
- 53
+ 55
1
0
0
@@ -881,7 +930,7 @@
2
- 54
+ 56
1
0
0
@@ -893,7 +942,7 @@
2
- 55
+ 57
1
0
0
@@ -905,7 +954,7 @@
2
- 56
+ 58
1
0
0
@@ -917,7 +966,7 @@
2
- 57
+ 59
1
0
0
@@ -929,7 +978,7 @@
2
- 58
+ 60
1
0
0
@@ -941,7 +990,7 @@
2
- 59
+ 61
1
0
0
@@ -951,17 +1000,29 @@
0
0
+
+ 2
+ 62
+ 1
+ 0
+ 0
+ 0
+ ..\..\User\bsp\src\bsp_ds18b20.c
+ bsp_ds18b20.c
+ 0
+ 0
+
MDK-ARM
- 1
+ 0
0
0
0
3
- 60
+ 63
2
0
0
@@ -981,7 +1042,7 @@
0
4
- 61
+ 64
1
0
0
@@ -993,7 +1054,7 @@
4
- 62
+ 65
1
0
0
@@ -1005,7 +1066,7 @@
4
- 63
+ 66
5
0
0
@@ -1017,7 +1078,7 @@
4
- 64
+ 67
1
0
0
@@ -1029,7 +1090,7 @@
4
- 65
+ 68
1
0
0
@@ -1041,7 +1102,7 @@
4
- 66
+ 69
1
0
0
@@ -1053,7 +1114,7 @@
4
- 67
+ 70
1
0
0
@@ -1065,7 +1126,7 @@
4
- 68
+ 71
1
0
0
@@ -1077,7 +1138,7 @@
4
- 69
+ 72
1
0
0
@@ -1089,7 +1150,7 @@
4
- 70
+ 73
1
0
0
@@ -1101,7 +1162,7 @@
4
- 71
+ 74
1
0
0
@@ -1113,7 +1174,7 @@
4
- 72
+ 75
1
0
0
@@ -1125,7 +1186,7 @@
4
- 73
+ 76
1
0
0
@@ -1137,7 +1198,7 @@
4
- 74
+ 77
1
0
0
@@ -1149,7 +1210,7 @@
4
- 75
+ 78
1
0
0
@@ -1161,7 +1222,7 @@
4
- 76
+ 79
1
0
0
@@ -1173,7 +1234,7 @@
4
- 77
+ 80
1
0
0
@@ -1185,7 +1246,7 @@
4
- 78
+ 81
1
0
0
@@ -1197,7 +1258,7 @@
4
- 79
+ 82
1
0
0
@@ -1209,7 +1270,7 @@
4
- 80
+ 83
1
0
0
@@ -1221,7 +1282,7 @@
4
- 81
+ 84
1
0
0
@@ -1233,7 +1294,7 @@
4
- 82
+ 85
1
0
0
@@ -1245,7 +1306,7 @@
4
- 83
+ 86
1
0
0
@@ -1257,7 +1318,7 @@
4
- 84
+ 87
1
0
0
@@ -1269,7 +1330,7 @@
4
- 85
+ 88
1
0
0
@@ -1281,7 +1342,7 @@
4
- 86
+ 89
1
0
0
@@ -1293,7 +1354,7 @@
4
- 87
+ 90
1
0
0
@@ -1305,7 +1366,7 @@
4
- 88
+ 91
1
0
0
@@ -1317,7 +1378,7 @@
4
- 89
+ 92
1
0
0
@@ -1329,7 +1390,7 @@
4
- 90
+ 93
1
0
0
@@ -1341,7 +1402,7 @@
4
- 91
+ 94
1
0
0
@@ -1353,7 +1414,7 @@
4
- 92
+ 95
1
0
0
@@ -1365,7 +1426,7 @@
4
- 93
+ 96
1
0
0
@@ -1377,7 +1438,7 @@
4
- 94
+ 97
1
0
0
@@ -1389,7 +1450,7 @@
4
- 95
+ 98
1
0
0
@@ -1401,7 +1462,7 @@
4
- 96
+ 99
1
0
0
@@ -1413,7 +1474,7 @@
4
- 97
+ 100
1
0
0
@@ -1425,7 +1486,7 @@
4
- 98
+ 101
1
0
0
@@ -1437,7 +1498,7 @@
4
- 99
+ 102
1
0
0
@@ -1449,7 +1510,7 @@
4
- 100
+ 103
1
0
0
@@ -1461,7 +1522,7 @@
4
- 101
+ 104
1
0
0
@@ -1473,7 +1534,7 @@
4
- 102
+ 105
1
0
0
@@ -1485,7 +1546,7 @@
4
- 103
+ 106
1
0
0
@@ -1497,7 +1558,7 @@
4
- 104
+ 107
1
0
0
@@ -1509,7 +1570,7 @@
4
- 105
+ 108
1
0
0
@@ -1521,7 +1582,7 @@
4
- 106
+ 109
1
0
0
@@ -1533,7 +1594,7 @@
4
- 107
+ 110
1
0
0
@@ -1545,7 +1606,7 @@
4
- 108
+ 111
1
0
0
@@ -1557,7 +1618,7 @@
4
- 109
+ 112
1
0
0
@@ -1569,7 +1630,7 @@
4
- 110
+ 113
1
0
0
@@ -1581,7 +1642,7 @@
4
- 111
+ 114
1
0
0
@@ -1601,7 +1662,7 @@
0
5
- 112
+ 115
1
0
0
@@ -1615,13 +1676,13 @@
SEGGER/HardFault
- 1
+ 0
0
0
0
6
- 113
+ 116
2
0
0
@@ -1633,7 +1694,7 @@
6
- 114
+ 117
1
0
0
@@ -1647,13 +1708,13 @@
Doc
- 1
+ 0
0
0
0
7
- 115
+ 118
5
0
0
@@ -1665,7 +1726,7 @@
7
- 116
+ 119
5
0
0
@@ -1685,7 +1746,7 @@
0
8
- 117
+ 120
1
0
0
@@ -1697,7 +1758,7 @@
8
- 118
+ 121
1
0
0
@@ -1709,7 +1770,7 @@
8
- 119
+ 122
1
0
0
@@ -1721,7 +1782,7 @@
8
- 120
+ 123
1
0
0
@@ -1733,7 +1794,7 @@
8
- 121
+ 124
1
0
0
@@ -1745,7 +1806,7 @@
8
- 122
+ 125
1
0
0
@@ -1757,7 +1818,7 @@
8
- 123
+ 126
1
0
0
@@ -1769,7 +1830,7 @@
8
- 124
+ 127
1
0
0
@@ -1781,7 +1842,7 @@
8
- 125
+ 128
1
0
0
@@ -1793,7 +1854,7 @@
8
- 126
+ 129
1
0
0
@@ -1805,7 +1866,7 @@
8
- 127
+ 130
1
0
0
@@ -1825,7 +1886,7 @@
0
9
- 128
+ 131
1
0
0
@@ -1837,7 +1898,7 @@
9
- 129
+ 132
1
0
0
@@ -1849,7 +1910,7 @@
9
- 130
+ 133
1
0
0
@@ -1861,7 +1922,7 @@
9
- 131
+ 134
1
0
0
@@ -1873,7 +1934,7 @@
9
- 132
+ 135
1
0
0
@@ -1885,7 +1946,7 @@
9
- 133
+ 136
1
0
0
@@ -1897,7 +1958,7 @@
9
- 134
+ 137
1
0
0
@@ -1909,7 +1970,7 @@
9
- 135
+ 138
5
0
0
@@ -1921,7 +1982,7 @@
9
- 136
+ 139
1
0
0
@@ -1933,7 +1994,7 @@
9
- 137
+ 140
1
0
0
@@ -1945,7 +2006,7 @@
9
- 138
+ 141
1
0
0
@@ -1957,7 +2018,7 @@
9
- 139
+ 142
1
0
0
@@ -1969,7 +2030,7 @@
9
- 140
+ 143
1
0
0
@@ -1981,7 +2042,7 @@
9
- 141
+ 144
1
0
0
@@ -1993,7 +2054,7 @@
9
- 142
+ 145
1
0
0
@@ -2005,7 +2066,7 @@
9
- 143
+ 146
1
0
0
@@ -2025,7 +2086,7 @@
0
10
- 144
+ 147
1
0
0
@@ -2037,7 +2098,7 @@
10
- 145
+ 148
1
0
0
@@ -2049,7 +2110,7 @@
10
- 146
+ 149
1
0
0
@@ -2061,7 +2122,7 @@
10
- 147
+ 150
1
0
0
@@ -2073,7 +2134,7 @@
10
- 148
+ 151
1
0
0
@@ -2085,7 +2146,7 @@
10
- 149
+ 152
1
0
0
@@ -2105,7 +2166,7 @@
0
11
- 150
+ 153
1
0
0
@@ -2117,7 +2178,7 @@
11
- 151
+ 154
1
0
0
@@ -2129,7 +2190,7 @@
11
- 152
+ 155
1
0
0
@@ -2141,7 +2202,7 @@
11
- 153
+ 156
1
0
0
@@ -2153,7 +2214,7 @@
11
- 154
+ 157
1
0
0
@@ -2165,7 +2226,7 @@
11
- 155
+ 158
1
0
0
@@ -2177,7 +2238,7 @@
11
- 156
+ 159
1
0
0
@@ -2189,7 +2250,7 @@
11
- 157
+ 160
1
0
0
@@ -2201,7 +2262,7 @@
11
- 158
+ 161
1
0
0
@@ -2213,7 +2274,7 @@
11
- 159
+ 162
1
0
0
@@ -2225,7 +2286,7 @@
11
- 160
+ 163
1
0
0
@@ -2237,7 +2298,7 @@
11
- 161
+ 164
1
0
0
@@ -2249,7 +2310,7 @@
11
- 162
+ 165
1
0
0
@@ -2261,7 +2322,7 @@
11
- 163
+ 166
1
0
0
@@ -2273,7 +2334,7 @@
11
- 164
+ 167
1
0
0
@@ -2285,7 +2346,7 @@
11
- 165
+ 168
1
0
0
@@ -2297,7 +2358,7 @@
11
- 166
+ 169
1
0
0
@@ -2309,7 +2370,7 @@
11
- 167
+ 170
1
0
0
@@ -2321,7 +2382,7 @@
11
- 168
+ 171
1
0
0
@@ -2333,7 +2394,7 @@
11
- 169
+ 172
1
0
0
@@ -2345,7 +2406,7 @@
11
- 170
+ 173
1
0
0
@@ -2357,7 +2418,7 @@
11
- 171
+ 174
1
0
0
@@ -2369,7 +2430,7 @@
11
- 172
+ 175
1
0
0
@@ -2381,7 +2442,7 @@
11
- 173
+ 176
1
0
0
@@ -2393,7 +2454,7 @@
11
- 174
+ 177
1
0
0
@@ -2405,7 +2466,7 @@
11
- 175
+ 178
1
0
0
@@ -2417,7 +2478,7 @@
11
- 176
+ 179
1
0
0
@@ -2429,7 +2490,7 @@
11
- 177
+ 180
1
0
0
@@ -2441,7 +2502,7 @@
11
- 178
+ 181
1
0
0
@@ -2453,7 +2514,7 @@
11
- 179
+ 182
1
0
0
@@ -2465,7 +2526,7 @@
11
- 180
+ 183
1
0
0
@@ -2477,7 +2538,7 @@
11
- 181
+ 184
1
0
0
@@ -2489,7 +2550,7 @@
11
- 182
+ 185
1
0
0
@@ -2501,7 +2562,7 @@
11
- 183
+ 186
1
0
0
@@ -2521,7 +2582,7 @@
0
12
- 184
+ 187
1
0
0
@@ -2541,7 +2602,7 @@
0
13
- 185
+ 188
1
0
0
@@ -2553,7 +2614,7 @@
13
- 186
+ 189
1
0
0
@@ -2565,7 +2626,7 @@
13
- 187
+ 190
5
0
0
@@ -2577,7 +2638,7 @@
13
- 188
+ 191
1
0
0
@@ -2589,7 +2650,7 @@
13
- 189
+ 192
1
0
0
@@ -2609,7 +2670,7 @@
0
14
- 190
+ 193
1
0
0
@@ -2621,7 +2682,7 @@
14
- 191
+ 194
1
0
0
@@ -2633,7 +2694,7 @@
14
- 192
+ 195
5
0
0
@@ -2645,7 +2706,7 @@
14
- 193
+ 196
1
0
0
@@ -2665,7 +2726,7 @@
0
15
- 194
+ 197
1
0
0
@@ -2677,7 +2738,7 @@
15
- 195
+ 198
1
0
0
@@ -2697,7 +2758,7 @@
0
16
- 196
+ 199
1
0
0
@@ -2709,7 +2770,7 @@
16
- 197
+ 200
1
0
0
@@ -2721,7 +2782,7 @@
16
- 198
+ 201
5
0
0
@@ -2733,7 +2794,7 @@
16
- 199
+ 202
1
0
0
@@ -2745,7 +2806,7 @@
16
- 200
+ 203
1
0
0
@@ -2765,7 +2826,7 @@
0
17
- 201
+ 204
1
0
0
@@ -2777,7 +2838,7 @@
17
- 202
+ 205
1
0
0
@@ -2789,7 +2850,7 @@
17
- 203
+ 206
1
0
0
@@ -2801,7 +2862,7 @@
17
- 204
+ 207
1
0
0
@@ -2813,7 +2874,7 @@
17
- 205
+ 208
5
0
0
@@ -2825,7 +2886,7 @@
17
- 206
+ 209
5
0
0
@@ -2837,7 +2898,7 @@
17
- 207
+ 210
5
0
0
@@ -2849,7 +2910,7 @@
17
- 208
+ 211
1
0
0
@@ -2861,7 +2922,7 @@
17
- 209
+ 212
1
0
0
@@ -2873,7 +2934,7 @@
17
- 210
+ 213
2
0
0
@@ -2885,7 +2946,7 @@
17
- 211
+ 214
1
0
0
@@ -2897,7 +2958,7 @@
17
- 212
+ 215
1
0
0
@@ -2909,19 +2970,7 @@
17
- 213
- 1
- 0
- 0
- 0
- ..\..\User\programmer\n76e_prog_file.c
- n76e_prog_file.c
- 0
- 0
-
-
- 17
- 214
+ 216
1
0
0
@@ -2933,7 +2982,19 @@
17
- 215
+ 217
+ 1
+ 0
+ 0
+ 0
+ ..\..\User\programmer\w25q_flash.c
+ w25q_flash.c
+ 0
+ 0
+
+
+ 17
+ 218
1
0
0
@@ -2943,6 +3004,18 @@
0
0
+
+ 17
+ 219
+ 1
+ 0
+ 0
+ 0
+ ..\..\User\programmer\pg_prog_file.c
+ pg_prog_file.c
+ 0
+ 0
+
@@ -2953,7 +3026,7 @@
0
18
- 216
+ 220
1
0
0
@@ -2965,7 +3038,7 @@
18
- 217
+ 221
1
0
0
@@ -2977,7 +3050,7 @@
18
- 218
+ 222
1
0
0
@@ -2989,7 +3062,7 @@
18
- 219
+ 223
1
0
0
@@ -3001,7 +3074,7 @@
18
- 220
+ 224
1
0
0
@@ -3013,7 +3086,7 @@
18
- 221
+ 225
1
0
0
@@ -3025,7 +3098,7 @@
18
- 222
+ 226
1
0
0
@@ -3037,7 +3110,7 @@
18
- 223
+ 227
1
0
0
@@ -3049,7 +3122,7 @@
18
- 224
+ 228
1
0
0
@@ -3061,7 +3134,7 @@
18
- 225
+ 229
1
0
0
@@ -3073,7 +3146,7 @@
18
- 226
+ 230
1
0
0
@@ -3085,7 +3158,7 @@
18
- 227
+ 231
1
0
0
@@ -3097,7 +3170,7 @@
18
- 228
+ 232
1
0
0
@@ -3109,7 +3182,7 @@
18
- 229
+ 233
1
0
0
@@ -3121,7 +3194,7 @@
18
- 230
+ 234
1
0
0
@@ -3133,7 +3206,7 @@
18
- 231
+ 235
1
0
0
@@ -3145,7 +3218,7 @@
18
- 232
+ 236
1
0
0
@@ -3157,7 +3230,7 @@
18
- 233
+ 237
1
0
0
@@ -3169,7 +3242,7 @@
18
- 234
+ 238
1
0
0
@@ -3181,7 +3254,7 @@
18
- 235
+ 239
1
0
0
@@ -3193,7 +3266,7 @@
18
- 236
+ 240
1
0
0
@@ -3205,7 +3278,7 @@
18
- 237
+ 241
1
0
0
@@ -3217,7 +3290,7 @@
18
- 238
+ 242
1
0
0
@@ -3229,7 +3302,7 @@
18
- 239
+ 243
1
0
0
@@ -3241,7 +3314,7 @@
18
- 240
+ 244
1
0
0
@@ -3253,7 +3326,7 @@
18
- 241
+ 245
1
0
0
@@ -3265,7 +3338,7 @@
18
- 242
+ 246
1
0
0
@@ -3277,7 +3350,7 @@
18
- 243
+ 247
1
0
0
@@ -3289,7 +3362,7 @@
18
- 244
+ 248
1
0
0
@@ -3301,7 +3374,7 @@
18
- 245
+ 249
1
0
0
@@ -3313,7 +3386,7 @@
18
- 246
+ 250
1
0
0
@@ -3325,7 +3398,7 @@
18
- 247
+ 251
1
0
0
@@ -3337,7 +3410,7 @@
18
- 248
+ 252
1
0
0
@@ -3351,13 +3424,13 @@
Lua_IF
- 1
+ 0
0
0
0
19
- 249
+ 253
1
0
0
@@ -3369,7 +3442,7 @@
19
- 250
+ 254
5
0
0
@@ -3381,7 +3454,7 @@
19
- 251
+ 255
1
0
0
@@ -3393,7 +3466,7 @@
19
- 252
+ 256
1
0
0
@@ -3405,7 +3478,7 @@
19
- 253
+ 257
1
0
0
@@ -3417,7 +3490,7 @@
19
- 254
+ 258
1
0
0
@@ -3429,7 +3502,7 @@
19
- 255
+ 259
1
0
0
@@ -3441,7 +3514,7 @@
19
- 256
+ 260
1
0
0
@@ -3453,7 +3526,7 @@
19
- 257
+ 261
1
0
0
@@ -3465,7 +3538,7 @@
19
- 258
+ 262
1
0
0
@@ -3477,7 +3550,7 @@
19
- 259
+ 263
1
0
0
@@ -3489,7 +3562,7 @@
19
- 260
+ 264
1
0
0
@@ -3501,7 +3574,7 @@
19
- 261
+ 265
1
0
0
@@ -3513,7 +3586,7 @@
19
- 262
+ 266
1
0
0
@@ -3525,7 +3598,7 @@
19
- 263
+ 267
1
0
0
@@ -3537,7 +3610,7 @@
19
- 264
+ 268
5
0
0
@@ -3549,7 +3622,7 @@
19
- 265
+ 269
1
0
0
@@ -3569,7 +3642,7 @@
0
20
- 266
+ 270
1
0
0
@@ -3581,7 +3654,7 @@
20
- 267
+ 271
1
0
0
@@ -3593,7 +3666,7 @@
20
- 268
+ 272
1
0
0
@@ -3605,7 +3678,7 @@
20
- 269
+ 273
1
0
0
@@ -3617,9 +3690,9 @@
20
- 270
+ 274
1
- 0
+ 1
0
0
..\..\User\daplink\source\daplink\cmsis-dap\SW_DP.c
@@ -3629,7 +3702,7 @@
20
- 271
+ 275
1
0
0
@@ -3641,7 +3714,7 @@
20
- 272
+ 276
1
0
0
@@ -3655,13 +3728,13 @@
DAP_Host
- 1
+ 0
0
0
0
21
- 273
+ 277
1
0
0
@@ -3673,7 +3746,7 @@
21
- 274
+ 278
1
0
0
@@ -3685,7 +3758,7 @@
21
- 275
+ 279
1
0
0
@@ -3697,7 +3770,7 @@
21
- 276
+ 280
1
0
0
@@ -3709,7 +3782,7 @@
21
- 277
+ 281
1
0
0
@@ -3721,7 +3794,7 @@
21
- 278
+ 282
1
0
0
@@ -3741,7 +3814,7 @@
0
22
- 279
+ 283
1
0
0
@@ -3753,7 +3826,7 @@
22
- 280
+ 284
1
0
0
@@ -3765,7 +3838,7 @@
22
- 281
+ 285
1
0
0
@@ -3785,7 +3858,7 @@
0
23
- 282
+ 286
1
0
0
@@ -3797,7 +3870,7 @@
23
- 283
+ 287
1
0
0
@@ -3809,7 +3882,7 @@
23
- 284
+ 288
1
0
0
@@ -3821,7 +3894,7 @@
23
- 285
+ 289
1
0
0
@@ -3833,7 +3906,7 @@
23
- 286
+ 290
1
0
0
@@ -3853,7 +3926,7 @@
0
24
- 287
+ 291
5
0
0
@@ -3865,7 +3938,7 @@
24
- 288
+ 292
1
0
0
@@ -3877,7 +3950,7 @@
24
- 289
+ 293
1
0
0
@@ -3889,7 +3962,7 @@
24
- 290
+ 294
1
0
0
@@ -3901,7 +3974,7 @@
24
- 291
+ 295
1
0
0
@@ -3913,7 +3986,7 @@
24
- 292
+ 296
1
0
0
@@ -3925,7 +3998,7 @@
24
- 293
+ 297
5
0
0
@@ -3939,13 +4012,13 @@
ST_USBD_Mass Storage
- 0
+ 1
0
0
0
25
- 294
+ 298
1
0
0
@@ -3957,7 +4030,7 @@
25
- 295
+ 299
1
0
0
@@ -3977,7 +4050,7 @@
0
26
- 296
+ 300
5
0
0
@@ -3989,7 +4062,7 @@
26
- 297
+ 301
5
0
0
@@ -4001,7 +4074,7 @@
26
- 298
+ 302
1
0
0
@@ -4013,7 +4086,7 @@
26
- 299
+ 303
1
0
0
@@ -4025,7 +4098,7 @@
26
- 300
+ 304
5
0
0
@@ -4037,7 +4110,7 @@
26
- 301
+ 305
5
0
0
@@ -4049,7 +4122,7 @@
26
- 302
+ 306
1
0
0
@@ -4069,7 +4142,7 @@
0
27
- 303
+ 307
1
0
0
@@ -4081,7 +4154,7 @@
27
- 304
+ 308
1
0
0
@@ -4093,7 +4166,7 @@
27
- 305
+ 309
1
0
0
@@ -4105,7 +4178,7 @@
27
- 306
+ 310
1
0
0
@@ -4117,7 +4190,7 @@
27
- 307
+ 311
1
0
0
@@ -4129,7 +4202,7 @@
27
- 308
+ 312
5
0
0
@@ -4149,7 +4222,7 @@
0
28
- 309
+ 313
1
0
0
@@ -4161,7 +4234,7 @@
28
- 310
+ 314
1
0
0
@@ -4173,7 +4246,7 @@
28
- 311
+ 315
1
0
0
@@ -4185,7 +4258,7 @@
28
- 312
+ 316
1
0
0
@@ -4199,13 +4272,13 @@
Encrypt
- 1
+ 0
0
0
0
29
- 313
+ 317
1
0
0
@@ -4217,7 +4290,7 @@
29
- 314
+ 318
1
0
0
diff --git a/Project/MDK-ARM(uV5)/project.uvprojx b/Project/MDK-ARM(uV5)/project.uvprojx
index 6026fa9..092d0a7 100755
--- a/Project/MDK-ARM(uV5)/project.uvprojx
+++ b/Project/MDK-ARM(uV5)/project.uvprojx
@@ -384,9 +384,9 @@
App
- main.h
+ includes.h
5
- ..\..\User\app\inc\main.h
+ ..\..\User\app\inc\includes.h
main.c
@@ -493,6 +493,16 @@
1
..\..\User\app\src\status_uart_monitor.c
+
+ status_ds18b20_meter.c
+ 1
+ ..\..\User\app\src\status_ds18b20_meter.c
+
+
+ disp_lib.c
+ 1
+ ..\..\User\app\src\disp_lib.c
+
@@ -734,6 +744,11 @@
1
..\..\User\bsp\src\bsp_i2c_gpio_ext.c
+
+ bsp_ds18b20.c
+ 1
+ ..\..\User\bsp\src\bsp_ds18b20.c
+
@@ -1574,21 +1589,26 @@
1
..\..\User\programmer\stm8_prog_file.c
-
- n76e_prog_file.c
- 1
- ..\..\User\programmer\n76e_prog_file.c
-
n76e003_flash.c
1
..\..\User\programmer\n76e003_flash.c
+
+ w25q_flash.c
+ 1
+ ..\..\User\programmer\w25q_flash.c
+
cx32_isp.c
1
..\..\User\programmer\cx32_isp.c
+
+ pg_prog_file.c
+ 1
+ ..\..\User\programmer\pg_prog_file.c
+
diff --git a/Project/MDK-ARM(uV5)/project.zip b/Project/MDK-ARM(uV5)/project.zip
deleted file mode 100644
index 57fdfcf..0000000
Binary files a/Project/MDK-ARM(uV5)/project.zip and /dev/null differ
diff --git a/Project/MDK-ARM(uV5)/startup_stm32h743xx.s b/Project/MDK-ARM(uV5)/startup_stm32h743xx.s
index 2360991..5ef07d2 100755
--- a/Project/MDK-ARM(uV5)/startup_stm32h743xx.s
+++ b/Project/MDK-ARM(uV5)/startup_stm32h743xx.s
@@ -68,7 +68,7 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
- DCD 0x00000135 ; Reserved H7-TOOL APP 固件版本
+ DCD 0x00000140 ; Reserved H7-TOOL APP 固件版本
DCD 0 ; Reserved 固件小版本
DCD 0 ; Reserved
DCD 0 ; Reserved
diff --git a/Project/dap.bin b/Project/dap.bin
new file mode 100644
index 0000000..7d4fa28
Binary files /dev/null and b/Project/dap.bin differ
diff --git a/Project/h7_tool_app(V1.35).bin b/Project/h7_tool_app(V1.35).bin
deleted file mode 100644
index 24e7a4d..0000000
Binary files a/Project/h7_tool_app(V1.35).bin and /dev/null differ
diff --git a/Project/h7_tool_app(v1.40).bin b/Project/h7_tool_app(v1.40).bin
new file mode 100644
index 0000000..4c561a4
Binary files /dev/null and b/Project/h7_tool_app(v1.40).bin differ
diff --git a/Project/h7_tool_app.bin b/Project/h7_tool_app.bin
deleted file mode 100644
index f060fd4..0000000
Binary files a/Project/h7_tool_app.bin and /dev/null differ
diff --git a/README.md b/README.md
index 4cd5f39..f0d8842 100644
--- a/README.md
+++ b/README.md
@@ -28,10 +28,10 @@
4. USB-RS232 转换器
5. USB-TTL 串口转换器
6. USB-CAN 转换器 (未完成)
-7. DAP-Link 仿真器 / 下载器 (未完成)
-8. 脱机烧录器 (已完成STM32、MM32、GD32、新唐ARM、新唐8051、AT32、APM32、RT1052)
-9. I2C 控制器 (未完成)
-10. SPI 控制器 (未完成)
+7. DAP-Link 仿真器 / 下载器
+8. 脱机烧录器 (已完成STM32、MM32、GD32、新唐ARM、新唐8051、AT32、APM32、RT1052; SPI Flash)
+9. I2C 控制器
+10. SPI 控制器
11. GPIO 输入输出控制器
12. 模拟信号发生器
13. PWM 发生器 (未完成)
@@ -41,32 +41,28 @@
17. 高侧电流表 & 电池放电容量测量
18. 双通道电压表
18. 电阻测量 通断蜂鸣
-19. 温度测量
+19. NTC温度测量
20. 二极管测量
21. 微型数控电源
22. 串口数据监视器
23. lua小程序
+24. 8通道DS18B20温度表
### :construction: 任务列表 / TODO
- [ ] DAP-Link
- - [x] DAP-Link 移植
- - [ ] DAP-Link 测试
- - [ ] `Wi-Fi` 无线调试
+ - [x] DAP-Link 实现RTT打印功能
+ - [ ] 联机下载
- [ ] 逻辑分析仪
- [ ] 底层驱动编码 (FMC、DMA、TIM)
- [ ] 兼容第三方上位机
- [ ] 脱机烧录器
- - [x] 界面操作方式规划
- - [x] 实现STM32系列
- - [ ] 实现STM8系列
+ - [x] 根据客户需求补充其他厂家ARM芯片
+ - [ ] 实现STM32系列
- [ ] CAN功能
- [ ] 底层驱动验证
- - [ ] 功能规划
- [ ] TIM 定时器相关
- - [ ] 脉冲计数器 (脱机)
- - [ ] 频率计 (脱机)
- [ ] PWM 发生器 (联机)
### :warning: 注意事项 / Attention
diff --git a/User/app/inc/disp_lib.h b/User/app/inc/disp_lib.h
new file mode 100644
index 0000000..620cce1
--- /dev/null
+++ b/User/app/inc/disp_lib.h
@@ -0,0 +1,35 @@
+/*
+*********************************************************************************************************
+*
+* 模块名称 : 显示子函数
+* 文件名称 : disp_lib.h
+*
+*********************************************************************************************************
+*/
+
+#ifndef _DISP_LIB_H_
+#define _DISP_LIB_H_
+
+void DispHeader(char *_str);
+void DispHeaderSn(uint8_t _idx);
+void DispMeasBar(uint8_t _ucLine, char *_pName, char *_pValue, char *_pUnit);
+void DispMeasBarEx(uint8_t _ucLine, char *_pName, char *_pValue, char *_pUnit, uint16_t _usFillColor);
+void DispParamBar(uint8_t _ucLine, char *_pName, char *_pValue, uint8_t _ucActive);
+void DispHelpBar(char *_str1, char *_str2);
+void DispHeader2(uint8_t _idx, char *_str);
+void DispHeaderStr(char *_str);
+void DispInfoBar16(uint8_t _ucLine, char *_pName, char *_pValue);
+void DispInfoBar16Ex(uint8_t _ucLine, char *_pName, char *_pValue, uint16_t _ucColor);
+void DispBox(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, uint16_t _usColor);
+void DispLabel(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
+ uint16_t _usColor, char *_pStr, FONT_T *_tFont);
+void DispLabelRound(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
+ uint16_t _usColor, char *_pStr, FONT_T *_tFont);
+void DispProgressBar(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
+ char *_str1, float _Percent, char *_str2, FONT_T *_tFont);
+void ProgressBarSetColor(uint16_t _Color);
+void DispMsgBox(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, char *_str);
+
+#endif
+
+/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/app/inc/main.h b/User/app/inc/includes.h
old mode 100755
new mode 100644
similarity index 60%
rename from User/app/inc/main.h
rename to User/app/inc/includes.h
index a2cd200..b094db4
--- a/User/app/inc/main.h
+++ b/User/app/inc/includes.h
@@ -1,86 +1,102 @@
-/*
-*********************************************************************************************************
-*
-* 模块名称 : main模块
-* 文件名称 : main.h
-*
-*********************************************************************************************************
-*/
-
-#ifndef _MAIN_H_
-#define _MAIN_H_
-
-#include "ui_def.h"
-#include "param.h"
-#include "modbus_register.h"
-
-/* 主程序状态字定义, MS = Main Status */
-enum
-{
- MS_LINK_MODE = 0, /* 联机状态 */
-
- MS_SYSTEM_SET, /* 系统设置 */
- MS_HARD_INFO, /* 关于-硬件信息 */
- MS_ESP32_TEST, /* ESP32模块升级状态 */
- MS_USB_EMMC, /* 虚拟串口状态。RS232 RS485 TTL-UART */
- MS_MODIFY_PARAM, /* 参数设置 */
- MS_FILE_MANAGE, /* 文件管理 */
-
- MS_PROG_SELECT_FILE, /* 脱机下载器浏览文件 */
- MS_PROG_WORK, /* 脱机下载器工作界面 */
- MS_PROG_SETTING, /* 脱机下载器参数设置 */
- MS_PROG_MODIFY_PARAM, /* 修改参数比如复位类型 */
-
- MS_VOLTAGE_METER, /* 电压表 */
- MS_CURRENT_METER, /* 高侧电流表 */
- MS_TEMP_METER, /* 温度表 */
- MS_RESISTOR_METER, /* 电阻表 */
- MS_TVCC_POWER, /* 微型数控电源 */
- MS_PULSE_METER, /* 脉冲计 */
-
- MS_MINI_DSO, /* 迷你示波器 */
-
- MS_EXTEND_MENU1, /* 第1级菜单 */
- MS_EXTEND_MENU_LUA, /* 第2级菜单-LUA程序 */
- MS_EXTEND_MENU_REC, /* 第2级菜单-数据记录仪 */
-
- MS_LUA_SELECT_FILE, /* 浏览lua文件 */
- MS_LUA_EXEC_FILE, /* 执行lua文件 */
-
- MS_MONITOR_UART, /* 串口监视器 */
- MS_MONITOR_CAN, /* CAN监视器 */
- MS_MONITOR_GPIO, /* IO监视器 */
- MS_MONITOR_ANALOG, /* 模拟量监视器 */
-};
-
-void DispHeader(char *_str);
-void DispHeaderSn(uint8_t _idx);
-void DispMeasBar(uint8_t _ucLine, char *_pName, char *_pValue, char *_pUnit);
-void DispMeasBarEx(uint8_t _ucLine, char *_pName, char *_pValue, char *_pUnit, uint16_t _usFillColor);
-void DispParamBar(uint8_t _ucLine, char *_pName, char *_pValue, uint8_t _ucActive);
-void DispHelpBar(char *_str1, char *_str2);
-void DispHeader2(uint8_t _idx, char *_str);
-void DispHeaderStr(char *_str);
-void DispInfoBar16(uint8_t _ucLine, char *_pName, char *_pValue);
-void DispInfoBar16Ex(uint8_t _ucLine, char *_pName, char *_pValue, uint16_t _ucColor);
-void DispBox(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, uint16_t _usColor);
-void DispLabel(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
- uint16_t _usColor, char *_pStr, FONT_T *_tFont);
-void DispProgressBar(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
- char *_str1, float _Percent, char *_str2, FONT_T *_tFont);
-void ProgressBarSetColor(uint16_t _Color);
-uint16_t NextStatus(uint16_t _NowStatus);
-uint16_t LastStatus(uint16_t _NowStatus);
-void DSO_StartMode2(void);
-void PlayKeyTone(void);
-void DispMsgBox(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, char *_str);
-
-extern uint16_t g_MainStatus;
-
-extern uint8_t qspi_file_buf[1024];
-extern uint8_t qspi_read_buf[1024];
-
-
-#endif
-
-/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
+/*
+*********************************************************************************************************
+*
+* 模块名称 : 头文件汇总
+* 文件名称 : includes.h
+* 版 本 : V1.0
+* 说 明 : 当前使用头文件汇总
+*
+* 修改记录 :
+* 版本号 日期 作者 说明
+* V1.0 2020-06-12 Eric2013 首次发布
+*
+* Copyright (C), 2020-2030, 安富莱电子 www.armfly.com
+*
+*********************************************************************************************************
+*/
+
+#ifndef _INCLUDES_H_
+#define _INCLUDES_H_
+
+/*
+*********************************************************************************************************
+* APP / BSP
+*********************************************************************************************************
+*/
+#include "bsp.h"
+
+/*
+*********************************************************************************************************
+* 其它
+*********************************************************************************************************
+*/
+#include "ui_def.h"
+#include "param.h"
+#include "modbus_register.h"
+#include "disp_lib.h"
+#include "lcd_menu.h"
+#include "file_lib.h"
+#include "lua_if.h"
+#include "prog_if.h"
+#include "modify_param.h"
+#include "wifi_if.h"
+#include "usb_if.h"
+
+/* 主程序状态字定义, MS = Main Status */
+enum
+{
+ MS_LINK_MODE = 0, /* 联机状态 */
+
+ MS_SYSTEM_SET, /* 系统设置 */
+ MS_HARD_INFO, /* 关于-硬件信息 */
+ MS_ESP32_TEST, /* ESP32模块升级状态 */
+ MS_USB_EMMC, /* 虚拟串口状态。RS232 RS485 TTL-UART */
+ MS_MODIFY_PARAM, /* 参数设置 */
+ MS_FILE_MANAGE, /* 文件管理 */
+
+ MS_PROG_SELECT_FILE, /* 脱机下载器浏览文件 */
+ MS_PROG_WORK, /* 脱机下载器工作界面 */
+ MS_PROG_SETTING, /* 脱机下载器参数设置 */
+ MS_PROG_MODIFY_PARAM, /* 修改参数比如复位类型 */
+
+ MS_VOLTAGE_METER, /* 电压表 */
+ MS_CURRENT_METER, /* 高侧电流表 */
+ MS_TEMP_METER, /* 温度表 */
+ MS_RESISTOR_METER, /* 电阻表 */
+ MS_TVCC_POWER, /* 微型数控电源 */
+ MS_PULSE_METER, /* 脉冲计 */
+
+ MS_MINI_DSO, /* 迷你示波器 */
+
+ MS_EXTEND_MENU1, /* 第1级菜单 */
+ MS_EXTEND_MENU_LUA, /* 第2级菜单-LUA程序 */
+ MS_EXTEND_MENU_REC, /* 第2级菜单-数据记录仪 */
+
+ MS_LUA_SELECT_FILE, /* 浏览lua文件 */
+ MS_LUA_EXEC_FILE, /* 执行lua文件 */
+
+ MS_MONITOR_UART, /* 串口监视器 */
+ MS_MONITOR_CAN, /* CAN监视器 */
+ MS_MONITOR_GPIO, /* IO监视器 */
+ MS_MONITOR_ANALOG, /* 模拟量监视器 */
+
+ MS_DAPLINK, /* 仿真器状态 */
+ MS_JUMP_APP, /* 跳到APP状态 */
+
+ MS_DS18B20_METER, /* DS18B20温度表 */
+};
+
+uint16_t NextStatus(uint16_t _NowStatus);
+uint16_t LastStatus(uint16_t _NowStatus);
+void DSO_StartMode2(void);
+void PlayKeyTone(void);
+
+extern uint16_t g_MainStatus;
+
+extern uint8_t qspi_file_buf[1024];
+extern uint8_t qspi_read_buf[1024];
+
+
+#endif
+
+/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/app/inc/modify_param.h b/User/app/inc/modify_param.h
index 324c1d8..03f756f 100644
--- a/User/app/inc/modify_param.h
+++ b/User/app/inc/modify_param.h
@@ -14,6 +14,15 @@
#ifndef _MODIFY_PARAM_H
#define _MODIFY_PARAM_H
+/* 修改参数的界面ID */
+enum
+{
+ MODIFY_PARAM_UART_MON = 0, /* 串口监视 */
+ MODIFY_PARAM_SYSTEM, /* 系统参数 */
+ MODIFY_PARAM_NET, /* 网络参数 */
+ MODIFY_PARAM_PROG, /* 脱机烧录器参数 */
+};
+
/* 参数列表结构 */
typedef struct
{
diff --git a/User/app/inc/param.h b/User/app/inc/param.h
index cf12931..08b09a5 100755
--- a/User/app/inc/param.h
+++ b/User/app/inc/param.h
@@ -25,7 +25,7 @@
#define CALIB_VER 0x00000201 /* 校准参数版本 200 */
/* 暂未启用 程序缓存 */
-#define APP_BUF_ADDR 0x08000000 + 1 * 1024 * 1024
+#define APP_BUF_ADDR 0x08000000 + 1 * 1024 * 1024
/* 校准参数结构,两点校准, 通用校准参数,ADC */
typedef struct
@@ -118,6 +118,11 @@ typedef struct
uint8_t UartMonTimeStamp; /* 串口监视,加上时间戳 */
uint8_t UartMonProxy; /* 串口监视,协议 */
+ /* DAP-Link相关参数 */
+ uint8_t DAP_TVCCVolt; /* DAP=Link TVCC设置 0-关闭 0-50 表示 0-5.0V */
+ uint8_t DAP_BeepEn; /* DAP=Link 提示音使能 0:关闭 1:烧录完毕鸣叫 */
+ uint8_t DAP_Sn; /* DAP-Link 序号,用于驱动识别: */
+
} PARAM_T;
/* 模拟量校准参数 */
diff --git a/User/app/src/disp_lib.c b/User/app/src/disp_lib.c
new file mode 100644
index 0000000..fdd34b2
--- /dev/null
+++ b/User/app/src/disp_lib.c
@@ -0,0 +1,500 @@
+/*
+*********************************************************************************************************
+*
+* 模块名称 : 显示类函数集合
+* 文件名称 : disp_lib.c
+* 版 本 : V1.0
+* 说 明 : H7-TOOL APP
+*
+* 修改记录 :
+* 版本号 日期 作者 说明
+* V1.0 2020-1106-20 armfly 1.由APP部分整合而来。裸机程序框架
+*
+* Copyright (C), 2020-2030, 安富莱电子 www.armfly.com
+*
+*********************************************************************************************************
+*/
+
+#include "includes.h"
+
+extern uint16_t g_MainStatus; /* 主状态字 */
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispHeader
+* 功能说明: 显示界面标题(抬头第1行)
+* 形 参: _str : 标题文字
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+extern uint16_t GetStatusIndex(uint16_t _NowStatus);
+void DispHeader(char *_str)
+{
+ uint8_t idx;
+
+ idx = GetStatusIndex(g_MainStatus);
+ DispHeader2(idx, _str);
+}
+
+/* 带序号参数 */
+void DispHeader2(uint8_t _idx, char *_str)
+{
+ FONT_T tFont;
+ char buf[48];
+
+ /* 设置字体参数 */
+ {
+ tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
+ tFont.FrontColor = HEAD_TEXT_COLOR; /* 字体颜色 */
+ tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
+ tFont.Space = 0; /* 文字间距,单位 = 像素 */
+ }
+
+ LCD_Fill_Rect(0, 0, HEAD_HEIGHT, HEAD_HEIGHT, HEAD_SN_COLOR); /* 清屏标题序号区 */
+ LCD_Fill_Rect(HEAD_HEIGHT, 0, HEAD_HEIGHT, 240 - HEAD_HEIGHT, HEAD_BACK_COLOR); /* 清屏标题栏文本区 */
+
+ sprintf(buf, "%02d", _idx);
+ tFont.BackColor = HEAD_SN_COLOR; /* 文字背景颜色 */
+ LCD_DispStr(4, 4, buf, &tFont);
+
+ /* 显示标题文字 */
+ tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
+ LCD_DispStrEx(HEAD_HEIGHT, 4, _str, &tFont, 240 - HEAD_HEIGHT, ALIGN_CENTER);
+
+ LCD_DrawLine(0, HEAD_HEIGHT, 239, HEAD_HEIGHT, HEAD_BODER_COLOR);
+
+ /* 清屏正文区 00联机界面背景颜色不同于其他界面,便于识别 */
+ LCD_Fill_Rect(0, HEAD_HEIGHT + 1, 240 - HEAD_HEIGHT - 1, 240, FORM_BACK_COLOR);
+}
+
+/* 只刷新标题文字部分,不清屏 */
+void DispHeaderStr(char *_str)
+{
+ FONT_T tFont;
+
+ /* 设置字体参数 */
+ {
+ tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
+ tFont.FrontColor = HEAD_TEXT_COLOR; /* 字体颜色 */
+ tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
+ tFont.Space = 0; /* 文字间距,单位 = 像素 */
+ }
+
+ LCD_Fill_Rect(HEAD_HEIGHT, 0, HEAD_HEIGHT, 240 - HEAD_HEIGHT, HEAD_BACK_COLOR); /* 清屏标题栏文本区 */
+
+ /* 显示标题文字 */
+ tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
+ LCD_DispStrEx(HEAD_HEIGHT, 4, _str, &tFont, 240 - HEAD_HEIGHT, ALIGN_CENTER);
+}
+
+/* 显示序号 */
+void DispHeaderSn(uint8_t _idx)
+{
+ FONT_T tFont;
+ char buf[48];
+
+ /* 设置字体参数 */
+ {
+ tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
+ tFont.FrontColor = HEAD_TEXT_COLOR; /* 字体颜色 */
+ tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
+ tFont.Space = 0; /* 文字间距,单位 = 像素 */
+ }
+
+ LCD_Fill_Rect(0, 0, HEAD_HEIGHT, HEAD_HEIGHT, HEAD_SN_COLOR); /* 清屏标题序号区 */
+
+ sprintf(buf, "%02d", _idx);
+ tFont.BackColor = HEAD_SN_COLOR; /* 文字背景颜色 */
+ LCD_DispStr(4, 4, buf, &tFont);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispBox
+* 功能说明: 显示一个圆角矩形框,固定风格。
+* 形 参: _usX : 坐标X
+* _usY : 坐标Y
+* _usHeight : 高度
+* _usWidth : 宽度
+* _usColor : 填充颜色
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void DispBox(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, uint16_t _usColor)
+{
+ /* 绘制边框 */
+ LCD_DrawRoundRect(_usX, _usY, _usHeight, _usWidth, B0X_ARC, MEAS_BODER_COLOR);
+
+ /* 填充矩形 */
+ LCD_FillRoundRect(_usX + 1, _usY + 1, _usHeight - 2, _usWidth - 2, B0X_ARC, _usColor);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispLabel
+* 功能说明: 显示一个文本标签框
+* 形 参: _usX : 坐标X
+* _usY : 坐标Y
+* _usHeight : 高度
+* _usWidth : 宽度
+* _usColor : 填充颜色
+* _pStr : 显示内容
+* _pFont : 字体
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void DispLabel(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
+ uint16_t _usColor, char *_pStr, FONT_T *_tFont)
+{
+ /* 填充矩形 */
+ LCD_Fill_Rect(_usX, _usY, _usHeight, _usWidth, _usColor);
+ LCD_DispStr(_usX, _usY, _pStr, _tFont);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispLabelRound
+* 功能说明: 显示圆角标签,用于DAP-LINK
+* 形 参: _usX : 坐标X
+* _usY : 坐标Y
+* _usHeight : 高度
+* _usWidth : 宽度
+* _usColor : 填充颜色
+* _pStr : 显示内容
+* _pFont : 字体
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void DispLabelRound(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
+ uint16_t _usColor, char *_pStr, FONT_T *_tFont)
+{
+ uint16_t fh;
+ uint16_t offset;
+
+ /* 绘制圆角矩形 */
+ DispBox(_usX, _usY, _usHeight, _usWidth, _usColor);
+
+ fh = LCD_GetFontHeight(_tFont);
+ if (_usHeight > fh)
+ {
+ offset = (_usHeight - fh) / 2;
+ }
+ else
+ {
+ offset = 0;
+ }
+ LCD_DispStrEx(_usX, _usY + offset, _pStr, _tFont, _usWidth, ALIGN_CENTER);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispMeasBar
+* 功能说明: 显示测量值
+* 形 参: _ucLine : 行号 0 - 3 (最多4行)
+* _pName : 参数名称
+* _pValue : 测量值
+* _pUnit : 单位
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void DispMeasBar(uint8_t _ucLine, char *_pName, char *_pValue, char *_pUnit)
+{
+ DispMeasBarEx(_ucLine, _pName, _pValue, _pUnit, MEAS_BACK_COLOR);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispMeasBarEx
+* 功能说明: 显示测量值,带填充颜色参数
+* 形 参: _ucLine : 行号 0 - 3 (最多4行)
+* _pName : 参数名称
+* _pValue : 测量值
+* _pUnit : 单位
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void DispMeasBarEx(uint8_t _ucLine, char *_pName, char *_pValue, char *_pUnit, uint16_t _usFillColor)
+{
+ FONT_T tFont;
+ uint16_t x;
+ uint16_t y;
+
+ /* 设置字体参数 */
+ {
+ tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
+ tFont.FrontColor = MEAS_NAME_COLOR; /* 字体颜色 */
+ tFont.BackColor = CL_MASK; /* 文字背景颜色 */
+ tFont.Space = 0; /* 文字间距,单位 = 像素 */
+ }
+
+ x = MEAS_WIN_LEFT;
+ y = HEAD_HEIGHT + 9 + _ucLine * (MEAS_WIN_HEIGHT + 9);
+
+ DispBox(x, y, MEAS_WIN_HEIGHT, MEAS_WIN_WIDTH, _usFillColor);
+
+ /* 参数名字 */
+ tFont.FrontColor = MEAS_NAME_COLOR;
+ LCD_DispStr(MEAS_WIN_LEFT + 5, y + 4, _pName, &tFont);
+
+ /* 测量值 */
+ tFont.FrontColor = MEAS_VALUE_COLOR;
+ LCD_DispStr(MEAS_WIN_LEFT + 80, y + 4, _pValue, &tFont);
+
+ /* 单位 */
+ tFont.FrontColor = MEAS_UNIT_COLOR;
+ LCD_DispStr(MEAS_WIN_LEFT + 188, y + 4, _pUnit, &tFont);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispParamBar
+* 功能说明: 显示参数设置 - 系统设置中使用
+* 形 参: _ucLine : 行号 0 - 3 (最多4行)
+* _pName : 参数名称
+* _pValue : 测量值
+* _ucActive : 选中否
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void DispParamBar(uint8_t _ucLine, char *_pName, char *_pValue, uint8_t _ucActive)
+{
+ FONT_T tFont;
+ uint16_t x;
+ uint16_t y;
+ uint16_t NameWidth;
+
+ /* 设置字体参数 */
+ {
+ tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
+ tFont.FrontColor = MEAS_NAME_COLOR; /* 字体颜色 */
+ tFont.BackColor = CL_MASK; /* 文字背景颜色 */
+ tFont.Space = 0; /* 文字间距,单位 = 像素 */
+ }
+
+ x = MEAS_WIN_LEFT;
+ y = HEAD_HEIGHT + 9 + _ucLine * (MEAS_WIN_HEIGHT + 3);
+
+ /* 绘制圆角矩形 */
+ if (_ucActive == 1) /* 选中是用黄色底 */
+ {
+ DispBox(x, y, MEAS_WIN_HEIGHT, MEAS_WIN_WIDTH, CL_YELLOW);
+ }
+ else
+ {
+ DispBox(x, y, MEAS_WIN_HEIGHT, MEAS_WIN_WIDTH, MEAS_BACK_COLOR);
+ }
+
+ /* 参数名字 */
+ tFont.FrontColor = MEAS_NAME_COLOR;
+ LCD_DispStr(MEAS_WIN_LEFT + 5, y + 4, _pName, &tFont);
+
+ NameWidth = LCD_GetStrWidth(_pName, &tFont);
+
+ /* 测量值 */
+ tFont.FrontColor = MEAS_VALUE_COLOR;
+ LCD_DispStr(MEAS_WIN_LEFT + 5 + NameWidth + 5, y + 4, _pValue, &tFont);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispProgressBar
+* 功能说明: 显示进度条
+* 形 参: _usX : 坐标
+* _usX : 坐标
+* _usHeight : 高度
+* _usWidth : 宽度
+* _str : 显示文字
+* _Percent : 百分比, 浮点数
+* tFont : 字体
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+extern uint8_t s_DispRefresh;
+static uint16_t s_ProgressBarColor1 = PROGRESS_BACK_COLOR1;
+void ProgressBarSetColor(uint16_t _Color)
+{
+ s_ProgressBarColor1 = _Color;
+}
+
+void DispProgressBar(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
+ char *_str1, float _Percent, char *_str2, FONT_T *_tFont)
+{
+ uint16_t width;
+ char buf[16];
+ uint16_t StrWidth;
+ uint16_t StrHeight;
+ uint16_t x, y;
+
+ if (_Percent > 100)
+ {
+ _Percent = 100;
+ }
+
+ width = ((_usWidth - 4) * _Percent) / 100;
+
+ /* 填充矩形 */
+ LCD_DrawRect(_usX, _usY, _usHeight, _usWidth, PROGRESS_BODER_COLOR);
+
+ LCD_Fill_Rect(_usX + 2, _usY + 2, _usHeight - 4, width, s_ProgressBarColor1);
+
+ if (_Percent < 100)
+ {
+ LCD_Fill_Rect(_usX + width + 2, _usY + 2, _usHeight - 4, _usWidth - width - 4, PROGRESS_BACK_COLOR2);
+ }
+
+ StrHeight = LCD_GetFontHeight(_tFont);
+ y = _usY + (_usHeight - StrHeight) / 2;
+ if (_str1[0] == 0) /* 只显示显示百分比文字 */
+ {
+ sprintf(buf, "%0.0f%%", _Percent);
+ StrWidth = LCD_GetStrWidth(buf, _tFont);
+ x = _usX + (_usWidth - StrWidth) / 2;
+ LCD_DispStr(x, y, buf, _tFont);
+ }
+ else
+ {
+ /* 显示左侧文本 */
+ x = _usX + 4;
+ LCD_DispStr(x, y, _str1, _tFont);
+
+ /* 显示百分比 */
+ sprintf(buf, "%0.0f%%", _Percent);
+ StrWidth = LCD_GetStrWidth(buf, _tFont);
+ x = _usX + (_usWidth - StrWidth) / 2;
+ LCD_DispStr(x, y, buf, _tFont);
+
+ /* 显示右侧文本 */
+ x = x + 36;
+ LCD_DispStr(x, y, _str2, _tFont);
+ }
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispHelpBar
+* 功能说明: 显示操作提示
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+const unsigned char g_ImageHelp[512] = { /* 0X10,0X10,0X00,0X10,0X00,0X10,0X01,0X1B, */
+ 0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,0XFF,0XBE,0XFF,0XBE,0XEF,0X9E,0XD7,0X5E,0XCF,0X3F,
+ 0XCF,0X1F,0XD7,0X5F,0XE7,0X9F,0XFF,0XDF,0XFF,0XDE,0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,
+ 0XF7,0X9E,0XF7,0X9E,0XF7,0XBE,0XEF,0X7E,0XC6,0XFE,0XAE,0XBE,0XA6,0X7E,0X9E,0X7E,
+ 0X9E,0X7E,0X9E,0X7E,0XA6,0X7E,0XBE,0XDE,0XE7,0X7E,0XFF,0XBE,0XF7,0X9E,0XF7,0X9E,
+ 0XF7,0X9E,0XF7,0XBE,0XE7,0X5E,0XB6,0XBE,0XA6,0X7E,0X9E,0X5E,0X96,0X5E,0X8E,0X1E,
+ 0X8E,0X1E,0X96,0X3E,0X96,0X5E,0X9E,0X5E,0XAE,0X9E,0XDF,0X5E,0XFF,0XBE,0XF7,0X9E,
+ 0XF7,0XBE,0XEF,0X7E,0XB6,0XBD,0X9E,0X7E,0X96,0X3E,0X96,0X3E,0X8E,0X1E,0XA6,0X7E,
+ 0XA6,0X7E,0X8E,0X1D,0X8E,0X1E,0X8E,0X3D,0X96,0X3D,0XA6,0X7D,0XE7,0X7E,0XFF,0XDE,
+ 0XFF,0XBE,0XBE,0XDD,0X9E,0X5D,0X96,0X3D,0X8E,0X1D,0X8E,0X1D,0X85,0XFD,0XDF,0X7E,
+ 0XE7,0X9F,0X85,0XFD,0X86,0X1D,0X86,0X1D,0X8E,0X1D,0X8E,0X1D,0XB6,0XBD,0XFF,0XDF,
+ 0XE7,0X7E,0X96,0X3D,0X8E,0X1D,0X86,0X1D,0X85,0XFD,0X86,0X1D,0X7D,0XFD,0X96,0X3D,
+ 0X96,0X3D,0X85,0XFD,0X85,0XFD,0X85,0XFD,0X85,0XFD,0X85,0XFD,0X8E,0X1C,0XE7,0X7E,
+ 0XCF,0X1E,0X7D,0XFC,0X85,0XFD,0X85,0XFD,0X7D,0XFD,0X7D,0XFD,0X8E,0X3D,0X96,0X3D,
+ 0X8E,0X1D,0X7D,0XFD,0X7D,0XFD,0X7D,0XFD,0X7D,0XDC,0X7D,0XFC,0X75,0XDC,0XC6,0XFE,
+ 0XB6,0XBD,0X75,0XBC,0X7D,0XDC,0X7D,0XDC,0X7D,0XFD,0X7D,0XDD,0X8E,0X3D,0XE7,0X7F,
+ 0XD7,0X5E,0X75,0XDC,0X7D,0XDC,0X7D,0XDC,0X7D,0XDC,0X7D,0XDC,0X75,0X9C,0XAE,0X9D,
+ 0XAE,0X9D,0X75,0X9C,0X7D,0XDC,0X7D,0XDC,0X7D,0XDC,0X7D,0XDC,0X6D,0X9C,0XBE,0XDE,
+ 0XDF,0X5E,0X75,0XBC,0X7D,0XDC,0X7D,0XDC,0X75,0XBC,0X75,0XBC,0X6D,0X7B,0XA6,0X7D,
+ 0XC6,0XFD,0X75,0X9C,0X7D,0XBC,0X75,0XBC,0X75,0XBC,0X75,0XBC,0X6D,0X9C,0XBE,0XDD,
+ 0XD7,0X5E,0X6D,0X9C,0X75,0XBC,0X75,0XBC,0X75,0X9C,0X75,0X9C,0X65,0X7B,0XBE,0XDD,
+ 0XE7,0X7E,0X85,0XDC,0X7D,0XBC,0X75,0X9C,0X75,0X9B,0X75,0X9C,0X65,0X7B,0XB6,0XBD,
+ 0XD7,0X3E,0X65,0X7B,0X6D,0X9C,0X6D,0X7B,0X6D,0X7B,0X75,0X9B,0X75,0X9B,0XDF,0X5E,
+ 0XFF,0XDE,0XAE,0X7C,0X85,0XDB,0X75,0X9B,0X6D,0X7B,0X6D,0X7B,0X5D,0X3B,0XB6,0XBD,
+ 0XD7,0X5E,0X5D,0X3B,0X6D,0X7B,0X6D,0X7B,0X6D,0X7B,0X75,0X7B,0X9E,0X3C,0XFF,0XDF,
+ 0XFF,0XBE,0XE7,0X5E,0X96,0X1C,0X7D,0XBB,0X75,0X7B,0X65,0X5B,0X75,0X9B,0XCF,0X1D,
+ 0XDF,0X7E,0X85,0XDB,0X5D,0X3A,0X6D,0X5B,0X75,0X7B,0X85,0XDB,0XDF,0X5D,0XFF,0XDE,
+ 0XF7,0X9E,0XFF,0XBE,0XD7,0X3D,0X95,0XFB,0X75,0X9B,0X6D,0X7B,0X6D,0X5B,0X6D,0X5A,
+ 0X65,0X5A,0X6D,0X5A,0X65,0X5A,0X6D,0X5A,0X7D,0XBB,0XCE,0XFD,0XFF,0XDE,0XF7,0X9E,
+ 0XF7,0X9E,0XF7,0X9E,0XFF,0XBE,0XDF,0X3D,0X9E,0X1B,0X6D,0X7A,0X5D,0X1A,0X4C,0XFA,
+ 0X4C,0XDA,0X4C,0XFA,0X5D,0X3A,0X8D,0XFB,0XDF,0X3D,0XFF,0XBE,0XF7,0X9E,0XF7,0X9E,
+ 0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,0XEF,0X5D,0XCE,0XBB,0XA6,0X1A,0X85,0XBA,
+ 0X85,0XBA,0X9E,0X1A,0XC6,0XBC,0XEF,0X7D,0XF7,0XBE,0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,
+};
+void DispHelpBar(char *_str1, char *_str2)
+{
+ FONT_T tFont; /* 定义字体结构体变量 */
+
+ tFont.FontCode = FC_ST_16; /* 字体代码 16点阵 */
+ tFont.FrontColor = HELP_TEXT_COLOR; /* 字体颜色 */
+ tFont.BackColor = HELP_BACK_COLOR; /* 文字背景颜色 */
+ tFont.Space = 0; /* 文字间距,单位 = 像素 */
+
+ ST7789_DrawBMP8(1, 240 - 36, 16, 16, (uint8_t *)g_ImageHelp);
+
+ LCD_DispStr(20, 240 - 36, _str1, &tFont);
+ LCD_DispStr(20, 240 - 18, _str2, &tFont);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispInfoBar16
+* 功能说明: 显示信息,16点阵.
+* 形 参: _line : 行号
+* _str1 : 参数名
+* _str2 : 参数值
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void DispInfoBar16(uint8_t _ucLine, char *_pName, char *_pValue)
+{
+ DispInfoBar16Ex(_ucLine, _pName, _pValue, INFO_VALUE_COLOR);
+}
+
+/* 带颜色参数 - 用于显示红色超标参数 */
+void DispInfoBar16Ex(uint8_t _ucLine, char *_pName, char *_pValue, uint16_t _ucColor)
+{
+ FONT_T tFont;
+ uint16_t x;
+ uint16_t y;
+
+ /* 设置字体参数 */
+ {
+ tFont.FontCode = FC_ST_16; /* 字体代码 16点阵 */
+ tFont.FrontColor = INFO_NAME_COLOR; /* 字体颜色 */
+ tFont.BackColor = INFO_BACK_COLOR; /* 文字背景颜色 */
+ tFont.Space = 0; /* 文字间距,单位 = 像素 */
+ }
+
+ x = 5;
+ y = HEAD_HEIGHT + 5 + _ucLine * INFO_HEIGHT;
+
+ /* 参数名字 */
+ tFont.FrontColor = INFO_NAME_COLOR;
+ LCD_DispStr(x, y, _pName, &tFont);
+
+ x += LCD_GetStrWidth(_pName, &tFont) + 5;
+
+ /* 参数值 */
+ tFont.FrontColor = _ucColor;
+ LCD_DispStr(x, y, _pValue, &tFont);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispMsgBox
+* 功能说明: 显示一个消息框. 字体16点阵
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void DispMsgBox(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, char *_str)
+{
+ FONT_T tFont;
+
+ /* 设置字体参数 */
+ {
+ tFont.FontCode = FC_ST_16; /* 字体代码 16点阵 */
+ tFont.FrontColor = MEAS_NAME_COLOR; /* 字体颜色 */
+ tFont.BackColor = CL_MASK; /* 文字背景颜色 */
+ tFont.Space = 0; /* 文字间距,单位 = 像素 */
+ }
+
+ DispBox(_usX, _usY, _usHeight, _usWidth, MEAS_BACK_COLOR);
+
+ /* 参数名字 */
+ tFont.FrontColor = MEAS_NAME_COLOR;
+ LCD_DispStr(_usX + 5, _usY + 4, _str, &tFont);
+}
+
+/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/app/src/file_lib.c b/User/app/src/file_lib.c
index 4fdccb8..f07bb79 100644
--- a/User/app/src/file_lib.c
+++ b/User/app/src/file_lib.c
@@ -14,11 +14,8 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "file_lib.h"
-#include "lcd_menu.h"
-#include "main.h"
-#include "prog_if.h"
+
+#include "includes.h"
#include "md5.h"
/*
diff --git a/User/app/src/lcd_menu.c b/User/app/src/lcd_menu.c
index 8849e0c..73c0ce8 100755
--- a/User/app/src/lcd_menu.c
+++ b/User/app/src/lcd_menu.c
@@ -14,10 +14,7 @@
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "fonts.h"
-#include "ui_def.h"
-#include "lcd_menu.h"
+#include "includes.h"
/*
*********************************************************************************************************
diff --git a/User/app/src/main.c b/User/app/src/main.c
index 0c34bd1..923f958 100755
--- a/User/app/src/main.c
+++ b/User/app/src/main.c
@@ -16,8 +16,7 @@
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
#include "status_link_mode.h"
#include "status_voltage_meter.h"
@@ -51,7 +50,11 @@
#include "file_lib.h"
#include "elf_file.h"
-static void DispLogo(void);
+#include "w25q_flash.h"
+
+
+extern void status_DS18B20Meter(void);
+
uint16_t GetStatusIndex(uint16_t _NowStatus);
uint16_t g_MainStatus; /* 主状态字 */
@@ -66,38 +69,9 @@ static const uint16_t StatusOrder[] =
MS_TEMP_METER, /* 温度表 */
MS_TVCC_POWER, /* 微型数控电源 */
MS_PULSE_METER, /* 脉冲计 */
- MS_MINI_DSO, /* 迷你示波器 */
+ //MS_MINI_DSO, /* 迷你示波器 */
};
-
-uint32_t stm32crc(uint32_t *ptr, int len)
-{
- uint32_t xbit, data;
- uint32_t crc = 0xFFFFFFFF; // init value
- uint32_t polynom = 0x04c11db7;
-
- while (len--) {
- xbit = 1u << 31;
-
- data = *ptr++;
- for (int bits = 0; bits < 32; bits++)
- {
- if (crc & 0x80000000) {
- crc <<= 1;
- crc ^= polynom;
- }
- else
- crc <<= 1;
-
- if (data & xbit)
- crc ^= polynom;
-
- xbit >>= 1;
- }
- }
- return crc;
-}
-
/*
*********************************************************************************************************
* 函 数 名: main
@@ -106,53 +80,16 @@ uint32_t stm32crc(uint32_t *ptr, int len)
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
+void JumpToDAPLink(void);
+extern MENU_T g_tMenu1;
int main(void)
-{
+{
bsp_Init();
+
LoadParam(); /* 读取应用程序参数, 该函数在param.c */
-
- PERIOD_Start(&g_tRunLed, 50, 50, 0); /* LED一直闪烁, 非阻塞 */
-
- DispLogo();
- bsp_InitESP32();
+ ST7789_SetDirection(g_tParam.DispDir);
- bsp_SetTVCC(3300);
-
- DSO_InitHard();
- DSO_SetDC(1, 1);
- DSO_SetDC(2, 1);
- DSO_SetGain(1, 3);
- DSO_SetGain(2, 3);
-
- /* 测试一拖四模式 */
- {
- g_gMulSwd.MultiMode = 0;
- g_gMulSwd.Active[0] = 1;
- g_gMulSwd.Active[1] = 1;
- g_gMulSwd.Active[2] = 1;
- g_gMulSwd.Active[3] = 1;
- }
-
- /* LwIP 初始化 */
- {
- /* 如果不插网线,此函数执行时间过长 */
- /* 网络参数存在在全局变量 g_tParam.lwip_ip, g_tParam.lwip_net_mask, g_tParam.lwip_gateway */
- lwip_start();
-
- lwip_pro();
- }
-
- PERIOD_Start(&g_tRunLed, 1000, 1000, 0); /* LED一直闪烁, 每2秒闪1次 */
-
- usbd_Init(); /* 初始化USB协议栈 */
-
- FileSystemLoad(); /* 挂载文件系统 */
-
- lua_Init(); /* 启动lua */
-
- //wifi_state = WIFI_INIT;
-
/* 主程序采用状态机实现程序功能切换 */
g_MainStatus = MS_LINK_MODE; /* 初始状态 = 联机界面 */
if (g_tParam.StartRun == 1)
@@ -164,7 +101,84 @@ int main(void)
{
g_gMulSwd.MultiMode = g_tParam.MultiProgMode;
g_MainStatus = MS_PROG_WORK; /* 多路烧录 */
- }
+ }
+ else if (g_tParam.StartRun == 3)
+ {
+ uint32_t RegJump;
+ /*
+ 备份寄存器,32bit。
+ RTC_BKP_DR0 : 用于RTC初始化标志
+ RTC_BKP_DR1 : 用于状态之间跳转
+ - boot = 1, app = 2, dap = 3
+ - 0x0102 : 表示从boot来,要去app
+ - 0x0301 : 表示从dap来,要去app
+ - 0x0103 : 表示从boot来,要去dap
+ */
+ RegJump = RTC_ReadBkup32(RTC_BKP_DR1);
+
+ if (RegJump == 0x0000)
+ {
+ JumpToDAPLink(); /* 进入DAP */
+ }
+
+ /* 从DAP返回,直接到菜单选择状态 */
+ if (RegJump == 0x0301)
+ {
+ g_tMenu1.Cursor = 0;
+ g_MainStatus = MS_EXTEND_MENU1;
+ }
+
+ /* 进入00 待机界面 */
+ RTC_WriteBkup32(RTC_BKP_DR1, 0x0000);
+ }
+ else /* 0 - 缺省*/
+ {
+ uint32_t RegJump;
+ RegJump = RTC_ReadBkup32(RTC_BKP_DR1);
+
+ /* 从DAP返回,直接到菜单选择状态 */
+ if (RegJump == 0x0301)
+ {
+ g_tMenu1.Cursor = 0;
+ g_MainStatus = MS_EXTEND_MENU1;
+ }
+
+ RTC_WriteBkup32(RTC_BKP_DR1, 0x0000);
+ }
+
+ /* 执行较快的初始化代码部分 */
+ {
+ //PERIOD_Start(&g_tRunLed, 50, 50, 0); /* LED一直闪烁, 非阻塞 */
+ PERIOD_Start(&g_tRunLed, 1000, 1000, 0); /* LED一直闪烁, 每2秒闪1次 */
+
+ bsp_InitESP32();
+
+ bsp_SetTVCC(3300);
+
+ DSO_InitHard();
+ DSO_SetDC(1, 1);
+ DSO_SetDC(2, 1);
+ DSO_SetGain(1, 3);
+ DSO_SetGain(2, 3);
+
+ /* 脱机烧录用的全局变量 */
+ {
+ g_gMulSwd.MultiMode = 0;
+ g_gMulSwd.Active[0] = 1;
+ g_gMulSwd.Active[1] = 1;
+ g_gMulSwd.Active[2] = 1;
+ g_gMulSwd.Active[3] = 1;
+ }
+
+ usbd_Init(); /* 初始化USB协议栈 */
+
+ FileSystemLoad(); /* 挂载文件系统 */
+
+ lua_Init(); /* 启动lua */
+ }
+
+ //wifi_state = WIFI_INIT;
+
while (1)
{
switch (g_MainStatus)
@@ -182,7 +196,7 @@ int main(void)
break;
case MS_MODIFY_PARAM: /* 修改参数 */
- status_ModifyParam();
+ //status_ModifyParam();
break;
case MS_ESP32_TEST: /* ESP32模块固件升级 */
@@ -265,13 +279,13 @@ int main(void)
status_MonitorCan();
break;
- case MS_MONITOR_GPIO: /* IO监视器 */
- status_MonitorUart();
- break;
-
- case MS_MONITOR_ANALOG: /* 模拟量监视器 */
+ case MS_MONITOR_GPIO: /* 串口视器 */
status_MonitorUart();
break;
+
+ case MS_DS18B20_METER: /* DS18B20温度表 */
+ status_DS18B20Meter();
+ break;
default:
g_MainStatus = MS_LINK_MODE;
@@ -280,7 +294,6 @@ int main(void)
}
}
-
/*
*********************************************************************************************************
* 函 数 名: NextStatus
@@ -380,472 +393,6 @@ uint16_t GetStatusIndex(uint16_t _NowStatus)
return idx;
}
-/*
-*********************************************************************************************************
-* 函 数 名: DispLogo
-* 功能说明: 开机显示版本号
-* 形 参: 无
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-static void DispLogo(void)
-{
- FONT_T tFont; /* 定义字体结构体变量 */
-
- tFont.FontCode = FC_ST_16; /* 字体代码 16点阵 */
- tFont.FrontColor = RGB(200, 200, 200); /* 字体颜色 */
- tFont.BackColor = FORM_BACK_COLOR; /* 文字背景颜色 */
- tFont.Space = 0; /* 文字间距,单位 = 像素 */
-
- ST7789_SetDirection(g_tParam.DispDir);
-
- LCD_ClrScr(FORM_BACK_COLOR); /* 清屏,背景蓝色 */
-
- /* 显示APP固件版本。版本号放在中断向量表 */
- {
- char buf[64];
- uint16_t x = 5;
- uint16_t y = 3;
- uint16_t line_cap = 20;
-
- //LCD_DispStr(x, y, "H7-TOOL多功能开发工具", &tFont);
- LCD_DispStr(x, y, "H7-TOOL", &tFont);
- y += line_cap;
-
- sprintf(buf, "App Ver:%d.%02X",
- APP_VERSION >> 8, APP_VERSION & 0xFF);
- LCD_DispStr(x, y, buf, &tFont);
-
- y += line_cap;
- sprintf(buf, "Boot Ver:%d.%02X",
- BOOT_VERSION >> 8, BOOT_VERSION & 0xFF);
- LCD_DispStr(x, y, buf, &tFont);
-
- y += line_cap;
- LCD_DispStr(x, y, "正在配置网络...", &tFont);
- }
-
- ST7789_DrawScreen(); /* 立即刷屏一次 */
-
- bsp_DelayMS(50); /* 刷屏后延迟50ms再开背光, 避免花屏闪一下问题 */
-
- LCD_SetBackLight(BRIGHT_DEFAULT); /* 打开背光 */
-}
-
-/*
-*********************************************************************************************************
-* 函 数 名: DispHeader
-* 功能说明: 显示界面标题(抬头第1行)
-* 形 参: _str : 标题文字
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-void DispHeader(char *_str)
-{
- uint8_t idx;
-
- idx = GetStatusIndex(g_MainStatus);
- DispHeader2(idx, _str);
-}
-
-/* 带序号参数 */
-void DispHeader2(uint8_t _idx, char *_str)
-{
- FONT_T tFont;
- char buf[48];
-
- /* 设置字体参数 */
- {
- tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
- tFont.FrontColor = HEAD_TEXT_COLOR; /* 字体颜色 */
- tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
- tFont.Space = 0; /* 文字间距,单位 = 像素 */
- }
-
- LCD_Fill_Rect(0, 0, HEAD_HEIGHT, HEAD_HEIGHT, HEAD_SN_COLOR); /* 清屏标题序号区 */
- LCD_Fill_Rect(HEAD_HEIGHT, 0, HEAD_HEIGHT, 240 - HEAD_HEIGHT, HEAD_BACK_COLOR); /* 清屏标题栏文本区 */
-
- sprintf(buf, "%02d", _idx);
- tFont.BackColor = HEAD_SN_COLOR; /* 文字背景颜色 */
- LCD_DispStr(4, 4, buf, &tFont);
-
- /* 显示标题文字 */
- tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
- LCD_DispStrEx(HEAD_HEIGHT, 4, _str, &tFont, 240 - HEAD_HEIGHT, ALIGN_CENTER);
-
- LCD_DrawLine(0, HEAD_HEIGHT, 239, HEAD_HEIGHT, HEAD_BODER_COLOR);
-
- LCD_Fill_Rect(0, HEAD_HEIGHT + 1, 240 - HEAD_HEIGHT - 1, 240, FORM_BACK_COLOR); /* 清屏正文区 */
-}
-
-/* 只刷新标题文字部分,不清屏 */
-void DispHeaderStr(char *_str)
-{
- FONT_T tFont;
-
- /* 设置字体参数 */
- {
- tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
- tFont.FrontColor = HEAD_TEXT_COLOR; /* 字体颜色 */
- tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
- tFont.Space = 0; /* 文字间距,单位 = 像素 */
- }
-
- LCD_Fill_Rect(HEAD_HEIGHT, 0, HEAD_HEIGHT, 240 - HEAD_HEIGHT, HEAD_BACK_COLOR); /* 清屏标题栏文本区 */
-
- /* 显示标题文字 */
- tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
- LCD_DispStrEx(HEAD_HEIGHT, 4, _str, &tFont, 240 - HEAD_HEIGHT, ALIGN_CENTER);
-}
-
-/* 显示序号 */
-void DispHeaderSn(uint8_t _idx)
-{
- FONT_T tFont;
- char buf[48];
-
- /* 设置字体参数 */
- {
- tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
- tFont.FrontColor = HEAD_TEXT_COLOR; /* 字体颜色 */
- tFont.BackColor = HEAD_BACK_COLOR; /* 文字背景颜色 */
- tFont.Space = 0; /* 文字间距,单位 = 像素 */
- }
-
- LCD_Fill_Rect(0, 0, HEAD_HEIGHT, HEAD_HEIGHT, HEAD_SN_COLOR); /* 清屏标题序号区 */
-
- sprintf(buf, "%02d", _idx);
- tFont.BackColor = HEAD_SN_COLOR; /* 文字背景颜色 */
- LCD_DispStr(4, 4, buf, &tFont);
-}
-
-/*
-*********************************************************************************************************
-* 函 数 名: DispBox
-* 功能说明: 显示一个圆角矩形框,固定风格。
-* 形 参: _usX : 坐标X
-* _usY : 坐标Y
-* _usHeight : 高度
-* _usWidth : 宽度
-* _usColor : 填充颜色
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-void DispBox(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, uint16_t _usColor)
-{
- /* 绘制边框 */
- LCD_DrawRoundRect(_usX, _usY, _usHeight, _usWidth, B0X_ARC, MEAS_BODER_COLOR);
-
- /* 填充矩形 */
- LCD_FillRoundRect(_usX + 1, _usY + 1, _usHeight - 2, _usWidth - 2, B0X_ARC, _usColor);
-}
-
-/*
-*********************************************************************************************************
-* 函 数 名: DispLabel
-* 功能说明: 显示一个文本标签框
-* 形 参: _usX : 坐标X
-* _usY : 坐标Y
-* _usHeight : 高度
-* _usWidth : 宽度
-* _usColor : 填充颜色
-* _pStr : 显示内容
-* _pFont : 字体
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-void DispLabel(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
- uint16_t _usColor, char *_pStr, FONT_T *_tFont)
-{
- /* 填充矩形 */
- LCD_Fill_Rect(_usX, _usY, _usHeight, _usWidth, _usColor);
- LCD_DispStr(_usX, _usY, _pStr, _tFont);
-}
-
-/*
-*********************************************************************************************************
-* 函 数 名: DispMeasBar
-* 功能说明: 显示测量值
-* 形 参: _ucLine : 行号 0 - 3 (最多4行)
-* _pName : 参数名称
-* _pValue : 测量值
-* _pUnit : 单位
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-void DispMeasBar(uint8_t _ucLine, char *_pName, char *_pValue, char *_pUnit)
-{
- DispMeasBarEx(_ucLine, _pName, _pValue, _pUnit, MEAS_BACK_COLOR);
-}
-
-/*
-*********************************************************************************************************
-* 函 数 名: DispMeasBarEx
-* 功能说明: 显示测量值,带填充颜色参数
-* 形 参: _ucLine : 行号 0 - 3 (最多4行)
-* _pName : 参数名称
-* _pValue : 测量值
-* _pUnit : 单位
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-void DispMeasBarEx(uint8_t _ucLine, char *_pName, char *_pValue, char *_pUnit, uint16_t _usFillColor)
-{
- FONT_T tFont;
- uint16_t x;
- uint16_t y;
-
- /* 设置字体参数 */
- {
- tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
- tFont.FrontColor = MEAS_NAME_COLOR; /* 字体颜色 */
- tFont.BackColor = CL_MASK; /* 文字背景颜色 */
- tFont.Space = 0; /* 文字间距,单位 = 像素 */
- }
-
- x = MEAS_WIN_LEFT;
- y = HEAD_HEIGHT + 9 + _ucLine * (MEAS_WIN_HEIGHT + 9);
-
- DispBox(x, y, MEAS_WIN_HEIGHT, MEAS_WIN_WIDTH, _usFillColor);
-
- /* 参数名字 */
- tFont.FrontColor = MEAS_NAME_COLOR;
- LCD_DispStr(MEAS_WIN_LEFT + 5, y + 4, _pName, &tFont);
-
- /* 测量值 */
- tFont.FrontColor = MEAS_VALUE_COLOR;
- LCD_DispStr(MEAS_WIN_LEFT + 80, y + 4, _pValue, &tFont);
-
- /* 单位 */
- tFont.FrontColor = MEAS_UNIT_COLOR;
- LCD_DispStr(MEAS_WIN_LEFT + 188, y + 4, _pUnit, &tFont);
-}
-
-/*
-*********************************************************************************************************
-* 函 数 名: DispParamBar
-* 功能说明: 显示参数设置 - 系统设置中使用
-* 形 参: _ucLine : 行号 0 - 3 (最多4行)
-* _pName : 参数名称
-* _pValue : 测量值
-* _ucActive : 选中否
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-void DispParamBar(uint8_t _ucLine, char *_pName, char *_pValue, uint8_t _ucActive)
-{
- FONT_T tFont;
- uint16_t x;
- uint16_t y;
- uint16_t NameWidth;
-
- /* 设置字体参数 */
- {
- tFont.FontCode = FC_ST_24; /* 字体代码 16点阵 */
- tFont.FrontColor = MEAS_NAME_COLOR; /* 字体颜色 */
- tFont.BackColor = CL_MASK; /* 文字背景颜色 */
- tFont.Space = 0; /* 文字间距,单位 = 像素 */
- }
-
- x = MEAS_WIN_LEFT;
- y = HEAD_HEIGHT + 9 + _ucLine * (MEAS_WIN_HEIGHT + 3);
-
- /* 绘制圆角矩形 */
- if (_ucActive == 1) /* 选中是用黄色底 */
- {
- DispBox(x, y, MEAS_WIN_HEIGHT, MEAS_WIN_WIDTH, CL_YELLOW);
- }
- else
- {
- DispBox(x, y, MEAS_WIN_HEIGHT, MEAS_WIN_WIDTH, MEAS_BACK_COLOR);
- }
-
- /* 参数名字 */
- tFont.FrontColor = MEAS_NAME_COLOR;
- LCD_DispStr(MEAS_WIN_LEFT + 5, y + 4, _pName, &tFont);
-
- NameWidth = LCD_GetStrWidth(_pName, &tFont);
-
- /* 测量值 */
- tFont.FrontColor = MEAS_VALUE_COLOR;
- LCD_DispStr(MEAS_WIN_LEFT + 5 + NameWidth + 5, y + 4, _pValue, &tFont);
-}
-
-/*
-*********************************************************************************************************
-* 函 数 名: DispProgressBar
-* 功能说明: 显示进度条
-* 形 参: _usX : 坐标
-* _usX : 坐标
-* _usHeight : 高度
-* _usWidth : 宽度
-* _str : 显示文字
-* _Percent : 百分比, 浮点数
-* tFont : 字体
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-extern uint8_t s_DispRefresh;
-static uint16_t s_ProgressBarColor1 = PROGRESS_BACK_COLOR1;
-void ProgressBarSetColor(uint16_t _Color)
-{
- s_ProgressBarColor1 = _Color;
-}
-
-void DispProgressBar(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth,
- char *_str1, float _Percent, char *_str2, FONT_T *_tFont)
-{
- uint16_t width;
- char buf[16];
- uint16_t StrWidth;
- uint16_t StrHeight;
- uint16_t x, y;
-
- if (_Percent > 100)
- {
- _Percent = 100;
- }
-
- width = ((_usWidth - 4) * _Percent) / 100;
-
- /* 填充矩形 */
- LCD_DrawRect(_usX, _usY, _usHeight, _usWidth, PROGRESS_BODER_COLOR);
-
- LCD_Fill_Rect(_usX + 2, _usY + 2, _usHeight - 4, width, s_ProgressBarColor1);
-
- if (_Percent < 100)
- {
- LCD_Fill_Rect(_usX + width + 2, _usY + 2, _usHeight - 4, _usWidth - width - 4, PROGRESS_BACK_COLOR2);
- }
-
- StrHeight = LCD_GetFontHeight(_tFont);
- y = _usY + (_usHeight - StrHeight) / 2;
- if (_str1[0] == 0) /* 只显示显示百分比文字 */
- {
- sprintf(buf, "%0.0f%%", _Percent);
- StrWidth = LCD_GetStrWidth(buf, _tFont);
- x = _usX + (_usWidth - StrWidth) / 2;
- LCD_DispStr(x, y, buf, _tFont);
- }
- else
- {
- /* 显示左侧文本 */
- x = _usX + 4;
- LCD_DispStr(x, y, _str1, _tFont);
-
- /* 显示百分比 */
- sprintf(buf, "%0.0f%%", _Percent);
- StrWidth = LCD_GetStrWidth(buf, _tFont);
- x = _usX + (_usWidth - StrWidth) / 2;
- LCD_DispStr(x, y, buf, _tFont);
-
- /* 显示右侧文本 */
- x = x + 36;
- LCD_DispStr(x, y, _str2, _tFont);
- }
-}
-
-/*
-*********************************************************************************************************
-* 函 数 名: DispHelpBar
-* 功能说明: 显示操作提示
-* 形 参: 无
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-const unsigned char g_ImageHelp[512] = { /* 0X10,0X10,0X00,0X10,0X00,0X10,0X01,0X1B, */
- 0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,0XFF,0XBE,0XFF,0XBE,0XEF,0X9E,0XD7,0X5E,0XCF,0X3F,
- 0XCF,0X1F,0XD7,0X5F,0XE7,0X9F,0XFF,0XDF,0XFF,0XDE,0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,
- 0XF7,0X9E,0XF7,0X9E,0XF7,0XBE,0XEF,0X7E,0XC6,0XFE,0XAE,0XBE,0XA6,0X7E,0X9E,0X7E,
- 0X9E,0X7E,0X9E,0X7E,0XA6,0X7E,0XBE,0XDE,0XE7,0X7E,0XFF,0XBE,0XF7,0X9E,0XF7,0X9E,
- 0XF7,0X9E,0XF7,0XBE,0XE7,0X5E,0XB6,0XBE,0XA6,0X7E,0X9E,0X5E,0X96,0X5E,0X8E,0X1E,
- 0X8E,0X1E,0X96,0X3E,0X96,0X5E,0X9E,0X5E,0XAE,0X9E,0XDF,0X5E,0XFF,0XBE,0XF7,0X9E,
- 0XF7,0XBE,0XEF,0X7E,0XB6,0XBD,0X9E,0X7E,0X96,0X3E,0X96,0X3E,0X8E,0X1E,0XA6,0X7E,
- 0XA6,0X7E,0X8E,0X1D,0X8E,0X1E,0X8E,0X3D,0X96,0X3D,0XA6,0X7D,0XE7,0X7E,0XFF,0XDE,
- 0XFF,0XBE,0XBE,0XDD,0X9E,0X5D,0X96,0X3D,0X8E,0X1D,0X8E,0X1D,0X85,0XFD,0XDF,0X7E,
- 0XE7,0X9F,0X85,0XFD,0X86,0X1D,0X86,0X1D,0X8E,0X1D,0X8E,0X1D,0XB6,0XBD,0XFF,0XDF,
- 0XE7,0X7E,0X96,0X3D,0X8E,0X1D,0X86,0X1D,0X85,0XFD,0X86,0X1D,0X7D,0XFD,0X96,0X3D,
- 0X96,0X3D,0X85,0XFD,0X85,0XFD,0X85,0XFD,0X85,0XFD,0X85,0XFD,0X8E,0X1C,0XE7,0X7E,
- 0XCF,0X1E,0X7D,0XFC,0X85,0XFD,0X85,0XFD,0X7D,0XFD,0X7D,0XFD,0X8E,0X3D,0X96,0X3D,
- 0X8E,0X1D,0X7D,0XFD,0X7D,0XFD,0X7D,0XFD,0X7D,0XDC,0X7D,0XFC,0X75,0XDC,0XC6,0XFE,
- 0XB6,0XBD,0X75,0XBC,0X7D,0XDC,0X7D,0XDC,0X7D,0XFD,0X7D,0XDD,0X8E,0X3D,0XE7,0X7F,
- 0XD7,0X5E,0X75,0XDC,0X7D,0XDC,0X7D,0XDC,0X7D,0XDC,0X7D,0XDC,0X75,0X9C,0XAE,0X9D,
- 0XAE,0X9D,0X75,0X9C,0X7D,0XDC,0X7D,0XDC,0X7D,0XDC,0X7D,0XDC,0X6D,0X9C,0XBE,0XDE,
- 0XDF,0X5E,0X75,0XBC,0X7D,0XDC,0X7D,0XDC,0X75,0XBC,0X75,0XBC,0X6D,0X7B,0XA6,0X7D,
- 0XC6,0XFD,0X75,0X9C,0X7D,0XBC,0X75,0XBC,0X75,0XBC,0X75,0XBC,0X6D,0X9C,0XBE,0XDD,
- 0XD7,0X5E,0X6D,0X9C,0X75,0XBC,0X75,0XBC,0X75,0X9C,0X75,0X9C,0X65,0X7B,0XBE,0XDD,
- 0XE7,0X7E,0X85,0XDC,0X7D,0XBC,0X75,0X9C,0X75,0X9B,0X75,0X9C,0X65,0X7B,0XB6,0XBD,
- 0XD7,0X3E,0X65,0X7B,0X6D,0X9C,0X6D,0X7B,0X6D,0X7B,0X75,0X9B,0X75,0X9B,0XDF,0X5E,
- 0XFF,0XDE,0XAE,0X7C,0X85,0XDB,0X75,0X9B,0X6D,0X7B,0X6D,0X7B,0X5D,0X3B,0XB6,0XBD,
- 0XD7,0X5E,0X5D,0X3B,0X6D,0X7B,0X6D,0X7B,0X6D,0X7B,0X75,0X7B,0X9E,0X3C,0XFF,0XDF,
- 0XFF,0XBE,0XE7,0X5E,0X96,0X1C,0X7D,0XBB,0X75,0X7B,0X65,0X5B,0X75,0X9B,0XCF,0X1D,
- 0XDF,0X7E,0X85,0XDB,0X5D,0X3A,0X6D,0X5B,0X75,0X7B,0X85,0XDB,0XDF,0X5D,0XFF,0XDE,
- 0XF7,0X9E,0XFF,0XBE,0XD7,0X3D,0X95,0XFB,0X75,0X9B,0X6D,0X7B,0X6D,0X5B,0X6D,0X5A,
- 0X65,0X5A,0X6D,0X5A,0X65,0X5A,0X6D,0X5A,0X7D,0XBB,0XCE,0XFD,0XFF,0XDE,0XF7,0X9E,
- 0XF7,0X9E,0XF7,0X9E,0XFF,0XBE,0XDF,0X3D,0X9E,0X1B,0X6D,0X7A,0X5D,0X1A,0X4C,0XFA,
- 0X4C,0XDA,0X4C,0XFA,0X5D,0X3A,0X8D,0XFB,0XDF,0X3D,0XFF,0XBE,0XF7,0X9E,0XF7,0X9E,
- 0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,0XEF,0X5D,0XCE,0XBB,0XA6,0X1A,0X85,0XBA,
- 0X85,0XBA,0X9E,0X1A,0XC6,0XBC,0XEF,0X7D,0XF7,0XBE,0XF7,0X9E,0XF7,0X9E,0XF7,0X9E,
-};
-void DispHelpBar(char *_str1, char *_str2)
-{
- FONT_T tFont; /* 定义字体结构体变量 */
-
- tFont.FontCode = FC_ST_16; /* 字体代码 16点阵 */
- tFont.FrontColor = HELP_TEXT_COLOR; /* 字体颜色 */
- tFont.BackColor = HELP_BACK_COLOR; /* 文字背景颜色 */
- tFont.Space = 0; /* 文字间距,单位 = 像素 */
-
- ST7789_DrawBMP8(1, 240 - 36, 16, 16, (uint8_t *)g_ImageHelp);
-
- LCD_DispStr(20, 240 - 36, _str1, &tFont);
- LCD_DispStr(20, 240 - 18, _str2, &tFont);
-}
-
-/*
-*********************************************************************************************************
-* 函 数 名: DispInfoBar16
-* 功能说明: 显示信息,16点阵.
-* 形 参: _line : 行号
-* _str1 : 参数名
-* _str2 : 参数值
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-void DispInfoBar16(uint8_t _ucLine, char *_pName, char *_pValue)
-{
- DispInfoBar16Ex(_ucLine, _pName, _pValue, INFO_VALUE_COLOR);
-}
-
-/* 带颜色参数 - 用于显示红色超标参数 */
-void DispInfoBar16Ex(uint8_t _ucLine, char *_pName, char *_pValue, uint16_t _ucColor)
-{
- FONT_T tFont;
- uint16_t x;
- uint16_t y;
-
- /* 设置字体参数 */
- {
- tFont.FontCode = FC_ST_16; /* 字体代码 16点阵 */
- tFont.FrontColor = INFO_NAME_COLOR; /* 字体颜色 */
- tFont.BackColor = INFO_BACK_COLOR; /* 文字背景颜色 */
- tFont.Space = 0; /* 文字间距,单位 = 像素 */
- }
-
- x = 5;
- y = HEAD_HEIGHT + 5 + _ucLine * INFO_HEIGHT;
-
- /* 参数名字 */
- tFont.FrontColor = INFO_NAME_COLOR;
- LCD_DispStr(x, y, _pName, &tFont);
-
- x += LCD_GetStrWidth(_pName, &tFont) + 5;
-
- /* 参数值 */
- tFont.FrontColor = _ucColor;
- LCD_DispStr(x, y, _pValue, &tFont);
-}
-
/*
*********************************************************************************************************
* 函 数 名: DSO_StartMode2
@@ -890,31 +437,4 @@ void PlayKeyTone(void)
}
}
-/*
-*********************************************************************************************************
-* 函 数 名: DispMsgBox
-* 功能说明: 显示一个消息框. 字体16点阵
-* 形 参: 无
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-void DispMsgBox(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, char *_str)
-{
- FONT_T tFont;
-
- /* 设置字体参数 */
- {
- tFont.FontCode = FC_ST_16; /* 字体代码 16点阵 */
- tFont.FrontColor = MEAS_NAME_COLOR; /* 字体颜色 */
- tFont.BackColor = CL_MASK; /* 文字背景颜色 */
- tFont.Space = 0; /* 文字间距,单位 = 像素 */
- }
-
- DispBox(_usX, _usY, _usHeight, _usWidth, MEAS_BACK_COLOR);
-
- /* 参数名字 */
- tFont.FrontColor = MEAS_NAME_COLOR;
- LCD_DispStr(_usX + 5, _usY + 4, _str, &tFont);
-}
-
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/app/src/modify_param.c b/User/app/src/modify_param.c
index 20dde7e..895031c 100644
--- a/User/app/src/modify_param.c
+++ b/User/app/src/modify_param.c
@@ -14,12 +14,7 @@
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "fonts.h"
-#include "ui_def.h"
-#include "main.h"
-#include "lcd_menu.h"
-#include "modify_param.h"
+#include "includes.h"
/* 多行文本框 */
#define MEMO_X 5
@@ -63,16 +58,27 @@ const PARAM_LIST_T UartMonParamList[UART_MON_PARAM_COUNT] =
};
/****** 系统设置-基本参数 ******************************************************************************/
-#define SYS_BASE_PARAM_COUNT 16
+#define SYS_BASE_PARAM_COUNT 4
const char *SysBaseParam0[] = {"关闭", "打开"};
const char *SysBaseParam1[] = {"1分钟", "5分钟", "15分钟", "1小时", "关闭"};
const char *SysBaseParam2[] = {"16点阵", "24点阵"};
+const char *SysBaseParam3[] = {"缺省", "单路烧录", "多路烧录", "DAP-Link"};
+
const PARAM_LIST_T SysBaseParamList[SYS_BASE_PARAM_COUNT] =
{
/* 数据类型, 名称 可选列表, 最小值, 最大值, 缺省值 */
{ 0, "按键音: ", SysBaseParam0, 0, 1, 1},
{ 0, "屏保超时: ", SysBaseParam1, 0, 4, 0},
{ 0, "列表字体: ", SysBaseParam2, 0, 1, 0},
+ { 0, "开机启动: ", SysBaseParam3, 0, 3, 0},
+};
+
+/****** 系统设置-IP参数 ******************************************************************************/
+#define NET_PARAM_COUNT 13
+
+const PARAM_LIST_T NetParamList[NET_PARAM_COUNT] =
+{
+ /* 数据类型, 名称 可选列表, 最小值, 最大值, 缺省值 */
{ 0, "RJ45本机IP0: ", 0, 0, 255, 192},
{ 0, "RJ45本机IP1: ", 0, 0, 255, 168},
{ 0, "RJ45本机IP2: ", 0, 0, 255, 1},
@@ -88,17 +94,18 @@ const PARAM_LIST_T SysBaseParamList[SYS_BASE_PARAM_COUNT] =
{ 0, "端口号: ", 0, 1024, 65535, 30010},
};
+
/****** 烧录参数 ******************************************************************************/
#define PROG_PARAM_COUNT 4
const char *ProgParam0[] = {"关闭", "1路", "1-2路", "1-3路", "1-4路"};
-const char *ProgParam1[] = {"缺省", "单路烧录", "多路烧录"};
+//const char *ProgParam1[] = {"缺省", "单路烧录", "多路烧录", "DAP-Link"};
const PARAM_LIST_T ProgParamList[PROG_PARAM_COUNT] =
{
/* 数据类型, 名称 可选列表, 最小值, 最大值, 缺省值 */
{ 0, "多路模式: ", ProgParam0, 0, 4, 4},
{ 0, "工厂代码: ", 0, 0, 999, 0},
{ 0, "烧录器编号: ", 0, 0, 999, 0},
- { 0, "开机启动: ", ProgParam1, 0, 2, 0},
+ { 0, "开机启动: ", SysBaseParam3, 0, 3, 0},
};
/*
@@ -307,21 +314,26 @@ void ModifyParam(uint16_t _MainStatus)
*/
void UartMonInitParam(uint16_t _MainStatus)
{
- if (_MainStatus == MS_MONITOR_UART)
+ if (_MainStatus == MODIFY_PARAM_UART_MON)
{
s_pParamList = UartMonParamList;
s_ParamCount = UART_MON_PARAM_COUNT;
}
- else if (_MainStatus == MS_SYSTEM_SET)
+ else if (_MainStatus == MODIFY_PARAM_SYSTEM)
{
s_pParamList = SysBaseParamList;
s_ParamCount = SYS_BASE_PARAM_COUNT;
}
- else if (_MainStatus == MS_PROG_MODIFY_PARAM)
+ else if (_MainStatus == MODIFY_PARAM_PROG)
{
s_pParamList = ProgParamList;
s_ParamCount = PROG_PARAM_COUNT;
}
+ else if (_MainStatus == MODIFY_PARAM_NET)
+ {
+ s_pParamList = NetParamList;
+ s_ParamCount = NET_PARAM_COUNT;
+ }
}
/*
@@ -351,20 +363,24 @@ static int32_t MonDispReadParam(uint8_t _index)
if (_index == 0) value = g_tParam.KeyToneEnable;
else if (_index == 1) value = g_tParam.LcdSleepTime;
else if (_index == 2) value = g_tParam.FileListFont24;
- else if (_index == 3) value = g_tParam.LocalIPAddr[0];
- else if (_index == 4) value = g_tParam.LocalIPAddr[1];
- else if (_index == 5) value = g_tParam.LocalIPAddr[2];
- else if (_index == 6) value = g_tParam.LocalIPAddr[3];
- else if (_index == 7) value = g_tParam.Gateway[0];
- else if (_index == 8) value = g_tParam.Gateway[1];
- else if (_index == 9) value = g_tParam.Gateway[2];
- else if (_index == 10) value = g_tParam.Gateway[3];
- else if (_index == 11) value = g_tParam.NetMask[0];
- else if (_index == 12) value = g_tParam.NetMask[1];
- else if (_index == 13) value = g_tParam.NetMask[2];
- else if (_index == 14) value = g_tParam.NetMask[3];
- else if (_index == 15) value = g_tParam.LocalTCPPort;
+ else if (_index == 3) value = g_tParam.StartRun;
}
+ else if (s_pParamList == NetParamList)
+ {
+ if (_index == 0) value = g_tParam.LocalIPAddr[0];
+ else if (_index == 1) value = g_tParam.LocalIPAddr[1];
+ else if (_index == 2) value = g_tParam.LocalIPAddr[2];
+ else if (_index == 3) value = g_tParam.LocalIPAddr[3];
+ else if (_index == 4) value = g_tParam.Gateway[0];
+ else if (_index == 5) value = g_tParam.Gateway[1];
+ else if (_index == 6) value = g_tParam.Gateway[2];
+ else if (_index == 7) value = g_tParam.Gateway[3];
+ else if (_index == 8) value = g_tParam.NetMask[0];
+ else if (_index == 9) value = g_tParam.NetMask[1];
+ else if (_index == 10) value = g_tParam.NetMask[2];
+ else if (_index == 11) value = g_tParam.NetMask[3];
+ else if (_index == 12) value = g_tParam.LocalTCPPort;
+ }
else if (s_pParamList == ProgParamList)
{
if (_index == 0) value = g_tParam.MultiProgMode;
@@ -401,20 +417,24 @@ static void MonDispWriteParam(uint8_t _index, int32_t _value)
if (_index == 0) g_tParam.KeyToneEnable = _value;
else if (_index == 1) g_tParam.LcdSleepTime = _value;
else if (_index == 2) g_tParam.FileListFont24 = _value;
- else if (_index == 3) g_tParam.LocalIPAddr[0] = _value;
- else if (_index == 4) g_tParam.LocalIPAddr[1] = _value;
- else if (_index == 5) g_tParam.LocalIPAddr[2] = _value;
- else if (_index == 6) g_tParam.LocalIPAddr[3] = _value;
- else if (_index == 7) g_tParam.Gateway[0] = _value;
- else if (_index == 8) g_tParam.Gateway[1] = _value;
- else if (_index == 9) g_tParam.Gateway[2] = _value;
- else if (_index == 10) g_tParam.Gateway[3] = _value;
- else if (_index == 11) g_tParam.NetMask[0] = _value;
- else if (_index == 12) g_tParam.NetMask[1] = _value;
- else if (_index == 13) g_tParam.NetMask[2] = _value;
- else if (_index == 14) g_tParam.NetMask[3] = _value;
- else if (_index == 15) g_tParam.LocalTCPPort = _value;
+ else if (_index == 3) g_tParam.StartRun = _value;
}
+ else if (s_pParamList == NetParamList)
+ {
+ if (_index == 0) g_tParam.LocalIPAddr[0] = _value;
+ else if (_index == 1) g_tParam.LocalIPAddr[1] = _value;
+ else if (_index == 2) g_tParam.LocalIPAddr[2] = _value;
+ else if (_index == 3) g_tParam.LocalIPAddr[3] = _value;
+ else if (_index == 4) g_tParam.Gateway[0] = _value;
+ else if (_index == 5) g_tParam.Gateway[1] = _value;
+ else if (_index == 6) g_tParam.Gateway[2] = _value;
+ else if (_index == 7) g_tParam.Gateway[3] = _value;
+ else if (_index == 8) g_tParam.NetMask[0] = _value;
+ else if (_index == 9) g_tParam.NetMask[1] = _value;
+ else if (_index == 10) g_tParam.NetMask[2] = _value;
+ else if (_index == 11) g_tParam.NetMask[3] = _value;
+ else if (_index == 12) g_tParam.LocalTCPPort = _value;
+ }
else if (s_pParamList == ProgParamList)
{
if (_index == 0) g_tParam.MultiProgMode = _value;
diff --git a/User/app/src/param.c b/User/app/src/param.c
index f6e0853..5a4e82c 100755
--- a/User/app/src/param.c
+++ b/User/app/src/param.c
@@ -14,9 +14,7 @@
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "param.h"
-#include "modbus_reg_addr.h"
+#include "includes.h"
PARAM_T g_tParam; /* 基本参数 */
CALIB_T g_tCalib; /* 校准参数 */
@@ -59,6 +57,18 @@ void LoadParam(void)
g_tVar.MACaddr[5] = g_tVar.CPU_Sn[0] >> 0;
LoadCalibParam();
+
+ /* 固件升级新增参数的处理 */
+ {
+ if (g_tParam.DAP_TVCCVolt > 50)
+ {
+ g_tParam.DAP_TVCCVolt = 0;
+ g_tParam.DAP_BeepEn = 1;
+ bsp_GenRNG(&g_tParam.DAP_Sn, 1);
+
+ SaveParam();
+ }
+ }
}
/*
@@ -154,6 +164,10 @@ void InitBaseParam(void)
g_tParam.ToolSn = 1; /* 烧录器编号 */
g_tParam.StartRun = 0; /* 开机启动 */
+
+ g_tParam.DAP_TVCCVolt = 0;
+ g_tParam.DAP_BeepEn = 1;
+ bsp_GenRNG(&g_tParam.DAP_Sn, 1);
SaveParam();
}
diff --git a/User/app/src/status_can_monitor.c b/User/app/src/status_can_monitor.c
index 4b9f34f..2afb618 100644
--- a/User/app/src/status_can_monitor.c
+++ b/User/app/src/status_can_monitor.c
@@ -14,13 +14,7 @@
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
-#include "lcd_menu.h"
-#include "file_lib.h"
-#include "lua_if.h"
-#include "prog_if.h"
-#include "modify_param.h"
+#include "includes.h"
/* 多行文本框 */
#define MEMO_X 0
@@ -213,7 +207,7 @@ void status_MonitorCan(void)
case KEY_LONG_DOWN_S: /* S键 长按 */
LCD_SetEncode(ENCODE_UTF8);
- ModifyParam(MS_MONITOR_UART); /* 参数修改界面,阻塞 */
+ ModifyParam(MODIFY_PARAM_UART_MON); /* 参数修改界面,阻塞 */
LCD_SetEncode(ENCODE_GBK);
fRefresh = 1;
fInit = 1;
diff --git a/User/app/src/status_current_meter.c b/User/app/src/status_current_meter.c
index 5a47220..c9e863f 100755
--- a/User/app/src/status_current_meter.c
+++ b/User/app/src/status_current_meter.c
@@ -14,8 +14,7 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
static void DispCurrentVolt(void);
static void AutoCurrentRange(void);
diff --git a/User/app/src/status_ds18b20_meter.c b/User/app/src/status_ds18b20_meter.c
new file mode 100644
index 0000000..697310e
--- /dev/null
+++ b/User/app/src/status_ds18b20_meter.c
@@ -0,0 +1,210 @@
+/*
+*********************************************************************************************************
+*
+* 模块名称 : DS18B20温度传感器监视
+* 文件名称 : status_ds18b20_meter.c
+* 版 本 : V1.0
+* 说 明 : 显示8路DS18B20温度值
+* 修改记录 :
+* 版本号 日期 作者 说明
+* V1.0 2020-11-29 armfly 正式发布
+*
+* Copyright (C), 2019-2030, 安富莱电子 www.armfly.com
+*
+*********************************************************************************************************
+*/
+#include "includes.h"
+
+static void DispDS18B20(void);
+
+static float TemperatureMin[8];
+static float TemperatureMax[8];
+
+/*
+*********************************************************************************************************
+* 函 数 名: status_DS18B20Meter
+* 功能说明: DS18B20温度表状态.
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void status_DS18B20Meter(void)
+{
+ uint8_t ucKeyCode; /* 按键代码 */
+ uint8_t fRefresh;
+
+ DispHeader("DS18B20温度表");
+// DispHelpBar("D0-D7可接8个DS18B20",
+// "");
+
+ fRefresh = 1;
+
+ {
+ uint8_t i;
+
+ for (i = 0; i < 8; i++)
+ {
+ TemperatureMin[i] = 125;
+ TemperatureMax[i] = -60;
+ }
+ }
+
+ bsp_StartAutoTimer(0, 300);
+ while (g_MainStatus == MS_DS18B20_METER)
+ {
+ if (fRefresh) /* 刷新整个界面 */
+ {
+ fRefresh = 0;
+
+ DispDS18B20();
+ }
+
+ bsp_Idle();
+
+ if (bsp_CheckTimer(0))
+ {
+ fRefresh = 1;
+ }
+
+ ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
+ if (ucKeyCode != KEY_NONE)
+ {
+ /* 有键按下 */
+ switch (ucKeyCode)
+ {
+ case KEY_DOWN_S: /* S键按下 */
+ break;
+
+ case KEY_UP_S: /* S键释放 */
+ ;
+ break;
+
+ case KEY_LONG_DOWN_S: /* S键长按 */
+ break;
+
+ case KEY_DOWN_C: /* C键按下 */
+ break;
+
+ case KEY_UP_C: /* C键释放 */
+ ;
+ break;
+
+ case KEY_LONG_DOWN_C: /* C键长按 */
+ PlayKeyTone();
+ g_MainStatus = MS_EXTEND_MENU_REC;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ bsp_StopTimer(0);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DispDS18B20
+* 功能说明: 显示8通道DS18B20数据
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+#define LABLE_X 5
+static void DispDS18B20(void)
+{
+ /*
+ BackColor = RGB(255, 236, 245);
+ BackColor = RGB(150, 240, 40);
+ BackColor = RGB(255, 255, 136);
+ BackColor = RGB(239, 223, 255);
+ BackColor = RGB(119, 253, 213);
+ */
+ FONT_T tFont16, tFont24;
+ char buf[32];
+ uint16_t x, y, h, w;
+ uint8_t i;
+ uint8_t SensorOk[8];
+ float Temperature[8];
+
+ for (i = 0; i < 8; i++)
+ {
+ if (DS18B20_ReadTemp(i, &Temperature[i]) == 1)
+ {
+ SensorOk[i] = 1;
+
+ /* DS18B20第1次读出数据可能是 85.0 */
+ if ((uint16_t)(Temperature[i] * 10) != 850)
+ {
+ if (Temperature[i] < TemperatureMin[i])
+ {
+ TemperatureMin[i] = Temperature[i];
+ }
+
+ if (Temperature[i] > TemperatureMax[i])
+ {
+ TemperatureMax[i] = Temperature[i];
+ }
+ }
+ }
+ else
+ {
+ SensorOk[i] = 0;
+ }
+ }
+
+ /* 设置字体参数 */
+ {
+ tFont16.FontCode = FC_ST_16; /* 字体代码 16点阵 */
+ tFont16.FrontColor = RGB(120,120,120); /* 字体颜色 */
+ tFont16.BackColor = CL_MASK; /* 文字背景 - 透明 */
+ tFont16.Space = 0; /* 文字间距,单位 = 像素 */
+
+ tFont24.FontCode = FC_ST_24; /* 字体代码 16点阵 */
+ tFont24.FrontColor = RGB(50,50,50); /* 字体颜色 */
+ tFont24.BackColor = CL_MASK; /* 文字背景 - 透明 */
+ tFont24.Space = 0; /* 文字间距,单位 = 像素 */
+ }
+
+ x = LABLE_X;
+ y = 36;
+ h = 24 + 1;
+ w = 200;
+ for (i = 0; i < 8; i++)
+ {
+ /* 显示数字编号 */
+ sprintf(buf, "%d", i);
+ w = 24;
+ DispLabelRound(x, y, h, w, RGB(150, 240, 40), buf, &tFont24);
+
+ /* 显示实时温度值 */
+ if (SensorOk[i] == 0)
+ {
+ sprintf(buf, "----");
+ }
+ else
+ {
+ /* -40.0℃ */
+ sprintf(buf, "%0.1f℃", Temperature[i]);
+ }
+ w = 100;
+ DispLabelRound(x + 24 + 5, y, h, w, RGB(255, 236, 245), buf, &tFont24);
+
+ /* 显示温度最大最小值 */
+ if (SensorOk[i] == 0)
+ {
+ sprintf(buf, "----");
+ }
+ else
+ {
+ /* -40.0℃ */
+ sprintf(buf, "%0.1f, %0.1f", TemperatureMin[i],TemperatureMax[i]);
+ }
+ w = 100;
+ DispLabelRound(x + 24 + 8 + 100, y, h, w, RGB(255, 255, 136), buf, &tFont16);
+
+ y += h;
+ }
+}
+
+/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/app/src/status_extend_menu.c b/User/app/src/status_extend_menu.c
index f48a422..77718dc 100644
--- a/User/app/src/status_extend_menu.c
+++ b/User/app/src/status_extend_menu.c
@@ -13,19 +13,20 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
#include "lcd_menu.h"
#include "SW_DP_Multi.h"
#include "modify_param.h"
+#include "usb_if.h"
const uint8_t *g_Menu1_Text[] =
{
- " 1 脱机烧录器(单路)",
- " 2 脱机烧录器(多路)",
- " 3 LUA小程序",
- " 4 数据监视器",
- " 5 系统设置",
+ " 1 CMSIS-DAP仿真器",
+ " 2 脱机烧录器(单路)",
+ " 3 脱机烧录器(多路)",
+ " 4 LUA小程序",
+ " 5 数据监视器",
+ " 6 系统设置",
/* 结束符号, 用于菜单函数自动识别菜单项个数 */
"&"
@@ -36,7 +37,7 @@ MENU_T g_tMenu1;
const uint8_t *g_MenuRec_Text[] =
{
"1 串口(TTL 485 232)",
- "2 CAN总线(预留)",
+ "2 DS18B20温度表",
/* 结束符号, 用于菜单函数自动识别菜单项个数 */
"&"
@@ -44,6 +45,8 @@ const uint8_t *g_MenuRec_Text[] =
MENU_T g_tMenuRec;
+void JumpToDAPLink(void);
+
/*
*********************************************************************************************************
* 函 数 名: status_ExtendMenu1
@@ -109,27 +112,32 @@ void status_ExtendMenu1(void)
case KEY_LONG_DOWN_S: /* S键 上 */
if (g_tMenu1.Cursor == 0)
+ {
+ /* 跳转到DAP固件 */
+ JumpToDAPLink();
+ }
+ else if (g_tMenu1.Cursor == 1)
{
g_gMulSwd.MultiMode = 0;
g_MainStatus = MS_PROG_WORK;
}
- else if (g_tMenu1.Cursor == 1)
+ else if (g_tMenu1.Cursor == 2)
{
g_gMulSwd.MultiMode = g_tParam.MultiProgMode;
g_MainStatus = MS_PROG_WORK;
}
- else if (g_tMenu1.Cursor == 2)
+ else if (g_tMenu1.Cursor == 3)
{
g_MainStatus = MS_LUA_SELECT_FILE;
}
- else if (g_tMenu1.Cursor == 3)
+ else if (g_tMenu1.Cursor == 4)
{
g_MainStatus = MS_EXTEND_MENU_REC;
}
- else if (g_tMenu1.Cursor == 4)
+ else if (g_tMenu1.Cursor == 5)
{
g_MainStatus = MS_SYSTEM_SET;
- }
+ }
break;
case KEY_UP_C: /* C键 下 */
@@ -222,7 +230,7 @@ void status_ExtendMenuRec(void)
}
else if (g_tMenuRec.Cursor == 1)
{
- g_MainStatus = MS_MONITOR_CAN;
+ g_MainStatus = MS_DS18B20_METER;
}
else if (g_tMenuRec.Cursor == 2)
{
@@ -251,4 +259,75 @@ void status_ExtendMenuRec(void)
}
}
+/*
+*********************************************************************************************************
+* 函 数 名: JumpToDAPLink
+* 功能说明: 跳转固件,去执行daplink固件
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void JumpToDAPLink(void)
+{
+ uint8_t i;
+ __IO uint32_t AppAddr = 0x08100000; /* APP 地址 */
+ void (*AppJump)(void); /* 声明一个函数指针 */
+
+ usbd_UnInit();
+
+ /* 关闭全局中断 */
+ DISABLE_INT();
+
+ /* 关闭所有的外设 */
+ bsp_DeInit();
+
+ /* 设置所有时钟到默认状态,使用HSI时钟 */
+ HAL_RCC_DeInit();
+
+ /* 关闭UART外设 */
+ {
+ USART1->CR1 &= ~USART_CR1_UE;
+ USART2->CR1 &= ~USART_CR1_UE;
+ USART3->CR1 &= ~USART_CR1_UE;
+ UART4->CR1 &= ~USART_CR1_UE;
+ UART5->CR1 &= ~USART_CR1_UE;
+ USART6->CR1 &= ~USART_CR1_UE;
+ UART7->CR1 &= ~USART_CR1_UE;
+ UART8->CR1 &= ~USART_CR1_UE;
+ }
+
+ /* 关闭滴答定时器,复位到默认值 */
+ SysTick->CTRL = 0;
+ SysTick->LOAD = 0;
+ SysTick->VAL = 0;
+
+ /* 关闭所有中断,清除所有中断挂起标志 */
+ for (i = 0; i < 8; i++)
+ {
+ NVIC->ICER[i]=0xFFFFFFFF;
+ NVIC->ICPR[i]=0xFFFFFFFF;
+ }
+
+ /* 使能全局中断 */
+ ENABLE_INT();
+
+ /* 跳转到应用程序,首地址是MSP,地址+4是复位中断服务程序地址 */
+ AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));
+
+ /* 设置主堆栈指针 */
+ __set_MSP(*(uint32_t *)AppAddr);
+
+ /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
+ __set_CONTROL(0);
+
+ /* 跳转到系统BootLoader */
+ AppJump();
+
+ /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
+ while (1)
+ {
+
+ }
+}
+
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/app/src/status_link_mode.c b/User/app/src/status_link_mode.c
index c996114..348f9a2 100755
--- a/User/app/src/status_link_mode.c
+++ b/User/app/src/status_link_mode.c
@@ -13,8 +13,7 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
#include "usbd_user.h"
#define DATE_X 5
diff --git a/User/app/src/status_lua.c b/User/app/src/status_lua.c
index 14ae2e7..042e7c0 100644
--- a/User/app/src/status_lua.c
+++ b/User/app/src/status_lua.c
@@ -13,8 +13,7 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
#include "lcd_menu.h"
#include "file_lib.h"
#include "lua_if.h"
diff --git a/User/app/src/status_mini_dso.c b/User/app/src/status_mini_dso.c
index 7b58af1..3635806 100644
--- a/User/app/src/status_mini_dso.c
+++ b/User/app/src/status_mini_dso.c
@@ -13,9 +13,7 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
-#include "lcd_menu.h"
+#include "includes.h"
/*
*********************************************************************************************************
diff --git a/User/app/src/status_pluse_meter.c b/User/app/src/status_pluse_meter.c
index b450b7a..4783686 100644
--- a/User/app/src/status_pluse_meter.c
+++ b/User/app/src/status_pluse_meter.c
@@ -13,8 +13,7 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
static void DispPulse(void);
diff --git a/User/app/src/status_programmer.c b/User/app/src/status_programmer.c
index f56a142..3af2649 100755
--- a/User/app/src/status_programmer.c
+++ b/User/app/src/status_programmer.c
@@ -13,14 +13,9 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
-#include "file_lib.h"
-#include "lua_if.h"
-#include "prog_if.h"
-#include "lcd_menu.h"
+#include "includes.h"
+
#include "SW_DP_Multi.h"
-#include "modify_param.h"
/* 三个按钮 */
#define BTN1_X (240 - BTN1_W - 5)
@@ -98,6 +93,7 @@ static void DispProgCounter(void);
extern void sysTickInit(void);
extern uint8_t swd_init_debug(void);
extern uint8_t swd_read_idcode(uint32_t *id);
+extern uint8_t swd_init(void);
/*
*********************************************************************************************************
@@ -282,6 +278,18 @@ void status_ProgWork(void)
// }
// }
+ /* V1.36 解决第一次上电第1次烧录失败问题 */
+ {
+ if (g_gMulSwd.MultiMode == 0)
+ {
+ MUL_PORT_SWD_SETUP();
+ }
+ else
+ {
+ swd_init();
+ }
+ }
+
g_tProg.AutoStart = 0;
fRefresh = 1;
while (g_MainStatus == MS_PROG_WORK)
@@ -931,7 +939,7 @@ void status_ProgSetting(void)
{
//g_MainStatus = MS_PROG_MODIFY_PARAM);;
- ModifyParam(MS_PROG_MODIFY_PARAM);
+ ModifyParam(MODIFY_PARAM_PROG);
LCD_DispMenu(&g_tMenuProg1);
/* 通知lua程序,多路编程参数变化 */
lua_do("MULTI_MODE = pg_read_c_var(\"MultiProgMode\")");
diff --git a/User/app/src/status_resistor_meter.c b/User/app/src/status_resistor_meter.c
index 71b8c13..df0f938 100755
--- a/User/app/src/status_resistor_meter.c
+++ b/User/app/src/status_resistor_meter.c
@@ -13,8 +13,7 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
static void DispResistor(void);
diff --git a/User/app/src/status_system_set.c b/User/app/src/status_system_set.c
index 12616b4..050cdbe 100755
--- a/User/app/src/status_system_set.c
+++ b/User/app/src/status_system_set.c
@@ -13,24 +13,17 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
-
-#include "status_system_set.h"
-#include "lcd_menu.h"
-#include "wifi_if.h"
-#include "usb_if.h"
-#include "file_lib.h"
-#include "modify_param.h"
+#include "includes.h"
const uint8_t *g_MenuSys_Text[] =
{
- " 1 硬件信息",
- " 2 参数设置",
+ " 1 基本参数",
+ " 2 网络参数",
" 3 ESP32固件升级",
" 4 USB eMMC磁盘",
" 5 数据维护",
- " 6 重启",
+ " 6 硬件信息",
+ " 7 重启",
/* 结束符号, 用于菜单函数自动识别菜单项个数 */
"&"
};
@@ -109,15 +102,16 @@ void status_SystemSetMain(void)
case KEY_LONG_DOWN_S: /* S键 上 */
PlayKeyTone();
s_enter_sub_menu = 1;
-
+
if (g_tMenuSys.Cursor == 0)
{
- g_MainStatus = MS_HARD_INFO;
+ ModifyParam(MODIFY_PARAM_SYSTEM);
+ DispHeader2(90, "系统设置"); /* 需要清屏 */
+ LCD_DispMenu(&g_tMenuSys);
}
else if (g_tMenuSys.Cursor == 1)
{
- //g_MainStatus = MS_MODIFY_PARAM;
- ModifyParam(MS_SYSTEM_SET);
+ ModifyParam(MODIFY_PARAM_NET);
DispHeader2(90, "系统设置"); /* 需要清屏 */
LCD_DispMenu(&g_tMenuSys);
}
@@ -133,7 +127,11 @@ void status_SystemSetMain(void)
{
g_MainStatus = MS_FILE_MANAGE;
}
- else if (g_tMenuSys.Cursor == 5) /* 重启 */
+ else if (g_tMenuSys.Cursor == 5)
+ {
+ g_MainStatus = MS_HARD_INFO;
+ }
+ else if (g_tMenuSys.Cursor == 6) /* 重启 */
{
ResetReq = 1;
}
@@ -379,250 +377,6 @@ void status_HardInfo(void)
}
}
-/*
-*********************************************************************************************************
-* 函 数 名: status_ModifyParam
-* 功能说明: 修改常用参数
-* 形 参: 无
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-#define PARAM_NUM 4
-void status_ModifyParam(void)
-{
- uint8_t ucKeyCode; /* 按键代码 */
- uint8_t fRefresh = 1;
- uint8_t fSaveParam = 0;
- uint8_t cursor = 0;
- char buf[48];
- uint8_t ucIgnoreKey = 1;
- uint8_t active;
-
- DispHeader2(92, "参数设置");
- DispHelpBar("长按S键选择参数",
- "短按S、C键修改参数值");
-
- while (g_MainStatus == MS_MODIFY_PARAM)
- {
- bsp_Idle();
-
- if (fRefresh == 1)
- {
- fRefresh = 0;
-
- /* 第1个参数 */
- {
- if (cursor == 0)
- {
- active = 1;
- }
- else
- {
- active = 0;
- }
- if (g_tParam.KeyToneEnable == 0)
- {
- sprintf(buf, "关闭");
- DispParamBar(0, "1 按键音:", buf, active);
- }
- else
- {
- sprintf(buf, "打开");
- DispParamBar(0, "1 按键音:", buf, active);
- }
- }
-
- /* 第2个参数 - 界面风格 */
- {
- if (cursor == 1)
- {
- active = 1;
- }
- else
- {
- active = 0;
- }
- sprintf(buf, "%3d", g_tParam.UIStyle);
- DispParamBar(1, "2 主 题:", buf, active);
- }
-
- /* 第3个参数 - 屏保 */
- {
- uint16_t min;
-
- if (cursor == 2)
- {
- active = 1;
- }
- else
- {
- active = 0;
- }
-
- min = GetSleepTimeMinute();
- if (min == 0)
- {
- sprintf(buf, "关闭");
- }
- else
- {
- sprintf(buf, "%3d 分钟", min);
- }
- DispParamBar(2, "3 屏 保:", buf, active);
- }
-
- /* 第3个参数 - 文件列表字体 */
- {
- if (cursor == 3)
- {
- active = 1;
- }
- else
- {
- active = 0;
- }
-
- if (g_tParam.FileListFont24 == 1)
- {
- sprintf(buf, "24点阵");
- }
- else
- {
- sprintf(buf, "16点阵");
- }
- DispParamBar(3, "4 列表字体:", buf, active);
- }
- }
-
- ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
- if (ucKeyCode != KEY_NONE)
- {
- /* 有键按下 */
- switch (ucKeyCode)
- {
- case KEY_UP_S: /* S键 弹起 */
- if (ucIgnoreKey == 1)
- {
- ucIgnoreKey = 0;
- break;
- }
-
- if (cursor == 0)
- {
- if (g_tParam.KeyToneEnable == 0)
- {
- g_tParam.KeyToneEnable = 1;
- }
- else
- {
- g_tParam.KeyToneEnable = 0;
- }
- }
- else if (cursor == 1)
- {
- g_tParam.UIStyle++;
- if (g_tParam.UIStyle >= UI_STYLE_NUM)
- {
- g_tParam.UIStyle = 0;
- }
- }
- else if (cursor == 2)
- {
- if (g_tParam.LcdSleepTime > 0)
- {
- g_tParam.LcdSleepTime--;
- }
- else
- {
- g_tParam.LcdSleepTime = 4;
- }
- }
- else if (cursor == 3)
- {
- if (g_tParam.FileListFont24 == 0)
- {
- g_tParam.FileListFont24 = 1;
- }
- else
- {
- g_tParam.FileListFont24 = 0;
- }
- }
- fRefresh = 1;
- fSaveParam = 1;
- break;
-
- case KEY_UP_C: /* C键 下 */
- if (cursor == 0)
- {
- if (g_tParam.KeyToneEnable == 0)
- {
- g_tParam.KeyToneEnable = 1;
- }
- else
- {
- g_tParam.KeyToneEnable = 0;
- }
- }
- else if (cursor == 1)
- {
- if (g_tParam.UIStyle > 0)
- {
- g_tParam.UIStyle--;
- }
- else
- {
- g_tParam.UIStyle = UI_STYLE_NUM;
- }
- }
- else if (cursor == 2)
- {
- if (++g_tParam.LcdSleepTime > 4)
- {
- g_tParam.LcdSleepTime = 0;
- }
- }
- else if (cursor == 3)
- {
- if (g_tParam.FileListFont24 == 0)
- {
- g_tParam.FileListFont24 = 1;
- }
- else
- {
- g_tParam.FileListFont24 = 0;
- }
- }
- fRefresh = 1;
- fSaveParam = 1;
- break;
-
- case KEY_LONG_DOWN_S: /* S键长按 - 选择参数 */
- if (++cursor >= PARAM_NUM)
- {
- cursor = 0;
- }
- ucIgnoreKey = 1;
- fRefresh = 1;
- break;
-
- case KEY_LONG_DOWN_C: /* C键长按 - 返回 */
- PlayKeyTone();
- g_MainStatus = MS_SYSTEM_SET;
- break;
-
- default:
- break;
- }
- }
- }
-
- if (fSaveParam == 1)
- {
- SaveParam(); /* 保存参数 */
- }
-}
-
/*
*********************************************************************************************************
* 函 数 名: status_ESP32Test
diff --git a/User/app/src/status_temp_meter.c b/User/app/src/status_temp_meter.c
index d36e370..2c5b61d 100755
--- a/User/app/src/status_temp_meter.c
+++ b/User/app/src/status_temp_meter.c
@@ -13,8 +13,7 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
static void DispTemp(void);
diff --git a/User/app/src/status_tvcc_power.c b/User/app/src/status_tvcc_power.c
index 751d39a..9da0276 100644
--- a/User/app/src/status_tvcc_power.c
+++ b/User/app/src/status_tvcc_power.c
@@ -13,8 +13,7 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
static void DispTVccVoltCurr(void);
static void DispTVccSetting(uint16_t _volt, uint8_t _mode);
diff --git a/User/app/src/status_uart_monitor.c b/User/app/src/status_uart_monitor.c
index f7970f7..f8a0d51 100644
--- a/User/app/src/status_uart_monitor.c
+++ b/User/app/src/status_uart_monitor.c
@@ -13,13 +13,8 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
-#include "lcd_menu.h"
-#include "file_lib.h"
-#include "lua_if.h"
-#include "prog_if.h"
-#include "modify_param.h"
+#include "includes.h"
+
/* 多行文本框 */
#define TITLE_X 0
@@ -183,6 +178,10 @@ void UartReciveNew2(uint8_t _byte)
if (g_tParam.UartMonHex == 0) /* ASCII格式显示 */
{
+ if (_byte < ' ')
+ {
+ _byte = ' '; /* 不可见字符转换为空格 */
+ }
LCD_MemoAddChar(&g_RecMemo, _byte);
}
else /* HEX格式显示 */
@@ -396,7 +395,7 @@ void status_MonitorUart(void)
else if (g_tMenuUart.Cursor == 3) /* 设置串口参数 */
{
LCD_SetEncode(ENCODE_UTF8);
- ModifyParam(MS_MONITOR_UART); /* 参数修改界面,阻塞 */
+ ModifyParam(MODIFY_PARAM_UART_MON); /* 参数修改界面,阻塞 */
LCD_SetEncode(ENCODE_GBK);
fInit = 1;
}
diff --git a/User/app/src/status_voltage_meter.c b/User/app/src/status_voltage_meter.c
index 5450082..90519ba 100755
--- a/User/app/src/status_voltage_meter.c
+++ b/User/app/src/status_voltage_meter.c
@@ -13,8 +13,7 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "main.h"
+#include "includes.h"
static void DispCH1CH2(void);
static void AutoVoltRange(void);
diff --git a/User/app/src/wifi_if.c b/User/app/src/wifi_if.c
index c7bec00..3166700 100755
--- a/User/app/src/wifi_if.c
+++ b/User/app/src/wifi_if.c
@@ -14,10 +14,7 @@
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "wifi_if.h"
-#include "param.h"
-#include "main.h"
+#include "includes.h"
uint8_t link_id = 0xFF; /* 当前的TCP连接id, 0-4有效。 FF表示无TCP连接 */
uint8_t wifi_state = WIFI_STOP;
diff --git a/User/bsp/bsp.c b/User/bsp/bsp.c
index 68ca563..42ebabe 100755
--- a/User/bsp/bsp.c
+++ b/User/bsp/bsp.c
@@ -100,6 +100,20 @@ void bsp_Init(void)
bsp_InitRNG(); /* 配置启用随机数模块 */
}
+
+/*
+*********************************************************************************************************
+* 函 数 名: bsp_DeInit
+* 功能说明: 禁能所有的硬件设备
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void bsp_DeInit(void)
+{
+ bsp_DeInitUart();
+}
+
/*
*********************************************************************************************************
* 函 数 名: SystemClock_Config
diff --git a/User/bsp/bsp.h b/User/bsp/bsp.h
index 66237ba..a9600b2 100755
--- a/User/bsp/bsp.h
+++ b/User/bsp/bsp.h
@@ -99,6 +99,7 @@
#include "bsp_ext_io.h"
#include "bsp_rng.h"
+#include "bsp_ds18b20.h"
@@ -108,6 +109,7 @@
/* 提供给其他C文件调用的函数 */
void bsp_Init(void);
+void bsp_DeInit(void);
void bsp_Idle(void);
void bsp_GetCpuID(uint32_t *_id);
diff --git a/User/bsp/inc/bsp_cpu_rtc.h b/User/bsp/inc/bsp_cpu_rtc.h
index 9eb806d..fea369c 100755
--- a/User/bsp/inc/bsp_cpu_rtc.h
+++ b/User/bsp/inc/bsp_cpu_rtc.h
@@ -33,6 +33,8 @@ void bsp_InitRTC(void);
uint8_t RTC_WriteClock(uint16_t _year, uint8_t _mon, uint8_t _day, uint8_t _hour, uint8_t _min, uint8_t _sec);
void RTC_ReadClock(void);
uint8_t RTC_CalcWeek(uint16_t _year, uint8_t _mon, uint8_t _day);
+uint32_t RTC_ReadBkup32(uint32_t _addr);
+void RTC_WriteBkup32(uint32_t _addr, uint32_t _value);
extern RTC_T g_tRTC;
diff --git a/User/bsp/inc/bsp_ds18b20.h b/User/bsp/inc/bsp_ds18b20.h
new file mode 100644
index 0000000..53c3535
--- /dev/null
+++ b/User/bsp/inc/bsp_ds18b20.h
@@ -0,0 +1,19 @@
+/*
+*********************************************************************************************************
+*
+* 模块名称 : DS18B20 驱动模块(1-wire 数字温度传感器)
+* 文件名称 : bsp_ds18b20.h
+*
+* Copyright (C), 2020, 安富莱电子 www.armfly.com
+*
+*********************************************************************************************************
+*/
+
+#ifndef _BSP_DS18B20_H
+#define _BSP_DS18B20_H
+
+uint8_t DS18B20_ReadTemp(uint8_t _ch, float *_result);
+
+#endif
+
+/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/bsp/inc/bsp_fmc_io.h b/User/bsp/inc/bsp_fmc_io.h
index 1c9d79f..9d135f4 100755
--- a/User/bsp/inc/bsp_fmc_io.h
+++ b/User/bsp/inc/bsp_fmc_io.h
@@ -55,7 +55,8 @@ typedef enum
ES_GPIO_SWD_OUT = 8, /* 1拖4 SWD接口用 */
- ES_GPIO_SPI = 9, /* SPI功能 */
+ ES_GPIO_SPI = 9, /* 硬件SPI功能 */
+ ES_PROG_SPI_FLASH = 10, /* 脱机烧录SPI FLASH */
} EIO_SELECT_E;
void bsp_InitExtIO(void);
diff --git a/User/bsp/inc/bsp_uart_fifo.h b/User/bsp/inc/bsp_uart_fifo.h
index dbf3b23..832dd73 100755
--- a/User/bsp/inc/bsp_uart_fifo.h
+++ b/User/bsp/inc/bsp_uart_fifo.h
@@ -187,6 +187,7 @@ typedef struct
}UART_T;
void bsp_InitUart(void);
+void bsp_DeInitUart(void);
void comSendBuf(COM_PORT_E _ucPort, uint8_t *_ucaBuf, uint16_t _usLen);
void comSendChar(COM_PORT_E _ucPort, uint8_t _ucByte);
uint8_t comGetChar(COM_PORT_E _ucPort, uint8_t *_pByte);
diff --git a/User/bsp/src/bsp_cpu_adc.c b/User/bsp/src/bsp_cpu_adc.c
index a2d7027..634f2ec 100755
--- a/User/bsp/src/bsp_cpu_adc.c
+++ b/User/bsp/src/bsp_cpu_adc.c
@@ -633,10 +633,10 @@ void DSO_SetGain(uint8_t _ch, uint8_t _gain)
{
if (_gain == 0) {G1C_0(); G1B_0(); G1A_0();}
else if (_gain == 1) {G1C_0(); G1B_0(); G1A_1();}
- else if (_gain == 2) {G1C_0(); G1B_1(); G1A_0();}
+ else if (_gain == 2) {G1C_0(); G1B_1(); G1A_0();}
else if (_gain == 3) {G1C_0(); G1B_1(); G1A_1();}
else if (_gain == 4) {G1C_1(); G1B_0(); G1A_0();}
- else if (_gain == 5) {G1C_1(); G1B_0(); G1A_1();}
+ else if (_gain == 5) {G1C_1(); G1B_0(); G1A_1();}
else if (_gain == 6) {G1C_1(); G1B_1(); G1A_0();}
else if (_gain == 7) {G1C_1(); G1B_1(); G1A_1();}
}
@@ -644,10 +644,10 @@ void DSO_SetGain(uint8_t _ch, uint8_t _gain)
{
if (_gain == 0) {G2C_0(); G2B_0(); G2A_0();}
else if (_gain == 1) {G2C_0(); G2B_0(); G2A_1();}
- else if (_gain == 2) {G2C_0(); G2B_1(); G2A_0();}
+ else if (_gain == 2) {G2C_0(); G2B_1(); G2A_0();}
else if (_gain == 3) {G2C_0(); G2B_1(); G2A_1();}
else if (_gain == 4) {G2C_1(); G2B_0(); G2A_0();}
- else if (_gain == 5) {G2C_1(); G2B_0(); G2A_1();}
+ else if (_gain == 5) {G2C_1(); G2B_0(); G2A_1();}
else if (_gain == 6) {G2C_1(); G2B_1(); G2A_0();}
else if (_gain == 7) {G2C_1(); G2B_1(); G2A_1();}
}
diff --git a/User/bsp/src/bsp_cpu_rtc.c b/User/bsp/src/bsp_cpu_rtc.c
index 8fca09f..7527e6f 100755
--- a/User/bsp/src/bsp_cpu_rtc.c
+++ b/User/bsp/src/bsp_cpu_rtc.c
@@ -296,4 +296,31 @@ uint8_t RTC_CalcWeek(uint16_t _year, uint8_t _mon, uint8_t _day)
return w;
}
+/*
+*********************************************************************************************************
+* 函 数 名: RTC_ReadBkup32
+* 功能说明: 读时钟备份寄存器
+* 形 参: _addr : 0-31
+* 返 回 值: 数据
+*********************************************************************************************************
+*/
+uint32_t RTC_ReadBkup32(uint32_t _addr)
+{
+ return HAL_RTCEx_BKUPRead(&RtcHandle, _addr);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: RTC_WriteBkup32
+* 功能说明: 写时钟备份寄存器
+* 形 参: _addr : 0-31
+* 返 回 值: 数据
+*********************************************************************************************************
+*/
+void RTC_WriteBkup32(uint32_t _addr, uint32_t _value)
+{
+ HAL_RTCEx_BKUPWrite(&RtcHandle, _addr, _value);
+}
+
+
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/bsp/src/bsp_ds18b20.c b/User/bsp/src/bsp_ds18b20.c
new file mode 100644
index 0000000..f42b4f9
--- /dev/null
+++ b/User/bsp/src/bsp_ds18b20.c
@@ -0,0 +1,491 @@
+/*
+*********************************************************************************************************
+*
+* 模块名称 : DS18B20 驱动模块(1-wire 数字温度传感器)
+* 文件名称 : bsp_ds18b20.c
+* 版 本 : V1.0
+* 说 明 : 用于H7-TOOL。 采用10us定时中断模式驱动. 可同步采集8通道.
+*
+*********************************************************************************************************
+*/
+
+#include "bsp.h"
+#include "param.h"
+
+#define DS18B20_IRQ_HANDLE TIM16_IRQHandler
+
+#define TIM_HARD TIM16
+#define TIM_HARD_IRQn TIM16_IRQn
+
+#define DQ_DIR_OUTPUT(ch) EIO_ConfigPort(ch, ES_GPIO_OUT)
+#define DQ_DIR_INPUT(ch) EIO_ConfigPort(ch, ES_GPIO_IN)
+
+#define DQ_0(ch) EIO_SetOutLevel(ch, 0)
+#define DQ_1(ch) EIO_SetOutLevel(ch, 1)
+
+/* 判断DQ输入是否为低 */
+#define DQ_IS_LOW(ch) (EIO_GetInputLevel(ch) == 0)
+
+/*
+ D0 PD14 PA15 PI0 - DIR PH8 CS2
+ D1 PD15 PA8 PH19 - DIR PG8 CS3
+
+ D2 PE6 PD0 PB7 - DIR PD9 MOSI_1 (硬件SPI信号)
+ D3 PE5 PD1 PH11 - DIR PG10 MISO_1 (硬件SPI信号)
+ D4 PE4 PE7 PH12 - DIR PG12 CS1 (软件控制片选)
+ D5 PE2 PE8 PI5 - DIR PG7 SCK (硬件SPI信号)
+ D6 PE9 PD3 PA0 - DIR PD10 MOSI_2
+ D7 PE10 PI6 - DIR PI1 MISO_2 (第2路MISO)
+ D8 PE11 PD4 PI3 - DIR PG9 MISO_3 (第3路MISO)
+ D9 PE12 PD5 - DIR PI12 MISO_4 (第4路MISO)
+*/
+
+static float s_DS18B20_TempReg[8];
+static uint16_t s_err[8] = {0};
+
+static void DS18B20_StartTimerIRQ(void);
+static void DS18B20_StopTimerIRQ(void);
+
+static uint8_t s_ch = 0;
+static uint16_t s_status = 0;
+
+/*
+*********************************************************************************************************
+* 函 数 名: DS18B20_ReadTempReg
+* 功能说明: 读温度寄存器的值(原始数据). 循环读,返回上次结果.
+* 形 参: 无
+* 返 回 值: 0表示失败,1表示OK
+*********************************************************************************************************
+*/
+uint8_t DS18B20_ReadTemp(uint8_t _ch, float *_result)
+{
+ uint8_t re = 0;
+
+ if (_ch > 7)
+ {
+ return re;
+ }
+
+ EIO_ConfigPort(_ch, ES_GPIO_OUT); /* DQ方向输出 */
+
+ s_err[_ch] = 1;
+ s_ch = _ch;
+ s_status = 0;
+
+ /* 定时周期10us,频率100KHz */
+ DS18B20_StartTimerIRQ();
+
+ while (s_status != 10)
+ {
+ //bsp_Idle();
+ }
+
+ DS18B20_StopTimerIRQ();
+
+ if (s_err[s_ch] == 1)
+ {
+ re = 0; /* 返回异常温度值 */
+ }
+ else
+ {
+ *_result = (float)s_DS18B20_TempReg[s_ch] / 16;
+ re = 1;
+ }
+
+ return re;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DS18B20_CaculCRC
+* 功能说明: CRC校验
+* 形 参: _buf: 数据缓冲区
+* _len : 数据长度
+* 返 回 值: 校验值
+*********************************************************************************************************
+*/
+uint8_t DS18B20_CaculCRC(uint8_t *_buf, uint8_t _len)
+{
+ uint8_t crc = 0, i, j;
+
+ for (i = 0; i < _len; i++)
+ {
+ crc = crc ^ _buf[i];
+ for (j = 0; j < 8; j++)
+ {
+ if (crc & 0x01)
+ {
+ crc = (crc >> 1) ^ 0x8C;
+ }
+ else
+ {
+ crc >>= 1;
+ }
+ }
+ }
+ return crc;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DS18B20_IRQ_HANDLE
+* 功能说明: 10us定时中断服务程序,读取DS18B20温度值
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void DS18B20_IRQ_HANDLE(void)
+{
+ static uint16_t s_time = 0;
+ static uint16_t s_call_ret = 0;
+ static uint16_t s_write_value = 0;
+ static uint8_t s_i;
+ static uint8_t s_read;
+ static uint8_t s_rx_buf[9];
+ static uint8_t s_rx_len = 0;
+
+ if (TIM_HARD->SR & TIM_IT_UPDATE)
+ {
+ TIM_HARD->SR = (uint16_t)~TIM_IT_UPDATE;
+ }
+
+ /*
+ 复位时序, 见DS18B20 page 15
+
+ 首先主机拉低DQ,持续最少 480us
+ 然后释放DQ,等待DQ被上拉电阻拉高,约 15-60us
+ DS18B20 将驱动DQ为低 60-240us, 这个信号叫 presence pulse (在位脉冲,表示DS18B20准备就绪 可以接受命令)
+ 如果主机检测到这个低应答信号,表示DS18B20复位成功
+ */
+ s_time++;
+ switch (s_status)
+ {
+ // DS18B20_Reset(_ch);
+
+ // DS18B20_WriteByte(_ch, 0xcc); /* 发命令 - 跳过ROM */
+ // DS18B20_WriteByte(_ch,0x44); /* 发转换命令 */
+
+ // DS18B20_Reset(_ch); /* 总线复位 */
+
+ // DS18B20_WriteByte(_ch, 0xcc); /* 发命令 */
+ // DS18B20_WriteByte(_ch,0xbe); /* 读温度 */
+
+ // temp1 = DS18B20_ReadByte(_ch); /* 读温度值低字节 */
+ // temp2 = DS18B20_ReadByte(_ch); /* 读温度值高字节 */
+
+ // return ((temp2 << 8) | temp1); /* 返回16位寄存器值 */
+
+ case 0:
+ s_status++;
+ break;
+
+ case 1:
+ s_call_ret = s_status + 1; /* 执行完毕返回状态 */
+ s_status = 100; /* 去执行DS18B20_Reset */
+ break;
+
+ case 2:
+ s_call_ret = s_status + 1;
+ s_write_value = 0xcc;
+ s_status = 110; /* DS18B20_WriteByte(_ch, 0xcc); */
+ break;
+
+ case 3:
+ s_call_ret = s_status + 1;
+ s_write_value = 0x44;
+ s_status = 110; /* DS18B20_WriteByte(_ch,0x44); */
+ break;
+
+ case 4:
+ s_call_ret = s_status + 1;
+ s_status = 100; /* DS18B20_Reset */
+ break;
+
+ case 5:
+ s_call_ret = s_status + 1;
+ s_write_value = 0xcc;
+ s_status = 110; /* DS18B20_WriteByte(_ch, 0xcc); */
+ break;
+
+ case 6:
+ s_call_ret = s_status + 1;
+ s_write_value = 0xBE;
+ s_status = 110; /* DS18B20_WriteByte(_ch,0xbe); */
+ break;
+
+ case 7:
+ s_call_ret = s_status + 1;
+ s_status = 120; /* DS18B20_ReadByte(_ch); 读温度值 */
+ break;
+
+ case 8:
+ if (DS18B20_CaculCRC(s_rx_buf, 8) == s_rx_buf[8] && s_rx_buf[4] == 0x7F)
+ {
+ int16_t reg16;
+
+ reg16 = (s_rx_buf[1] << 8) + s_rx_buf[0];
+ s_DS18B20_TempReg[s_ch] = reg16;
+
+ s_err[s_ch] = 0; /* 读取成功清0 */
+ }
+ else
+ {
+ s_err[s_ch] = 1;
+ }
+ s_status++;
+ break;
+
+ case 9:
+ /* 任务结束,关闭定时中断 */
+ DS18B20_StopTimerIRQ();
+ s_status++;
+ break;
+
+ case 10: /* 执行一次结束,再此处等待 */
+ ;
+ break;
+
+ case 99: /* 异常处理 */
+ s_err[s_ch] = 1; /* 错误 */
+ s_status = 9; /* 结束任务 */
+ break;
+
+ /************ DS18B20_Reset 总线复位子程序 ************/
+ case 100:
+ DQ_DIR_OUTPUT(s_ch); /* DQ方向输出 */
+ DQ_0(s_ch); /* 拉低DQ */
+ s_time = 0;
+ s_status++;
+ break;
+
+ case 101: /* 延迟 520uS, 要求这个延迟大于 480us */
+ if (s_time >= 52)
+ {
+ DQ_DIR_INPUT(s_ch); /* DQ方向输入, 外部上拉会拉到高 */
+ //DQ_1(s_ch); /* 释放DQ */
+
+ s_time = 0;
+ s_status++;
+ }
+ break;
+
+ case 102: /* 延时60us,等待总线电平归位 */
+ if (s_time >= 6)
+ {
+ s_time = 0;
+ s_status++;
+ }
+ if (!DQ_IS_LOW(s_ch)) /* 总线已经拉高 */
+ {
+ s_time = 0;
+ s_status++;
+ }
+ break;
+
+ case 103: /* 等待DS18B20拉低总线 */
+ if (DQ_IS_LOW(s_ch))
+ {
+ s_time = 0;
+ s_status++;
+ }
+ if (s_time > 8) /* 80us 没检测到应答,则认为DS18B20异常 */
+ {
+ s_status = 99; /* 错误处理 */
+ }
+ break;
+
+ case 104: /* 等待DS18B20释放总线 */
+ if (!DQ_IS_LOW(s_ch))
+ {
+ s_time = 0;
+ s_status++;
+ }
+ if (s_time > 30) /* 300us 没释放,则认为DS18B20异常 */
+ {
+ s_status = 99; /* 错误处理 */
+ }
+ break;
+
+ case 105: /* 复位成功,下面可以开始读数据了 */
+ s_status = s_call_ret;
+ break;
+
+ /************ DS18B20_WriteByte ************/
+ // for (i = 0; i < 8; i++)
+ // {
+ // DQ_0(_ch);
+ // bsp_DelayUS(2);
+
+ // if (_val & 0x01)
+ // {
+ // DQ_1(_ch);
+ // }
+ // else
+ // {
+ // DQ_0(_ch);
+ // }
+ // bsp_DelayUS(60);
+ // DQ_1(_ch);
+ // bsp_DelayUS(2);
+ // _val >>= 1;
+ // }
+ case 110:
+ s_i = 0;
+ s_status++;
+ break;
+
+ case 110 + 1:
+ DQ_DIR_OUTPUT(s_ch); /* DQ方向输出 */
+ DQ_0(s_ch); /* 拉低DQ */
+ bsp_DelayUS(2);
+ if (s_write_value & 0x01)
+ {
+ DQ_1(s_ch);
+ }
+ else
+ {
+ DQ_0(s_ch);
+ }
+ s_time = 0;
+ s_status++;
+ break;
+
+ case 110 + 2:
+ if (s_time >= 6)
+ {
+ DQ_1(s_ch);
+ s_write_value >>= 1;
+
+ if (++s_i >= 8)
+ {
+ s_status++;
+ }
+ else
+ {
+ s_status--;
+ }
+ }
+ break;
+
+ case 110 + 3:
+ s_status = s_call_ret;
+ break;
+
+ /************ DS18B20_ReadByte ************/
+ // uint8_t i;
+ // uint8_t read = 0;
+
+ // for (i = 0; i < 8; i++)
+ // {
+ // read >>= 1;
+
+ // DQ_0(_ch);
+ // bsp_DelayUS(3);
+ // DQ_1(_ch);
+ // bsp_DelayUS(3);
+
+ // if (DQ_IS_LOW(_ch))
+ // {
+ // ;
+ // }
+ // else
+ // {
+ // read |= 0x80;
+ // }
+ // bsp_DelayUS(60);
+ // }
+ // return read;
+
+ case 120:
+ s_rx_len = 0;
+ s_status++;
+ break;
+
+ case 120 + 1:
+ s_i = 0;
+ s_read = 0;
+ s_status++;
+ break;
+
+ case 120 + 2:
+ s_read >>= 1;
+ DQ_DIR_OUTPUT(s_ch); /* DQ方向输出 */
+ DQ_0(s_ch);
+ bsp_DelayUS(3);
+ //DQ_1(s_ch);
+ DQ_DIR_INPUT(s_ch); /* DQ方向输入 */
+ bsp_DelayUS(3);
+ if (DQ_IS_LOW(s_ch))
+ {
+ ;
+ }
+ else
+ {
+ s_read |= 0x80;
+ }
+ s_time = 0;
+ s_status++;
+ break;
+
+ case 120 + 3:
+ if (s_time >= 6) /* 延迟60us */
+ {
+ if (++s_i >= 8)
+ {
+ s_status++;
+ }
+ else
+ {
+ s_status--;
+ }
+ }
+ break;
+
+ case 120 + 4:
+ s_rx_buf[s_rx_len] = s_read;
+ if (++s_rx_len >= 9)
+ {
+ s_status++;
+ }
+ else
+ {
+ s_status = 120 + 1;
+ }
+ break;
+
+ case 120 + 5:
+ //s_err[s_ch] = 0; /* 读取成功清0 */
+ s_status = s_call_ret;
+ break;
+ }
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DS18B20_StartTimerIRQ
+* 功能说明: 启动TIM定时中断
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static void DS18B20_StartTimerIRQ(void)
+{
+ bsp_SetTIMforInt(TIM_HARD, 100*1000, 0, 0);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: DS18B20_StopTimerIRQ
+* 功能说明: 关闭TIM定时中断
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static void DS18B20_StopTimerIRQ(void)
+{
+ bsp_SetTIMforInt(TIM_HARD, 0, 0, 0);
+}
+
+
+/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
+
diff --git a/User/bsp/src/bsp_fmc_io.c b/User/bsp/src/bsp_fmc_io.c
index 96a5a28..ea22bc6 100755
--- a/User/bsp/src/bsp_fmc_io.c
+++ b/User/bsp/src/bsp_fmc_io.c
@@ -351,6 +351,12 @@ void EIO_D0_Config(EIO_SELECT_E _mode)
GPIO_INIT_UART7(GPIOA, GPIO_PIN_15); /* 配置GPIO为UART7功能 */
GPIO_INIT_INPUT(GPIOI, GPIO_PIN_0); /* 配置为GPIO 输入功能 */
}
+ else if (_mode == ES_PROG_SPI_FLASH)
+ {
+ GPIO_DIR_SET_OUT(GPIO_D0_DIR, PIN_D0_DIR); /* 设置为输出方向 - 先执行 */
+ GPIO_INIT_INPUT(GPIOA, GPIO_PIN_15); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_OUT_PP(GPIOI, GPIO_PIN_0); /* 配置为GPIO 输出功能 */
+ }
else
{
g_tVar.GpioMode[0] = 0;
@@ -405,6 +411,13 @@ void EIO_D1_Config(EIO_SELECT_E _mode)
GPIO_INIT_INPUT(GPIOI, GPIO_PIN_0); /* 配置为GPIO 输入功能 */
GPIO_DIR_SET_IN(GPIO_D1_DIR, PIN_D1_DIR); /* 设置为输入方向 - 后执行 */
}
+ else if (_mode == ES_PROG_SPI_FLASH) /* PD15 输出 */
+ {
+ GPIO_DIR_SET_OUT(GPIO_D1_DIR, PIN_D1_DIR); /* 设置为输出方向 - 先执行 */
+ GPIO_INIT_INPUT(GPIOA, GPIO_PIN_8); /* 配置为GPIO输入功能 */
+ GPIO_INIT_INPUT(GPIOH, GPIO_PIN_10); /* 配置为GPIO输入功能 */
+ GPIO_INIT_OUT_PP(GPIOD, GPIO_PIN_15); /* 配置为GPIO输出功能 */
+ }
else
{
g_tVar.GpioMode[1] = 0;
@@ -420,8 +433,8 @@ void EIO_D1_Config(EIO_SELECT_E _mode)
* 返 回 值: 无
*********************************************************************************************************
*/
-#define GPIO_D2_DIR GPIOD
-#define PIN_D2_DIR GPIO_PIN_9
+#define GPIO_D2_DIR GPIOD
+#define PIN_D2_DIR GPIO_PIN_9
void EIO_D2_Config(EIO_SELECT_E _mode)
{
/*
@@ -458,6 +471,13 @@ void EIO_D2_Config(EIO_SELECT_E _mode)
GPIO_DIR_SET_OUT(GPIO_D2_DIR, PIN_D2_DIR); /* 设置为输出方向 - 先执行 */
GPIO_INIT_INPUT(GPIOB, GPIO_PIN_7); /* 配置为GPIO 输入功能 */
GPIO_INIT_AF_PP(GPIOE, GPIO_PIN_6); /* 配置为GPIO AF功能 */
+ }
+ else if (_mode == ES_PROG_SPI_FLASH) /* MOSI_1 = PD0(写时) PE6(读时) */
+ {
+ GPIO_DIR_SET_OUT(GPIO_D2_DIR, PIN_D2_DIR); /* 设置为输出方向 - 先执行 */
+ GPIO_INIT_INPUT(GPIOB, GPIO_PIN_7); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_INPUT(GPIOE, GPIO_PIN_6); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_OUT_PP(GPIOD, GPIO_PIN_0); /* 配置为GPIO 输出功能 */
}
else
{
@@ -512,7 +532,14 @@ void EIO_D3_Config(EIO_SELECT_E _mode)
GPIO_INIT_INPUT(GPIOH, GPIO_PIN_11); /* 配置为GPIO 输入功能 */
GPIO_INIT_AF_PP(GPIOE, GPIO_PIN_5); /* 配置为GPIO AF */
GPIO_DIR_SET_IN(GPIO_D3_DIR, PIN_D3_DIR); /* 设置为输入方向 - 后执行 */
- }
+ }
+ else if (_mode == ES_PROG_SPI_FLASH) /* MOSI_2 = PD1(写时) PE5(读时) */
+ {
+ GPIO_DIR_SET_OUT(GPIO_D3_DIR, PIN_D3_DIR); /* 设置为输出方向 - 先执行 */
+ GPIO_INIT_INPUT(GPIOH, GPIO_PIN_11); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_INPUT(GPIOE, GPIO_PIN_5); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_OUT_PP(GPIOD, GPIO_PIN_1); /* 配置为GPIO 输出功能 */
+ }
else
{
g_tVar.GpioMode[3] = 0;
@@ -561,6 +588,12 @@ void EIO_D4_Config(EIO_SELECT_E _mode)
GPIO_INIT_INPUT(GPIOH, GPIO_PIN_12); /* 配置为GPIO 输入功能 */
GPIO_INIT_INPUT(GPIOE, GPIO_PIN_4); /* 配置为GPIO 输入功能 */
}
+ else if (_mode == ES_PROG_SPI_FLASH) /* MISO_1 = PE4 */
+ {
+ GPIO_INIT_INPUT(GPIOH, GPIO_PIN_12); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_INPUT(GPIOE, GPIO_PIN_4); /* 配置为GPIO 输入功能 */
+ GPIO_DIR_SET_IN(GPIO_D4_DIR, PIN_D4_DIR); /* 设置为输入方向 - 后执行 */
+ }
else
{
g_tVar.GpioMode[4] = 0;
@@ -614,7 +647,13 @@ void EIO_D5_Config(EIO_SELECT_E _mode)
GPIO_DIR_SET_OUT(GPIO_D5_DIR, PIN_D5_DIR); /* 设置为输出方向 - 先执行 */
GPIO_INIT_INPUT(GPIOI, GPIO_PIN_5); /* 配置为GPIO 输入功能 */
GPIO_INIT_AF_PP(GPIOE, GPIO_PIN_2); /* 配置为GPIO 为AF给 */
- }
+ }
+ else if (_mode == ES_PROG_SPI_FLASH) /* MISO_2 = PE2 */
+ {
+ GPIO_INIT_INPUT(GPIOI, GPIO_PIN_5); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_INPUT(GPIOE, GPIO_PIN_2); /* 配置为GPIO 输入功能 */
+ GPIO_DIR_SET_IN(GPIO_D5_DIR, PIN_D5_DIR); /* 设置为输入方向 - 后执行 */
+ }
else
{
g_tVar.GpioMode[5] = 0;
@@ -670,6 +709,13 @@ void EIO_D6_Config(EIO_SELECT_E _mode)
GPIO_INIT_INPUT(GPIOA, GPIO_PIN_0); /* 配置为GPIO 输入功能 */
GPIO_INIT_INPUT(GPIOD, GPIO_PIN_3); /* 配置为GPIO 输入功能 */
}
+ else if (_mode == ES_PROG_SPI_FLASH) /* MOSI_3 = PD3(写时) PE9(读时) */
+ {
+ GPIO_DIR_SET_OUT(GPIO_D6_DIR, PIN_D6_DIR); /* 设置为输出方向 - 先执行 */
+ GPIO_INIT_INPUT(GPIOA, GPIO_PIN_0); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_OUT_PP(GPIOD, GPIO_PIN_3); /* 配置为GPIO 输出功能 */
+ GPIO_INIT_INPUT(GPIOE, GPIO_PIN_9);
+ }
else
{
g_tVar.GpioMode[6] = 0;
@@ -732,6 +778,13 @@ void EIO_D7_Config(EIO_SELECT_E _mode)
GPIO_INIT_INPUT(GPIOI, GPIO_PIN_6); /* 配置为GPIO 输入功能 */
GPIO_DIR_SET_IN(GPIO_D7_DIR, PIN_D7_DIR); /* 设置为输入方向 - 后执行 */
}
+ else if (_mode == ES_PROG_SPI_FLASH) /* MISO_3 = PE10 */
+ {
+ GPIO_INIT_INPUT(GPIOF, GPIO_PIN_0); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_INPUT(GPIOI, GPIO_PIN_6); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_INPUT(GPIOE, GPIO_PIN_10); /* 配置为GPIO 输入功能 */
+ GPIO_DIR_SET_IN(GPIO_D7_DIR, PIN_D7_DIR); /* 设置为输入方向 - 后执行 */
+ }
else
{
g_tVar.GpioMode[7] = 0;
@@ -806,6 +859,14 @@ void EIO_D8_Config(EIO_SELECT_E _mode)
GPIO_INIT_INPUT(GPIOE, GPIO_PIN_11); /* 配置为GPIO 输入功能 */
GPIO_INIT_FMC(GPIOD, GPIO_PIN_4); /* 配置为FMC功能 NOE */
}
+ else if (_mode == ES_PROG_SPI_FLASH) /* MOSI_4 = PD4(写时) PE11(读时) */
+ {
+ GPIO_DIR_SET_OUT(GPIO_D8_DIR, PIN_D8_DIR); /* 设置为输出方向 - 先执行 */
+
+ GPIO_INIT_OUT_PP(GPIOD, GPIO_PIN_4); /* 配置为GPIO 输出功能 */
+ GPIO_INIT_INPUT(GPIOI, GPIO_PIN_3); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_INPUT(GPIOE, GPIO_PIN_3); /* 配置为GPIO 输入功能 */
+ }
else
{
g_tVar.GpioMode[8] = 0;
@@ -883,6 +944,14 @@ void EIO_D9_Config(EIO_SELECT_E _mode)
GPIO_INIT_INPUT(GPIOD, GPIO_PIN_5); /* 配置为GPIO 输入功能 */
GPIO_DIR_SET_IN(GPIO_D9_DIR, PIN_D9_DIR); /* 设置为输入方向 - 后执行 */
}
+ else if (_mode == ES_PROG_SPI_FLASH) /* MISO_4 = PE12(读时) */
+ {
+ GPIO_INIT_INPUT(GPIOE, GPIO_PIN_12); /* 配置为GPIO 输入功能 */
+
+ GPIO_INIT_INPUT(GPIOF, GPIO_PIN_1); /* 配置为GPIO 输入功能 */
+ GPIO_INIT_INPUT(GPIOD, GPIO_PIN_5); /* 配置为GPIO 输入功能 */
+ GPIO_DIR_SET_IN(GPIO_D9_DIR, PIN_D9_DIR); /* 设置为输入方向 - 后执行 */
+ }
else
{
g_tVar.GpioMode[9] = 0;
diff --git a/User/bsp/src/bsp_key.c b/User/bsp/src/bsp_key.c
index 394e3c6..17335cb 100755
--- a/User/bsp/src/bsp_key.c
+++ b/User/bsp/src/bsp_key.c
@@ -252,6 +252,33 @@ void bsp_PutKey(uint8_t _KeyCode)
return;
}
+ /* 启动后 100ms内检测到按键按下全部忽略 - 例如从 DAP返回,C键一直按着. 需要忽略这个按键事件 */
+ {
+ static uint8_t s_JumpFlag = 0;
+
+ if (s_JumpFlag == 0)
+ {
+ if (bsp_CheckRunTime(0) < 100)
+ {
+ s_JumpFlag = 1;
+ return;
+ }
+ else
+ {
+ s_JumpFlag = 2;
+ }
+ }
+ else if (s_JumpFlag == 1)
+ {
+ if (_KeyCode == KEY_1_UP || _KeyCode == KEY_1_LONG_UP
+ || _KeyCode == KEY_2_UP || _KeyCode == KEY_2_LONG_UP)
+ {
+ s_JumpFlag = 2;
+ return;
+ }
+ }
+ }
+
s_tKey.Buf[s_tKey.Write] = _KeyCode;
if (++s_tKey.Write >= KEY_FIFO_SIZE)
diff --git a/User/bsp/src/bsp_tft_st7789.c b/User/bsp/src/bsp_tft_st7789.c
index c969853..111d964 100755
--- a/User/bsp/src/bsp_tft_st7789.c
+++ b/User/bsp/src/bsp_tft_st7789.c
@@ -333,6 +333,7 @@ void ST7789_DrawScreen(void)
}
#else
static int32_t s_time1 = 0;
+ static uint8_t s_first_run = 0; /* 上电第1次运行,准备好数据后开背光,避免短暂花屏 */
if (s_DispRefresh == 0)
{
@@ -343,7 +344,7 @@ void ST7789_DrawScreen(void)
if (bsp_CheckRunTime(s_time1) < 50)
{
return;
- }
+ }
s_DispRefresh = 0;
@@ -360,6 +361,13 @@ void ST7789_DrawScreen(void)
while (wTransferState == 0){}
s_time1 = bsp_GetRunTime();
+
+ if (s_first_run == 0)
+ {
+ s_first_run = 1;
+
+ LCD_SetBackLight(BRIGHT_DEFAULT); /* 打开背光 255 */
+ }
#endif
}
diff --git a/User/bsp/src/bsp_tim_pwm.c b/User/bsp/src/bsp_tim_pwm.c
index a9858d2..ede4455 100755
--- a/User/bsp/src/bsp_tim_pwm.c
+++ b/User/bsp/src/bsp_tim_pwm.c
@@ -413,6 +413,40 @@ void bsp_SetTIMforInt(TIM_TypeDef* TIMx, uint32_t _ulFreq, uint8_t _PreemptionPr
uint16_t usPrescaler;
uint32_t uiTIMxCLK;
+ if (_ulFreq == 0)
+ {
+ bsp_RCC_TIM_Disable(TIMx);
+
+
+ __HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE);
+
+ /* 配置TIM定时更新中断 (Update) */
+ {
+ uint8_t irq = 0; /* 中断号, 定义在 stm32h7xx.h */
+
+ if (TIMx == TIM1) irq = TIM1_UP_IRQn;
+ else if (TIMx == TIM2) irq = TIM2_IRQn;
+ else if (TIMx == TIM3) irq = TIM3_IRQn;
+ else if (TIMx == TIM4) irq = TIM4_IRQn;
+ else if (TIMx == TIM5) irq = TIM5_IRQn;
+ else if (TIMx == TIM6) irq = TIM6_DAC_IRQn;
+ else if (TIMx == TIM7) irq = TIM7_IRQn;
+ else if (TIMx == TIM8) irq = TIM8_UP_TIM13_IRQn;
+ else if (TIMx == TIM12) irq = TIM8_BRK_TIM12_IRQn;
+ else if (TIMx == TIM13) irq = TIM8_UP_TIM13_IRQn;
+ else if (TIMx == TIM14) irq = TIM8_TRG_COM_TIM14_IRQn;
+ else if (TIMx == TIM15) irq = TIM15_IRQn;
+ else if (TIMx == TIM16) irq = TIM16_IRQn;
+ else if (TIMx == TIM17) irq = TIM17_IRQn;
+ else
+ {
+ Error_Handler(__FILE__, __LINE__);
+ }
+ HAL_NVIC_DisableIRQ((IRQn_Type)irq);
+ }
+ return;
+ }
+
/* 使能TIM时钟 */
bsp_RCC_TIM_Enable(TIMx);
diff --git a/User/bsp/src/bsp_timer.c b/User/bsp/src/bsp_timer.c
index 58d4432..13c7e30 100755
--- a/User/bsp/src/bsp_timer.c
+++ b/User/bsp/src/bsp_timer.c
@@ -330,7 +330,7 @@ void bsp_StartTimer(uint8_t _id, uint32_t _period)
* 函 数 名: bsp_StartAutoTimer
* 功能说明: 启动一个自动定时器,并设置定时周期。
* 形 参: _id : 定时器ID,值域【0,TMR_COUNT-1】。用户必须自行维护定时器ID,以避免定时器ID冲突。
-* _period : 定时周期,单位10ms
+* _period : 定时周期,单位1ms
* 返 回 值: 无
*********************************************************************************************************
*/
diff --git a/User/bsp/src/bsp_uart_fifo.c b/User/bsp/src/bsp_uart_fifo.c
index 363936a..9239a4b 100755
--- a/User/bsp/src/bsp_uart_fifo.c
+++ b/User/bsp/src/bsp_uart_fifo.c
@@ -238,6 +238,14 @@ void bsp_InitUart(void)
RS485_InitTXE(); /* 配置RS485芯片的发送使能硬件,配置为推挽输出 */
}
+
+void bsp_DeInitUart(void)
+{
+ HAL_UART_DeInit(&(g_tUart1.huart));
+ HAL_UART_DeInit(&(g_tUart4.huart));
+ HAL_UART_DeInit(&(g_tUart7.huart));
+}
+
/*
*********************************************************************************************************
* 函 数 名: ComToUart
diff --git a/User/daplink/source/daplink/cmsis-dap/SW_DP.c b/User/daplink/source/daplink/cmsis-dap/SW_DP.c
index 96e5605..fab8c44 100755
--- a/User/daplink/source/daplink/cmsis-dap/SW_DP.c
+++ b/User/daplink/source/daplink/cmsis-dap/SW_DP.c
@@ -51,21 +51,21 @@
*/
/*
- 无延迟最高速度时,烧写H7-TOOL程序
- 正在校验...(FLM_CRC32)
- 19968ms, 0.00%
- 20894ms, 100.00%
- 编程成功
-
- --延迟 PIN_DELAY_SLOW(0)
- 正在校验...(FLM_CRC32)
- 20708ms, 0.00%
- 21648ms, 100.00%
-
- --延迟 PIN_DELAY_SLOW(1)
- 正在校验...(FLM_CRC32)
- 21417ms, 0.00%
- 22376ms, 100.00%
+ 延迟0: 写16.7M, 读9M
+
+ 延迟1: 写6.2M 读5.4M
+ 延迟2: 写5.7M 读5.0M
+ 延迟3: 写5.3M 读4.6M
+ 延迟4: 写4.2M 读4.3M
+ 延迟10: 写2.94M 读3.1M
+ 延迟20: 写2.1M 读2.0M
+ 延迟40: 写1.29M 读1.29M
+ 延迟100: 写 594K 读 594K
+
+ 延迟200: 写 313K 读 313K
+ 延迟1000:写 65K 读 65K
+ 延迟2000:写 33.1K 读33.1K
+ 延迟5000:写 13.2K 读13.2K
*/
//#define PIN_SWCLK_SET() PIN_SWCLK_TCK_SET();PIN_SWCLK_TCK_SET()
@@ -130,13 +130,13 @@
if (val & 1) \
{ \
GPIOD->BSRR = GPIO_PIN_4 + (GPIO_PIN_3 << 16U); \
- val >>= 1; \
+ val >>= 1; PIN_DELAY_S(); \
PIN_SWCLK_SET(); PIN_DELAY_S(); \
} \
else \
{ \
GPIOD->BSRR = (GPIO_PIN_4 + GPIO_PIN_3) << 16U; \
- val >>= 1; \
+ val >>= 1; PIN_DELAY_S(); \
PIN_SWCLK_SET(); PIN_DELAY_S(); \
}
@@ -212,13 +212,66 @@ uint8_t SWD_TransferFast(uint32_t request, uint32_t *data)
/* Read data */
/* armfly : 优化奇偶校验算法 */
val = 0U;
+ #if 0
+ {
+ uint32_t buf[32];
+
+ // PD3 = CLK PD4 = DIO
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[0] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[1] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[2] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[3] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[4] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[5] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[6] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[7] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[8] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[9] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[10] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[11] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[12] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[13] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[14] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[15] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[16] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[17] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[18] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[19] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[20] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[21] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[22] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[23] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[24] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[25] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[26] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[27] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[28] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[29] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[30] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+ GPIOD->BSRR = (GPIO_PIN_3 << 16U); buf[31] = GPIOD->IDR; GPIOD->BSRR = GPIO_PIN_3;
+
+ parity = 0;
+ for (n = 0; n < 32; n++)
+ {
+ val >>= 1;
+ if (buf[n] & GPIO_PIN_4)
+ {
+ val |= 0x80000000;
+ parity++;
+ }
+ }
+ //parity = GetParity(val);
+ }
+ #else
for (n = 32U; n; n--) {
SW_READ_BIT_FAST(bit); /* Read RDATA[0:31] */
val >>= 1;
val |= bit << 31;
- }
+ }
+ parity = GetParity(val);
+ #endif
- parity = GetParity(val);
+
SW_READ_BIT_FAST(bit); /* Read Parity */
diff --git a/User/daplink/source/hic_hal/stm32/stm32h750/DAP_config.h b/User/daplink/source/hic_hal/stm32/stm32h750/DAP_config.h
index b574ae7..2119153 100755
--- a/User/daplink/source/hic_hal/stm32/stm32h750/DAP_config.h
+++ b/User/daplink/source/hic_hal/stm32/stm32h750/DAP_config.h
@@ -611,7 +611,7 @@ Status LEDs. In detail the operation of Hardware I/O and LED pins are enabled an
- LED output pins are enabled and LEDs are turned off.
*/
extern void bsp_InitSPI2_Fast(void);
-static __inline void DAP_SETUP(void)
+__inline void DAP_SETUP(void)
{
// /* Enable port clock */
// __HAL_RCC_GPIOA_CLK_ENABLE();
@@ -637,7 +637,9 @@ static __inline void DAP_SETUP(void)
EIO_D6_Config(ES_GPIO_OUT); /* SWCLK - */
EIO_D8_Config(ES_GPIO_OUT); /* SWDIO - */
- EIO_D2_Config(ES_GPIO_OUT); /* - */
+ //EIO_D2_Config(ES_GPIO_OUT); /* - */
+
+ //DAP_SETUP
#if SPI_MODE_ENABLE == 1
bsp_InitSPI2_Fast();
diff --git a/User/lua/if/lua_if.c b/User/lua/if/lua_if.c
index 62c64ee..56f0893 100755
--- a/User/lua/if/lua_if.c
+++ b/User/lua/if/lua_if.c
@@ -1,3 +1,21 @@
+/*
+*********************************************************************************************************
+*
+* 模块名称 : lua接口API
+* 文件名称 : lua_if.c
+* 版 本 : V1.0
+* 说 明 :
+* 修改记录 :
+* 版本号 日期 作者 说明
+* V1.0 2019-10-06 armfly 正式发布
+*
+* Copyright (C), 2019-2030, 安富莱电子 www.armfly.com
+*
+*********************************************************************************************************
+*/
+
+#include "includes.h"
+
#include "lua_if.h"
#include "bsp.h"
#include "param.h"
@@ -164,8 +182,8 @@ void LuaYeildHook(lua_State *_L, lua_Debug *ar)
}
}
}
-
- if (g_MainStatus == MS_PROG_WORK)
+ else
+ //if (g_MainStatus == MS_PROG_WORK) 在其他状态按C键退出
{
uint8_t ucKeyCode;
@@ -1007,7 +1025,79 @@ uint32_t lua_GetVarUint32(const char *_VarName, uint32_t _Default)
return data;
}
+
+/*
+*********************************************************************************************************
+* 函 数 名: lua_ReadDev
+* 功能说明: 通用外设读。 ok, temp = read("DS18B20", 1)
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static int lua_ReadDev(lua_State* L)
+{
+ const char *device;
+ size_t len;
+
+ if (lua_type(L, 1) == LUA_TSTRING) /* 判断第1个参数 */
+ {
+ device = luaL_checklstring(L, 1, &len); /* 1是参数的位置, len是string的长度 */
+ }
+
+ if (strcmp(device, "DS18B20") == 0) /* re,temp = read("DS18B20", 0) */
+ {
+ float ftemp;
+ uint8_t ch;
+ if (lua_type(L, 2) == LUA_TNUMBER) /* 判断第2个参数, 通道 */
+ {
+ ch = luaL_checknumber(L, 2);
+ }
+ else
+ {
+ ch = 0;
+ }
+
+ if (DS18B20_ReadTemp(ch, &ftemp) == 1) /* 正常返回温度值 */
+ {
+ lua_pushnumber(L, 1);
+ lua_pushnumber(L, ftemp);
+ return 2;
+ }
+ else
+ {
+ lua_pushnumber(L, 0);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: lua_WriteDev
+* 功能说明: 通用外设写
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static int lua_WriteDev(lua_State* L)
+{
+ const char *device;
+ size_t len;
+
+ if (lua_type(L, 1) == LUA_TSTRING) /* 判断第1个参数 */
+ {
+ device = luaL_checklstring(L, 1, &len); /* 1是参数的位置, len是string的长度 */
+ }
+
+ if (strcmp(device, "DS18B20") == 0) /* re,temp = read("DS18B20", 0) */
+ {
+ ;
+ }
+ return 0;
+}
+
/*
*********************************************************************************************************
* 函 数 名: lua_RegisterFunc
@@ -1039,7 +1129,10 @@ static void lua_RegisterFunc(void)
lua_register(g_Lua, "get_rng", get_rng);
lua_register(g_Lua, "crc32_stm32", crc32_stm32);
-
+
+ /* 读写2个通用函数 */
+ lua_register(g_Lua, "read", lua_ReadDev);
+ lua_register(g_Lua, "write", lua_WriteDev);
/* 注册接口函数 */
lua_gpio_RegisterFun();
diff --git a/User/lua/if/lua_if_dac.c b/User/lua/if/lua_if_dac.c
index 95401ef..1eb1441 100755
--- a/User/lua/if/lua_if_dac.c
+++ b/User/lua/if/lua_if_dac.c
@@ -50,7 +50,7 @@ static int lua_PowerOnDac(lua_State* L)
{
WriteRegValue_06H(REG03_DAC_WAVE_TYPE, 0); /* 直流 */
WriteRegValue_06H(REG03_DAC_WAVE_START, 1);
- return 1;
+ return 0;
}
/*
@@ -65,7 +65,7 @@ static int lua_PowerOffDac(lua_State* L)
{
WriteRegValue_06H(REG03_DAC_WAVE_TYPE, 0); /* 直流 */
WriteRegValue_06H(REG03_DAC_WAVE_START, 0);
- return 1;
+ return 0;
}
/*
@@ -87,7 +87,7 @@ static int lua_WriteDac(lua_State* L)
WriteRegValue_06H(REG03_OUT_VOLT_DAC, value);
- return 1;
+ return 0;
}
/*
@@ -109,7 +109,7 @@ static int lua_WriteVolt(lua_State* L)
WriteRegValue_06H(REG03_OUT_VOLT_MV, value);
- return 1;
+ return 0;
}
/*
@@ -132,7 +132,7 @@ static int lua_WriteCurr(lua_State* L)
WriteRegValue_06H(REG03_OUT_CURR_UA, value);
- return 1;
+ return 0;
}
/*
@@ -154,7 +154,7 @@ static int lua_WriteTvccDac(lua_State* L)
WriteRegValue_06H(REG03_OUT_TVCC_DAC, value);
- return 1;
+ return 0;
}
/*
@@ -176,7 +176,7 @@ static int lua_WriteTvccVolt(lua_State* L)
WriteRegValue_06H(REG03_OUT_TVCC_MV, value);
- return 1;
+ return 0;
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/lua/if/lua_if_swd.c b/User/lua/if/lua_if_swd.c
index c916db7..6b1f161 100755
--- a/User/lua/if/lua_if_swd.c
+++ b/User/lua/if/lua_if_swd.c
@@ -1,11 +1,24 @@
+/*
+*********************************************************************************************************
+*
+* 模块名称 : lua接口SWD烧录器器
+* 文件名称 : lua_if_swd.c
+* 版 本 : V1.0
+* 说 明 :
+* 修改记录 :
+* 版本号 日期 作者 说明
+* V1.0 2019-10-06 armfly 正式发布
+*
+* Copyright (C), 2019-2030, 安富莱电子 www.armfly.com
+*
+*********************************************************************************************************
+*/
+#include "includes.h"
+
#include "lauxlib.h"
#include "lualib.h"
#include "time.h"
-#include "lua_if.h"
-#include "bsp.h"
#include "elf_file.h"
-#include "file_lib.h"
-#include "prog_if.h"
#include "target_reset.h"
#include "target_config.h"
#include "swd_host.h"
@@ -20,7 +33,7 @@
#include "debug_cm.h"
#include "n76e003_flash.h"
#include "cx32_isp.h"
-
+#include "w25q_flash.h"
/* 为了避免和DAP驱动中的函数混淆,本模块函数名前缀用 h7swd */
@@ -240,9 +253,9 @@ static int h7swd_Init(lua_State* L)
N76E_EnterIAP(); /* 进入IAP状态 */
}
- else
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
{
- ;
+ W25Q_InitHard();
}
return 0;
@@ -258,44 +271,70 @@ static int h7swd_Init(lua_State* L)
*/
static int h7swd_ReadID(lua_State* L)
{
- uint32_t id;
- uint32_t id_buf[4];
+// uint32_t id;
+// uint32_t id_buf[4];
- if (g_tProg.ChipType == CHIP_SWD_ARM)
- {
- if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
- {
- if (MUL_swd_read_idcode(id_buf) == 0)
- {
- lua_pushnumber(L, 0); /* 出错 */
- }
- else
- {
- lua_pushnumber(L, id); /* 成功,返回ID */
- }
- }
- else
- {
- if (swd_read_idcode(&id) == 0)
- {
- lua_pushnumber(L, 0); /* 出错 */
- }
- else
- {
- lua_pushnumber(L, id); /* 成功,返回ID */
- }
- }
- }
- else if (g_tProg.ChipType == CHIP_SWIM_STM8)
- {
- id = 0x00000800; /* STM8没有ID, 填一个固定值 */
- lua_pushnumber(L, id); /* 成功,返回ID */
- }
- else
- {
- id = 0;
- lua_pushnumber(L, 0); /* 出错 */
- }
+// if (g_tProg.ChipType == CHIP_SWD_ARM)
+// {
+// if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+// {
+// if (MUL_swd_read_idcode(id_buf) == 0)
+// {
+// lua_pushnumber(L, 0); /* 出错 */
+// }
+// else
+// {
+// lua_pushnumber(L, id); /* 成功,返回ID */
+// }
+// }
+// else
+// {
+// if (swd_read_idcode(&id) == 0)
+// {
+// lua_pushnumber(L, 0); /* 出错 */
+// }
+// else
+// {
+// lua_pushnumber(L, id); /* 成功,返回ID */
+// }
+// }
+// }
+// else if (g_tProg.ChipType == CHIP_SWIM_STM8)
+// {
+// id = 0x00000800; /* STM8没有ID, 填一个固定值 */
+// lua_pushnumber(L, id); /* 成功,返回ID */
+// }
+// else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+// {
+// W25Q_DetectIC(id_buf);
+// if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+// {
+// if (MUL_swd_read_idcode(id_buf) == 0)
+// {
+// lua_pushnumber(L, 0); /* 出错 */
+// }
+// else
+// {
+// lua_pushnumber(L, id); /* 成功,返回ID */
+// }
+// }
+// else
+// {
+// if (swd_read_idcode(&id) == 0)
+// {
+// lua_pushnumber(L, 0); /* 出错 */
+// }
+// else
+// {
+// lua_pushnumber(L, id); /* 成功,返回ID */
+// }
+// }
+// }
+// else
+// {
+// id = 0;
+// lua_pushnumber(L, 0); /* 出错 */
+// }
return 1;
}
@@ -479,7 +518,42 @@ static int h7swd_ReadMemory(lua_State* L)
lua_pushlstring(L, (char *)s_lua_read_buf, num);
return 2;
- }
+ }
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ if (W25Q_ReadBuf(addr, s_lua_read_buf, num) == 0)
+ {
+ lua_pushnumber(L, 0); /* 出错 */
+ }
+ else
+ {
+ lua_pushnumber(L, 1); /* 成功 */
+ }
+
+ lua_pushlstring(L, (char *)s_lua_read_buf, num);
+ lua_pushlstring(L, (char *)(s_lua_read_buf + num), num);
+ lua_pushlstring(L, (char *)(s_lua_read_buf + 2 * num), num);
+ lua_pushlstring(L, (char *)(s_lua_read_buf + 3 * num), num);
+ return 5;
+ }
+ else
+ {
+ if (W25Q_ReadBuf(addr, s_lua_read_buf, num) == 0)
+ {
+ lua_pushnumber(L, 0); /* 出错 */
+ }
+ else
+ {
+ lua_pushnumber(L, 1); /* 成功 */
+ }
+
+ lua_pushlstring(L, (char *)s_lua_read_buf, num);
+
+ return 2;
+ }
+ }
else
{
lua_pushnumber(L, 0); /* 出错 */
@@ -1116,7 +1190,7 @@ static int h7_LoadAlgoFile(lua_State* L)
* 返 回 值: 0 失败 1 成功
*********************************************************************************************************
*/
-uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndAddr, uint32_t _CtrlByte,
+extern uint16_t PG_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndAddr, uint32_t _CtrlByte,
uint32_t _FileIndex, const char *_AlgoName);
static int h7_ProgFile(lua_State* L)
{
@@ -1217,7 +1291,7 @@ static int h7_ProgFile(lua_State* L)
}
else if (g_tProg.ChipType == CHIP_NUVOTON_8051)
{
- if (PG_N76E_ProgFile(file_name, FlashAddr, EndAddr, CtrlByte, FileIndex, AlgoName) == 0)
+ if (PG_ProgFile(file_name, FlashAddr, EndAddr, CtrlByte, FileIndex, AlgoName) == 0)
{
lua_pushnumber(L, 1); /*OK */
}
@@ -1226,6 +1300,17 @@ static int h7_ProgFile(lua_State* L)
lua_pushnumber(L, 0); /* 出错 */
}
}
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ if (PG_ProgFile(file_name, FlashAddr, EndAddr, CtrlByte, FileIndex, AlgoName) == 0)
+ {
+ lua_pushnumber(L, 1); /*OK */
+ }
+ else
+ {
+ lua_pushnumber(L, 0); /* 出错 */
+ }
+ }
else
{
lua_pushnumber(L, 0); /* 出错 */
@@ -1374,7 +1459,7 @@ static int h7_reset_pin(lua_State* L)
static int h7_DetectIC(lua_State* L)
{
uint32_t mode = 0;
-
+
if (lua_type(L, 1) == LUA_TNUMBER) /* 判断第1个参数 */
{
mode = luaL_checknumber(L, 1); /* 1表示仅用于检测芯片插入状态, 无需检测3次 */
@@ -1469,7 +1554,28 @@ static int h7_DetectIC(lua_State* L)
}
lua_pushnumber(L, id); /* 成功,返回ID */
return 1;
- }
+ }
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ uint32_t id[4];
+
+ W25Q_InitHard();
+ W25Q_DetectIC(id);
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ lua_pushnumber(L, id[0]); /* 成功,返回ID */
+ lua_pushnumber(L, id[1]); /* 成功,返回ID */
+ lua_pushnumber(L, id[2]); /* 成功,返回ID */
+ lua_pushnumber(L, id[3]); /* 成功,返回ID */
+ return 4;
+ }
+ else
+ {
+ lua_pushnumber(L, id[0]); /* 成功,返回ID */
+ return 1;
+ }
+ }
+
lua_pushnumber(L, -1); /* 失败 */
return 1;
}
@@ -2021,6 +2127,17 @@ static int h7_EraseSector(lua_State* L)
lua_pushnumber(L, 1); /* 成功 */
}
}
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ if (W25Q_EraseSector(FlashAddr) == 0)
+ {
+ lua_pushnumber(L, 0); /* 出错 */
+ }
+ else
+ {
+ lua_pushnumber(L, 1); /* 成功 */
+ }
+ }
else
{
lua_pushnumber(L, 0); /* 出错 */
diff --git a/User/lwip_if/lwip_user.c b/User/lwip_if/lwip_user.c
index cefdc64..bb3d534 100755
--- a/User/lwip_if/lwip_user.c
+++ b/User/lwip_if/lwip_user.c
@@ -38,7 +38,7 @@
#include "lwip_user.h"
#include "net_udp.h"
-static uint8_t s_init_lwip_ok = 0;
+static uint8_t s_lwip_status = 0;
struct netif gnetif;
@@ -72,34 +72,6 @@ static void Netif_Config(void)
#endif
}
-/*
-*********************************************************************************************************
-* 函 数 名: lwip_start
-* 功能说明: 启动lwip_start, 网络参数存在在全局变量 g_tParam.lwip_ip, g_tParam.lwip_net_mask,
-* g_tParam.lwip_gateway
-* 形 参: 无
-* 返 回 值: 无
-*********************************************************************************************************
-*/
-void lwip_start(void)
-{
- /* Initialize the LwIP stack */
- lwip_init();
-
- /* Configure the Network interface */
- Netif_Config();
-
- /* Http webserver Init */
- http_server_init();
-
- /* tcp server init */
- tcp_echoserver_init();
-
- udp_server_init(); /* 开启UDP监听 */
-
- s_init_lwip_ok = 1;
-}
-
/*
*********************************************************************************************************
* 函 数 名: lwip_pro
@@ -110,25 +82,48 @@ void lwip_start(void)
*/
void lwip_pro(void)
{
- if (s_init_lwip_ok == 0)
- {
- return;
+ switch (s_lwip_status)
+ {
+ case 0:
+ lwip_init(); /* Initialize the LwIP stack */
+ s_lwip_status++;
+ break;
+
+ case 1:
+ /* Configure the Network interface */
+ Netif_Config();
+ s_lwip_status++;
+ break;
+
+ case 2:
+ /* Http webserver Init */
+ http_server_init();
+
+ /* tcp server init */
+ tcp_echoserver_init();
+
+ udp_server_init(); /* 开启UDP监听 */
+
+ s_lwip_status = 10;
+ break;
+
+ case 10:
+ /* Read a received packet from the Ethernet buffers and send it
+ to the lwIP for handling */
+ ethernetif_input(&gnetif);
+
+ /* Handle timeouts */
+ sys_check_timeouts();
+
+ #if LWIP_NETIF_LINK_CALLBACK
+ Ethernet_Link_Periodic_Handle(&gnetif);
+ #endif
+
+ #if LWIP_DHCP
+ DHCP_Periodic_Handle(&gnetif);
+ #endif
+ break;
}
-
- /* Read a received packet from the Ethernet buffers and send it
- to the lwIP for handling */
- ethernetif_input(&gnetif);
-
- /* Handle timeouts */
- sys_check_timeouts();
-
-#if LWIP_NETIF_LINK_CALLBACK
- Ethernet_Link_Periodic_Handle(&gnetif);
-#endif
-
-#if LWIP_DHCP
- DHCP_Periodic_Handle(&gnetif);
-#endif
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/modbus/modbus_reg_addr.h b/User/modbus/modbus_reg_addr.h
index b52239e..c6a7f54 100755
--- a/User/modbus/modbus_reg_addr.h
+++ b/User/modbus/modbus_reg_addr.h
@@ -63,7 +63,7 @@ AI : 示波器 CH1 均值, mV单位
#define REG03_DEV_ID5 0x0005
#define REG03_HARD_MODEL 0x0006 /* 硬件型号(只读),内部型号代码 0750 */
-#define REG03_APP_VER 0x0007 /* APP固件版本,0x0102 表示V1.02 */
+#define REG03_APP_VER 0x0007 /* APP固件版本,0x0102 表示V1.02 */
#define REG03_X15_00 0x0008 /* DI的实时状态(只读),Bit0表示D0通道,Bit15表示D15通道 */
#define REG03_X31_16 0x0009 /* DI的实时状态(只读), */
@@ -83,38 +83,38 @@ AI : 示波器 CH1 均值, mV单位
AN_USB_VOLT, /* USB供电电压检测 */
#endif
/* 校准后的模拟量 */
-#define REG03_AI_CH1 0x000C /* 4字节浮点数, 示波器CH1通道电压值均值,单位V */
-#define REG03_AI_CH2 0x000E /* 4字节浮点数, 示波器CH2通道电压值均值,单位V */
-#define REG03_AI_HIGH_SIDE_VOLT 0x0010 /* 4字节浮点数, 高端电流检测-电压值 均值,单位V */
-#define REG03_AI_HIGH_SIDE_CURR 0x0012 /* 4字节浮点数, 高端电流检测-电流值 均值, 单位A */
-#define REG03_AI_TVCC_VOLT 0x0014 /* 4字节浮点数, 目标板电压 均值, 单位V */
-#define REG03_AI_TVCC_CURR 0x0016 /* 4字节浮点数, 目标板电压 均值, 单位V */
-#define REG03_AI_NTC_RES 0x0018 /* NTC热敏电阻阻值检测, 单位欧姆 */
-#define REG03_AI_NTC_TEMP 0x001A /* 4字节浮点数 NTC温度(换算后) */
-#define REG03_AI_USB_5V 0x001C /* 4字节浮点数, USB 5V电压 均值, 单位V */
-#define REG03_AI_EXT_POWER 0x001E /* 4字节浮点数, 外部12V电源电压均值, 单位V */
+#define REG03_AI_CH1 0x000C /* 4字节浮点数, 示波器CH1通道电压值均值,单位V */
+#define REG03_AI_CH2 0x000E /* 4字节浮点数, 示波器CH2通道电压值均值,单位V */
+#define REG03_AI_HIGH_SIDE_VOLT 0x0010 /* 4字节浮点数, 高端电流检测-电压值 均值,单位V */
+#define REG03_AI_HIGH_SIDE_CURR 0x0012 /* 4字节浮点数, 高端电流检测-电流值 均值, 单位A */
+#define REG03_AI_TVCC_VOLT 0x0014 /* 4字节浮点数, 目标板电压 均值, 单位V */
+#define REG03_AI_TVCC_CURR 0x0016 /* 4字节浮点数, 目标板电压 均值, 单位V */
+#define REG03_AI_NTC_RES 0x0018 /* NTC热敏电阻阻值检测, 单位欧姆 */
+#define REG03_AI_NTC_TEMP 0x001A /* 4字节浮点数 NTC温度(换算后) */
+#define REG03_AI_USB_5V 0x001C /* 4字节浮点数, USB 5V电压 均值, 单位V */
+#define REG03_AI_EXT_POWER 0x001E /* 4字节浮点数, 外部12V电源电压均值, 单位V */
/* 空挡预留 */
-#define REG03_ADC_CH1 0x0040 /* 4字节浮点数, 示波器CH1通道 adc 均值 */
-#define REG03_ADC_CH2 0x0042 /* 4字节浮点数, 示波器CH2通道 adc 均值 */
-#define REG03_ADC_HIGH_SIDE_VOLT 0x0044 /* 4字节浮点数, 高端电流检测-电压值 adc 均值 */
-#define REG03_ADC_HIGH_SIDE_CURR 0x0046 /* 4字节浮点数, 高端电流检测-电流值 adc 均值 */
-#define REG03_ADC_TVCC_VOLT 0x0048 /* 4字节浮点数, 目标板电压 adc 均值 */
-#define REG03_ADC_TVCC_CURR 0x004A /* 4字节浮点数, 目标板电压 adc 均值 */
-#define REG03_ADC_NTC_RES 0x004C /* NTC热敏电阻阻值检测 adc 均值*/
-#define REG03_ADC_USB_5V 0x004E /* 4字节浮点数, USB 5V电压 adc 均值 */
-#define REG03_ADC_EXT_POWER 0x0050 /* 4字节浮点数, 外部12V电源电压 adc 均值 */
-#define REG03_ADC_PF4 0x0052 /* 保留单元 */
+#define REG03_ADC_CH1 0x0040 /* 4字节浮点数, 示波器CH1通道 adc 均值 */
+#define REG03_ADC_CH2 0x0042 /* 4字节浮点数, 示波器CH2通道 adc 均值 */
+#define REG03_ADC_HIGH_SIDE_VOLT 0x0044 /* 4字节浮点数, 高端电流检测-电压值 adc 均值 */
+#define REG03_ADC_HIGH_SIDE_CURR 0x0046 /* 4字节浮点数, 高端电流检测-电流值 adc 均值 */
+#define REG03_ADC_TVCC_VOLT 0x0048 /* 4字节浮点数, 目标板电压 adc 均值 */
+#define REG03_ADC_TVCC_CURR 0x004A /* 4字节浮点数, 目标板电压 adc 均值 */
+#define REG03_ADC_NTC_RES 0x004C /* NTC热敏电阻阻值检测 adc 均值*/
+#define REG03_ADC_USB_5V 0x004E /* 4字节浮点数, USB 5V电压 adc 均值 */
+#define REG03_ADC_EXT_POWER 0x0050 /* 4字节浮点数, 外部12V电源电压 adc 均值 */
+#define REG03_ADC_PF4 0x0052 /* 保留单元 */
-#define REG03_OUT_VOLT_DAC 0x0080 /* 2字节整数 设置输出电压的 DAC值 */
-#define REG03_OUT_VOLT_MV 0x0081 /* 2字节整数 设置输出电压的 mV值 */
+#define REG03_OUT_VOLT_DAC 0x0080 /* 2字节整数 设置输出电压的 DAC值 */
+#define REG03_OUT_VOLT_MV 0x0081 /* 2字节整数 设置输出电压的 mV值 */
-#define REG03_OUT_CURR_DAC 0x0082 /* 2字节整数 设置输出电流的 DAC值 */
-#define REG03_OUT_CURR_UA 0x0083 /* 2字节整数 设置输出电流的 uA值 */
+#define REG03_OUT_CURR_DAC 0x0082 /* 2字节整数 设置输出电流的 DAC值 */
+#define REG03_OUT_CURR_UA 0x0083 /* 2字节整数 设置输出电流的 uA值 */
-#define REG03_OUT_TVCC_DAC 0x0084 /* 2字节整数 设置TVCC电压的档位值(0-127) */
-#define REG03_OUT_TVCC_MV 0x0085 /* 2字节整数 mV值 1260 - 5000mV */
+#define REG03_OUT_TVCC_DAC 0x0084 /* 2字节整数 设置TVCC电压的档位值(0-127) */
+#define REG03_OUT_TVCC_MV 0x0085 /* 2字节整数 mV值 1260 - 5000mV */
/* 空挡预留 */
@@ -124,127 +124,127 @@ AI : 示波器 CH1 均值, mV单位
2:输出方波
3:输出三角波
*/
-#define REG03_DAC_WAVE_VOLT_RANGE 0x0100 /* 电压量程,保留不用。固定正负10V */
-#define REG03_DAC_WAVE_TYPE 0x0101 /* DAC波形类型 */
-#define REG03_DAC_WAVE_VOLT_MIN 0x0102 /* 波形最小电压,mV */
-#define REG03_DAC_WAVE_VOLT_MAX 0x0103 /* 波形最大电压,mV */
-#define REG03_DAC_WAVE_FREQ 0x0104 /* 32bit 波形频率,Hz */
-#define REG03_DAC_WAVE_FREQ_Low 0x0105 /* 32bit 波形频率,Hz */
-#define REG03_DAC_WAVE_DUTY 0x0106 /* 波形占空比 百分比 */
-#define REG03_DAC_WAVE_COUNT_SET 0x0107 /* 32bit 波形个数设置 高16bit */
-#define REG03_DAC_WAVE_COUNT_SET0 0x0108 /* 32bit 波形个数设置 低16bit */
-#define REG03_DAC_WAVE_START 0x0109 /* DAC波形启动停止控制 */
+#define REG03_DAC_WAVE_VOLT_RANGE 0x0100 /* 电压量程,保留不用。固定正负10V */
+#define REG03_DAC_WAVE_TYPE 0x0101 /* DAC波形类型 */
+#define REG03_DAC_WAVE_VOLT_MIN 0x0102 /* 波形最小电压,mV */
+#define REG03_DAC_WAVE_VOLT_MAX 0x0103 /* 波形最大电压,mV */
+#define REG03_DAC_WAVE_FREQ 0x0104 /* 32bit 波形频率,Hz */
+#define REG03_DAC_WAVE_FREQ_Low 0x0105 /* 32bit 波形频率,Hz */
+#define REG03_DAC_WAVE_DUTY 0x0106 /* 波形占空比 百分比 */
+#define REG03_DAC_WAVE_COUNT_SET 0x0107 /* 32bit 波形个数设置 高16bit */
+#define REG03_DAC_WAVE_COUNT_SET0 0x0108 /* 32bit 波形个数设置 低16bit */
+#define REG03_DAC_WAVE_START 0x0109 /* DAC波形启动停止控制 */
/* 空挡保留未用 */
-#define REG03_D0_GPIO_MODE 0x0140 /* DO口的GPIO模式 - 0=输入,1=输出 2=其他特殊功能 */
-#define REG03_D1_GPIO_MODE 0x0141
-#define REG03_D2_GPIO_MODE 0x0142
-#define REG03_D3_GPIO_MODE 0x0143
-#define REG03_D4_GPIO_MODE 0x0144
-#define REG03_D5_GPIO_MODE 0x0145
-#define REG03_D6_GPIO_MODE 0x0146
-#define REG03_D7_GPIO_MODE 0x0147
-#define REG03_D8_GPIO_MODE 0x0148
-#define REG03_D9_GPIO_MODE 0x0149
+#define REG03_D0_GPIO_MODE 0x0140 /* DO口的GPIO模式 - 0=输入,1=输出 2=其他特殊功能 */
+#define REG03_D1_GPIO_MODE 0x0141
+#define REG03_D2_GPIO_MODE 0x0142
+#define REG03_D3_GPIO_MODE 0x0143
+#define REG03_D4_GPIO_MODE 0x0144
+#define REG03_D5_GPIO_MODE 0x0145
+#define REG03_D6_GPIO_MODE 0x0146
+#define REG03_D7_GPIO_MODE 0x0147
+#define REG03_D8_GPIO_MODE 0x0148
+#define REG03_D9_GPIO_MODE 0x0149
-#define REG03_D10_GPIO_MODE 0x014A /* TTL-TX */
-#define REG03_D11_GPIO_MODE 0x014B /* TTL-RX */
-#define REG03_D12_GPIO_MODE 0x014C /* CAN-TX */
-#define REG03_D13_GPIO_MODE 0x014D /* CAN-RX */
+#define REG03_D10_GPIO_MODE 0x014A /* TTL-TX */
+#define REG03_D11_GPIO_MODE 0x014B /* TTL-RX */
+#define REG03_D12_GPIO_MODE 0x014C /* CAN-TX */
+#define REG03_D13_GPIO_MODE 0x014D /* CAN-RX */
/* 空挡保留未用 */
-#define REG03_RTC_YEAR 0x0180 /* 设备时钟 */
-#define REG03_RTC_MON 0x0181
-#define REG03_RTC_DAY 0x0182
-#define REG03_RTC_HOUR 0x0183
-#define REG03_RTC_MIN 0x0184
-#define REG03_RTC_SEC 0x0185
+#define REG03_RTC_YEAR 0x0180 /* 设备时钟 */
+#define REG03_RTC_MON 0x0181
+#define REG03_RTC_DAY 0x0182
+#define REG03_RTC_HOUR 0x0183
+#define REG03_RTC_MIN 0x0184
+#define REG03_RTC_SEC 0x0185
-#define REG03_NTC_COEF_K 0x0186 /* NTC温度传感器温度修正公式 y = kx + b 之K值 浮点 缺省 = 1 */
-#define REG03_NTC_COEF_B 0x0187 /* NTC温度传感器温度修正公式 y = kx + b 之B值 浮点 缺省 = 0 */
+#define REG03_NTC_COEF_K 0x0186 /* NTC温度传感器温度修正公式 y = kx + b 之K值 浮点 缺省 = 1 */
+#define REG03_NTC_COEF_B 0x0187 /* NTC温度传感器温度修正公式 y = kx + b 之B值 浮点 缺省 = 0 */
/* ADC 示波器控制 */
-#define REG03_DSO_MEASURE_MODE 0x01FF /* 1表示电流检测模式 */
-#define REG03_CH1_DC 0x0200 /* CH1通道,AC/DC耦合切换 1表示DC */
-#define REG03_CH2_DC 0x0201 /* CH2通道,AC/DC耦合切换 */
-#define REG03_CH1_GAIN 0x0202 /* CH1通道,增益切换0-3 */
-#define REG03_CH2_GAIN 0x0203 /* CH2通道,增益切换0-3 */
-#define REG03_CH1_OFFSET 0x0204 /* CH1通道,直流偏值(0-2500mV 保留,不支持) */
-#define REG03_CH2_OFFSET 0x0205 /* CH2通道,直流偏值(0-2500mV 保留,不支持) */
-#define REG03_DSO_FREQ_ID 0x0206 /* 示波器采样频率档位 */
-#define DSO_FREQ_100 0
-#define DSO_FREQ_200 1
-#define DSO_FREQ_500 2
-#define DSO_FREQ_1K 3
-#define DSO_FREQ_2K 4
-#define DSO_FREQ_5K 5
-#define DSO_FREQ_10K 6
-#define DSO_FREQ_20K 7
-#define DSO_FREQ_50K 8
-#define DSO_FREQ_100K 9
-#define DSO_FREQ_200K 10
-#define DSO_FREQ_500K 11
-#define DSO_FREQ_1M 12
-#define DSO_FREQ_2M 13
-#define DSO_FREQ_5M 14
-#define DSO_FREQ_10M 15
-#define DSO_FREQ_20M 16
+#define REG03_DSO_MEASURE_MODE 0x01FF /* 1表示电流检测模式 */
+#define REG03_CH1_DC 0x0200 /* CH1通道,AC/DC耦合切换 1表示DC */
+#define REG03_CH2_DC 0x0201 /* CH2通道,AC/DC耦合切换 */
+#define REG03_CH1_GAIN 0x0202 /* CH1通道,增益切换0-7 */
+#define REG03_CH2_GAIN 0x0203 /* CH2通道,增益切换0-7 */
+#define REG03_CH1_OFFSET 0x0204 /* CH1通道,直流偏值(0-2500mV 保留,不支持) */
+#define REG03_CH2_OFFSET 0x0205 /* CH2通道,直流偏值(0-2500mV 保留,不支持) */
+#define REG03_DSO_FREQ_ID 0x0206 /* 示波器采样频率档位 */
+ #define DSO_FREQ_100 0
+ #define DSO_FREQ_200 1
+ #define DSO_FREQ_500 2
+ #define DSO_FREQ_1K 3
+ #define DSO_FREQ_2K 4
+ #define DSO_FREQ_5K 5
+ #define DSO_FREQ_10K 6
+ #define DSO_FREQ_20K 7
+ #define DSO_FREQ_50K 8
+ #define DSO_FREQ_100K 9
+ #define DSO_FREQ_200K 10
+ #define DSO_FREQ_500K 11
+ #define DSO_FREQ_1M 12
+ #define DSO_FREQ_2M 13
+ #define DSO_FREQ_5M 14
+ #define DSO_FREQ_10M 15
+ #define DSO_FREQ_20M 16
#define REG03_DSO_SAMPLE_SIZE 0x0207 /* 采样深度档位 */
-#define DSO_SIZE_1K 0
-#define DSO_SIZE_2K 1
-#define DSO_SIZE_4K 2
-#define DSO_SIZE_8K 3
-#define DSO_SIZE_16K 4
-#define DSO_SIZE_32K 5
-// #define DSO_SIZE_64K 6 /* 后面暂时不支持 */
-// #define DSO_SIZE_128K 7
-// #define DSO_FREQ_512K 8
-#define DSO_SIZE_MAX DSO_SIZE_32K
+ #define DSO_SIZE_1K 0
+ #define DSO_SIZE_2K 1
+ #define DSO_SIZE_4K 2
+ #define DSO_SIZE_8K 3
+ #define DSO_SIZE_16K 4
+ #define DSO_SIZE_32K 5
+ // #define DSO_SIZE_64K 6 /* 后面暂时不支持 */
+ // #define DSO_SIZE_128K 7
+ // #define DSO_FREQ_512K 8
+ #define DSO_SIZE_MAX DSO_SIZE_32K
-#define REG03_DSO_TRIG_LEVEL 0x0208 /* 触发电平,0-65535 */
-#define REG03_DSO_TRIG_POS 0x0209 /* 触发位置 0-100 百分比 */
-#define REG03_DSO_TRIG_MODE 0x020A /* 触发模式 0=自动 1=普通 2=单次 */
-#define REG03_DSO_TRIG_CHAN 0x020B /* 触发通道 0=CH1 1=CH2*/
-#define REG03_DSO_TRIG_EDGE 0x020C /* 触发边沿 0下降 1上升 */
-#define REG03_DSO_CHAN_EN 0x020D /* 通道使能控制 bit0 = CH1 bit1 = CH2 bit2 = CH2 - CH1 */
-#define REG03_DSO_RUN 0x020E /* 示波器采集控制,0:停止 1: 启动 */
+#define REG03_DSO_TRIG_LEVEL 0x0208 /* 触发电平,0-65535 */
+#define REG03_DSO_TRIG_POS 0x0209 /* 触发位置 0-100 百分比 */
+#define REG03_DSO_TRIG_MODE 0x020A /* 触发模式 0=自动 1=普通 2=单次 */
+#define REG03_DSO_TRIG_CHAN 0x020B /* 触发通道 0=CH1 1=CH2*/
+#define REG03_DSO_TRIG_EDGE 0x020C /* 触发边沿 0下降 1上升 */
+#define REG03_DSO_CHAN_EN 0x020D /* 通道使能控制 bit0 = CH1 bit1 = CH2 bit2 = CH2 - CH1 */
+#define REG03_DSO_RUN 0x020E /* 示波器采集控制,0:停止 1: 启动 */
-#define REG03_DSO_CURR_GAIN 0x0211 /* 0表示100mA, 1表示1A量程 */
+#define REG03_DSO_CURR_GAIN 0x0211 /* 0表示100mA, 1表示1A量程 */
-#define REG03_WAVE_LOCK 0x021C /* 波形锁定,等待读取 */
+#define REG03_WAVE_LOCK 0x021C /* 波形锁定,等待读取 */
-#define REG03_LUA_CMD 0x0300 /* LUA控制指令 */
-#define REG03_LUA_STATE 0x0301 /* LUA程序状态 */
+#define REG03_LUA_CMD 0x0300 /* LUA控制指令 */
+#define REG03_LUA_STATE 0x0301 /* LUA程序状态 */
-#define REG03_WORK_MODE 0x1000 /* 终端工作模式。1 :常规工作模式。其他值:保留做其他应用 */
-#define REG03_RS485_ADDR 0x1001 /* 本机RS485 MODBUS地址(1-254)*/
-#define REG03_RS485_BAUD 0x1002 /* RS485波特率(0:1200 , 1:2400,2 : 4800,3 : 9600 , 4:19200 , 5:38400,6:57600,7:115200)*/
-#define REG03_RS485_PARITY 0x1003 /* RS485奇偶校验位(0:无奇偶校验, 1:奇校验,2:偶校验)*/
+#define REG03_WORK_MODE 0x1000 /* 终端工作模式。1 :常规工作模式。其他值:保留做其他应用 */
+#define REG03_RS485_ADDR 0x1001 /* 本机RS485 MODBUS地址(1-254)*/
+#define REG03_RS485_BAUD 0x1002 /* RS485波特率(0:1200 , 1:2400,2 : 4800,3 : 9600 , 4:19200 , 5:38400,6:57600,7:115200)*/
+#define REG03_RS485_PARITY 0x1003 /* RS485奇偶校验位(0:无奇偶校验, 1:奇校验,2:偶校验)*/
-#define REG03_IPAddr_Format 0x1100 /*以太网IP地址格式。IPv4或IPv6 0 表示IPv4 1 表示IPv6*/
-#define REG03_DHCP 0x1101 /*以太网DHCP设置。0表示禁止,1表示启用。*/
-#define REG03_LocalIPAddr_H 0x1102 /*IPv4本机IP地址(静态地址),4字节。缺省 192.168.1.105*/
-#define REG03_LocalIPAddr_L 0x1103 /*IPv4本机IP地址(静态地址),4字节。缺省 192.168.1.105*/
-#define REG03_GatewayAddr_H 0x1104 /*IPv4网关地址,4字节。缺省192.168.1.1*/
-#define REG03_GatewayAddr_L 0x1105 /*IPv4网关地址,4字节。缺省192.168.1.1*/
-#define REG03_SubMask_H 0x1106 /*IPv4子网掩码,4字节。缺省255.255.255.0*/
-#define REG03_SubMask_L 0x1107 /*IPv4子网掩码,4字节。缺省255.255.255.0*/
-#define REG03_TCP_PORT 0x1108 /*本机TCP服务端口号,缺省值30010*/
-#define REG03_MAC12 0x1109 /*MAC地址1,2字节*/
-#define REG03_MAC34 0x110A /*MAC地址3,4字节*/
-#define REG03_MAC56 0x110B /*MAC地址5,6字节*/
+#define REG03_IPAddr_Format 0x1100 /*以太网IP地址格式。IPv4或IPv6 0 表示IPv4 1 表示IPv6*/
+#define REG03_DHCP 0x1101 /*以太网DHCP设置。0表示禁止,1表示启用。*/
+#define REG03_LocalIPAddr_H 0x1102 /*IPv4本机IP地址(静态地址),4字节。缺省 192.168.1.105*/
+#define REG03_LocalIPAddr_L 0x1103 /*IPv4本机IP地址(静态地址),4字节。缺省 192.168.1.105*/
+#define REG03_GatewayAddr_H 0x1104 /*IPv4网关地址,4字节。缺省192.168.1.1*/
+#define REG03_GatewayAddr_L 0x1105 /*IPv4网关地址,4字节。缺省192.168.1.1*/
+#define REG03_SubMask_H 0x1106 /*IPv4子网掩码,4字节。缺省255.255.255.0*/
+#define REG03_SubMask_L 0x1107 /*IPv4子网掩码,4字节。缺省255.255.255.0*/
+#define REG03_TCP_PORT 0x1108 /*本机TCP服务端口号,缺省值30010*/
+#define REG03_MAC12 0x1109 /*MAC地址1,2字节*/
+#define REG03_MAC34 0x110A /*MAC地址3,4字节*/
+#define REG03_MAC56 0x110B /*MAC地址5,6字节*/
/* 用于读取波形数据的寄存器入口 */
-#define REG03_CH1_WAVE_0 0x2000 /* CH1波形数据 入口寄存器。 特殊处理,1K整数字节读取 */
-#define REG03_CH1_WAVE_1 0x2001 /* CH1波形数据 第2段 1K字节 */
-#define REG03_CH1_WAVE_2 0x2002 /* CH1波形数据 第3段 1K字节 */
-#define REG03_CH1_WAVE_END 0x2FFF /* CH1波形数据 第4096段 1K字节 */
+#define REG03_CH1_WAVE_0 0x2000 /* CH1波形数据 入口寄存器。 特殊处理,1K整数字节读取 */
+#define REG03_CH1_WAVE_1 0x2001 /* CH1波形数据 第2段 1K字节 */
+#define REG03_CH1_WAVE_2 0x2002 /* CH1波形数据 第3段 1K字节 */
+#define REG03_CH1_WAVE_END 0x2FFF /* CH1波形数据 第4096段 1K字节 */
-#define REG03_CH2_WAVE_0 0x4000 /* CH2波形数据 入口寄存器。 特殊处理,1K整数字节读取 */
-#define REG03_CH2_WAVE_END 0x4FFF /* CH2波形数据 入口寄存器。 特殊处理,1K整数字节读取 */
+#define REG03_CH2_WAVE_0 0x4000 /* CH2波形数据 入口寄存器。 特殊处理,1K整数字节读取 */
+#define REG03_CH2_WAVE_END 0x4FFF /* CH2波形数据 入口寄存器。 特殊处理,1K整数字节读取 */
/********************************** 校准参数 ***********************************/
/* 校准开关,
@@ -256,29 +256,29 @@ AI : 示波器 CH1 均值, mV单位
#define REG03_CALIB_KEY 0xBFFF
/* 输入模拟量校准 */
-#define REG03_CALIB_CH1_R1_X1 0xC000 /* CH1 X1档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
-#define REG03_CALIB_CH1_R1_Y1 0xC002
-#define REG03_CALIB_CH1_R1_X2 0xC004
-#define REG03_CALIB_CH1_R1_Y2 0xC006
-#define REG03_CALIB_CH1_R2_X1 0xC008 /* CH1 X2档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
-#define REG03_CALIB_CH1_R3_X1 0xC010 /* CH1 X4档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
-#define REG03_CALIB_CH1_R4_X1 0xC018 /* CH1 X8档位 校准参数 */
-#define REG03_CALIB_CH1_R5_X1 0xC020 /* CH1 X16档位 校准参数 */
-#define REG03_CALIB_CH1_R6_X1 0xC028 /* CH1 X32档位 校准参数 */
-#define REG03_CALIB_CH1_R7_X1 0xC030 /* CH1 X64档位 校准参数 */
-#define REG03_CALIB_CH1_R8_X1 0xC038 /* CH1 X128档位 校准参数 */
+#define REG03_CALIB_CH1_R1_X1 0xC000 /* CH1 X1档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
+#define REG03_CALIB_CH1_R1_Y1 0xC002
+#define REG03_CALIB_CH1_R1_X2 0xC004
+#define REG03_CALIB_CH1_R1_Y2 0xC006
+#define REG03_CALIB_CH1_R2_X1 0xC008 /* CH1 X2档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
+#define REG03_CALIB_CH1_R3_X1 0xC010 /* CH1 X4档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
+#define REG03_CALIB_CH1_R4_X1 0xC018 /* CH1 X8档位 校准参数 */
+#define REG03_CALIB_CH1_R5_X1 0xC020 /* CH1 X16档位 校准参数 */
+#define REG03_CALIB_CH1_R6_X1 0xC028 /* CH1 X32档位 校准参数 */
+#define REG03_CALIB_CH1_R7_X1 0xC030 /* CH1 X64档位 校准参数 */
+#define REG03_CALIB_CH1_R8_X1 0xC038 /* CH1 X128档位 校准参数 */
-#define REG03_CALIB_CH2_R1_X1 0xC040 /* CH2 X1档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
-#define REG03_CALIB_CH2_R1_Y1 0xC042
-#define REG03_CALIB_CH2_R1_X2 0xC044
-#define REG03_CALIB_CH2_R1_Y2 0xC046
-#define REG03_CALIB_CH2_R2_X1 0xC048 /* CH2 X2档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
-#define REG03_CALIB_CH2_R3_X1 0xC050 /* CH2 X4档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
-#define REG03_CALIB_CH2_R4_X1 0xC058 /* CH2 X8档位 校准参数 */
-#define REG03_CALIB_CH2_R5_X1 0xC060 /* CH2 X16档位 校准参数 */
-#define REG03_CALIB_CH2_R6_X1 0xC068 /* CH2 X32档位 校准参数 */
-#define REG03_CALIB_CH2_R7_X1 0xC070 /* CH2 X64档位 校准参数 */
-#define REG03_CALIB_CH2_R8_X1 0xC078 /* CH2 X128档位 校准参数 */
+#define REG03_CALIB_CH2_R1_X1 0xC040 /* CH2 X1档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
+#define REG03_CALIB_CH2_R1_Y1 0xC042
+#define REG03_CALIB_CH2_R1_X2 0xC044
+#define REG03_CALIB_CH2_R1_Y2 0xC046
+#define REG03_CALIB_CH2_R2_X1 0xC048 /* CH2 X2档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
+#define REG03_CALIB_CH2_R3_X1 0xC050 /* CH2 X4档位 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
+#define REG03_CALIB_CH2_R4_X1 0xC058 /* CH2 X8档位 校准参数 */
+#define REG03_CALIB_CH2_R5_X1 0xC060 /* CH2 X16档位 校准参数 */
+#define REG03_CALIB_CH2_R6_X1 0xC068 /* CH2 X32档位 校准参数 */
+#define REG03_CALIB_CH2_R7_X1 0xC070 /* CH2 X64档位 校准参数 */
+#define REG03_CALIB_CH2_R8_X1 0xC078 /* CH2 X128档位 校准参数 */
#define REG03_CALIB_LOAD_VOLT_X1 0xC080 /* 高端电流检测-电压值 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
#define REG03_CALIB_LOAD_VOLT_Y1 0xC082
@@ -341,67 +341,67 @@ AI : 示波器 CH1 均值, mV单位
#define REG03_CALIB_DAC_CURR_X4 0xC0D6
#define REG03_CALIB_DAC_CURR_Y4 0xC0D7
-#define REG03_CALIB_NTC_RES_X1 0xC0D8 /* NTC电阻 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
-#define REG03_CALIB_NTC_RES_Y1 0xC0DA
-#define REG03_CALIB_NTC_RES_X2 0xC0DC
-#define REG03_CALIB_NTC_RES_Y2 0xC0DE
-#define REG03_CALIB_NTC_RES_X3 0xC0E0
-#define REG03_CALIB_NTC_RES_Y3 0xC0E2
-#define REG03_CALIB_NTC_RES_X4 0xC0E4
-#define REG03_CALIB_NTC_RES_Y4 0xC0E6
+#define REG03_CALIB_NTC_RES_X1 0xC0D8 /* NTC电阻 校准参数,X1 Y1 X2 Y2 均为浮点数. 每个浮点数占用2个寄存器 */
+#define REG03_CALIB_NTC_RES_Y1 0xC0DA
+#define REG03_CALIB_NTC_RES_X2 0xC0DC
+#define REG03_CALIB_NTC_RES_Y2 0xC0DE
+#define REG03_CALIB_NTC_RES_X3 0xC0E0
+#define REG03_CALIB_NTC_RES_Y3 0xC0E2
+#define REG03_CALIB_NTC_RES_X4 0xC0E4
+#define REG03_CALIB_NTC_RES_Y4 0xC0E6
#define REG03_CALIB_PARAM_END REG03_CALIB_NTC_RES_Y4 + 1 /* 校准参数如最后1个寄存器 */
#define REG03_BOOT_VER 0xE000 /* BOOT 固件版本,0x0102 表示V1.02 */
/* 重映射部分寄存器,专用于UDP网路搜索 */
-#define REG03_NET_CPU_ID0 0xFF00
-#define REG03_NET_CPU_ID1 0xFF01
-#define REG03_NET_CPU_ID2 0xFF02
-#define REG03_NET_CPU_ID3 0xFF03
-#define REG03_NET_CPU_ID4 0xFF04
-#define REG03_NET_CPU_ID5 0xFF05
-#define REG03_NET_HARD_VER 0xFF06 /* 硬件型号(只读),内部型号代码,非型号全称,0xC200 表示TC200*/
-#define REG03_NET_SOFT_VER 0xFF07 /* 硬件版本(只读),如0x0100,表示H1.00 */
-#define REG03_NET_MAC12 0xFF08 /* MAC */
-#define REG03_NET_MAC34 0xFF09 /* MAC */
-#define REG03_NET_MAC56 0xFF0A /* MAC */
-#define REG03_NET_LOCAL_IP_H 0xFF0B /* IPv4本机IP地址(静态地址),高2字节 */
-#define REG03_NET_LOCAL_IP_L 0xFF0C /* IPv4本机IP地址(静态地址),低2字节 */
-#define REG03_NET_NETMASK_H 0xFF0D /* IPv4子网掩码,高2字节。 */
-#define REG03_NET_NETMASK_L 0xFF0E /* IPv4子网掩码,低2字节。 */
-#define REG03_NET_GATEWAY_H 0xFF0F /* IPv4网关地址,高2字节。 */
-#define REG03_NET_GATEWAY_L 0xFF10 /* IPv4网关地址,第2字节。 */
-#define REG03_NET_LOCAL_PORT 0xFF11 /* 本地端口 */
-#define REG03_NET_SYSTEM_IP_H 0xFF12 /* 管理系统IP地址高位 */
-#define REG03_NET_SYSTEM_IP_L 0xFF13 /* 管理系统IP地址低位 */
-#define REG03_NET_SYSTEM_PORT 0xFF14 /* 远程服务器端口 */
+#define REG03_NET_CPU_ID0 0xFF00
+#define REG03_NET_CPU_ID1 0xFF01
+#define REG03_NET_CPU_ID2 0xFF02
+#define REG03_NET_CPU_ID3 0xFF03
+#define REG03_NET_CPU_ID4 0xFF04
+#define REG03_NET_CPU_ID5 0xFF05
+#define REG03_NET_HARD_VER 0xFF06 /* 硬件型号(只读),内部型号代码,非型号全称,0xC200 表示TC200*/
+#define REG03_NET_SOFT_VER 0xFF07 /* 硬件版本(只读),如0x0100,表示H1.00 */
+#define REG03_NET_MAC12 0xFF08 /* MAC */
+#define REG03_NET_MAC34 0xFF09 /* MAC */
+#define REG03_NET_MAC56 0xFF0A /* MAC */
+#define REG03_NET_LOCAL_IP_H 0xFF0B /* IPv4本机IP地址(静态地址),高2字节 */
+#define REG03_NET_LOCAL_IP_L 0xFF0C /* IPv4本机IP地址(静态地址),低2字节 */
+#define REG03_NET_NETMASK_H 0xFF0D /* IPv4子网掩码,高2字节。 */
+#define REG03_NET_NETMASK_L 0xFF0E /* IPv4子网掩码,低2字节。 */
+#define REG03_NET_GATEWAY_H 0xFF0F /* IPv4网关地址,高2字节。 */
+#define REG03_NET_GATEWAY_L 0xFF10 /* IPv4网关地址,第2字节。 */
+#define REG03_NET_LOCAL_PORT 0xFF11 /* 本地端口 */
+#define REG03_NET_SYSTEM_IP_H 0xFF12 /* 管理系统IP地址高位 */
+#define REG03_NET_SYSTEM_IP_L 0xFF13 /* 管理系统IP地址低位 */
+#define REG03_NET_SYSTEM_PORT 0xFF14 /* 远程服务器端口 */
#define REG03_RESET_TO_BOOT 0xFF7F /* 特殊寄存器,复位进入BOOT */
/* BOOT 程序用的寄存器 */
-#define REG03_BOOT_CPU_ID0 0xFF80
-#define REG03_BOOT_CPU_ID1 0xFF81
-#define REG03_BOOT_CPU_ID2 0xFF82
-#define REG03_BOOT_CPU_ID3 0xFF83
-#define REG03_BOOT_CPU_ID4 0xFF84
-#define REG03_BOOT_CPU_ID5 0xFF85
-#define REG03_BOOT_HARD_VER 0xFF86 /* 硬件型号(只读),内部型号代码,非型号全称,0xC200 表示TC200*/
-#define REG03_BOOT_SOFT_VER 0xFF87 /* 硬件版本(只读),如0x0100,表示H1.00 */
+#define REG03_BOOT_CPU_ID0 0xFF80
+#define REG03_BOOT_CPU_ID1 0xFF81
+#define REG03_BOOT_CPU_ID2 0xFF82
+#define REG03_BOOT_CPU_ID3 0xFF83
+#define REG03_BOOT_CPU_ID4 0xFF84
+#define REG03_BOOT_CPU_ID5 0xFF85
+#define REG03_BOOT_HARD_VER 0xFF86 /* 硬件型号(只读),内部型号代码,非型号全称,0xC200 表示TC200*/
+#define REG03_BOOT_SOFT_VER 0xFF87 /* 硬件版本(只读),如0x0100,表示H1.00 */
-#define REG03_BOOT_PROG_TYPE 0xFF88 /* APP程序类型: 0 = CPU内部Flash ; 1 = QSPI Flash */
-#define REG03_BOOT_PROG_ADDR 0xFF89 /* APP程序地址 32位 */
-#define REG03_BOOT_PROG_SIZE 0xFF8B /* APP程序长度 32位 */
+#define REG03_BOOT_PROG_TYPE 0xFF88 /* APP程序类型: 0 = CPU内部Flash ; 1 = QSPI Flash */
+#define REG03_BOOT_PROG_ADDR 0xFF89 /* APP程序地址 32位 */
+#define REG03_BOOT_PROG_SIZE 0xFF8B /* APP程序长度 32位 */
/* 系统控制参数
1 - 通知开始升级,设备开始擦除flash. 根据前面2个寄存器决定擦除空间
2 - 通知设备程序下载完毕
3 - 通知系统复位
*/
-#define REG03_BOOT_SYSTEM 0xFF8D
+#define REG03_BOOT_SYSTEM 0xFF8D
-#define REG03_BOOT_STATUS 0xFFA0 /* 设备状态寄存器 0空闲,1表示正忙 */
-#define REG03_BOOT_CRC32_HIGH 0xFFA1 /* 程序区CRC32校验 - 未用 */
-#define REG03_BOOT_CRC32_LOW 0xFFA2 /* 程序区CRC32校验 - 未用 */
+#define REG03_BOOT_STATUS 0xFFA0 /* 设备状态寄存器 0空闲,1表示正忙 */
+#define REG03_BOOT_CRC32_HIGH 0xFFA1 /* 程序区CRC32校验 - 未用 */
+#define REG03_BOOT_CRC32_LOW 0xFFA2 /* 程序区CRC32校验 - 未用 */
#endif
diff --git a/User/modbus/modbus_register.c b/User/modbus/modbus_register.c
index 6d84ac0..abc74e4 100755
--- a/User/modbus/modbus_register.c
+++ b/User/modbus/modbus_register.c
@@ -42,40 +42,48 @@ uint8_t ReadRegValue_03H(uint16_t reg_addr, uint16_t *reg_value)
{
case REG03_NET_CPU_ID0: /* MCU序号(只读) */
case REG03_DEV_ID0:
+ case REG03_BOOT_CPU_ID0:
value = g_tVar.CPU_Sn[0];
break;
case REG03_NET_CPU_ID1:
case REG03_DEV_ID1:
+ case REG03_BOOT_CPU_ID1:
value = g_tVar.CPU_Sn[0] >> 16;
break;
case REG03_NET_CPU_ID2:
case REG03_DEV_ID2:
+ case REG03_BOOT_CPU_ID2:
value = g_tVar.CPU_Sn[1];
break;
case REG03_NET_CPU_ID3:
case REG03_DEV_ID3:
+ case REG03_BOOT_CPU_ID3:
value = g_tVar.CPU_Sn[1] >> 16;
break;
case REG03_NET_CPU_ID4:
case REG03_DEV_ID4:
+ case REG03_BOOT_CPU_ID4:
value = g_tVar.CPU_Sn[2];
break;
case REG03_NET_CPU_ID5:
case REG03_DEV_ID5:
+ case REG03_BOOT_CPU_ID5:
value = g_tVar.CPU_Sn[2] >> 16;
break;
case REG03_NET_HARD_VER:
case REG03_HARD_MODEL:
+ case REG03_BOOT_HARD_VER:
value = HARD_MODEL;
break;
case REG03_BOOT_VER:
+ case REG03_BOOT_SOFT_VER:
value = BOOT_VERSION;
break;
diff --git a/User/modbus/modbus_swd.c b/User/modbus/modbus_swd.c
index 77b8506..299aa44 100644
--- a/User/modbus/modbus_swd.c
+++ b/User/modbus/modbus_swd.c
@@ -28,6 +28,7 @@
#include "stm8_flash.h"
#include "stm8_swim.h"
#include "n76e003_flash.h"
+#include "w25q_flash.h"
/* 64H帧子功能码定义 */
enum
@@ -42,8 +43,8 @@ static void MODS66_WriteMem(void);
/*
*********************************************************************************************************
-* 函 数 名: MODS_64H
-* 功能说明: 文件操作通信接口
+* 函 数 名: MODS_66H
+* 功能说明: SWD内存读写操作通信接口
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
@@ -239,9 +240,23 @@ static void MODS66_ReadMem(void)
memcpy(&g_tModS.TxBuf[g_tModS.TxCount], s_lua_read_buf, package_len);
g_tModS.TxCount += package_len;
}
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ if (W25Q_ReadBuf(offset_addr, s_lua_read_buf, package_len) == 0)
+ {
+ g_tModS.TxBuf[g_tModS.TxCount++] = 0x01; /* 出错 */
+ }
+ else
+ {
+ g_tModS.TxBuf[g_tModS.TxCount++] = 0x00; /* 执行结果 00 */
+ }
+
+ memcpy(&g_tModS.TxBuf[g_tModS.TxCount], s_lua_read_buf, package_len);
+ g_tModS.TxCount += package_len;
+ }
else
{
- ;
+ g_tModS.TxBuf[g_tModS.TxCount++] = 0x01; /* 出错 */
}
}
diff --git a/User/programmer/n76e_prog_file.c b/User/programmer/pg_prog_file.c
similarity index 90%
rename from User/programmer/n76e_prog_file.c
rename to User/programmer/pg_prog_file.c
index f9c9bb1..bd455f9 100644
--- a/User/programmer/n76e_prog_file.c
+++ b/User/programmer/pg_prog_file.c
@@ -1,10 +1,10 @@
/*
*********************************************************************************************************
*
-* 模块名称 : N76E003芯片编程模块
-* 文件名称 : n76e_prog_file.c
+* 模块名称 : 通用芯片编程文件
+* 文件名称 : pg_prog_file.c
* 版 本 : V1.0
-* 说 明 : 烧写文件到N76E003芯片
+* 说 明 : 烧写文件到芯片
*
* 修改记录 :
* 版本号 日期 作者 说明
@@ -31,7 +31,7 @@ extern const program_target_t flash_algo;
/*
*********************************************************************************************************
-* 函 数 名: PG_N76E_ProgFile
+* 函 数 名: PG_ProgFile
* 功能说明: 开始编程flash。 由lua程序调用。阻塞运行,只到编程结束。
* 形 参: _Path : 文件名
* _FlashAddr : flash起始地址
@@ -42,7 +42,7 @@ extern const program_target_t flash_algo;
* 返 回 值: 0 = ok, 其他表示错误
*********************************************************************************************************
*/
-uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndAddr, uint32_t _CtrlByte,
+uint16_t PG_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndAddr, uint32_t _CtrlByte,
uint32_t _FileIndex, const char *_AlgoName)
{
char path[256];
@@ -54,7 +54,8 @@ uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndA
uint8_t CheckBankMode = 0;
// uint8_t fBlankChip = 0;
// uint32_t BlockSize;
- uint32_t CheckLen; /* 实际扫描的空间大小 */
+ uint32_t CheckLen; /* 实际扫描的空间大小 */
+ uint8_t EmptyValue; /* 空片的值 */
/* 传入的文件名是相对路径 */
if (strlen(_Path) + strlen(PROG_USER_DIR) > sizeof(path))
@@ -125,6 +126,19 @@ uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndA
}
}
+ if (g_tProg.ChipType == CHIP_SWIM_STM8 || g_tProg.ChipType == CHIP_NUVOTON_8051)
+ {
+ EmptyValue = 0x00;
+ }
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ EmptyValue = 0xFF;
+ }
+ else
+ {
+ EmptyValue = 0x00;
+ }
+
/*
低4bit表示擦除模式 0按扇区擦除 1按整片擦除 2不执行擦除
高4bit表示查空 0查空 1不查空
@@ -169,6 +183,9 @@ uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndA
{
uint32_t addr;
uint32_t endAddr;
+ uint32_t SectorSize;
+
+ SectorSize = PG_GetSectorSize(_AlgoName, addr);
endAddr = _FlashAddr + FileLen;
if (endAddr > _EndAddr)
@@ -196,12 +213,13 @@ uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndA
float percent;
percent = addr - _FlashAddr; /* 已擦除大小 */
- percent = percent / (endAddr - _FlashAddr);
+ percent = 100 * percent / (endAddr - _FlashAddr);
PG_PrintPercent(percent, addr); /* 显示100% */
}
- addr += PG_GetSectorSize(_AlgoName, addr);
+ addr += SectorSize;
}
+ PG_PrintPercent(100.0, addr); /* 显示100% */
}
else if (EraseMode == 1) /* 1:整片擦除 */
{
@@ -284,7 +302,7 @@ uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndA
/* V1.11 修正bug : 烧写非整数倍PageSize的文件失败 */
if (bytes % PageSize)
{
- memset(&FsReadBuf[bytes], 0x00 ,PageSize - (bytes % PageSize)); /* 填充空值 00 */
+ memset(&FsReadBuf[bytes], EmptyValue ,PageSize - (bytes % PageSize)); /* 填充空值 00 or FF */
bytes = ((bytes + PageSize - 1) / PageSize) * PageSize;
}
@@ -306,8 +324,8 @@ uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndA
FileOffset += PageSize;
- /* 进度指示 - 每2KB刷新一次 */
- if ((FileOffset % 2048) == 0 || (bytes < 2048 && (FileOffset % 512) == 0))
+ /* 进度指示 - 每4KB刷新一次 */
+ if ((FileOffset % 8192) == 0 || (bytes < 8192 && (FileOffset % 512) == 0))
{
float percent;
@@ -393,12 +411,17 @@ uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndA
{
PageSize = sizeof(FsReadBuf);
}
-
+
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ PageSize = PageSize / 4;
+ }
+
if (PageSize >= DeviceSize)
{
PageSize = DeviceSize;
- }
-
+ }
+
for (; FileOffset < FileLen; )
{
if (ProgCancelKey())
@@ -437,6 +460,7 @@ uint16_t PG_N76E_ProgFile(const char *_Path, uint32_t _FlashAddr, uint32_t _EndA
}
/* 进度指示 */
+ if ((FileOffset % 8192) == 0 || (bytes < 8192 && (FileOffset % 512) == 0))
{
float percent = -1;
diff --git a/User/programmer/prog_if.c b/User/programmer/prog_if.c
index 5972b93..fb26d7b 100755
--- a/User/programmer/prog_if.c
+++ b/User/programmer/prog_if.c
@@ -14,19 +14,17 @@
*
*********************************************************************************************************
*/
-#include "bsp.h"
-#include "param.h"
-#include "file_lib.h"
-#include "lua_if.h"
-#include "prog_if.h"
+
+#include "includes.h"
+
#include "swd_host.h"
#include "swd_flash.h"
#include "elf_file.h"
-#include "main.h"
#include "stm8_flash.h"
#include "n76e003_flash.h"
#include "SW_DP_Multi.h"
#include "swd_host_multi.h"
+#include "w25q_flash.h"
extern const program_target_t flash_algo;
@@ -216,6 +214,29 @@ void PG_ReloadLuaVar(void)
{
h7swim_ReadLuaVar(); /* 读取LUA中的全局变量 */
}
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ // uint32_t Capacity; /* 芯片容量 */
+ // uint32_t SectorSize; /* 扇区大小 */
+ // uint32_t EraseSectorCmd; /* 扇区擦除指令 */
+ // uint32_t EraseSectorTimeout; /* 擦除扇区超时 ms */
+ // uint32_t EraseChipTimeout; /* 擦除整片超时 ms */
+ // uint32_t ProgPageTimeout; /* 编程page超时 */
+ // uint8_t AutoAddrInc; /* AAI模式写 */
+
+ g_tW25Q.Capacity = lua_GetVarUint32("FLASH_SIZE", 0);
+ g_tW25Q.SectorSize = lua_GetVarUint32("SECTOR_SIZE", 4096);
+ g_tW25Q.EraseSectorCmd = lua_GetVarUint32("ERASE_SECTOR_CMD", 0x20);
+ g_tW25Q.EraseSectorTimeout = lua_GetVarUint32("ERASE_SECTOR_TIMEOUT", 2 * 1000);
+ g_tW25Q.EraseChipTimeout = lua_GetVarUint32("ERASE_CHIP_TIMEOUT", 400 * 1000);
+ g_tW25Q.ProgPageTimeout = 100; /* 100ms */
+ g_tW25Q.AutoAddrInc = lua_GetVarUint32("PROG_AAI", 0);
+ g_tW25Q.ReadMode = lua_GetVarUint32("READ_MODE", 0);
+ g_tW25Q.ReadIDCmd = lua_GetVarUint32("READ_ID_CMD", 0x9F);
+ g_tW25Q.EraseChipCmd = lua_GetVarUint32("ERASE_CHIP_CMD", 0xC7);
+ g_tW25Q.UnlockCmd = lua_GetVarUint32("UNLOCK_CMD", 0x00);
+
+ }
}
/*
@@ -522,6 +543,11 @@ uint8_t PG_FixDataIsDiff(void)
return 0;
}
+/*
+*********************************************************************************************************
+* 下面代码,用于通用芯片编程. 被 pg_prog_file.c 文件调用
+*********************************************************************************************************
+*/
/*
*********************************************************************************************************
@@ -546,7 +572,11 @@ uint32_t PG_GetSectorSize(const char *_Algo, uint32_t _Addr)
else if (g_tProg.ChipType == CHIP_NUVOTON_8051)
{
sz = 128;
- }
+ }
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ sz = lua_GetVarUint32("SECTOR_SIZE", 4*1024);
+ }
return sz;
}
@@ -560,6 +590,23 @@ uint32_t PG_GetSectorSize(const char *_Algo, uint32_t _Addr)
*/
uint8_t PG_EraseSector(const char *_Algo, uint32_t _Addr)
{
+ if (g_tProg.ChipType == CHIP_SWD_ARM)
+ {
+ /* ARM不用这个文件 */;
+ }
+ else if (g_tProg.ChipType == CHIP_SWIM_STM8)
+ {
+ /* STM8都是整片擦除 */;
+ }
+ else if (g_tProg.ChipType == CHIP_NUVOTON_8051)
+ {
+ /* 选择整片擦除 */
+ }
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ W25Q_EraseSector(_Addr);
+ }
+
return 1;
}
@@ -586,7 +633,11 @@ uint32_t PG_GetPageSize(const char *_Algo)
else if (g_tProg.ChipType == CHIP_NUVOTON_8051)
{
sz = 32;
- }
+ }
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ sz = lua_GetVarUint32("FLASH_PAGE_SIZE", 1024);;
+ }
return sz;
}
@@ -640,7 +691,10 @@ uint32_t PG_GetDeviceAddr(const char *_Algo)
addr = 0;
}
}
-
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ addr = lua_GetVarUint32("FLASH_ADDRESS", 0);
+ }
return addr;
}
@@ -694,7 +748,10 @@ uint32_t PG_GetDeviceSize(const char *_Algo)
sz = 1024;
}
}
-
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ sz = lua_GetVarUint32("FLASH_SIZE", 0);
+ }
return sz;
}
@@ -720,7 +777,10 @@ uint8_t PG_EraseChip(void)
{
N76E_EraseChip();
}
-
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ W25Q_EraseChip();
+ }
return 1;
}
@@ -746,7 +806,10 @@ uint8_t PG_CheckBlank(const char *_Algo, uint32_t _Addr, uint32_t _Size)
{
;
}
-
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ ;
+ }
return 0;
}
@@ -776,7 +839,10 @@ uint8_t PG_ProgramBuf(const char *_Algo, uint32_t _FlashAddr, uint8_t *_Buff, ui
{
re = N76E_FLASH_ProgramBuf(_FlashAddr, _Buff, _Size);
}
-
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ re = W25Q_FLASH_ProgramBuf(_FlashAddr, _Buff, _Size);
+ }
return re;
}
@@ -806,6 +872,10 @@ uint8_t PG_ReadBuf(const char *_Algo, uint32_t _FlashAddr, uint8_t *_Buff, uint3
{
re = N76E_ReadBuf(_FlashAddr, _Buff, _Size);
}
+ else if (g_tProg.ChipType == CHIP_SPI_FLASH)
+ {
+ re = W25Q_ReadBuf(_FlashAddr, _Buff, _Size);
+ }
return re;
}
diff --git a/User/programmer/prog_if.h b/User/programmer/prog_if.h
index c0f1fba..2af0833 100755
--- a/User/programmer/prog_if.h
+++ b/User/programmer/prog_if.h
@@ -67,6 +67,8 @@ typedef struct
uint8_t AbortOnError; /* 多路模式,0表示出错时继续烧录OK的芯片 1表示出错后立刻同时终止 */
+ uint8_t ChNum; /* 通道个数 */
+
}OFFLINE_PROG_T;
/* lua脚本fix_data_begin()返回一个table,用于通知C程序哪些内存地址需要填充数据 */
diff --git a/User/programmer/w25q_flash.c b/User/programmer/w25q_flash.c
new file mode 100644
index 0000000..6d2cdf1
--- /dev/null
+++ b/User/programmer/w25q_flash.c
@@ -0,0 +1,1493 @@
+/*
+*********************************************************************************************************
+*
+* 模块名称 : 串行FLASH驱动
+* 文件名称 : w25q_flash.c
+* 版 本 : V1.0
+* 说 明 : SPI串行FLASH驱动. 支持4路同步操作.
+* 修改记录 :
+* 版本号 日期 作者 说明
+* V1.0 2020-10-29 armfly 原创
+*
+* Copyright (C), 2019-2030, 安富莱电子 www.armfly.com
+*
+*********************************************************************************************************
+*/
+
+#include "bsp.h"
+#include "prog_if.h"
+#include "DAP_config.h"
+#include "n76e003_flash.h"
+#include "w25q_flash.h"
+#include "SW_DP_Multi.h"
+
+/* 常用的厂商JEDEC ID */
+#define SF_ID_CYPRESS 0x01
+#define SF_ID_FUJITSU 0x04
+#define SF_ID_EON 0x1C
+#define SF_ID_ATMEL 0x1F
+#define SF_ID_MICRON 0x20
+#define SF_ID_AMIC 0x37
+#define SF_ID_SANYO 0x62
+#define SF_ID_INTEL 0x89
+#define SF_ID_ESMT 0x8C
+#define SF_ID_FUDAN 0xA1
+#define SF_ID_HYUNDAI 0xAD
+#define SF_ID_SST 0xBF
+#define SF_ID_MICRONIX 0xC2
+#define SF_ID_GIGADEVICE 0xC8
+#define SF_ID_ISSI 0xD5
+#define SF_ID_WINBOND 0xEF
+
+
+#define CMD_DISWR 0x04 /* 禁止写, 退出AAI状态 */
+#define CMD_EWRSR 0x50 /* 允许写状态寄存器的命令 */
+#define CMD_WRSR 0x01 /* 写状态寄存器命令 */
+#define CMD_WREN 0x06 /* 写使能命令 */
+#define CMD_READ 0x03 /* 读数据区命令 */
+#define CMD_RDSR 0x05 /* 读状态寄存器命令 */
+#define CMD_RDID 0x9F /* 读器件ID命令 */
+#define CMD_SE 0x20 /* 擦除扇区命令 */
+#define CMD_BE 0xC7 /* 批量擦除命令 */
+
+
+#define CMD_AAI 0xAD /* AAI 连续编程指令(FOR SST25VF016B) */
+#define CMD_ERASE_CHIP 0xC7 /* CHIP擦除命令, 镁光的片子只支持C7,很多芯片同时支持60和C7 */
+#define CMD_PAGE_PROG 0x02 /* page编程256字节 */
+
+#define DUMMY_BYTE 0xA5 /* 哑命令,可以为任意值,用于读操作 */
+
+#define WIP_FLAG 0x01 /* 状态寄存器中的正在编程标志(WIP) */
+
+/*
+ 单路模式:
+ D0 PD14 PA15 PI0 - DIR PH8 CS2
+ D1 PD15 PA8 PH19 - DIR PG8 CS3
+
+ D2 PE6 PD0 PB7 - DIR PD9 MOSI_1 (硬件SPI信号)
+ D3 PE5 PD1 PH11 - DIR PG10 MISO_1 (硬件SPI信号)
+ D4 PE4 PE7 PH12 - DIR PG12 CS1 (软件控制片选)
+ D5 PE2 PE8 PI5 - DIR PG7 SCK (硬件SPI信号)
+ D6 PE9 PD3 PA0 - DIR PD10 MOSI_2
+ D7 PE10 PI6 - DIR PI1 MISO_2 (第2路MISO)
+ D8 PE11 PD4 PI3 - DIR PG9 MISO_3 (第3路MISO)
+ D9 PE12 PD5 - DIR PI12 MISO_4 (第4路MISO)
+
+ RS232_TX - RS232串口机台信号扩展 START BUSY OK NG
+ RS232_RX - RS232串口机台信号扩展
+
+
+ SPI 时钟上升沿采集数据,下降沿改变数据
+
+ 四路模式:
+
+ D0 PD14 PA15 PI0 - DIR PH8 CS = PI0
+ D1 PD15 PA8 PH19 - DIR PG8 SCK = PD15
+
+ D2 PE6 PD0 PB7 - DIR PD9 MOSI_1 = PD0(写时) PE6(读时)
+ D3 PE5 PD1 PH11 - DIR PG10 MOSI_2 = PD1(写时) PE5(读时)
+ D4 PE4 PE7 PH12 - DIR PG12 MISO_1 = PE4
+ D5 PE2 PE8 PI5 - DIR PG7 MISO_2 = PE2
+ D6 PE9 PD3 PA0 - DIR PD10 MOSI_3 = PD3(写时) PE9(读时)
+ D7 PE10 PI6 - DIR PI1 MISO_3 = PE10
+ D8 PE11 PD4 PI3 - DIR PG9 MOSI_4 = PD4(写时) PE11(读时)
+ D9 PE12 PD5 - DIR PI12 MISO_4 = PE12(读时)
+
+ RS232_TX - RS232串口机台信号扩展 START BUSY OK NG
+ RS232_RX - RS232串口机台信号扩展
+
+
+ ----整理下----
+ D0 = CS
+ D1 = SCK
+
+ D2 = MOSI_1
+ D3 = MOSI_2
+ D4 = MISO_1
+ D5 = MISO_2
+ D6 = MOSI_3
+ D7 = MISO_3
+ D8 = MOSI_4
+ D9 = MISO_4
+
+ RS232_TX
+ RS232_RX
+*/
+
+__forceinline void PIN_DELAY_SLOW (uint32_t delay) {
+ uint32_t count;
+
+ count = delay;
+ while (count--);
+}
+
+#define PIN_DELAY_S() PIN_DELAY_SLOW(g_tProg.SwdClockDelay)
+
+/* 片选四路共用 */
+#define W25_CS_0() BSP_SET_GPIO_0(GPIOI, GPIO_PIN_0)
+#define W25_CS_1() BSP_SET_GPIO_1(GPIOI, GPIO_PIN_0)
+
+/* 时钟通用 */
+#define W25_SCK_0() BSP_SET_GPIO_0(GPIOD, GPIO_PIN_15)
+#define W25_SCK_1() BSP_SET_GPIO_1(GPIOD, GPIO_PIN_15)
+
+/* MOSI 四路不同 */
+#define W25_MOSI1_0() BSP_SET_GPIO_0(GPIOD, GPIO_PIN_0)
+#define W25_MOSI1_1() BSP_SET_GPIO_1(GPIOD, GPIO_PIN_0)
+
+#define W25_MOSI2_0() BSP_SET_GPIO_0(GPIOD, GPIO_PIN_1)
+#define W25_MOSI2_1() BSP_SET_GPIO_1(GPIOD, GPIO_PIN_1)
+
+#define W25_MOSI3_0() BSP_SET_GPIO_0(GPIOD, GPIO_PIN_3)
+#define W25_MOSI3_1() BSP_SET_GPIO_1(GPIOD, GPIO_PIN_3)
+
+#define W25_MOSI4_0() BSP_SET_GPIO_0(GPIOD, GPIO_PIN_4)
+#define W25_MOSI4_1() BSP_SET_GPIO_1(GPIOD, GPIO_PIN_4)
+
+#define W25_MOSI_0_SCK_0() GPIOD->BSRR = (uint32_t)(GPIO_PIN_15 | GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4) << 16
+#define W25_MOSI_1_SCK_0() GPIOD->BSRR = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4 | ((uint32_t)GPIO_PIN_15 << 16)
+
+/* MISO 四路不同 */
+
+#define W25_READ_MISO() GPIOE->IDR
+
+#define W25_MISO1_PIN_A GPIO_PIN_4
+#define W25_MISO2_PIN_A GPIO_PIN_2
+#define W25_MISO3_PIN_A GPIO_PIN_10
+#define W25_MISO4_PIN_A GPIO_PIN_12
+
+#define W25_MISO1_PIN_B GPIO_PIN_6
+#define W25_MISO2_PIN_B GPIO_PIN_5
+#define W25_MISO3_PIN_B GPIO_PIN_9
+#define W25_MISO4_PIN_B GPIO_PIN_11
+
+/* MOSI设置为输出 D2 D3 D6 D8 === PD0 PD1 PD3 PD4 配置为输出 00000011 11001111 --- 00000001 01000101 */
+#define W25_MOSI_SET_OUT() BSP_SET_GPIO_1(GPIOD, GPIO_PIN_9 | GPIO_PIN_10); BSP_SET_GPIO_1(GPIOG, GPIO_PIN_9 | GPIO_PIN_10); \
+ GPIOD->MODER = ((GPIOD->MODER & (~0x000003CF)) | 0x00000145);
+
+/* MOSI设置为输入 */
+#define W25_MOSI_SET_IN() BSP_SET_GPIO_0(GPIOD, GPIO_PIN_9 | GPIO_PIN_10); BSP_SET_GPIO_0(GPIOG, GPIO_PIN_9 | GPIO_PIN_10); \
+ GPIOD->MODER = GPIOD->MODER & (~0x000003CF);
+
+static void W25Q_SendBit8Fast(uint8_t _data);
+static void W25Q_SendBit8Slow(uint8_t _data);
+static void W25Q_RaedBit8Fast(uint8_t *_rxbuf);
+static void W25Q_RaedBit8Slow(uint8_t *_rxbuf);
+
+void W25Q_UnlockBlock(void);
+void W25Q_WriteStatusEnable(void);
+uint8_t W25Q_WaitBusy(uint32_t _timeout);
+
+W25Q_T g_tW25Q;
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_InitHard
+* 功能说明: ICP接口GPIO硬件初始化
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void W25Q_InitHard(void)
+{
+ EIO_D0_Config(ES_PROG_SPI_FLASH);
+ EIO_D1_Config(ES_PROG_SPI_FLASH);
+ EIO_D2_Config(ES_PROG_SPI_FLASH);
+ EIO_D4_Config(ES_PROG_SPI_FLASH);
+ EIO_D5_Config(ES_PROG_SPI_FLASH);
+ EIO_D6_Config(ES_PROG_SPI_FLASH);
+
+ EIO_D3_Config(ES_PROG_SPI_FLASH);
+ EIO_D7_Config(ES_PROG_SPI_FLASH);
+ EIO_D8_Config(ES_PROG_SPI_FLASH);
+ EIO_D9_Config(ES_PROG_SPI_FLASH);
+
+ /* 选MODE3,平时SCK为1 */
+ W25_SCK_1();
+
+ W25Q_UnlockBlock(); /* SST26VFxxx 需要解除块保护 */
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_SendBit8Fast
+* 功能说明: 传输8bit
+* 形 参: _data:数据
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static void W25Q_SendBit8Fast(uint8_t _data)
+{
+ uint8_t i;
+
+ /* SCK下降沿改变数据,上升沿采集数据, 平时SCK = 1 */
+ for (i = 0; i < 8; i++)
+ {
+ if (_data & 0x80)
+ {
+ W25_MOSI_1_SCK_0();
+ }
+ else
+ {
+ W25_MOSI_0_SCK_0();
+ }
+ W25_SCK_1();
+ _data <<= 1;
+ }
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_SendBit8Slow
+* 功能说明: 传输8bit, 低速模式, 用于进入和退出IAP
+* 形 参: _data:数据
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static void W25Q_SendBit8Slow(uint8_t _data)
+{
+ uint8_t i;
+
+ /* SCK下降沿改变数据,上升沿采集数据, 平时SCK = 1 */
+ for (i = 0; i < 8; i++)
+ {
+ if (_data & 0x80)
+ {
+ W25_MOSI_1_SCK_0();
+ }
+ else
+ {
+ W25_MOSI_0_SCK_0();
+ }
+ PIN_DELAY_S();
+ W25_SCK_1();
+ _data <<= 1;
+ PIN_DELAY_S();
+
+ }
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_RaedBit8Fast
+* 功能说明: 读8bit数据,4通道同步
+* 形 参: 无
+* 返 回 值: 4通道的数据
+*********************************************************************************************************
+*/
+static void W25Q_RaedBit8Fast(uint8_t *_rxbuf)
+{
+ uint8_t i;
+ uint32_t gpio;
+ uint32_t ret = 0;
+
+ /* SCK下降沿改变数据,上升沿采集数据, 平时SCK = 1 */
+ for (i = 0; i < 8; i++)
+ {
+ W25_SCK_0();
+ ret <<= 1;
+ W25_SCK_1();
+ gpio = W25_READ_MISO();
+
+ if (gpio & W25_MISO1_PIN_A)
+ {
+ ret |= 0x00000001;
+ }
+ if (gpio & W25_MISO2_PIN_A)
+ {
+ ret |= 0x00000100;
+ }
+ if (gpio & W25_MISO3_PIN_A)
+ {
+ ret |= 0x00010000;
+ }
+ if (gpio & W25_MISO4_PIN_A)
+ {
+ ret |= 0x01000000;
+ }
+
+ }
+
+ _rxbuf[0] = ret;
+ _rxbuf[1] = ret >> 8;
+ _rxbuf[2] = ret >> 16;
+ _rxbuf[3] = ret >> 24;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_RaedBit8FastDaul
+* 功能说明: 读8bit数据,4通道同步, 双线
+* 形 参: 无
+* 返 回 值: 4通道的数据
+*********************************************************************************************************
+*/
+static void W25Q_RaedBit8FastDaul(uint8_t *_rxbuf)
+{
+ uint8_t i;
+ uint32_t gpio;
+ uint32_t ret = 0;
+
+ /* SCK下降沿改变数据,上升沿采集数据, 平时SCK = 1 */
+ for (i = 0; i < 4; i++)
+ {
+ W25_SCK_0();
+ if (gpio & W25_MISO1_PIN_B)
+ {
+ ret |= 0x00000001;
+ }
+ if (gpio & W25_MISO1_PIN_A)
+ {
+ ret |= 0x00000002;
+ }
+
+ if (gpio & W25_MISO2_PIN_B)
+ {
+ ret |= 0x00000100;
+ }
+ if (gpio & W25_MISO2_PIN_A)
+ {
+ ret |= 0x00000200;
+ }
+
+ if (gpio & W25_MISO3_PIN_B)
+ {
+ ret |= 0x00010000;
+ }
+ if (gpio & W25_MISO3_PIN_A)
+ {
+ ret |= 0x00020000;
+ }
+
+ if (gpio & W25_MISO4_PIN_B)
+ {
+ ret |= 0x01000000;
+ }
+ if (gpio & W25_MISO4_PIN_A)
+ {
+ ret |= 0x02000000;
+ }
+ ret <<= 2;
+ W25_SCK_1();
+ gpio = W25_READ_MISO();
+ }
+
+ if (gpio & W25_MISO1_PIN_B)
+ {
+ ret |= 0x00000001;
+ }
+ if (gpio & W25_MISO1_PIN_A)
+ {
+ ret |= 0x00000002;
+ }
+
+ if (gpio & W25_MISO2_PIN_B)
+ {
+ ret |= 0x00000100;
+ }
+ if (gpio & W25_MISO2_PIN_A)
+ {
+ ret |= 0x00000200;
+ }
+
+ if (gpio & W25_MISO3_PIN_B)
+ {
+ ret |= 0x00010000;
+ }
+ if (gpio & W25_MISO3_PIN_A)
+ {
+ ret |= 0x00020000;
+ }
+
+ if (gpio & W25_MISO4_PIN_B)
+ {
+ ret |= 0x01000000;
+ }
+ if (gpio & W25_MISO4_PIN_A)
+ {
+ ret |= 0x02000000;
+ }
+
+ _rxbuf[0] = ret;
+ _rxbuf[1] = ret >> 8;
+ _rxbuf[2] = ret >> 16;
+ _rxbuf[3] = ret >> 24;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_RaedBit8Slow
+* 功能说明: 读8bit数据,4通道同步, 双线
+* 形 参: 无
+* 返 回 值: 4通道的数据
+*********************************************************************************************************
+*/
+static void W25Q_RaedBit8Slow(uint8_t *_rxbuf)
+{
+ uint8_t i;
+ uint32_t gpio;
+ uint32_t ret = 0;
+
+ /* SCK下降沿改变数据,上升沿采集数据, 平时SCK = 1 */
+ for (i = 0; i < 8; i++)
+ {
+ W25_SCK_0();
+ PIN_DELAY_S();
+ ret <<= 1;
+ W25_SCK_1();
+ gpio = W25_READ_MISO();
+ PIN_DELAY_S();
+
+ if (gpio & W25_MISO1_PIN_A)
+ {
+ ret |= 0x00000001;
+ }
+ if (gpio & W25_MISO2_PIN_A)
+ {
+ ret |= 0x00000100;
+ }
+ if (gpio & W25_MISO3_PIN_A)
+ {
+ ret |= 0x00010000;
+ }
+ if (gpio & W25_MISO4_PIN_A)
+ {
+ ret |= 0x01000000;
+ }
+ }
+ _rxbuf[0] = ret;
+ _rxbuf[1] = ret >> 8;
+ _rxbuf[2] = ret >> 16;
+ _rxbuf[3] = ret >> 24;
+}
+
+static void W25Q_RaedBit8SlowDaul(uint8_t *_rxbuf)
+{
+ uint8_t i;
+ uint32_t gpio;
+ uint32_t ret = 0;
+
+ /* SCK下降沿改变数据,上升沿采集数据, 平时SCK = 1 */
+ for (i = 0; i < 4; i++)
+ {
+ W25_SCK_0();
+ PIN_DELAY_S();
+ ret <<= 2;
+ W25_SCK_1();
+ PIN_DELAY_S();
+ gpio = W25_READ_MISO();
+ if (gpio & W25_MISO1_PIN_B)
+ {
+ ret |= 0x00000001;
+ }
+ if (gpio & W25_MISO1_PIN_A)
+ {
+ ret |= 0x00000002;
+ }
+
+ if (gpio & W25_MISO2_PIN_B)
+ {
+ ret |= 0x00000100;
+ }
+ if (gpio & W25_MISO2_PIN_A)
+ {
+ ret |= 0x00000200;
+ }
+
+ if (gpio & W25_MISO3_PIN_B)
+ {
+ ret |= 0x00010000;
+ }
+ if (gpio & W25_MISO3_PIN_A)
+ {
+ ret |= 0x00020000;
+ }
+
+ if (gpio & W25_MISO4_PIN_B)
+ {
+ ret |= 0x01000000;
+ }
+ if (gpio & W25_MISO4_PIN_A)
+ {
+ ret |= 0x02000000;
+ }
+ }
+ _rxbuf[0] = ret;
+ _rxbuf[1] = ret >> 8;
+ _rxbuf[2] = ret >> 16;
+ _rxbuf[3] = ret >> 24;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_SendData
+* 功能说明: 发送数据
+* 形 参: _cmd : 命令
+* _addr : 地址
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static void W25Q_SendData(uint8_t *_txbuf, uint16_t _txlen)
+{
+ uint16_t i;
+
+ W25_CS_0();
+ if (g_tProg.SwdClockDelay == 0)
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Fast(_txbuf[i]);
+ }
+ }
+ else
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Slow(_txbuf[i]);
+ }
+ }
+ W25_CS_1();
+}
+
+// 不拉高CS
+static void W25Q_SendData0(uint8_t *_txbuf, uint16_t _txlen)
+{
+ uint16_t i;
+
+ W25_CS_0();
+ if (g_tProg.SwdClockDelay == 0)
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Fast(_txbuf[i]);
+ }
+ }
+ else
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Slow(_txbuf[i]);
+ }
+ }
+ //W25_CS_1();
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_ReadData
+* 功能说明: 读回数据. 4路同步读回
+* 形 参:
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+#if 0
+static void W25Q_ReadData(uint8_t *_rxbuf, uint16_t _rxlen)
+{
+ uint16_t i;
+ uint8_t buf[4];
+
+ W25_CS_0();
+ if (g_tProg.SwdClockDelay == 0)
+ {
+ for (i = 0;i < _rxlen; i++)
+ {
+ W25Q_RaedBit8Fast(buf);
+
+ _rxbuf[4 * i] = buf[0];
+ _rxbuf[4 * i + 1] = buf[1];
+ _rxbuf[4 * i + 2] = buf[2];
+ _rxbuf[4 * i + 3] = buf[3];
+ }
+ }
+ else
+ {
+ for (i = 0;i < _rxlen; i++)
+ {
+ W25Q_RaedBit8Slow(buf);
+
+ _rxbuf[4 * i] = buf[0];
+ _rxbuf[4 * i + 1] = buf[1];
+ _rxbuf[4 * i + 2] = buf[2];
+ _rxbuf[4 * i + 3] = buf[3];
+ }
+ }
+ W25_CS_1();
+}
+#endif
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_SendAndReadData
+* 功能说明: 发送并且读回数据(单线)
+* 形 参:
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static void W25Q_SendAndReadData(uint8_t *_txbuf, uint32_t _txlen, uint8_t *_rxbuf, uint32_t _rxlen)
+{
+ uint32_t i;
+ uint8_t buf[4];
+
+ W25_CS_0();
+ if (g_tProg.SwdClockDelay == 0)
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Fast(_txbuf[i]);
+ }
+
+ for (i = 0; i < _rxlen; i++)
+ {
+ W25Q_RaedBit8Fast(buf);
+
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ _rxbuf[i] = buf[0];
+ _rxbuf[_rxlen + i] = buf[1];
+ _rxbuf[2 * _rxlen + i] = buf[2];
+ _rxbuf[3 * _rxlen + i] = buf[3];
+ }
+ else /* 单路模式 */
+ {
+ _rxbuf[i] = buf[0];
+ }
+ }
+ }
+ else
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Slow(_txbuf[i]);
+ }
+
+ for (i = 0;i < _rxlen; i++)
+ {
+ W25Q_RaedBit8Slow(buf);
+
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ _rxbuf[i] = buf[0];
+ _rxbuf[_rxlen + i] = buf[1];
+ _rxbuf[2 * _rxlen + i] = buf[2];
+ _rxbuf[3 * _rxlen + i] = buf[3];
+ }
+ else
+ {
+ _rxbuf[i] = buf[0];
+ }
+ }
+ }
+
+ W25_CS_1();
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_SendAndReadDataDaul
+* 功能说明: 发送并且读回数据(双线)
+* 形 参:
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static void W25Q_SendAndReadDataDaul(uint8_t *_txbuf, uint32_t _txlen, uint8_t *_rxbuf, uint32_t _rxlen)
+{
+ uint32_t i;
+ uint8_t buf[4];
+
+ W25_CS_0();
+ if (g_tProg.SwdClockDelay == 0)
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Fast(_txbuf[i]);
+ }
+
+ /* 切换MOSI 为输入 */
+ W25_MOSI_SET_IN();
+
+ for (i = 0; i < _rxlen; i++)
+ {
+ W25Q_RaedBit8FastDaul(buf);
+
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ _rxbuf[i] = buf[0];
+ _rxbuf[_rxlen + i] = buf[1];
+ _rxbuf[2 * _rxlen + i] = buf[2];
+ _rxbuf[3 * _rxlen + i] = buf[3];
+ }
+ else /* 单路模式 */
+ {
+ _rxbuf[i] = buf[0];
+ }
+ }
+ /* 切换MOSI 为输出 */
+ W25_MOSI_SET_OUT();
+ }
+ else
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Slow(_txbuf[i]);
+ }
+
+ /* 切换MOSI 为输入 */
+ W25_MOSI_SET_IN();
+
+ for (i = 0;i < _rxlen; i++)
+ {
+ W25Q_RaedBit8SlowDaul(buf);
+
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ _rxbuf[i] = buf[0];
+ _rxbuf[_rxlen + i] = buf[1];
+ _rxbuf[2 * _rxlen + i] = buf[2];
+ _rxbuf[3 * _rxlen + i] = buf[3];
+ }
+ else
+ {
+ _rxbuf[i] = buf[0];
+ }
+ }
+
+ /* 切换MOSI 为输出 */
+ W25_MOSI_SET_OUT();
+ }
+ W25_CS_1();
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_SendAndReadDataBlank
+* 功能说明: 发送并且读回数据(单线), 判断是否为空
+* 形 参:
+* 返 回 值: 1 表示空片, 0表示不空需要擦除
+*********************************************************************************************************
+*/
+static uint8_t W25Q_SendAndReadDataBlank(uint8_t *_txbuf, uint32_t _txlen, uint32_t _rxlen)
+{
+ uint32_t i;
+ uint8_t buf[4];
+ uint8_t blank = 1;
+
+ W25_CS_0();
+ if (g_tProg.SwdClockDelay == 0)
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Fast(_txbuf[i]);
+ }
+
+ for (i = 0; i < _rxlen; i++)
+ {
+ W25Q_RaedBit8Fast(buf);
+
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ uint8_t k;
+
+ for (k = 0; k < g_gMulSwd.MultiMode; k++)
+ {
+ if (buf[k] != 0xFF)
+ {
+ blank = 0; /* 不空 */
+ break;
+ }
+ }
+ }
+ else /* 单路模式 */
+ {
+ if (buf[0] != 0xFF)
+ {
+ blank = 0; /* 不空 */
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Slow(_txbuf[i]);
+ }
+
+ for (i = 0;i < _rxlen; i++)
+ {
+ W25Q_RaedBit8Slow(buf);
+
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ uint8_t k;
+
+ for (k = 0; k < g_gMulSwd.MultiMode; k++)
+ {
+ if (buf[k] != 0xFF)
+ {
+ blank = 0; /* 不空 */
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (buf[0] != 0xFF)
+ {
+ blank = 0; /* 不空 */
+ break;
+ }
+ }
+ }
+ }
+
+ W25_CS_1();
+
+ return blank;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_SendAndReadDataBlankDaul
+* 功能说明: 发送并且读回数据(双线), 判断是否为空
+* 形 参:
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+static uint8_t W25Q_SendAndReadDataBlankDaul(uint8_t *_txbuf, uint32_t _txlen, uint32_t _rxlen)
+{
+ uint32_t i;
+ uint8_t buf[4];
+ uint8_t blank = 1;
+
+ W25_CS_0();
+ if (g_tProg.SwdClockDelay == 0)
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Fast(_txbuf[i]);
+ }
+
+ /* 切换MOSI 为输入 */
+ W25_MOSI_SET_IN();
+
+ for (i = 0; i < _rxlen; i++)
+ {
+ W25Q_RaedBit8FastDaul(buf);
+
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ uint8_t k;
+
+ for (k = 0; k < g_gMulSwd.MultiMode; k++)
+ {
+ if (buf[k] != 0xFF)
+ {
+ blank = 0; /* 不空 */
+ break;
+ }
+ }
+ }
+ else /* 单路模式 */
+ {
+ if (buf[0] != 0xFF)
+ {
+ blank = 0; /* 不空 */
+ break;
+ }
+ }
+ }
+ /* 切换MOSI 为输出 */
+ W25_MOSI_SET_OUT();
+ }
+ else
+ {
+ for (i = 0;i < _txlen; i++)
+ {
+ W25Q_SendBit8Slow(_txbuf[i]);
+ }
+
+ /* 切换MOSI 为输入 */
+ W25_MOSI_SET_IN();
+
+ for (i = 0;i < _rxlen; i++)
+ {
+ W25Q_RaedBit8SlowDaul(buf);
+
+ if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
+ {
+ uint8_t k;
+
+ for (k = 0; k < g_gMulSwd.MultiMode; k++)
+ {
+ if (buf[k] != 0xFF)
+ {
+ blank = 0; /* 不空 */
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (buf[0] != 0xFF)
+ {
+ blank = 0; /* 不空 */
+ break;
+ }
+ }
+ }
+
+ /* 切换MOSI 为输出 */
+ W25_MOSI_SET_OUT();
+ }
+ W25_CS_1();
+
+ return blank;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_DetectIC
+* 功能说明: 检测IC是否在位
+* 形 参: _id 读取4FFC开始的数字,当做芯片识别码
+* 返 回 值: 1表示OK 0表示错误
+*********************************************************************************************************
+*/
+uint8_t W25Q_DetectIC(uint32_t *_id)
+{
+ uint8_t txbuf[1];
+ uint8_t rxbuf[3 * 4];
+ uint8_t i;
+
+ if (g_tW25Q.ReadIDCmd == 0x9F)
+ {
+ txbuf[0] = 0x9F;
+ W25Q_SendAndReadData(txbuf, 1, rxbuf,3);
+
+ for (i = 0; i < 4; i++)
+ {
+ if (rxbuf[4 * i + 0] == 0 || rxbuf[4 * i + 0] == 0xFF) /* 判断厂家ID */
+ {
+ _id[i] = 0; /* 无效ID,做无芯片处理 */
+ }
+ else
+ {
+ _id[i] = ((rxbuf[3 * i + 0] << 16) & 0x00FF0000) +
+ ((rxbuf[3 * i + 1] << 8) & 0x0000FF00) +
+ ((rxbuf[3 * i + 2] << 0) & 0x000000FF);
+ }
+ }
+ }
+ else if (g_tW25Q.ReadIDCmd == 0x90 || g_tW25Q.ReadIDCmd == 0xAB) /* SST */
+ {
+ txbuf[0] = g_tW25Q.ReadIDCmd;
+ W25Q_SendAndReadData(txbuf, 1, rxbuf, 2);
+
+ for (i = 0; i < 4; i++)
+ {
+ if (rxbuf[4 * i + 0] == 0 || rxbuf[4 * i + 0] == 0xFF) /* 判断厂家ID */
+ {
+ _id[i] = 0; /* 无效ID,做无芯片处理 */
+ }
+ else
+ {
+ _id[i] = ((rxbuf[2 * i + 0] << 8) & 0x00FF00) +
+ ((rxbuf[2 * i + 1] << 0) & 0x0000FF);
+ }
+ }
+ }
+ return 1;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_WriteBuf
+* 功能说明: 连续写多个字节. 不支持的操作。没有内存或寄存器可以操作
+* 形 参: _Addr : 3个字节的地址。整数值
+* _Buf : 输入数据缓冲区
+* _Len : 字节长度
+* 返 回 值: 1表示OK, 0表示出错
+*********************************************************************************************************
+*/
+uint8_t W25Q_WriteBuf(uint32_t _Addr, uint8_t *_Buf, uint16_t _Len)
+{
+ return 1;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_ReadBuf
+* 功能说明: 读取连续多个字节数据. APROM。 LDROM的数据地址 + 0x10000
+* 形 参: _Addr : 3个字节的地址。整数值
+* _Buf : 目标缓冲区
+* _Len : 字节长度
+* 返 回 值: 1表示成功,0表示失败
+*********************************************************************************************************
+*/
+uint8_t W25Q_ReadBuf(uint32_t _Addr, uint8_t *_Buf, uint16_t _Len)
+{
+ uint8_t txbuf[5];
+
+ if (g_tW25Q.ReadMode == 0) /* 单线 */
+ {
+ if (_Addr > 16 * 1024 * 1024)
+ {
+ txbuf[0] = 0x13; /* 4字节地址,读 */
+ txbuf[1] = _Addr >> 24;
+ txbuf[2] = _Addr >> 16;
+ txbuf[3] = _Addr >> 8;
+ txbuf[4] = _Addr;
+
+ W25Q_SendAndReadData(txbuf, 5, _Buf, _Len);
+ }
+ else
+ {
+ txbuf[0] = 0x03; /* 3字节地址,读 */
+ txbuf[1] = _Addr >> 16;
+ txbuf[2] = _Addr >> 8;
+ txbuf[3] = _Addr;
+ W25Q_SendAndReadData(txbuf, 4, _Buf, _Len);
+ }
+ }
+ else if (g_tW25Q.ReadMode == 1) /* 双线 */
+ {
+ if (_Addr > 16 * 1024 * 1024)
+ {
+ txbuf[0] = 0x3C; /* 4字节地址,读 Read daul output */
+ txbuf[1] = _Addr >> 24;
+ txbuf[2] = _Addr >> 16;
+ txbuf[3] = _Addr >> 8;
+ txbuf[4] = _Addr;
+
+ W25Q_SendAndReadDataDaul(txbuf, 5, _Buf, _Len);
+ }
+ else
+ {
+ txbuf[0] = 0x3B; /* 3字节地址,读 Read daul output */
+ txbuf[1] = _Addr >> 16;
+ txbuf[2] = _Addr >> 8;
+ txbuf[3] = _Addr;
+ txbuf[4] = 0; /* 空闲字节 */
+ W25Q_SendAndReadDataDaul(txbuf, 5, _Buf, _Len);
+ }
+ }
+
+ return 1;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_CheckBlank
+* 功能说明: 读取连续多个字节数据. APROM。 LDROM的数据地址 + 0x10000
+* 形 参: _Addr : 3个字节的地址。整数值
+* _Len : 字节长度
+* 返 回 值: 1表示空片,0表示不空
+*********************************************************************************************************
+*/
+uint8_t W25Q_CheckBlank(uint32_t _Addr, uint32_t _Len)
+{
+ uint8_t txbuf[5];
+ uint8_t re;
+
+ if (g_tW25Q.ReadMode == 0) /* 单线 */
+ {
+ if (_Addr > 16 * 1024 * 1024)
+ {
+ txbuf[0] = 0x13; /* 4字节地址,读 */
+ txbuf[1] = _Addr >> 24;
+ txbuf[2] = _Addr >> 16;
+ txbuf[3] = _Addr >> 8;
+ txbuf[4] = _Addr;
+
+ re = W25Q_SendAndReadDataBlank(txbuf, 5, _Len); /* 查空 */
+ }
+ else
+ {
+ txbuf[0] = 0x03; /* 3字节地址,读 */
+ txbuf[1] = _Addr >> 16;
+ txbuf[2] = _Addr >> 8;
+ txbuf[3] = _Addr;
+ re = W25Q_SendAndReadDataBlank(txbuf, 4, _Len);
+ }
+ }
+ else if (g_tW25Q.ReadMode == 1) /* 双线 */
+ {
+ if (_Addr > 16 * 1024 * 1024)
+ {
+ txbuf[0] = 0x3C; /* 4字节地址,读 Read daul output */
+ txbuf[1] = _Addr >> 24;
+ txbuf[2] = _Addr >> 16;
+ txbuf[3] = _Addr >> 8;
+ txbuf[4] = _Addr;
+
+ re = W25Q_SendAndReadDataBlankDaul(txbuf, 5, _Len);
+ }
+ else
+ {
+ txbuf[0] = 0x3B; /* 3字节地址,读 Read daul output */
+ txbuf[1] = _Addr >> 16;
+ txbuf[2] = _Addr >> 8;
+ txbuf[3] = _Addr;
+ re = W25Q_SendAndReadDataBlankDaul(txbuf, 4, _Len);
+ }
+ }
+
+ return re;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_WriteEnable
+* 功能说明: 向器件发送写使能命令
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void W25Q_WriteEnable(void)
+{
+ uint8_t txbuf[1];
+
+ txbuf[0] = CMD_WREN;
+ W25Q_SendData(txbuf, 1);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_WriteStatusEnable
+* 功能说明: 向器件发送写状态字使能命令
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void W25Q_WriteStatusEnable(void)
+{
+ uint8_t txbuf[1];
+
+ txbuf[0] = CMD_EWRSR;
+ W25Q_SendData(txbuf, 1);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_WriteDisable
+* 功能说明: 向器件发送写禁止命令
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void W25Q_WriteDisable(void)
+{
+ uint8_t txbuf[1];
+
+ txbuf[0] = CMD_DISWR;
+ W25Q_SendData(txbuf, 1);
+}
+
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_WriteStatus
+* 功能说明: 向器件发送写状态字指令
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void W25Q_WriteStatus(uint8_t _value)
+{
+ uint8_t txbuf[2];
+
+ txbuf[0] = CMD_WRSR;
+ txbuf[1] = _value;
+ W25Q_SendData(txbuf, 2);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_UnlockBlock
+* 功能说明: 解锁写保护。 在擦除全片和扇区时执行
+* 形 参: _addr 地址
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void W25Q_UnlockBlock(void)
+{
+ if (g_tW25Q.UnlockCmd > 0x00)
+ {
+ uint8_t txbuf[1];
+
+ W25Q_WriteEnable();
+
+ txbuf[0] = g_tW25Q.UnlockCmd;
+ W25Q_SendData(txbuf, 1);
+ }
+// else
+// {
+// W25Q_WriteDisable();
+//
+// W25Q_WaitBusy(200);
+//
+// W25Q_WriteStatusEnable();
+//
+// W25Q_WriteStatus(0); /* 解除所有BLOCK的写保护 */
+// }
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_WaitBusy
+* 功能说明: 等待操作结束
+* 形 参: _addr 地址
+* 返 回 值: 1表示OK, 0表示出错
+*********************************************************************************************************
+*/
+uint8_t W25Q_WaitBusy(uint32_t _timeout)
+{
+ int32_t time1;
+ uint8_t txbuf[1];
+ uint8_t rxbuf[4]; /* 4路的状态字 */
+ uint8_t i;
+ int32_t timedisp;
+ uint8_t ch_num;
+
+ time1 = bsp_GetRunTime();
+ timedisp = bsp_GetRunTime();
+ txbuf[0] = (CMD_RDSR); /* 发送命令, 读状态寄存器 */
+
+ if ( g_gMulSwd.MultiMode == 0)
+ {
+ ch_num = 1;
+ }
+ else
+ {
+ ch_num = g_gMulSwd.MultiMode; /* 多路烧录 */
+ }
+
+ while(1)
+ {
+ if (bsp_CheckRunTime(time1) > _timeout + 5000)
+ {
+ printf("W25Q_WaitBusy(%d) is timeout", _timeout);
+ break; /* 超时 */
+ }
+
+ if (bsp_CheckRunTime(timedisp) > 500)
+ {
+ timedisp = bsp_GetRunTime();
+
+ {
+ float percent;
+ int32_t tt;
+
+ tt = bsp_CheckRunTime(time1);
+ percent = ((float)tt / _timeout) * 100;
+ PG_PrintPercent(percent, 0);
+ bsp_Idle();
+ }
+ }
+
+ W25Q_SendAndReadData(txbuf, 1, rxbuf, 1);
+
+ {
+ uint8_t err = 0;
+
+ if (g_tProg.AbortOnError == 1) /* 有1个错误 则返回错误 */
+ {
+ for (i = 0; i < ch_num; i++)
+ {
+ if (g_gMulSwd.Active[i] == 1)
+ {
+ if ((rxbuf[i] & WIP_FLAG) != 0)
+ {
+ err = 1;
+ }
+ }
+ }
+
+ if (err == 0)
+ {
+ return 1; /* OK */
+ }
+ }
+ else
+ {
+ for (i = 0; i < ch_num; i++)
+ {
+ if (g_gMulSwd.Active[i] == 1 && g_gMulSwd.Error[i] == 0)
+ {
+ if ((rxbuf[i] & WIP_FLAG) != 0)
+ {
+ err = 1;
+ }
+ }
+ }
+
+ if (err == 0)
+ {
+ return 1; /* OK */
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_EraseSector
+* 功能说明: 擦除扇区, 一般4K, 先检查是否为空
+* 形 参: _addr 地址
+* 返 回 值: 1表示OK, 0表示出错
+*********************************************************************************************************
+*/
+uint8_t W25Q_EraseSector(uint32_t _Addr)
+{
+ uint8_t buf[5];
+
+
+ /* 先判断是否为空,再擦除 */
+ if (W25Q_CheckBlank(_Addr, g_tW25Q.SectorSize) == 1)
+ {
+ return 1;
+ }
+
+ W25Q_WriteEnable();
+
+ buf[0] = g_tW25Q.EraseSectorCmd;
+ if (g_tW25Q.Capacity > 16 * 1024 * 1024)
+ {
+ buf[1] = _Addr >> 24;
+ buf[2] = _Addr >> 16;
+ buf[3] = _Addr >> 8;
+ buf[4] = _Addr >> 0;
+ W25Q_SendData(buf, 5);
+ }
+ else /* 3字节模式 */
+ {
+ buf[1] = _Addr >> 16;
+ buf[2] = _Addr >> 8;
+ buf[3] = _Addr >> 0;
+ W25Q_SendData(buf, 4);
+ }
+
+ return W25Q_WaitBusy(g_tW25Q.EraseSectorTimeout);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_EraseSector
+* 功能说明: 擦除整片
+* 形 参: 无
+* 返 回 值: 1表示OK, 0表示出错
+*********************************************************************************************************
+*/
+uint8_t W25Q_EraseChip(void)
+{
+ uint8_t buf[4];
+
+ W25Q_WriteEnable();
+
+ buf[0] = g_tW25Q.EraseChipCmd; /* 整片擦除指令 */
+ W25Q_SendData(buf, 1);
+
+ return W25Q_WaitBusy(g_tW25Q.EraseChipTimeout);
+}
+
+/*
+*********************************************************************************************************
+* 函 数 名: W25Q_FLASH_ProgramBuf
+* 功能说明: Programs a memory block。 页大小256字节
+* 形 参: _FlashAddr : 绝对地址。
+* _Buff : Pointer to buffer containing source data.
+* _Size : 数据大小,可以大于1个block
+* 返 回 值: 0 : 出错; 1 : 成功
+*********************************************************************************************************
+*/
+uint8_t W25Q_FLASH_ProgramBuf(uint32_t _Addr, uint8_t *_Buff, uint32_t _Size)
+{
+ if (g_tW25Q.AutoAddrInc == 0) /* 256 page 写入模式 */
+ {
+ uint8_t txbuf[5];
+ uint32_t i;
+
+ for (i = 0; i < _Size / 256; i++)
+ {
+ W25Q_WriteEnable();
+
+ txbuf[0] = CMD_PAGE_PROG;
+ if (g_tW25Q.Capacity > 16 * 1024 * 1024)
+ {
+ txbuf[1] = _Addr >> 24;
+ txbuf[2] = _Addr >> 16;
+ txbuf[3] = _Addr >> 8;
+ txbuf[4] = _Addr >> 0;
+ W25Q_SendData0(txbuf, 5); /* 发送完毕不拉高CS */
+ }
+ else /* 3字节模式 */
+ {
+ txbuf[1] = _Addr >> 16;
+ txbuf[2] = _Addr >> 8;
+ txbuf[3] = _Addr >> 0;
+ W25Q_SendData0(txbuf, 4); /* 发送完毕不拉高CS */
+ }
+
+ W25Q_SendData(_Buff, 256); /* 发送完毕拉高CS */
+
+ if (W25Q_WaitBusy(g_tW25Q.ProgPageTimeout) == 0)
+ {
+ return 0; /* 超时异常 */
+ }
+
+ _Addr += 256;
+ _Buff += 256;
+ }
+ }
+ else /* 地址递增模式 SST25 */
+ {
+ uint8_t txbuf[6];
+ uint32_t i;
+
+ W25Q_WriteEnable();
+
+// /* 允许SO输出忙状态 */
+// txbuf[0] = 0x70;
+// W25Q_SendData(txbuf, 1);
+
+ txbuf[0] = CMD_AAI;
+ txbuf[1] = _Addr >> 16;
+ txbuf[2] = _Addr >> 8;
+ txbuf[3] = _Addr >> 0;
+ txbuf[4] = *_Buff++;
+ txbuf[5] = *_Buff++;
+ W25Q_SendData(txbuf, 6); /* 发送完毕拉高CS */
+
+ //---- 等so
+ if (W25Q_WaitBusy(g_tW25Q.ProgPageTimeout) == 0)
+ {
+ return 0; /* 超时异常 */
+ }
+
+ for (i = 0; i < (_Size - 2) / 2; i++)
+ {
+ txbuf[0] = CMD_AAI;
+ txbuf[1] = *_Buff++;
+ txbuf[2] = *_Buff++;
+ W25Q_SendData(txbuf, 3); /* 发送完毕拉高CS */
+
+ if (W25Q_WaitBusy(g_tW25Q.ProgPageTimeout) == 0)
+ {
+ return 0; /* 超时异常 */
+ }
+ }
+
+ // 退出AAI
+ W25Q_WriteDisable();
+
+ if (W25Q_WaitBusy(g_tW25Q.ProgPageTimeout) == 0)
+ {
+ return 0; /* 超时异常 */
+ }
+ }
+ return 1;
+}
+
+/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
diff --git a/User/programmer/w25q_flash.h b/User/programmer/w25q_flash.h
new file mode 100644
index 0000000..7fc6c84
--- /dev/null
+++ b/User/programmer/w25q_flash.h
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+*
+* 模块名称 : SPI Flash编程驱动
+* 文件名称 : w25q_flash.h
+*
+*********************************************************************************************************
+*/
+
+#ifndef _W25Q_FLASH_H
+#define _W25Q_FLASH_H
+
+
+typedef struct
+{
+ uint32_t Capacity; /* 芯片容量 */
+ uint32_t SectorSize; /* 扇区大小 */
+ uint32_t EraseSectorCmd; /* 扇区擦除指令 */
+ uint32_t EraseSectorTimeout; /* 擦除扇区超时 ms */
+ uint32_t EraseChipCmd; /* 全片擦除指令 */
+ uint32_t EraseChipTimeout; /* 擦除整片超时 ms */
+ uint32_t ProgPageTimeout; /* 编程page超时 */
+ uint8_t AutoAddrInc; /* AAI模式写 */
+ uint8_t ReadMode; /* 0表示单线,1表示单线MOSI,双线MISO,2表示双线MOSI,双线MISO */
+ uint8_t ReadIDCmd; /* 大多数是0x9F, SST是0x90 */
+ uint8_t UnlockCmd; /* 解锁指令 */
+}W25Q_T;
+
+void W25Q_InitHard(void);
+uint8_t W25Q_DetectIC(uint32_t *_id);
+uint8_t W25Q_EraseSector(uint32_t _addr);
+uint8_t W25Q_EraseChip(void);
+uint8_t W25Q_FLASH_ProgramBuf(uint32_t _FlashAddr, uint8_t *_Buff, uint32_t _Size);
+uint8_t W25Q_ReadBuf(uint32_t _Addr, uint8_t *_Buf, uint16_t _Len);
+
+extern W25Q_T g_tW25Q;
+
+#endif
diff --git a/User/st_usb/usb_if.c b/User/st_usb/usb_if.c
index bcf7025..e92e69c 100644
--- a/User/st_usb/usb_if.c
+++ b/User/st_usb/usb_if.c
@@ -38,6 +38,24 @@ void usbd_Init(void)
//tusb_init();
}
+/*
+*********************************************************************************************************
+* 函 数 名: usbd_UnInit
+* 功能说明: 退出USB协议栈
+* 形 参: 无
+* 返 回 值: 无
+*********************************************************************************************************
+*/
+void usbd_UnInit(void)
+{
+ if (USBD_Device.dev_config > 0)
+ {
+ USBD_Stop(&USBD_Device);
+
+ USBD_DeInit(&USBD_Device);
+ }
+}
+
/*
*********************************************************************************************************
* 函 数 名: usbd_OpenCDC
diff --git a/User/st_usb/usb_if.h b/User/st_usb/usb_if.h
index a75fbff..16d1533 100644
--- a/User/st_usb/usb_if.h
+++ b/User/st_usb/usb_if.h
@@ -18,6 +18,7 @@
#include "usbd_cdc_interface.h"
void usbd_Init(void);
+void usbd_UnInit(void);
void usbd_OpenCDC(uint8_t _com);
void usbd_OpenCDC2(uint8_t _com);
void usbd_CloseCDC(void);
diff --git a/User/st_usb/usbd_virtual_com/usbd_cdc_interface.c b/User/st_usb/usbd_virtual_com/usbd_cdc_interface.c
index f88d4e9..8322a38 100644
--- a/User/st_usb/usbd_virtual_com/usbd_cdc_interface.c
+++ b/User/st_usb/usbd_virtual_com/usbd_cdc_interface.c
@@ -475,12 +475,6 @@ static void TIM_Config(void)
/* ## Enable TIM peripherals Clock ####################################### */
TIMx_CLK_ENABLE();
- /* ## Configure the NVIC for TIMx ######################################## */
- /* Set Interrupt Group Priority */
- HAL_NVIC_SetPriority(TIMx_IRQn, 6, 0);
-
- /* Enable the TIMx global Interrupt */
- HAL_NVIC_EnableIRQ(TIMx_IRQn);
/* Set TIMx instance */
TimHandle.Instance = TIMx;
@@ -507,6 +501,14 @@ static void TIM_Config(void)
/* Starting Error */
ERROR_HANDLER();
}
+
+ /* 2020-11-27 V1.36 移动到后面,在前面从DAP跳转时会死机 */
+ /* ## Configure the NVIC for TIMx ######################################## */
+ /* Set Interrupt Group Priority */
+ HAL_NVIC_SetPriority(TIMx_IRQn, 6, 0);
+
+ /* Enable the TIMx global Interrupt */
+ HAL_NVIC_EnableIRQ(TIMx_IRQn);
}
/*