STM32 can通信例程 发送和接受数组

[复制链接]
查看3 | 回复0 | 2021-8-14 01:38:49 | 显示全部楼层 |阅读模式
1.jpg

can收发程序.zip (19.01 MB, 售价: 5 工控币)

部分源码,完整源码见附件。
  1. #ifdef EN_UPDATE_FONT
  2. u8 temp[512];  //零时空间
  3. u8 Update_Font(void)
  4. {
  5.         u32 fcluster=0;           
  6.         u32 i;
  7.         //u8 temp[512];  //零时空间         在这里定义,会内存溢出
  8.         u32 tempsys[2];  //临时记录文件起始位置和文件大小
  9.         float prog;
  10.         u8 t;                 
  11.         FileInfoStruct FileTemp;//零时文件夹                                                
  12.         //得到根目录的簇号
  13.         if(FAT32_Enable)fcluster=FirstDirClust;
  14.         else fcluster=0;                           
  15.         FileTemp=F_Search(fcluster,(unsigned char *)folder[0],T_FILE);//查找system文件夹         
  16.         if(FileTemp.F_StartCluster==0)return 1;                                                  //系统文件夹丢失                          
  17.         {                                                                                          
  18.                 //先查找字体
  19.                 FileTemp=F_Search(FileTemp.F_StartCluster,(unsigned char *)folder[1],T_FILE);//在system文件夹下查找FONT文件夹
  20.                 if(FileTemp.F_StartCluster==0)return 2;//字体文件夹丢失        

  21.                 fcluster=FileTemp.F_StartCluster;      //字体文件夹簇号            
  22.                 FileTemp=F_Search(fcluster,(unsigned char *)sysfile[2],T_SYS);//在system文件夹下查找SYS文件
  23.                 if(FileTemp.F_StartCluster==0)return 3;//FONT12字体文件丢失         
  24.                 //LCD_ShowString(20,90,"Write UNI2GBK to FLASH...");               
  25.                 //LCD_ShowString(108,110,"%");               
  26.                 F_Open(&FileTemp);//打开该文件
  27.                 i=0;         
  28.                 while(F_Read(&FileTemp,temp))//成功读出512个字节
  29.                 {                 
  30.                         if(i<FileTemp.F_Size)//不超过文件大小
  31.                         {
  32.                                 SPI_Flash_Write(temp,i+100000,512);//从100K字节处开始写入512个数据   
  33.                                 i+=512;//增加512个字节
  34.                         }
  35.                         prog=(float)i/FileTemp.F_Size;
  36.                         prog*=100;
  37.                         if(t!=prog)
  38.                         {
  39.                                 t=prog;
  40.                                 if(t>100)t=100;
  41.                                 //LCD_ShowNum(84,110,t,3,16);//显示数值
  42.                         }                                            
  43.                 }
  44.                 UNI2GBKADDR=100000;//UNI2GBKADDR从100K处开始写入.
  45.                 tempsys[0]=UNI2GBKADDR;
  46.                 tempsys[1]=FileTemp.F_Size;                   //UNI2GBKADDR 大小
  47.                 SPI_Flash_Write((u8*)tempsys,0,8);//记录在地址0~7处

  48.                 delay_ms(1000);                           
  49.                 //printf("UNI2GBK写入FLASH完毕!\n");
  50.                 //printf("写入数据长度:%d\n",FileTemp.F_Size);
  51.                 //printf("UNI2GBKSADDR:%d\n\n",UNI2GBKADDR);
  52.                
  53.                 FONT16ADDR=FileTemp.F_Size+UNI2GBKADDR;//F16的首地址
  54.                 FileTemp=F_Search(fcluster,(unsigned char *)sysfile[0],T_FON);//在system文件夹下查找FONT16字体文件
  55.                 if(FileTemp.F_StartCluster==0)return 4;//FONT16字体文件丢失         
  56.         
  57.                 //LCD_ShowString(20,90,"Write FONT16 to FLASH... ");               
  58.                  //printf("开始FONT16写入FLASH...\n");               
  59.                 F_Open(&FileTemp);//打开该文件
  60.                 i=0;         
  61.                 while(F_Read(&FileTemp,temp))//成功读出512个字节
  62.                 {
  63.                         if(i<FileTemp.F_Size)//不超过文件大小
  64.                         {
  65.                                 SPI_Flash_Write(temp,i+FONT16ADDR,512);//从0开始写入512个数据   
  66.                                 i+=512;//增加512个字节
  67.                         }
  68.                         prog=(float)i/FileTemp.F_Size;
  69.                         prog*=100;
  70.                         if(t!=prog)
  71.                         {
  72.                                 t=prog;
  73.                                 if(t>100)t=100;
  74.                                 //LCD_ShowNum(84,110,t,3,16);//显示数值
  75.                         }
  76.                 }                                                                                                   
  77.                 tempsys[0]=FONT16ADDR;
  78.                 tempsys[1]=FileTemp.F_Size;                   //FONT16ADDR 大小
  79.                 SPI_Flash_Write((u8*)tempsys,8,8);//记录在地址8~15处
  80.                
  81.                 delay_ms(1000);            
  82.                 //printf("FONT16写入FLASH完毕!\n");
  83.                 //printf("写入数据长度:%d\n",FileTemp.F_Size);


  84.                 FONT24ADDR=FileTemp.F_Size+FONT16ADDR;//F16的首地址
  85.                 //printf("FONT16SADDR:%d\n\n",FONT16ADDR);
  86.                 //LCD_ShowString(20,60,"Write FONT12 to FLASH... ");               
  87.                 //FONT12暂时不加入
  88.                                           
  89.                 FileTemp=F_Search(fcluster,(unsigned char *)sysfile[1],T_FON);//在system文件夹下查找FONT12字体文件
  90.                 if(FileTemp.F_StartCluster==0)return 5;//FONT12字体文件丢失         
  91.                 //printf("开始FONT12写入FLASH...\n");               
  92.                 F_Open(&FileTemp);//打开该文件
  93.                 i=0;         
  94.                 while(F_Read(&FileTemp,temp))//成功读出512个字节
  95.                 {
  96.                         if(i<FileTemp.F_Size)//不超过文件大小
  97.                         {
  98.                                 SPI_Flash_Write(temp,i+FONT24ADDR,512);//从0开始写入512个数据   
  99.                                 i+=512;//增加512个字节
  100.                         }
  101.                         prog=(float)i/FileTemp.F_Size;
  102.                         prog*=100;
  103.                         if(t!=prog)
  104.                         {
  105.                                 t=prog;
  106.                                 if(t>100)t=100;
  107.                                 //LCD_ShowNum(84,80,t,3,16);//显示数值
  108.                         }
  109.                 }            
  110.                 tempsys[0]=FONT24ADDR;
  111.                 tempsys[1]=FileTemp.F_Size;                   //FONT16ADDR 大小
  112.                 SPI_Flash_Write((u8*)tempsys,16,8);//记录在地址16~23处

  113.                 //printf("FONT12写入FLASH完毕!\n");
  114.         //        printf("写入数据长度:%d\n",FileTemp.F_Size);   
  115.         //        printf("FONT12SADDR:%d\n\n",FONT12ADDR); */
  116.         }
  117.         t=0XAA;
  118.            SPI_Flash_Write(&t,24,1);//写入字库存在标志        0XAA
  119.         //LCD_ShowString(20,90,"  Font Update Successed  ");                    
  120.         delay_ms(1000);               
  121.         delay_ms(1000);               
  122.         return 0;//成功
  123. }
  124. #endif

  125. //用这个函数得到字体地址
  126. //在系统使用汉字支持之前,必须调用该函数
  127. //包括FONT16ADDR,FONT12ADDR,UNI2GBKADDR;  
  128. u8 Font_Init(void)
  129. {
  130.         u32 tempsys[2];//临时记录文件起始位置和文件大小
  131.         u8 fontok=0;
  132.         SPI_Flash_Read(&fontok,24,1);//读出字库标志位,看是否存在字库
  133.         if(fontok!=0XAA)return 1;
  134.         SPI_Flash_Read((u8*)tempsys,0,8);//读出8个字节   
  135.         UNI2GBKADDR=tempsys[0];                                          
  136.         //printf("tempsysgbk[0]:%d\n",tempsys[0]);
  137.         //printf("tempsysgbk[1]:%d\n",tempsys[1]);

  138.         SPI_Flash_Read((u8*)tempsys,8,8);//读出8个字节   
  139.         //printf("tempsysf16[0]:%d\n",tempsys[0]);
  140.         //printf("tempsysf16[1]:%d\n",tempsys[1]);
  141.         FONT16ADDR=tempsys[0];
  142.         
  143.         SPI_Flash_Read((u8*)tempsys,16,8);//读出8个字节   
  144.         //printf("tempsysf12[0]:%d\n",tempsys[0]);
  145.         //printf("tempsysf12[1]:%d\n",tempsys[1]);
  146.         FONT24ADDR=tempsys[0];
  147.         return 0;         
  148. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则