Explorar el Código

PCR 双串口

yidong.fan hace 4 meses
padre
commit
535a8bafc5

+ 13 - 0
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/DMA.c

@@ -33,6 +33,19 @@ void InitDMA(void)
     DMA1CONbits.CHEN= 0;//Æô¶¯
     IFS0bits.DMA1IF = 1;
 
+
+	DMA2CON=0X6001;                           
+    DMA2CNT=SHORT_DATA;                      
+    DMA2REQ=0x53;                              
+    DMA2PAD=(volatile unsigned int)&U3TXREG;   
+    DMA2STAH=__builtin_dmapage(g_ucU3TX_Data);
+    DMA2STAL=__builtin_dmaoffset(g_ucU3TX_Data);
+    IFS1bits.DMA2IF = 0;                      
+    IEC1bits.DMA2IE = 0;                       
+    DMA2CONbits.CHEN= 0;                     
+    IPC6bits. DMA2IP= 1;
+    IFS1bits.DMA2IF = 1;
+
 }
 ///*******************************************************************************
 // * º¯ÊýÃû³Æ£ºInitDma0

+ 8 - 4
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/EEPROM.c

@@ -330,13 +330,17 @@ void Read_Sys_EE_05(void){
 /*****************************************/
         EE_StrRead(0x574, (unsigned char*) &g_tEE.CutUart, 2);       
         if(g_tEE.CutUart == 0){
-	         _RP97R  = 0x01;
-	         _U1RXR  = 0x60; 		
+         _RP65R  = 0x01; 
+         _U1RXR  = 0x70; 	
+		 _RP97R	= 0x1b;
+    	 _U3RXR  = 0x60; 	
 	    	 STU2 = 1;
         }
         else if(g_tEE.CutUart == 1){
-	         _RP97R  = 0x01; 
-	         _U1RXR  = 0x70; 
+         _RP97R  = 0x01;
+         _U1RXR  = 0x60; 	
+		 _RP65R	= 0x1b;
+    	 _U3RXR  = 0x70; 
 	    	STU2 = 0;
          }   
 

+ 2 - 1
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Interrupt.c

@@ -4,7 +4,7 @@ unsigned char g_ucENABLE = 1;
 unsigned int uiData_num = 0,uiData_buffer = 0;
 
 #define  MAX_OFFLINE_TIME 10
-
+unsigned int printtempFlag=0; 
 
 /*******************************************************************************
  * º¯ÊýÃû³Æ£ºInit_T3
@@ -275,6 +275,7 @@ void __attribute__((interrupt,auto_psv)) _T6Interrupt (void)
     if(SampleNo > 2) {     //100ms
         SampleNo=0;
         T4CONbits.TON=1;    //off the T4  for 1ms
+		printtempFlag = 1;	   
     }
 
     

+ 9 - 6
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/PIN.c

@@ -26,13 +26,16 @@ void PIN_Initialize(void){
     _TRISA4 = 0;   
     _TRISA5 = 0;  
     
-
-    _TRISF1 = 0;    
-    _TRISF0 = 1;   
-    _TRISG0 = 1;   
+    _TRISD1 = 0;         
+    _TRISF1 = 0;
+    _TRISF0 = 1;
+    _TRISG0 = 1;  
+	
     _RP97R  = 0x01; 
-    _U1RXR  = 0x60; 
-//    _U1RXR  = 0x70; 
+    _U1RXR  = 0x60;  
+	
+	_RP65R	= 0x1b;
+    _U3RXR  = 0x70; 
     
 
     _TRISK11 = 0;     //SCL

+ 291 - 2
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Uart.c

@@ -66,7 +66,7 @@ void InitUart3(void) {
     U3MODEbits.LPBACK = 0;  
 
     //    U1BRG = 31;       
-    U3BRG = 389;            
+    U3BRG = 31;            
 
     U3STAbits.UTXISEL0 = 1;
     U3STAbits.UTXISEL1 = 0;
@@ -1313,7 +1313,7 @@ void Uart1_Ack(void)
             
             if(g_ucU1RX_Data[4] == 253){
                 _RP97R  = 0x01;
-                _U1RXR  = 0x70;   
+                _U1RXR  = 0x6D;    
     			STU2 = 0; 
             }
             else if(g_ucU1RX_Data[4] == 252){
@@ -1638,4 +1638,293 @@ void Uart1_Ack(void)
     g_ucHeaderFlag1 = 0;
     memset(g_ucU1RX_Data,0,g_uiLth1*sizeof(unsigned char));
     g_BUSY1 = 0;
+}
+
+
+uint32_t m_pow_n(uint32_t m, uint32_t n)
+{
+    uint32_t i = 0, ret = 1;
+    if (n < 0) return 0;
+    for (i = 0; i < n; i++)
+    {
+        ret *= m;
+    }
+    return ret;
+}
+void my_send_char(char ch){
+ 	 g_ucU3TX_buf[g_ucU3TX_Last++] = ch;
+}
+
+// 返回值为打印字符的个数
+// 支持%d,%o, %x,%s,%c,%f(只打印6位数字)
+int my_printf(const char* str, ...)
+{
+    if (str == NULL) return -1;
+
+	uint32_t ret_num = 0;// 返回打印字符的个数
+    char* pStr = (char*)str;// 指向str
+    int ArgIntVal = 0;  // 接收整型
+    uint32_t ArgHexVal = 0;// 接十六进制
+    char* ArgStrVal = NULL;  // 接收字符型
+    double ArgFloVal = 0.0; // 接受浮点型
+    uint32_t val_seg = 0;   // 数据切分
+    uint32_t val_temp = 0;  // 临时保存数据
+    int cnt = 0;       // 数据长度计数
+    int cnt_float = 0;       // 数据长度计数
+    int i = 0;
+    
+    va_list pArgs; // 定义va_list类型指针,用于存储参数的地址
+    va_start(pArgs, str); // 初始化pArgs
+    if(g_ucU3TX_Last > 0){
+		return 0;
+	}
+    while (*pStr != '\0')
+    {
+        switch (*pStr)
+        {
+        case ' ':
+        case '\r':
+        case '\n':
+            my_send_char(*pStr); ret_num++; break;
+        case '\t':
+            my_send_char(*pStr); ret_num += 4; break;
+        case '%':
+            pStr++;
+            // % 格式解析
+
+			if('.' == *pStr)
+			{
+            	pStr++;
+				cnt_float = *pStr - '0';// %.Nf,输出指定位数小数
+                pStr++;
+			}
+			
+            switch (*pStr)
+            {
+            case '%':
+                my_send_char('%');// %%,输出%
+                ret_num++;
+                pStr++;
+				continue;
+            case 'c':
+                ArgIntVal = va_arg(pArgs, int);// %c,输出char
+                my_send_char((char)ArgIntVal);
+                ret_num++;
+                pStr++;
+				continue;
+            case 'd':
+                // 接收整型
+                ArgIntVal = va_arg(pArgs, int);
+                if (ArgIntVal < 0)// 如果为负数打印,负号
+                {
+                    ArgIntVal = -ArgIntVal;// 取相反数
+
+                    my_send_char('-');
+                    ret_num++;
+                }
+                val_seg = ArgIntVal;// 赋值给 val_seg处理数据
+                // 计算ArgIntVal长度
+                if (ArgIntVal)
+                {
+                    while (val_seg) {
+                        cnt++;
+                        val_seg /= 10;
+                    }
+                }
+                else cnt = 1;// 数字0的长度为1
+
+                ret_num += cnt;// 字符个数加上整数的长度
+
+                // 将整数转为单个字符打印
+                while (cnt)
+                {
+                    val_seg = ArgIntVal / m_pow_n(10, cnt - 1);
+                    ArgIntVal %= m_pow_n(10, cnt - 1);
+                    my_send_char((char)val_seg + '0');
+                    cnt--;
+                }
+                pStr++;
+                continue;
+            case 'o':
+                // 接收整型
+                ArgIntVal = va_arg(pArgs, int);
+                if (ArgIntVal < 0)// 如果为负数打印,负号
+                {
+                    ArgIntVal = -ArgIntVal;// 取相反数
+
+                    my_send_char('-');
+                    ret_num++;
+                }
+                val_seg = ArgIntVal;// 赋值给 val_seg处理数据
+                // 计算ArgIntVal长度
+                if (ArgIntVal)
+                {
+                    while (val_seg) {
+                        cnt++;
+                        val_seg /= 8;
+                    }
+                }
+                else cnt = 1;// 数字0的长度为1
+
+                ret_num += cnt;// 字符个数加上整数的长度
+
+                // 将整数转为单个字符打印
+                while (cnt)
+                {
+                    val_seg = ArgIntVal / m_pow_n(8, cnt - 1);
+                    ArgIntVal %= m_pow_n(8, cnt - 1);
+                    my_send_char((char)val_seg + '0');
+                    cnt--;
+                }
+                pStr++;
+				continue;
+            case 'x':
+                // 接收16进制
+                ArgHexVal = va_arg(pArgs, uint32_t);
+                val_seg = ArgHexVal;
+                // 计算ArgIntVal长度
+                if (ArgHexVal)
+                {
+                    while (val_seg) {
+                        cnt++;
+                        val_seg /= 16;
+                    }
+                }
+                else cnt = 1;// 数字0的长度为1
+
+                ret_num += cnt;// 字符个数加上整数的长度
+                // 将整数转为单个字符打印
+                while (cnt)
+                {
+                    val_seg = ArgHexVal / m_pow_n(16, cnt - 1);
+                    ArgHexVal %= m_pow_n(16, cnt - 1);
+                    if (val_seg <= 9)
+                        my_send_char((char)val_seg + '0');
+                    else
+                    {
+						//my_send_char((char)val_seg - 10 + 'a'); //小写字母
+                        my_send_char((char)val_seg - 10 + 'A');
+                    }
+                    cnt--;
+                }
+                pStr++;
+				continue;
+            case 'b':
+                // 接收整型
+                ArgIntVal = va_arg(pArgs, int);
+                val_seg = ArgIntVal;
+                // 计算ArgIntVal长度
+                if (ArgIntVal)
+                {
+                    while (val_seg) {
+                        cnt++;
+                        val_seg /= 2;
+                    }
+                }
+                else cnt = 1;// 数字0的长度为1
+
+                ret_num += cnt;// 字符个数加上整数的长度
+                // 将整数转为单个字符打印
+                while (cnt)
+                {
+                    val_seg = ArgIntVal / m_pow_n(2, cnt - 1);
+                    ArgIntVal %= m_pow_n(2, cnt - 1);
+                    my_send_char((char)val_seg + '0');
+                    cnt--;
+                }
+                pStr++;
+				continue;
+            case 's':
+                // 接收字符
+                ArgStrVal = va_arg(pArgs, char*);
+                ret_num += (uint32_t)strlen(ArgStrVal);
+                while (*ArgStrVal)
+                {
+                    my_send_char(*ArgStrVal);
+                    ArgStrVal++;
+                }
+
+                pStr++;
+				continue;
+
+            case 'f':
+                // 接收浮点型 保留6为小数,不采取四舍五入
+                ArgFloVal = va_arg(pArgs, double);
+				
+                if (ArgFloVal < 0)// 如果为负数打印,负号
+                {
+                    ArgFloVal = -ArgFloVal;// 取相反数
+
+                    my_send_char('-');
+                    ret_num++;
+                }
+                val_seg = (uint32_t)ArgFloVal;// 取整数部分
+                val_temp = val_seg;      // 临时保存整数部分数据
+                ArgFloVal = ArgFloVal - val_seg;// 得出余下的小数部分
+                // 计算整数部分长度
+                if (val_seg)
+                {
+                    while (val_seg) {
+                        cnt++;
+                        val_seg /= 10;
+                    }
+                }
+                else cnt = 1;// 数字0的长度为1
+                ret_num += cnt;// 字符个数加上整数的长度
+                // 将整数转为单个字符打印
+                while (cnt)
+                {
+                    val_seg = val_temp / m_pow_n(10, cnt - 1);
+                    val_temp %= m_pow_n(10, cnt - 1);
+                    my_send_char((char)val_seg + '0');
+                    cnt--;
+                }
+                // 打印小数点
+                my_send_char('.');
+                ret_num++;
+                // printf("\r\n %f\r\n", ArgFloVal);
+				if(cnt_float == 0)
+                	cnt_float = 6;
+					
+                // 开始输出小数部分
+                //ArgFloVal *= 1000000;
+                ArgFloVal *= m_pow_n(10, cnt_float);
+
+                val_temp = (int)ArgFloVal;// 取整数部分
+                while (cnt_float)
+                {
+                    val_seg = val_temp / m_pow_n(10, cnt_float - 1);
+                    val_temp %= m_pow_n(10, cnt_float - 1);
+                    my_send_char((char)val_seg + '0');
+                    cnt_float--;
+                }
+                ret_num += 6;
+                pStr++;
+				continue;
+            default:// % 匹配错误,暂输出空格
+				my_send_char(' '); ret_num++;
+				break;
+            }
+			break;
+
+
+        default:
+            my_send_char(*pStr); ret_num++;
+            break;
+        }
+        pStr++;
+    }
+    va_end(pArgs);// 结束取参数
+
+	for(int i;i<ret_num;i++){
+		g_ucU3TX_Data[i] = g_ucU3TX_buf[i];
+	}
+	g_ucU3TX_Last = 0;
+    while(DMA2CONbits.CHEN);        
+    DMA2CNT=(ret_num-1);
+    DMA2CONbits.CHEN  = 1;		
+    DMA2REQbits.FORCE = 1;	
+
+    
+    return ret_num;
 }

+ 3 - 0
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Uart.h

@@ -159,6 +159,9 @@ EXTERN_UART unsigned int Alldata_Max[2000];
 
 EXTERN_UART unsigned char g_ucU1TX_Data[500] __attribute__((eds));
 EXTERN_UART unsigned int ucBuffer_Data[7000] __attribute__((eds));
+EXTERN_UART unsigned char g_ucU3TX_Data[128] __attribute__((eds));
+EXTERN_UART unsigned char g_ucU3TX_buf[128];
+EXTERN_UART unsigned int g_ucU3TX_Last;
 
 EXTERN_UART unsigned long int uiEE_address;
 EXTERN_UART unsigned char GlobalTmp,GlobalNum1;

+ 16 - 1
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/main.c

@@ -42,7 +42,8 @@
 #include "ABIS_User.h"
  unsigned char VersionNumber[16]="N01.20230823";//¹Ì¼þ°æ±¾ºÅ
  unsigned char HardwareVersionNumber[16]="10062308022300802";//Ó²¼þ°æ±¾ºÅ
- 
+ extern unsigned int printtempFlag;
+ extern int my_printf(const char* str, ...);
 int main(void) {   
     unsigned int i;
     unsigned int K;
@@ -80,6 +81,10 @@ int main(void) {
         Delay_ms(200);
     }
     POWER_STU1 = 1;                    
+  my_printf("\n**********************************************************************\n\r");
+  my_printf("*                         build %s %s                        *\n\r",__DATE__,__TIME__);
+  my_printf("*                         ALPS - 004                                   *\n\r");
+  my_printf("**********************************************************************\n\r");
   
  
 //     while(1){
@@ -130,5 +135,15 @@ int main(void) {
 			com_timer = 0;
             Uart1_Ack();                       
         }
+
+		
+        if(printtempFlag == 1){  
+            printtempFlag = 0;   
+			my_printf("temp %f, %f, %f, %f, %f, %f\n\r",
+			TempChn[0].fCurrentTemperature,TempChn[1].fCurrentTemperature,
+			TempChn[2].fCurrentTemperature,TempChn[3].fCurrentTemperature,
+			TempChn[4].fCurrentTemperature,TempChn[5].fCurrentTemperature);
+        }
+		
     }  
 }