QuakeGod
2023-02-01 2364f06313efb8eb97d4ae741a31cdd2efc175d2
提交 | 用户 | 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         uint8_t value;
300 //    LL_GPIO_TogglePin(GPIOB,LL_GPIO_PIN_7);
301      if (LL_SPI_IsActiveFlag_RXNE(SPI1))
302      {
303              value = LL_SPI_ReceiveData8( SPI1);
a7db3c 304 #if (BOARD_TYPE == 14)
0fe6b0 305             KMem.WDD[62]++;
Q 306             KMem.WDT[122]++;
d69aae 307          if (!bSPI1Sending)
Q 308          {
0fe6b0 309              logData(value);
d69aae 310          }
Q 311          if (!bSPI1Sending && (1 || bSPI1Recving))
312          {
313              SPI1RecvBuf[nSPI1RecvPos]=value;
314              nSPI1RecvPos++;
315              
316              if (value==0x0d)
317              {
0fe6b0 318                  logData(nSPI1RecvPos);
d69aae 319
Q 320                  nSPI1RecvLenInBuf=nSPI1RecvPos;
321                  bSPI1RecvDone=1;
322                  nSPI1RecvPos=0;
323                  bSPI1Recving=0;
324                  
325              
326                  TriggerPendSV();
327              }
328          }
329          if (bSPI1Sending)
330          {
331                  nSPI1SentLen++;
332                  KMem.SDD[63]++;
333              
334              if (nSPI1SentLen >= nSPI1ToSendLen) {
335                  SetACKPin_1();
336                  bSPI1Sending=0;
337                  bSPI1SendDone=1;
338                  bSPI1Recving=1;
339                  nSPI1RecvPos=0;
340                  SetFP0DEPin_0();
341              }
342              else {
343                  value = SPI1SendBuf[nSPI1SentLen];
344                  LL_SPI_TransmitData8(SPI1,value);
0fe6b0 345                 logData(value);
d69aae 346              }
Q 347          }
348 #endif         
349      }     
350 }
351
bfc108 352 void Uart1SendDone()
Q 353 {
354     Uart1Stat.TcCount++;
355     return;
356 }
357
358 void Uart1RecvDone()
359 {
360         Uart1Stat.IdelCount++;
361 //        NVIC_SetPendingIRQ(PendSV_IRQn);
e1f350 362 //      SCB->ICSR=SCB_ICSR_PENDSVSET_Msk; //1<<SCB_ICSR_PENDSVSET_Pos;
Q 363     
bfc108 364     if (Uart1RecvBuf1DataLen >0)
Q 365     {
366         Uart1Stat.bPacketRecved=1;
e1f350 367 //      SCB->ICSR=SCB_ICSR_PENDSVSET_Msk; //1<<SCB_ICSR_PENDSVSET_Pos;
bfc108 368 //        KLParsePacket(Uart1RecvBuf1,Uart1RecvBuf1DataLen);
Q 369 //        Uart1RecvBuf1DataLen=0;
370     }
371 }
372
373 void Uart2SendDone()
374 {
375     Uart2Stat.TcCount++;
376 }
377 void Uart2RecvDone()
378 {
e1f350 379     Uart2RecvBuf1DataLen=sizeof(Uart2RecvBuf1) - LL_DMA_GetDataLength(DMA1,LL_DMA_CHANNEL_5);
bfc108 380     Uart2Stat.bPacketRecved=1;
Q 381     Uart2Stat.IdelCount++;
e1f350 382     if (Uart2RecvBuf1DataLen>0)
Q 383         TriggerPendSV();
0fe6b0 384     //    ParsePacket((pKBPacket)Uart2RecvBuf1,Uart2RecvBuf1DataLen);
bfc108 385 }
Q 386
387 int PutStr(char * str1, int len1)
388 {
389 //    Uart1SendDMA(str1,len1);
d69aae 390     PushIn(&Uart1Stat.QTx,str1,len1);
bfc108 391 //    LL_USART_EnableIT_TXE(USART1);   
Q 392 //    LL_USART_EnableIT_TC(USART1);     
d69aae 393     Uart1TriggerSendDMA();
bfc108 394     return len1;
Q 395 }
396 int PutStr1(char * str1, int len1)
397 {
398 //    Uart1SendDMA(str1,len1);
399     PushIn(&Uart1Stat.QTx,str1,len1);
400 //    LL_USART_EnableIT_TXE(USART1);   
401 //    LL_USART_EnableIT_TC(USART1);     
402     Uart1TriggerSendDMA();
403     return len1;
404 }
405 int PutStr2(char * str1, int len1)
406 {
e1f350 407     Uart2SendDMA(str1,len1);
Q 408 //    PushIn(&Uart2Stat.QTx,str1,len1);
bfc108 409 //    LL_USART_EnableIT_TXE(USART1);   
Q 410 //    LL_USART_EnableIT_TC(USART1);     
e1f350 411 //    Uart2TriggerSendDMA();
bfc108 412     return len1;
Q 413 }
414
d69aae 415 int SendPacket(int nChn, void * pBuf,int len1)
bfc108 416 {
d69aae 417     if (nChn==1)     {
Q 418         PutStr1((char *)pBuf,len1);
419 //    PushIn(&Uart1Stat.QTx,p1,len1);
420 //    Uart1TriggerSendDMA();
421         Uart1Stat.SentPacket++;        
422     }else if (nChn==2){
423         PutStr2((char *)pBuf,len1);    
424 //    PushIn(&Uart2Stat.QTx,p1,len1);
425 //    Uart2TriggerSendDMA();    
426         Uart2Stat.SentPacket++;        
427     }
428         return len1;
bfc108 429 }
d69aae 430 /*
bfc108 431 int SendPacket1(void * pBuf,int len1)
Q 432 {
433         PutStr1((char *)pBuf,len1);
434 //    PushIn(&Uart1Stat.QTx,p1,len1);
435 //    Uart1TriggerSendDMA();
436         Uart1Stat.SentPacket++;
437     return len1;
438 }
0fe6b0 439 int SendPacket2(pKBPacket p1,int len1)
bfc108 440 {
Q 441         PutStr2((char *)p1,len1);    
442 //    PushIn(&Uart2Stat.QTx,p1,len1);
443 //    Uart2TriggerSendDMA();    
444         Uart2Stat.SentPacket++;
445     return len1;
446 }
d69aae 447 */
bfc108 448 void ToggleRunLed() {    LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_13);}
Q 449 void ToggleErrLed() {    LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_14);}
0fe6b0 450 void ToggleErr2Led() {    LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_15);}
Q 451
a7db3c 452 #if (BOARD_TYPE == 14)
d69aae 453 void ToggleOutStat() {    LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_15);}
Q 454
455 void SetOutStat(uchar bOn)
456 {
457     if (bOn) {LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_15);}
458     else {LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_15);}    
459 }
460 #else
bfc108 461 void ToggleOutStat() {    LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_11);}
Q 462
463 void SetOutStat(uchar bOn)
464 {
465     if (bOn) {LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11);}
466     else {LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11);}    
467 }
d69aae 468 #endif
bfc108 469
Q 470 void SetRunLed(uchar bOn)
471 {
472     if (bOn) {LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_13);}
473     else {LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_13);}        
474 }
475 void SetErrLed(uchar bOn)
476 {
477     if (bOn) {LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_14);}
478     else {LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_14);}        
479 }
0fe6b0 480 void SetErr2Led(uchar bOn)
Q 481 {
482     if (bOn) {LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_15);}
483     else {LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_15);}        
484 }
485 /*
bfc108 486 void SetLeds(uchar bRun, uchar bErr)
Q 487 {
488     SetRunLed(bRun); SetErrLed (bErr);
489 }
0fe6b0 490 */
bfc108 491 #define set165SL_0() LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_4)
Q 492 #define set165SL_1() LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_4)
493 #define set165CLK_0() LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_5)
494 #define set165CLK_1() LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_5)
495 #define Get165SER() LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_6)
496 #define GetCfg165SER() LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_7)
497
498 unsigned int Input165_8()
499 {
500     int x1=0;
e1f350 501     __disable_irq();
bfc108 502     set165SL_0();    set165SL_1();
Q 503     unsigned int mask1=0x0080;
504     volatile uint32_t * p1=&GPIOA->IDR;
505     for (uint32_t i=8;i;i--)
506     {
507         //if (Get165SER()) {}
508         //else x1|=mask1;
509         if (*p1&LL_GPIO_PIN_6) {}
510         else x1|=mask1;            
511         //x1<<=1;
512         //x1|=!Get165SER();
513         set165CLK_0();            
514         mask1>>=1;
515         set165CLK_1();
516     }
e1f350 517     __enable_irq();
bfc108 518     return x1;
Q 519 }
520
521 unsigned int Input165(int nBit)
522 {
523     int x1=0;
e1f350 524     __disable_irq();
bfc108 525     set165SL_0();    set165SL_1();
Q 526     unsigned int mask1=1<<(nBit-1);
527     volatile uint32_t * p1=&GPIOA->IDR;
528     for (uint32_t i=nBit;i;i--)
529     {
530         //if (Get165SER()) {}
531         //else x1|=mask1;
532         if (*p1&LL_GPIO_PIN_6) {}
533         else x1|=mask1;            
534         //x1<<=1;
535         //x1|=!Get165SER();
536         set165CLK_0();    
537         mask1>>=1;
538         set165CLK_1();
539     }
e1f350 540     __enable_irq();
bfc108 541     return x1;
Q 542 }
543 unsigned int Input165_R(int nBit)
544 {
e1f350 545     __disable_irq();
bfc108 546     set165SL_0();    set165SL_1();
Q 547     int nBytes = nBit /8;
548     volatile uint32_t * p1=&GPIOA->IDR;
549     union stdata
550     {
551         int intvalue;
552         unsigned char Bytes[4];
553     }rdata;
554     rdata.intvalue=0;
555     for (int i=0;i<nBytes;i++)
556     {
557         int x1=0;
558         unsigned int mask1=1<<(7);
559         for (uint32_t i=8;i;i--)
560         {
561             //if (Get165SER()) {}
562             //else x1|=mask1;
563             if (*p1&LL_GPIO_PIN_6) {}
564             else x1|=mask1;            
565             //x1<<=1;
566             //x1|=!Get165SER();
567             set165CLK_0();    
568             mask1>>=1;
569             set165CLK_1();
570         }
571         rdata.Bytes[i]=x1;
572     }
e1f350 573     __enable_irq();
bfc108 574     return rdata.intvalue;
Q 575 }
576
577 unsigned int Input165Cfg(int nBit)
578 {
579     int x1=0;
e1f350 580     __disable_irq();
bfc108 581     set165SL_0();    set165SL_1();
Q 582     unsigned int mask1=1<<(nBit-1);
583     volatile uint32_t * p1=&GPIOA->IDR;
584     for (uint32_t i=nBit;i;i--)
585     {
586         //if (Get165SER()) {}
587         //else x1|=mask1;
588         if (*p1&LL_GPIO_PIN_7) {}
589         else x1|=mask1;            
590         //x1<<=1;
591         //x1|=!Get165SER();
592         set165CLK_0();    
593         mask1>>=1;
594         set165CLK_1();
595     }
e1f350 596     __enable_irq();
bfc108 597     return x1;
Q 598 }
599
600 unsigned int GetInput()
601 {
602     int BoradType=GetBoardType();
603     switch (BoradType)
604     {
605         
606         case 1:
607                      return Input165(8);
608         case 2:
609                      return Input165(8);
610         case 3:
611                      return Input165(16);
612         case 4:
613                      return Input165(8);
614         case 5:
615         case 7:
616                         return Input165(16);
617         case 6:
618         case 8:
619                         return Input165(8);
620         case 9:
621                         return Input165_R(16);
622         case 10:
623                         return Input165_R(8);
0aeaad 624         case 11:
Q 625                         return Input165_R(8);
a7db3c 626         case 13:
Q 627                         return Input165_R(16);
628         case 14:
f4f290 629                         return 0;    //FP0
a7db3c 630         case 15:
Q 631                         return Input165_R(16);
7a2ff3 632         case 16:
Q 633                         return Input165_R(8);
634         
bfc108 635         default:
Q 636             break;
637     }
638         return 0;
639         
640 }
641 int ReadConfig_0()
642 {
643     return 0;
644 }
645
646 int ReadConfig_1()
647 {
648     //    uchar x = LL_GPIO_ReadInputPort(GPIOB);
649 //    uchar x1 = LL_GPIO_IsInputPinSet(GPIOB,LL_GPIO_PIN_10);
650 //    uchar x2=(x&0x7) | (x1 << 3 ) ;    
651     uchar x2=0;
652     x2=(GPIOB->IDR&0x7) | ((GPIOB->IDR &0x400)>>7); 
653     x2= (~x2)&0xf;
654     return x2;
655 }
656
657 int ReadConfig_2()
658 {
659     uchar x2=0;
660     x2=(GPIOB->IDR&0x7) | ((GPIOB->IDR &0x400)>>7); 
661     x2= (~x2)&0xf;
662     return x2;
663 }
664
665 int ReadConfig_3()
666 {
667     uchar x2=0;
668     x2 = Input165(24)&0xff;
669     return x2;
670     
671 }
672 int ReadConfig_4()
673 {
674     
675     uchar x2=0;
676     x2 = Input165(16)&0xff;
677     return x2;
678 }
679
680 int ReadConfig_5()
681 {
682     uchar x2=0;
683     x2 = Input165Cfg(8)&0xff;
684     return x2;
685 }
686
0aeaad 687 int ReadConfig_11()
Q 688 {
689     uchar x2=0;
690     x2=((GPIOB->IDR&0x2)<<2); 
691     x2= ((~x2)&0x8)|1;
692     return x2;
693 }    
694
bfc108 695 int ReadJumperSW()
Q 696 {
697         int BoradType=GetBoardType();
698     switch (BoradType)
699     {
700         case 0:
701                     return ReadConfig_0();    
702         case 1:
703                      return ReadConfig_1();    //old board 4 in 4 o
704         case 2:
705                      return ReadConfig_2();    //old board 8 in 8 o
706         case 3:
707                      return ReadConfig_3();    //Master 16 in16 o
708         case 4:
709                      return ReadConfig_4();    //Slave 8 in 8 o
710         case 5:
711         case 7:
712                      return ReadConfig_5();    // New Master 16 in16 o
713         case 6:
714         case 8:
715                      return ReadConfig_5();    //New Slave 8 in 8 o
716         case 9:
717         case 10:
a7db3c 718                      return ReadConfig_5();    //New Master Slave 8 in 8 o
0aeaad 719         case 11:
Q 720                      return ReadConfig_11(); //Mini Board
d69aae 721         case 13:
Q 722                      return ReadConfig_5();
a7db3c 723         case 14:
Q 724                      return (~(LL_GPIO_ReadInputPort(GPIOA)>>4))&0x0f;    //FP0
725         case 15:
7a2ff3 726         case 16:
a7db3c 727                      return ReadConfig_5();    //Wireless Master Slave 8 in 8 o
bfc108 728         default:
Q 729             
730                      return 0;
731     }
732 }
733
e1f350 734 #define SRCLK2_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_13)
Q 735 #define SRCLK2_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_13)
736 #define STRCLK2_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_12)
737 #define STRCLK2_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_12)
738 #define SER2_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_15)
739 #define SER2_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_15)
bfc108 740
Q 741 void Enable595(uchar bEnable)
742 {
743             if (bEnable) {LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_8);}
744             else {LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_8);}    
745 }
746
747 void Output595_8(unsigned int cc)
748 {
749 //unsigned char i;
0fe6b0 750 ;//        74HC595输出程序,输出8位
bfc108 751 //    cc=~0x3f;
e1f350 752     __disable_irq();
Q 753     STRCLK2_1();
bfc108 754     unsigned int mask1=0x0080;
Q 755     //volatile uint32_t * p1 = &GPIOB->BRR;
756     //volatile uint32_t * p2 = &GPIOB->BSRR;
757     for (;mask1;)
758     {
e1f350 759         SRCLK2_0();
bfc108 760         //*p1=LL_GPIO_PIN_13;
e1f350 761         if (cc&mask1) {SER2_1();}
Q 762         else {SER2_0();}
bfc108 763         mask1>>=1;
e1f350 764         SRCLK2_1();
bfc108 765 //        __nop();
Q 766         //*p2=LL_GPIO_PIN_13;
767     }
e1f350 768     STRCLK2_0();
Q 769     STRCLK2_1();    
770     __enable_irq();
bfc108 771 }
a7db3c 772
bfc108 773 void Output595_16(unsigned int cc)
Q 774 {
775 //unsigned char i;
0fe6b0 776 ;//        74HC595输出程序,输出8位
bfc108 777 //    cc=~0x3f;
e1f350 778     __disable_irq();
Q 779     STRCLK2_1();
bfc108 780     unsigned int mask1=0x8000;
Q 781     //volatile uint32_t * p1 = &GPIOB->BRR;
782     //volatile uint32_t * p2 = &GPIOB->BSRR;
783     for (;mask1;)
784     {
e1f350 785         SRCLK2_0();
bfc108 786         //*p1=LL_GPIO_PIN_13;
e1f350 787         if (cc&mask1) {SER2_1();}
Q 788         else {SER2_0();}
bfc108 789         mask1>>=1;
e1f350 790         SRCLK2_1();
bfc108 791 //        __nop();
Q 792         //*p2=LL_GPIO_PIN_13;
793     }
e1f350 794     STRCLK2_0();
Q 795     STRCLK2_1();
796     __enable_irq();
bfc108 797 }
e1f350 798
d69aae 799 /*
e1f350 800 #define STRCLK12_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_7)
Q 801 #define STRCLK12_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_7)
802
803 void PutOutputSPI1(unsigned int Y)
804 {
805     __disable_irq();
806     STRCLK12_1();    
807     LL_SPI_TransmitData8(SPI1,Y>>8);
808     int i=0;
809     while (LL_SPI_IsActiveFlag_TXE(SPI1) == RESET)
810     {
811     }
812     KMem.SDD[28]=i;
813     i=0;
814     while (LL_SPI_IsActiveFlag_BSY(SPI1) == SET)
815     {
816         i++;
817     }    
818     LL_SPI_TransmitData8(SPI1,Y);
819     while (LL_SPI_IsActiveFlag_TXE(SPI1) == RESET)
820     {
821     }
822     KMem.SDD[28]=i;
823     i=0;
824     while (LL_SPI_IsActiveFlag_BSY(SPI1) == SET)
825     {
826         i++;
827     }        
828     KMem.SDD[30]=i;
829         STRCLK12_0();
d69aae 830         __nop();
Q 831         STRCLK12_1();
832         __enable_irq();
e1f350 833 }
d69aae 834 */
e1f350 835
Q 836 void PutOutputSPI2(unsigned int Y)
837 {
838     __disable_irq();
839     STRCLK2_1();    
840     LL_SPI_TransmitData8(SPI2,Y>>8);
0aeaad 841     int i=0;
Q 842     while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET)
843     {
844     }
845     KMem.SDD[28]=i;
846     i=0;
847     while (LL_SPI_IsActiveFlag_BSY(SPI2) == SET)
848     {
849         i++;
850     }    
e1f350 851     LL_SPI_TransmitData8(SPI2,Y);
Q 852     while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET)
853     {
854     }
855     KMem.SDD[28]=i;
856     i=0;
857     while (LL_SPI_IsActiveFlag_BSY(SPI2) == SET)
858     {
859         i++;
860     }        
0aeaad 861     KMem.SDD[30]=i;
e1f350 862         STRCLK2_0();
d69aae 863         STRCLK2_1();
e1f350 864     __enable_irq();
Q 865 }
866
867 void PutOutput(unsigned int Y)        
868 {    
a7db3c 869 #if (BOARD_TYPE == 14)
d69aae 870     return ;
0fe6b0 871 #else
e1f350 872     PutOutputSPI2(Y);
Q 873     //Output595_16(Y);
0fe6b0 874 #endif
0aeaad 875 }
bfc108 876
7a2ff3 877 #if (BOARD_TYPE == 9 || BOARD_TYPE == 10 || BOARD_TYPE == 15 ||  BOARD_TYPE == 16)
bfc108 878 //#pragma message("9,10")
0fe6b0 879     // V4.2 管脚排列向右移动了一位。
bfc108 880 #define SRCLK1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_1)
Q 881 #define SRCLK1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_1)
882 #define STRCLK1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_2)
883 #define STRCLK1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_2)
884 #define OE1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_10)
885 #define OE1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_10)
886 #define SER1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_11)
887 #define SER1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_11)
0fe6b0 888 #else        //按照原来的管脚排列
bfc108 889 #define SRCLK1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_0)
Q 890 #define SRCLK1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_0)
891 #define STRCLK1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_1)
892 #define STRCLK1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_1)
893 #define OE1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_2)
894 #define OE1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_2)
895 #define SER1_0() LL_GPIO_ResetOutputPin(GPIOB,LL_GPIO_PIN_10)
896 #define SER1_1() LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_10)
897 #endif
898
899
900 void EnableDisIn(uchar bEnable)
901 {
902             if (bEnable) {OE1_0();}
903             else {OE1_1();}    
904 }
a7db3c 905
bfc108 906 void displayInput(unsigned int cc)
Q 907 {
908 //unsigned char i;
0fe6b0 909 ;//        74HC595输出程序,输出8位
bfc108 910 //    cc=~0x3f;
e1f350 911     __disable_irq();
bfc108 912     STRCLK1_1();
Q 913     unsigned int mask1=0x8000;
914     //volatile uint32_t * p1 = &GPIOB->BRR;
915     //volatile uint32_t * p2 = &GPIOB->BSRR;`````
916     for (;mask1;)
917     {
918         SRCLK1_0();
919         //*p1=LL_GPIO_PIN_13;
920         if (cc&mask1) {SER1_1();}
921         else {SER1_0();}
922         mask1>>=1;
923         SRCLK1_1();
924 //        __nop();
925         //*p2=LL_GPIO_PIN_13;
926     }
927     STRCLK1_0();
e1f350 928     STRCLK1_1();
Q 929     __enable_irq();    
bfc108 930 }