QuakeGod
2023-02-01 4392349b649164f2b498ca5157ecd141631ea96f
提交 | 用户 | age
bfc108 1 /**
Q 2   ******************************************************************************
3   * @file           : functions.c
4   * @brief          : funcstions program body
5   ******************************************************************************
6     */
7 //#include "globaldef.h"
8 #include "functions.h"
9 #include "string.h"
10 #include "stm32f0xx_hal.h"
a7db3c 11 #if (BOARD_TYPE == 14)
d69aae 12 #include "fp0.h"
Q 13 #endif
bfc108 14 extern __IO uint32_t uwTick;
Q 15 //#include "Myprotocol.h"
16 int TickFreq=10000;
17 int CoreClkMHz;        //=SystemCoreClock/1000000;
18 int TickPriodClk;        //=SystemCoreClock/TickFreq;
19 unsigned int TickPrioduS;    //
20 volatile unsigned int nCurTick=0;
21 volatile unsigned int CurTickuS=0;
0fe6b0 22 //volatile unsigned int ThisRunTime=0;        //开机时间
Q 23 //volatile unsigned int TotalRunTime=0;     //总开机时间
24 //volatile unsigned int PwrCount=0;                //开机次数
25 unsigned short ClkuS;                //每个Clk的nS数,
bfc108 26
Q 27 int InituS(int TickFreq1)
28 {
0fe6b0 29         TickPrioduS=1000000/TickFreq1;    //每个SysTick的微秒数
Q 30         CoreClkMHz=HAL_RCC_GetHCLKFreq()/1000000;        //=SystemCoreClock/1000000;每uS的时钟数
31         TickPriodClk=SystemCoreClock/TickFreq1;            //每个SysTick的时钟数
bfc108 32         ClkuS=(1000000LL*65536)/SystemCoreClock;
Q 33         CurTickuS=TickPrioduS+100u;
34     return 0;
35 }
36
37 inline unsigned int GetuS(void)
38 {
39 //    unsigned short Clk1=SysTick->VAL;
40     
41     int CurTickuS1=CurTickuS;
42     int Val1=SysTick->VAL;
43     if (CurTickuS1 != CurTickuS )
44     {
45         CurTickuS1=CurTickuS;
46         Val1=SysTick->VAL;
47     }
48     uint32_t us1=CurTickuS1-(((Val1)*1365)>>16);
49     return us1;
50 }
51
52 inline unsigned int GetTick(void)
53 {
54 //    unsigned short Clk1=SysTick->VAL;
55         return nCurTick;
0fe6b0 56 }
Q 57
58 void logData(unsigned char d)
59 {
60             KMem.WDB[128+KMem.WDT[123]] = d;
61             KMem.WDT[123]++;      if (KMem.WDT[123]>=100) {KMem.WDT[123]=81;}            
bfc108 62 }
a7db3c 63
bfc108 64 const unsigned short crc16_table[256] = {
Q 65 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
66 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
67 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
68 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
69 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
70 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
71 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
72 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
73 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
74 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
75 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
76 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
77 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
78 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
79 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
80 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
81 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
82 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
83 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
84 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
85 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
86 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
87 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
88 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
89 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
90 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
91 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
92 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
93 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
94 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
95 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
96 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
97 };
98
99 unsigned short crc_check(const unsigned char * data, unsigned int  length)
100 {
101 unsigned short crc_reg = 0xFFFF;
d69aae 102     while (length--)
Q 103     {
104     crc_reg = (crc_reg >> 8) ^ crc16_table[(crc_reg ^ *data++) & 0xff];
105     }
a7db3c 106     return (~crc_reg) & 0xFFFF;
bfc108 107 }
Q 108
109 const uint16_t polynom = 0xA001;
110  
111 unsigned short crc16bitbybit(const unsigned char *ptr, unsigned int len)
112 {
113     uint8_t i;
114     uint16_t crc = 0xffff;
115  
116     if (len == 0) {
117         len = 1;
118     }
119     while (len--) {
120         crc ^= *ptr;
121         for (i = 0; i<8; i++)
122         {
123             if (crc & 1) {
124                 crc >>= 1;
125                 crc ^= polynom;
126             }
127             else {
128                 crc >>= 1;
129             }
130         }
131         ptr++;
132     }
133     return(crc);
134 }
135  
e1f350 136 /* Table of CRC values for high-order byte */
bfc108 137 const uint8_t crctablehi[] = {
Q 138     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
139     0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
140     0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
141     0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
142     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
143     0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
144     0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
145     0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
146     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
147     0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
148     0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
149     0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
150     0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
151     0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
152     0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
153     0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
154     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
155     0x40
156 };
e1f350 157 /* Table of CRC values for low-order byte */
bfc108 158 const uint8_t crctablelo[] = {
Q 159     0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
160     0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
161     0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
162     0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
163     0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
164     0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
165     0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
166     0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
167     0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
168     0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
169     0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
170     0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
171     0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
172     0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
173     0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
174     0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
175     0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
176     0x40
177 };
178  
179 uint16_t crc16table(const uint8_t *ptr, uint16_t len)
180 {
181     uint8_t crchi = 0xff;
182     uint8_t crclo = 0xff; 
183     uint16_t index;
184     while (len--) 
185     {
186         index = crclo ^ *ptr++; 
187         crclo = crchi ^ crctablehi[index];
188         crchi = crctablelo[index];
189     }
190     return (crchi << 8 | crclo);
191 }
192  
193 void modbuscrc16test()
194 {
195     printf("\n");
196     printf(" Modbus CRC16 tester\n");
197     printf("-----------------------------------------------------------------------\n");
198     uint8_t crc16_data[] = { 0x01, 0x04, 0x04, 0x43, 0x6b, 0x58, 0x0e };    // expected crc value 0xD825.
199     printf(" modbus crc16table test, expected value : 0xd825, calculate value : 0x%x\n", crc16table(crc16_data, sizeof(crc16_data)));
e1f350 200 //    printf(" modbus crc16tablefast test, expected value : 0xd825, calculate value : 0x%x\n", crc16tablefast(crc16_data, sizeof(crc16_data)));
bfc108 201     printf(" modbus crc16bitbybit test, expected value : 0xd825, calculate value : 0x%x\n", crc16bitbybit(crc16_data, sizeof(crc16_data)));
Q 202 }
203
204 int InitUartstat(stUartStat * pUartstat,void * pBufRx, int nSizeRx, void * pBufTx, int nSizeTx)
205 {
206     memset(pUartstat,sizeof(stUartStat),0);
207     initQueue(&pUartstat->QRx,pBufRx,nSizeRx);
208     initQueue(&pUartstat->QTx,pBufTx,nSizeTx);
209     return 0;
210 }
211
212 int Uart1SendDMA(void * pData, int nSize)
213 {
214     LL_DMA_DisableChannel(DMA1,LL_DMA_CHANNEL_2);
215     LL_DMA_ConfigAddresses(DMA1,LL_DMA_CHANNEL_2, (uint32_t)pData,
216          (uint32_t)&USART1->TDR, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
217     LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_2,nSize);
218     LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_2);
219     Uart1Stat.DMASendLen=nSize;
0fe6b0 220     Uart1Stat.bSending=1;    
bfc108 221     LL_DMA_EnableIT_TC(DMA1,LL_DMA_CHANNEL_2);
Q 222     LL_USART_EnableDMAReq_TX(USART1);
223     return nSize;    
224 }
225
226 int Uart1TriggerSendDMA()
227 {
0fe6b0 228         if (!Uart1Stat.bSending&&!IsEmpty(&Uart1Stat.QTx))
bfc108 229         {            
Q 230             int len1=GetContinueData(&Uart1Stat.QTx);
231             Uart1SendDMA(GetReadBuffer(&Uart1Stat.QTx),len1);
232         }
233         return 0;
234 }
235
e1f350 236 int Uart2RecvDMA(void * pBuf, int nSize)
Q 237 {
238     LL_DMA_DisableChannel(DMA1,LL_DMA_CHANNEL_5);
239     LL_DMA_ConfigAddresses(DMA1,LL_DMA_CHANNEL_5, (uint32_t)&USART2->RDR,
240          (uint32_t)pBuf, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
241     LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_5,nSize);
242     LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_5);
243     Uart2Stat.DMARecvLen=nSize;
0fe6b0 244     Uart2Stat.bRecving=1;    
e1f350 245     LL_DMA_EnableIT_TC(DMA1,LL_DMA_CHANNEL_5);
Q 246     LL_USART_EnableDMAReq_RX(USART2);    
247     return 0;
248 }
bfc108 249 int Uart2SendDMA(void * pData, int nSize)
Q 250 {
251     LL_DMA_DisableChannel(DMA1,LL_DMA_CHANNEL_4);
252     LL_DMA_ConfigAddresses(DMA1,LL_DMA_CHANNEL_4, (uint32_t)pData,
253          (uint32_t)&USART2->TDR, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
254     LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_4,nSize);
255     LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_4);
256     Uart2Stat.DMASendLen=nSize;
0fe6b0 257     Uart2Stat.bSending=1;    
bfc108 258     LL_DMA_EnableIT_TC(DMA1,LL_DMA_CHANNEL_4);
Q 259     LL_USART_EnableDMAReq_TX(USART2);
260     return nSize;    
261 }
262 int Uart2TriggerSendDMA()
263 {
0fe6b0 264         if (!Uart2Stat.bSending&&!IsEmpty(&Uart2Stat.QTx))
bfc108 265         {            
Q 266             int len1=GetContinueData(&Uart2Stat.QTx);
267             Uart2SendDMA(GetReadBuffer(&Uart2Stat.QTx),len1);
268         }
269         return 0;
270 }
e1f350 271
Q 272 void TriggerPendSV()
273 {
274       SCB->ICSR=SCB_ICSR_PENDSVSET_Msk; //1<<SCB_ICSR_PENDSVSET_Pos;
275 }
276
277 void PendSvCallBack()
278 {
a7db3c 279 #if (BOARD_TYPE == 14)
d69aae 280 ///*    
Q 281         if (bSPI1RecvDone)
282         {
283             bSPI1RecvDone=0;
284             ParseFP0Pkg(SPI1RecvBuf,nSPI1RecvLenInBuf);
285         }
286 //*/    
287 #endif        
e1f350 288     if (Uart2Stat.bPacketRecved)
Q 289     {
0fe6b0 290         KBusParsePacket(2, (pKBPacket)Uart2RecvBuf1, Uart2RecvBuf1DataLen);        
e1f350 291         Uart2RecvBuf1DataLen=0;
Q 292         Uart2Stat.bPacketRecved=0;
293         Uart2RecvDMA(Uart2RecvBuf1,sizeof(Uart2RecvBuf1));        
294     }
295 }
d69aae 296
Q 297 void SPI1_IRQ_CallBack()
298 {
299 //    LL_GPIO_TogglePin(GPIOB,LL_GPIO_PIN_7);
300      if (LL_SPI_IsActiveFlag_RXNE(SPI1))
301      {
439234 302          uint8_t value = LL_SPI_ReceiveData8( SPI1);
a7db3c 303 #if (BOARD_TYPE == 14)
0fe6b0 304             KMem.WDD[62]++;
Q 305             KMem.WDT[122]++;
d69aae 306          if (!bSPI1Sending)
Q 307          {
0fe6b0 308              logData(value);
d69aae 309          }
Q 310          if (!bSPI1Sending && (1 || bSPI1Recving))
311          {
312              SPI1RecvBuf[nSPI1RecvPos]=value;
313              nSPI1RecvPos++;
314              
315              if (value==0x0d)
316              {
0fe6b0 317                  logData(nSPI1RecvPos);
d69aae 318
Q 319                  nSPI1RecvLenInBuf=nSPI1RecvPos;
320                  bSPI1RecvDone=1;
321                  nSPI1RecvPos=0;
322                  bSPI1Recving=0;
323                  
324              
325                  TriggerPendSV();
326              }
327          }
328          if (bSPI1Sending)
329          {
330                  nSPI1SentLen++;
331                  KMem.SDD[63]++;
332              
333              if (nSPI1SentLen >= nSPI1ToSendLen) {
334                  SetACKPin_1();
335                  bSPI1Sending=0;
336                  bSPI1SendDone=1;
337                  bSPI1Recving=1;
338                  nSPI1RecvPos=0;
339                  SetFP0DEPin_0();
340              }
341              else {
342                  value = SPI1SendBuf[nSPI1SentLen];
343                  LL_SPI_TransmitData8(SPI1,value);
0fe6b0 344                 logData(value);
d69aae 345              }
Q 346          }
347 #endif         
348      }     
349 }
350
bfc108 351 void Uart1SendDone()
Q 352 {
353     Uart1Stat.TcCount++;
354     return;
355 }
356
357 void Uart1RecvDone()
358 {
359         Uart1Stat.IdelCount++;
360 //        NVIC_SetPendingIRQ(PendSV_IRQn);
e1f350 361 //      SCB->ICSR=SCB_ICSR_PENDSVSET_Msk; //1<<SCB_ICSR_PENDSVSET_Pos;
Q 362     
bfc108 363     if (Uart1RecvBuf1DataLen >0)
Q 364     {
365         Uart1Stat.bPacketRecved=1;
e1f350 366 //      SCB->ICSR=SCB_ICSR_PENDSVSET_Msk; //1<<SCB_ICSR_PENDSVSET_Pos;
bfc108 367 //        KLParsePacket(Uart1RecvBuf1,Uart1RecvBuf1DataLen);
Q 368 //        Uart1RecvBuf1DataLen=0;
369     }
370 }
371
372 void Uart2SendDone()
373 {
374     Uart2Stat.TcCount++;
375 }
376 void Uart2RecvDone()
377 {
e1f350 378     Uart2RecvBuf1DataLen=sizeof(Uart2RecvBuf1) - LL_DMA_GetDataLength(DMA1,LL_DMA_CHANNEL_5);
bfc108 379     Uart2Stat.bPacketRecved=1;
Q 380     Uart2Stat.IdelCount++;
e1f350 381     if (Uart2RecvBuf1DataLen>0)
Q 382         TriggerPendSV();
0fe6b0 383     //    ParsePacket((pKBPacket)Uart2RecvBuf1,Uart2RecvBuf1DataLen);
bfc108 384 }
Q 385
386 int PutStr(char * str1, int len1)
387 {
388 //    Uart1SendDMA(str1,len1);
d69aae 389     PushIn(&Uart1Stat.QTx,str1,len1);
bfc108 390 //    LL_USART_EnableIT_TXE(USART1);   
Q 391 //    LL_USART_EnableIT_TC(USART1);     
d69aae 392     Uart1TriggerSendDMA();
bfc108 393     return len1;
Q 394 }
395 int PutStr1(char * str1, int len1)
396 {
397 //    Uart1SendDMA(str1,len1);
398     PushIn(&Uart1Stat.QTx,str1,len1);
399 //    LL_USART_EnableIT_TXE(USART1);   
400 //    LL_USART_EnableIT_TC(USART1);     
401     Uart1TriggerSendDMA();
402     return len1;
403 }
404 int PutStr2(char * str1, int len1)
405 {
e1f350 406     Uart2SendDMA(str1,len1);
Q 407 //    PushIn(&Uart2Stat.QTx,str1,len1);
bfc108 408 //    LL_USART_EnableIT_TXE(USART1);   
Q 409 //    LL_USART_EnableIT_TC(USART1);     
e1f350 410 //    Uart2TriggerSendDMA();
bfc108 411     return len1;
Q 412 }
413
d69aae 414 int SendPacket(int nChn, void * pBuf,int len1)
bfc108 415 {
d69aae 416     if (nChn==1)     {
Q 417         PutStr1((char *)pBuf,len1);
418 //    PushIn(&Uart1Stat.QTx,p1,len1);
419 //    Uart1TriggerSendDMA();
420         Uart1Stat.SentPacket++;        
421     }else if (nChn==2){
422         PutStr2((char *)pBuf,len1);    
423 //    PushIn(&Uart2Stat.QTx,p1,len1);
424 //    Uart2TriggerSendDMA();    
425         Uart2Stat.SentPacket++;        
426     }
427         return len1;
bfc108 428 }
d69aae 429 /*
bfc108 430 int SendPacket1(void * pBuf,int len1)
Q 431 {
432         PutStr1((char *)pBuf,len1);
433 //    PushIn(&Uart1Stat.QTx,p1,len1);
434 //    Uart1TriggerSendDMA();
435         Uart1Stat.SentPacket++;
436     return len1;
437 }
0fe6b0 438 int SendPacket2(pKBPacket p1,int len1)
bfc108 439 {
Q 440         PutStr2((char *)p1,len1);    
441 //    PushIn(&Uart2Stat.QTx,p1,len1);
442 //    Uart2TriggerSendDMA();    
443         Uart2Stat.SentPacket++;
444     return len1;
445 }
d69aae 446 */
bfc108 447 void ToggleRunLed() {    LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_13);}
Q 448 void ToggleErrLed() {    LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_14);}
0fe6b0 449 void ToggleErr2Led() {    LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_15);}
Q 450
a7db3c 451 #if (BOARD_TYPE == 14)
d69aae 452 void ToggleOutStat() {    LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_15);}
Q 453
454 void SetOutStat(uchar bOn)
455 {
456     if (bOn) {LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_15);}
457     else {LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_15);}    
458 }
459 #else
bfc108 460 void ToggleOutStat() {    LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_11);}
Q 461
462 void SetOutStat(uchar bOn)
463 {
464     if (bOn) {LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11);}
465     else {LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11);}    
466 }
d69aae 467 #endif
bfc108 468
Q 469 void SetRunLed(uchar bOn)
470 {
471     if (bOn) {LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_13);}
472     else {LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_13);}        
473 }
474 void SetErrLed(uchar bOn)
475 {
476     if (bOn) {LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_14);}
477     else {LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_14);}        
478 }
0fe6b0 479 void SetErr2Led(uchar bOn)
Q 480 {
481     if (bOn) {LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_15);}
482     else {LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_15);}        
483 }
484 /*
bfc108 485 void SetLeds(uchar bRun, uchar bErr)
Q 486 {
487     SetRunLed(bRun); SetErrLed (bErr);
488 }
0fe6b0 489 */
bfc108 490 #define set165SL_0() LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_4)
Q 491 #define set165SL_1() LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_4)
492 #define set165CLK_0() LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_5)
493 #define set165CLK_1() LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_5)
494 #define Get165SER() LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_6)
495 #define GetCfg165SER() LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_7)
496
497 unsigned int Input165_8()
498 {
499     int x1=0;
e1f350 500     __disable_irq();
bfc108 501     set165SL_0();    set165SL_1();
Q 502     unsigned int mask1=0x0080;
503     volatile uint32_t * p1=&GPIOA->IDR;
504     for (uint32_t i=8;i;i--)
505     {
506         //if (Get165SER()) {}
507         //else x1|=mask1;
508         if (*p1&LL_GPIO_PIN_6) {}
509         else x1|=mask1;            
510         //x1<<=1;
511         //x1|=!Get165SER();
512         set165CLK_0();            
513         mask1>>=1;
514         set165CLK_1();
515     }
e1f350 516     __enable_irq();
bfc108 517     return x1;
Q 518 }
519
520 unsigned int Input165(int nBit)
521 {
522     int x1=0;
e1f350 523     __disable_irq();
bfc108 524     set165SL_0();    set165SL_1();
Q 525     unsigned int mask1=1<<(nBit-1);
526     volatile uint32_t * p1=&GPIOA->IDR;
527     for (uint32_t i=nBit;i;i--)
528     {
529         //if (Get165SER()) {}
530         //else x1|=mask1;
531         if (*p1&LL_GPIO_PIN_6) {}
532         else x1|=mask1;            
533         //x1<<=1;
534         //x1|=!Get165SER();
535         set165CLK_0();    
536         mask1>>=1;
537         set165CLK_1();
538     }
e1f350 539     __enable_irq();
bfc108 540     return x1;
Q 541 }
542 unsigned int Input165_R(int nBit)
543 {
e1f350 544     __disable_irq();
bfc108 545     set165SL_0();    set165SL_1();
Q 546     int nBytes = nBit /8;
547     volatile uint32_t * p1=&GPIOA->IDR;
548     union stdata
549     {
550         int intvalue;
551         unsigned char Bytes[4];
552     }rdata;
553     rdata.intvalue=0;
554     for (int i=0;i<nBytes;i++)
555     {
556         int x1=0;
557         unsigned int mask1=1<<(7);
558         for (uint32_t i=8;i;i--)
559         {
560             //if (Get165SER()) {}
561             //else x1|=mask1;
562             if (*p1&LL_GPIO_PIN_6) {}
563             else x1|=mask1;            
564             //x1<<=1;
565             //x1|=!Get165SER();
566             set165CLK_0();    
567             mask1>>=1;
568             set165CLK_1();
569         }
570         rdata.Bytes[i]=x1;
571     }
e1f350 572     __enable_irq();
bfc108 573     return rdata.intvalue;
Q 574 }
575
576 unsigned int Input165Cfg(int nBit)
577 {
578     int x1=0;
e1f350 579     __disable_irq();
bfc108 580     set165SL_0();    set165SL_1();
Q 581     unsigned int mask1=1<<(nBit-1);
582     volatile uint32_t * p1=&GPIOA->IDR;
583     for (uint32_t i=nBit;i;i--)
584     {
585         //if (Get165SER()) {}
586         //else x1|=mask1;
587         if (*p1&LL_GPIO_PIN_7) {}
588         else x1|=mask1;            
589         //x1<<=1;
590         //x1|=!Get165SER();
591         set165CLK_0();    
592         mask1>>=1;
593         set165CLK_1();
594     }
e1f350 595     __enable_irq();
bfc108 596     return x1;
Q 597 }
598
599 unsigned int GetInput()
600 {
601     int BoradType=GetBoardType();
602     switch (BoradType)
603     {
604         
605         case 1:
606                      return Input165(8);
607         case 2:
608                      return Input165(8);
609         case 3:
610                      return Input165(16);
611         case 4:
612                      return Input165(8);
613         case 5:
614         case 7:
615                         return Input165(16);
616         case 6:
617         case 8:
618                         return Input165(8);
619         case 9:
620                         return Input165_R(16);
621         case 10:
622                         return Input165_R(8);
0aeaad 623         case 11:
Q 624                         return Input165_R(8);
a7db3c 625         case 13:
Q 626                         return Input165_R(16);
627         case 14:
f4f290 628                         return 0;    //FP0
a7db3c 629         case 15:
Q 630                         return Input165_R(16);
7a2ff3 631         case 16:
Q 632                         return Input165_R(8);
633         
bfc108 634         default:
Q 635             break;
636     }
637         return 0;
638         
639 }
640 int ReadConfig_0()
641 {
642     return 0;
643 }
644
645 int ReadConfig_1()
646 {
647     //    uchar x = LL_GPIO_ReadInputPort(GPIOB);
648 //    uchar x1 = LL_GPIO_IsInputPinSet(GPIOB,LL_GPIO_PIN_10);
649 //    uchar x2=(x&0x7) | (x1 << 3 ) ;    
650     uchar x2=0;
651     x2=(GPIOB->IDR&0x7) | ((GPIOB->IDR &0x400)>>7); 
652     x2= (~x2)&0xf;
653     return x2;
654 }
655
656 int ReadConfig_2()
657 {
658     uchar x2=0;
659     x2=(GPIOB->IDR&0x7) | ((GPIOB->IDR &0x400)>>7); 
660     x2= (~x2)&0xf;
661     return x2;
662 }
663
664 int ReadConfig_3()
665 {
666     uchar x2=0;
667     x2 = Input165(24)&0xff;
668     return x2;
669     
670 }
671 int ReadConfig_4()
672 {
673     
674     uchar x2=0;
675     x2 = Input165(16)&0xff;
676     return x2;
677 }
678
679 int ReadConfig_5()
680 {
681     uchar x2=0;
682     x2 = Input165Cfg(8)&0xff;
683     return x2;
684 }
685
0aeaad 686 int ReadConfig_11()
Q 687 {
688     uchar x2=0;
689     x2=((GPIOB->IDR&0x2)<<2); 
690     x2= ((~x2)&0x8)|1;
691     return x2;
692 }    
693
bfc108 694 int ReadJumperSW()
Q 695 {
696         int BoradType=GetBoardType();
697     switch (BoradType)
698     {
699         case 0:
700                     return ReadConfig_0();    
701         case 1:
702                      return ReadConfig_1();    //old board 4 in 4 o
703         case 2:
704                      return ReadConfig_2();    //old board 8 in 8 o
705         case 3:
706                      return ReadConfig_3();    //Master 16 in16 o
707         case 4:
708                      return ReadConfig_4();    //Slave 8 in 8 o
709         case 5:
710         case 7:
711                      return ReadConfig_5();    // New Master 16 in16 o
712         case 6:
713         case 8:
714                      return ReadConfig_5();    //New Slave 8 in 8 o
715         case 9:
716         case 10:
a7db3c 717                      return ReadConfig_5();    //New Master Slave 8 in 8 o
0aeaad 718         case 11:
Q 719                      return ReadConfig_11(); //Mini Board
d69aae 720         case 13:
Q 721                      return ReadConfig_5();
a7db3c 722         case 14:
Q 723                      return (~(LL_GPIO_ReadInputPort(GPIOA)>>4))&0x0f;    //FP0
724         case 15:
7a2ff3 725         case 16:
a7db3c 726                      return ReadConfig_5();    //Wireless Master Slave 8 in 8 o
bfc108 727         default:
Q 728             
729                      return 0;
730     }
731 }
732
e1f350 733 #define SRCLK2_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_13)
Q 734 #define SRCLK2_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_13)
735 #define STRCLK2_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_12)
736 #define STRCLK2_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_12)
737 #define SER2_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_15)
738 #define SER2_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_15)
bfc108 739
Q 740 void Enable595(uchar bEnable)
741 {
742             if (bEnable) {LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_8);}
743             else {LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_8);}    
744 }
745
746 void Output595_8(unsigned int cc)
747 {
748 //unsigned char i;
0fe6b0 749 ;//        74HC595输出程序,输出8位
bfc108 750 //    cc=~0x3f;
e1f350 751     __disable_irq();
Q 752     STRCLK2_1();
bfc108 753     unsigned int mask1=0x0080;
Q 754     //volatile uint32_t * p1 = &GPIOB->BRR;
755     //volatile uint32_t * p2 = &GPIOB->BSRR;
756     for (;mask1;)
757     {
e1f350 758         SRCLK2_0();
bfc108 759         //*p1=LL_GPIO_PIN_13;
e1f350 760         if (cc&mask1) {SER2_1();}
Q 761         else {SER2_0();}
bfc108 762         mask1>>=1;
e1f350 763         SRCLK2_1();
bfc108 764 //        __nop();
Q 765         //*p2=LL_GPIO_PIN_13;
766     }
e1f350 767     STRCLK2_0();
Q 768     STRCLK2_1();    
769     __enable_irq();
bfc108 770 }
a7db3c 771
bfc108 772 void Output595_16(unsigned int cc)
Q 773 {
774 //unsigned char i;
0fe6b0 775 ;//        74HC595输出程序,输出8位
bfc108 776 //    cc=~0x3f;
e1f350 777     __disable_irq();
Q 778     STRCLK2_1();
bfc108 779     unsigned int mask1=0x8000;
Q 780     //volatile uint32_t * p1 = &GPIOB->BRR;
781     //volatile uint32_t * p2 = &GPIOB->BSRR;
782     for (;mask1;)
783     {
e1f350 784         SRCLK2_0();
bfc108 785         //*p1=LL_GPIO_PIN_13;
e1f350 786         if (cc&mask1) {SER2_1();}
Q 787         else {SER2_0();}
bfc108 788         mask1>>=1;
e1f350 789         SRCLK2_1();
bfc108 790 //        __nop();
Q 791         //*p2=LL_GPIO_PIN_13;
792     }
e1f350 793     STRCLK2_0();
Q 794     STRCLK2_1();
795     __enable_irq();
bfc108 796 }
e1f350 797
d69aae 798 /*
e1f350 799 #define STRCLK12_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_7)
Q 800 #define STRCLK12_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_7)
801
802 void PutOutputSPI1(unsigned int Y)
803 {
804     __disable_irq();
805     STRCLK12_1();    
806     LL_SPI_TransmitData8(SPI1,Y>>8);
807     int i=0;
808     while (LL_SPI_IsActiveFlag_TXE(SPI1) == RESET)
809     {
810     }
811     KMem.SDD[28]=i;
812     i=0;
813     while (LL_SPI_IsActiveFlag_BSY(SPI1) == SET)
814     {
815         i++;
816     }    
817     LL_SPI_TransmitData8(SPI1,Y);
818     while (LL_SPI_IsActiveFlag_TXE(SPI1) == RESET)
819     {
820     }
821     KMem.SDD[28]=i;
822     i=0;
823     while (LL_SPI_IsActiveFlag_BSY(SPI1) == SET)
824     {
825         i++;
826     }        
827     KMem.SDD[30]=i;
828         STRCLK12_0();
d69aae 829         __nop();
Q 830         STRCLK12_1();
831         __enable_irq();
e1f350 832 }
d69aae 833 */
e1f350 834
Q 835 void PutOutputSPI2(unsigned int Y)
836 {
837     __disable_irq();
838     STRCLK2_1();    
839     LL_SPI_TransmitData8(SPI2,Y>>8);
0aeaad 840     int i=0;
Q 841     while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET)
842     {
843     }
844     KMem.SDD[28]=i;
845     i=0;
846     while (LL_SPI_IsActiveFlag_BSY(SPI2) == SET)
847     {
848         i++;
849     }    
e1f350 850     LL_SPI_TransmitData8(SPI2,Y);
Q 851     while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET)
852     {
853     }
854     KMem.SDD[28]=i;
855     i=0;
856     while (LL_SPI_IsActiveFlag_BSY(SPI2) == SET)
857     {
858         i++;
859     }        
0aeaad 860     KMem.SDD[30]=i;
e1f350 861         STRCLK2_0();
d69aae 862         STRCLK2_1();
e1f350 863     __enable_irq();
Q 864 }
865
866 void PutOutput(unsigned int Y)        
867 {    
a7db3c 868 #if (BOARD_TYPE == 14)
d69aae 869     return ;
0fe6b0 870 #else
e1f350 871     PutOutputSPI2(Y);
Q 872     //Output595_16(Y);
0fe6b0 873 #endif
0aeaad 874 }
bfc108 875
7a2ff3 876 #if (BOARD_TYPE == 9 || BOARD_TYPE == 10 || BOARD_TYPE == 15 ||  BOARD_TYPE == 16)
bfc108 877 //#pragma message("9,10")
0fe6b0 878     // V4.2 管脚排列向右移动了一位。
bfc108 879 #define SRCLK1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_1)
Q 880 #define SRCLK1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_1)
881 #define STRCLK1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_2)
882 #define STRCLK1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_2)
883 #define OE1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_10)
884 #define OE1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_10)
885 #define SER1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_11)
886 #define SER1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_11)
0fe6b0 887 #else        //按照原来的管脚排列
bfc108 888 #define SRCLK1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_0)
Q 889 #define SRCLK1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_0)
890 #define STRCLK1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_1)
891 #define STRCLK1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_1)
892 #define OE1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_2)
893 #define OE1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_2)
894 #define SER1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_10)
895 #define SER1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_10)
896 #endif
897
898
899 void EnableDisIn(uchar bEnable)
900 {
901             if (bEnable) {OE1_0();}
902             else {OE1_1();}    
903 }
a7db3c 904
bfc108 905 void displayInput(unsigned int cc)
Q 906 {
907 //unsigned char i;
0fe6b0 908 ;//        74HC595输出程序,输出8位
bfc108 909 //    cc=~0x3f;
e1f350 910     __disable_irq();
bfc108 911     STRCLK1_1();
Q 912     unsigned int mask1=0x8000;
913     //volatile uint32_t * p1 = &GPIOB->BRR;
914     //volatile uint32_t * p2 = &GPIOB->BSRR;`````
915     for (;mask1;)
916     {
917         SRCLK1_0();
918         //*p1=LL_GPIO_PIN_13;
919         if (cc&mask1) {SER1_1();}
920         else {SER1_0();}
921         mask1>>=1;
922         SRCLK1_1();
923 //        __nop();
924         //*p2=LL_GPIO_PIN_13;
925     }
926     STRCLK1_0();
e1f350 927     STRCLK1_1();
Q 928     __enable_irq();    
bfc108 929 }