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); } /*