你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103 AD 在写完flash后变得不准

[复制链接]
小肥羊dsf 提问时间:2019-11-19 16:48 /
STM32F103  AD 在写完flash后变得不准经过过测试和不相干IO口设置有关怎么回事
IO口设置代码
  1. void Init_Dev(void)
  2. {

  3.    //Rtc_Init();
  4.    Init_key();
  5.    Init_Set();
  6.    InitLight();
  7.    InitAUX();
  8.    InitFan();
  9.    InitDefrost();
  10.    InitComp();
  11.    BuzzInit();
  12.    GN1621_Dev_Init();
  13.    DS1302_IO_Init();
  14.    Ds1302_Init();
  15.    InitDoor();
  16.    uart_init2(9600);
  17.    uart_init1(9600);
  18.    HotKey_Dispy_Init();
  19.    uart_init3(9600);
  20.    Adc_Init();
  21.    SwitchInit();
  22.    CodeText();
  23.    TIM3_Mode_Config();
  24.    InitAlarm();
  25.    


  26. }
复制代码
TIM3_Mode_Config();







  1. //配置成PWM输出
  2. void TIM3_Mode_Config(void)
  3. {
  4.    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//初始化TIM2的时间基数单位
  5.    TIM_OCInitTypeDef  TIM_OCInitStructure;//初始化TIM2的外设
  6.    GPIO_InitTypeDef GPIO_InitStructure;

  7.   /*
  8.    关掉JTAD调式 PA15作为普通IO口
  9.   */
  10.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  11.   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

  12.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  13.   //由于PA6是复用的所以要设置一下
  14.   //GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);

  15.   //配置PA16 PWM输出的模式
  16.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 ;
  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 
  18.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  20.   //打开TIM3的时钟
  21.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  22.   //TIM2的时间基数单位设置(如计数终止值:999,从0开始 ;计数方式:向上计数)         
  23.   #if INSIDE_RCC
  24.    TIM_TimeBaseStructure.TIM_Prescaler= (2 - 1); //时钟预分频数,时钟频率=64MHZ/(时钟预分频+1) 之后是8M   
  25.    TIM_TimeBaseStructure.TIM_Period=3200-1; //自动重装载寄存器的值/  10KHZ
  26.   #else
  27.    TIM_TimeBaseStructure.TIM_Prescaler= (9 - 1); //时钟预分频数,时钟频率=72MHZ/(时钟预分频+1) 之后是8M   
  28.    TIM_TimeBaseStructure.TIM_Period=1000-1; //自动重装载寄存器的值/        8KHZ
  29.   #endif
  30.   
  31.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        
  32.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  33.   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  34.   
  35.   //TIM3的外设的设置
  36.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;        //TIM脉冲宽度调制模式1   
  37.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//这个暂时不知道,stm32固件库里没有搜到。应该是定时器输出声明使能的意思        
  38.   TIM_OCInitStructure.TIM_Pulse = 500;//设置了待装入捕获比较寄存器的脉冲值         
  39.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //TIM输出比较极性高
  40.   TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  41.          
  42.   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
  43.   TIM_ARRPreloadConfig(TIM3, ENABLE);        //使能TIM2重载寄存器ARR  

  44.   TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除溢出中断标志
  45.   TIM_Cmd(TIM3, ENABLE);//使能TIM2     

  46.   
  47. }
复制代码
InitAlarm();的代码这不是AD IO端口
  1. void InitAlarm(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);

  5.         /*
  6.      关掉JTAD调式 PA15作为普通IO口
  7.         */
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  9.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
  10.        

  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  14.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  15.         GPIO_ResetBits(GPIOB,GPIO_Pin_9);


  16. }
复制代码
当写完flash后AD值就不对了
测试发现
把void InitAlarm(void)里面的
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
删除就对了AD的值又对了
或者把
TIM3_Mode_Config();
   InitAlarm();
顺序变了就行了AD的值又对了
或者调试的时候停止然后在重新运行AD值也对
我想应该不是和AD的函数的问题


<
收藏 评论10 发布时间:2019-11-19 16:48

举报

10个回答
小肥羊dsf 回答时间:2019-11-19 16:49:40
这是AD的代码



  1. void ADC_NVIC_Config(void)
  2. {  
  3.         NVIC_InitTypeDef NVIC_InitStructure;        // 优先级分组       
  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   // 配置中断优先级
  5.         NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
  6.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
  7.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
  8.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  9.         NVIC_Init(&NVIC_InitStructure);
  10. }


  11. void Adc_Init(void)
  12. {
  13.         ADC_InitTypeDef ADC_InitStructure;
  14.         GPIO_InitTypeDef GPIO_InitStructure;

  15.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1    , ENABLE );         //使能ADC1通道时钟
  16.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC        , ENABLE);

  17.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

  18.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //复用推挽输出
  20.         GPIO_Init(GPIOA, &GPIO_InitStructure);


  21.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //复用推挽输出
  23.         GPIO_Init(GPIOA, &GPIO_InitStructure);


  24.         //ADC1配置  
  25.         //独立工作模式  
  26.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  
  27.         //扫描方式  
  28.         ADC_InitStructure.ADC_ScanConvMode = DISABLE; //不扫描
  29.         //连续转换  
  30.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换
  31.         //外部触发禁止  
  32.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;       
  33.         //数据右对齐  
  34.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  
  35.         //用于转换的通道数  
  36.         ADC_InitStructure.ADC_NbrOfChannel = 1;       
  37.         ADC_Init(ADC1, &ADC_InitStructure);       

  38.         //规则模式通道配置  
  39.         //ADC_RegularChannelConfig(ADC1, ADC_Channel_10 , 1, ADC_SampleTime_239Cycles5); //扭蛋机的  
  40.         //ADC_RegularChannelConfig(ADC1, ADC_Channel_13 , 2, ADC_SampleTime_239Cycles5);  
  41.         //ADC_RegularChannelConfig(ADC1, ADC_Channel_12 , 3, ADC_SampleTime_239Cycles5);  
  42.         //ADC_RegularChannelConfig(ADC1, ADC_Channel_11 , 4, ADC_SampleTime_239Cycles5);  

  43.         //使能ADC1的DMA       
  44.         //ADC_DMACmd(ADC1, ENABLE);  


  45.     ADC_NVIC_Config();
  46.         // ADC1 转换结束产生中断,在中断服务程序中读取转换值
  47.         ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);


  48.         //使能ADC1  
  49.         ADC_Cmd(ADC1, ENABLE);  

  50.         //使能ADC1复位校准寄存器   
  51.         ADC_ResetCalibration(ADC1);       
  52.         //检查校准寄存器是否复位完毕  
  53.         while(ADC_GetResetCalibrationStatus(ADC1));       

  54.         //开始校准  
  55.         ADC_StartCalibration(ADC1);       
  56.         //检测是否校准完毕  
  57.         while(ADC_GetCalibrationStatus(ADC1));  

  58.         //开启ADC1的软件转换  
  59.         //ADC_SoftwareStartConvCmd(ADC1, ENABLE);       

  60. }




  61. void ADC1_2_IRQHandler(void)
  62. {               
  63.         if (ADC_GetITStatus(ADC1,ADC_IT_EOC)==SET)        
  64.         {   // 读取ADC的转换值               
  65.             ADC_Data = ADC_GetConversionValue(ADC1);
  66.                 ADC_FinshFlag=1;
  67.         }       
  68.         ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
  69. }




  70. void SwitchInit(void)
  71. {
  72.         GPIO_InitTypeDef GPIO_InitStructure;

  73.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);
  74.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC  , ENABLE);

  75.         /*
  76.      关掉JTAD调式 PA15作为普通IO口
  77.         */
  78.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  79.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

  80.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  81.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  82.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
  83.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  84.        
  85.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  86.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  87.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
  88.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  89.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  90.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  91.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
  92.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  93.         GPIO_ResetBits(GPIOC,GPIO_Pin_4);

  94. }
  95. //选择转换通道
  96. void SiwtchChanl(u8 num)
  97. {

  98.   switch(num)
  99.   {
  100.         case 0:
  101.         GPIO_ResetBits(GPIOC,GPIO_Pin_5);
  102.                 GPIO_SetBits(GPIOB,GPIO_Pin_0);
  103.                 break;
  104.         case 1:
  105.                 GPIO_SetBits(GPIOC,GPIO_Pin_5);
  106.                 GPIO_SetBits(GPIOB,GPIO_Pin_0);
  107.                 break;
  108.         case 2:
  109.                 GPIO_SetBits(GPIOC,GPIO_Pin_5);
  110.                 GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  111.                 break;
  112.         case 3:
  113.         GPIO_ResetBits(GPIOC,GPIO_Pin_5);
  114.                 GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  115.                 break;
  116.     default:break;
  117.   }
  118. }


  119. //开始转换
  120. void StartADC(u8 num)
  121. {
  122.     u8 tmp;

  123.         CompRum.tPb=0;
  124.         //SetDisplay.Lod=0;
  125.         //SetDisplay.rES=1;
  126.         tmp=CompRum.tPb;
  127.         if(tmp>0)
  128.         {
  129.              //PT1000
  130.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 1, ADC_SampleTime_239Cycles5);
  131.                 GPIO_SetBits(GPIOC,GPIO_Pin_4);
  132.                 SiwtchChanl(num);
  133.         os_dly_wait(100);

  134.         }else
  135.         {
  136.              //NTC
  137.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_0 , 1, ADC_SampleTime_239Cycles5);
  138.                 GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  139.                 SiwtchChanl(num);
  140.         os_dly_wait(20);
  141.         }
  142.   
  143.   

  144.   ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  145. }


  146. u16 GetADCData(void)
  147. {
  148.   
  149.    u16 dataRe=0;
  150.    dataRe=ADC_Data;
  151.    return dataRe;
  152. }
复制代码
小肥羊dsf 回答时间:2019-11-19 16:52:04
这是flash读写的代码
  1. #include "stmflash.h"
  2. //#include "delay.h"
  3. //#include "usart.h"

  4. //////////////////////////////////////////////////////////////////////////////////         
  5. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  6. //ALIENTEK miniSTM32开发板
  7. //STM32 FLASH 驱动代码          
  8. //正点原子@ALIENTEK
  9. //技术论坛:www.openedv.com
  10. //修改日期:2012/9/13
  11. //版本:V1.0
  12. //版权所有,盗版必究。
  13. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  14. //All rights reserved                                                                          
  15. //////////////////////////////////////////////////////////////////////////////////

  16. //读取指定地址的半字(16位数据)
  17. //faddr:读地址(此地址必须为2的倍数!!)
  18. //返回值:对应数据.
  19. u16 STMFLASH_ReadHalfWord(u32 faddr)
  20. {
  21.         return *(vu16*)faddr;
  22. }
  23. #if STM32_FLASH_WREN        //如果使能了写   
  24. //不检查的写入
  25. //WriteAddr:起始地址
  26. //pBuffer:数据指针
  27. //NumToWrite:半字(16位)数   
  28. void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)   
  29. {                                           
  30.         u16 i;
  31.         for(i=0;i<NumToWrite;i++)
  32.         {
  33.                 FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
  34.             WriteAddr+=2;//地址增加2.
  35.         }  
  36. }
  37. //从指定地址开始写入指定长度的数据
  38. //WriteAddr:起始地址(此地址必须为2的倍数!!)
  39. //pBuffer:数据指针
  40. //NumToWrite:半字(16位)数(就是要写入的16位数据的个数.)
  41. #if STM32_FLASH_SIZE<256
  42. #define STM_SECTOR_SIZE 1024 //字节
  43. #else
  44. #define STM_SECTOR_SIZE        2048
  45. #endif                 
  46. u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];//最多是2K字节
  47. void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)       
  48. {
  49.         u32 secpos;           //扇区地址
  50.         u16 secoff;           //扇区内偏移地址(16位字计算)
  51.         u16 secremain; //扇区内剩余地址(16位字计算)          
  52.         u16 i;   
  53.         u32 offaddr;   //去掉0X08000000后的地址
  54.         if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
  55.         FLASH_Unlock();                                                //解锁
  56.         offaddr=WriteAddr-STM32_FLASH_BASE;                //实际偏移地址.
  57.         secpos=offaddr/STM_SECTOR_SIZE;                        //扇区地址  0~127 for STM32F103RBT6
  58.         secoff=(offaddr%STM_SECTOR_SIZE)/2;                //在扇区内的偏移(2个字节为基本单位.)
  59.         secremain=STM_SECTOR_SIZE/2-secoff;                //扇区剩余空间大小   
  60.         if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
  61.         while(1)
  62.         {       
  63.                 STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
  64.                 for(i=0;i<secremain;i++)//校验数据
  65.                 {
  66.                         if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除            
  67.                 }
  68.                 if(i<secremain)//需要擦除
  69.                 {
  70.                         FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
  71.                         for(i=0;i<secremain;i++)//复制
  72.                         {
  73.                                 STMFLASH_BUF[i+secoff]=pBuffer[i];          
  74.                         }
  75.                         STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区  
  76.                 }else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.                                   
  77.                 if(NumToWrite==secremain)break;//写入结束了
  78.                 else//写入未结束
  79.                 {
  80.                         secpos++;                                //扇区地址增1
  81.                         secoff=0;                                //偏移位置为0          
  82.                            pBuffer+=secremain;          //指针偏移
  83.                         WriteAddr+=secremain;        //写地址偏移          
  84.                            NumToWrite-=secremain;        //字节(16位)数递减
  85.                         if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
  86.                         else secremain=NumToWrite;//下一个扇区可以写完了
  87.                 }         
  88.         };       
  89.         FLASH_Lock();//上锁
  90. }
  91. #endif

  92. //从指定地址开始读出指定长度的数据
  93. //ReadAddr:起始地址
  94. //pBuffer:数据指针
  95. //NumToWrite:半字(16位)数
  96. void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)          
  97. {
  98.         u16 i;
  99.         for(i=0;i<NumToRead;i++)
  100.         {
  101.                 pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
  102.                 ReadAddr+=2;//偏移2个字节.       
  103.         }
  104. }

  105. //////////////////////////////////////////////////////////////////////////////////////////////////////
  106. //WriteAddr:起始地址
  107. //WriteData:要写入的数据
  108. void Test_Write(u32 WriteAddr,u16 WriteData)          
  109. {
  110.         STMFLASH_Write(WriteAddr,&WriteData,1);//写入一个字
  111. }


  112. void Erase_Flash(uint32_t WriteAddr)
  113. {
  114.         FLASH_Unlock();
  115.         FLASH_ErasePage(WriteAddr);
  116.         FLASH_Lock();//上锁
  117. }

复制代码


这是调用flash读写函数
  1. #include "keep.h"


  2. #define   ONE_PAGE 1024

  3. #define  SET_BASE_ADDR      STM32_FLASH_BASE+ONE_PAGE*61  //第61页
  4. #define  CompRum_ADDR       SET_BASE_ADDR+100*0
  5. #define  SetProbe_ADDR      SET_BASE_ADDR+100*1
  6. #define  SetDisplay_ADDR    SET_BASE_ADDR+100*2
  7. #define  Frost_Set_ADDR     SET_BASE_ADDR+100*3
  8. #define  Fan_ADDR           SET_BASE_ADDR+100*4
  9. #define  Door_ADDR          SET_BASE_ADDR+100*5
  10. #define  Aux_s_ADDR         SET_BASE_ADDR+100*6
  11. #define  Alarm_s_ADDR       SET_BASE_ADDR+100*7
  12. #define  RTC_s_ADDR         SET_BASE_ADDR+100*8



  13. //新机第一次上电的时候清除数据
  14. #define UPDATAFLAG   0x5887
  15. void CreanZore(void)
  16. {
  17.        
  18.         ReadSetData();
  19.         if(PowerUp!=UPDATAFLAG)
  20.         {
  21.                 PowerUp=UPDATAFLAG;
  22.                 DefalutSys();
  23.                 WriteSetData();       
  24.                 SetTime.update=1;
  25.         }
  26. }


  27. void ReadSetData(void)
  28. {

  29.         u32 address;
  30.         u16 buf[50];

  31.         memset(buf,0,100);
  32.         address=CompRum_ADDR;
  33.         STMFLASH_Read(address,buf,50);
  34.         memcpy(&PowerUp,buf,4);
  35.         memcpy(&CompRum,&buf[4],sizeof(CompRum));
  36.        

  37.         memset(buf,0,100);
  38.         address=SetProbe_ADDR;
  39.         STMFLASH_Read(address,buf,50);
  40.         memcpy(&SetProbe,buf,sizeof(SetProbe));
  41.        

  42.         memset(buf,0,100);
  43.         address=SetDisplay_ADDR;
  44.         STMFLASH_Read(address,buf,50);
  45.         memcpy(&SetDisplay,buf,sizeof(SetDisplay));


  46.         memset(buf,0,100);
  47.         address=Frost_Set_ADDR;
  48.         STMFLASH_Read(address,buf,50);
  49.         memcpy(&Frost_Set,buf,sizeof(Frost_Set));


  50.         memset(buf,0,100);
  51.         address=Fan_ADDR;
  52.         STMFLASH_Read(address,buf,50);
  53.         memcpy(&Fan,buf,sizeof(Fan));


  54.         memset(buf,0,100);
  55.         address=Door_ADDR;
  56.         STMFLASH_Read(address,buf,50);
  57.         memcpy(&Door_s,buf,sizeof(Door_s));


  58.         memset(buf,0,100);
  59.         address=Aux_s_ADDR;
  60.         STMFLASH_Read(address,buf,50);
  61.         memcpy(&Aux_s,buf,sizeof(Aux_s));


  62.         memset(buf,0,100);
  63.         address=Alarm_s_ADDR;
  64.         STMFLASH_Read(address,buf,50);
  65.         memcpy(&Alarm_s,buf,sizeof(Alarm_s));

  66.         memset(buf,0,100);
  67.         address=RTC_s_ADDR;
  68.         STMFLASH_Read(address,buf,50);
  69.         memcpy(&Rtc_Set,buf,sizeof(Rtc_Set));

  70.        
  71. }


  72. void WriteSetData(void)
  73. {

  74.         u32 address;
  75.         u16 buf[50];

  76.         memset(buf,0,100);
  77.         address=CompRum_ADDR;
  78.         memcpy(buf,&PowerUp,4);
  79.         memcpy(&buf[4],&CompRum,sizeof(CompRum));
  80.         STMFLASH_Write(address,buf,50);

  81.     memset(buf,0,100);
  82.         address=SetProbe_ADDR;
  83.         memcpy(buf,&SetProbe,sizeof(SetProbe));
  84.         STMFLASH_Write(address,buf,50);

  85.     memset(buf,0,100);
  86.         address=SetDisplay_ADDR;
  87.         memcpy(buf,&SetDisplay,sizeof(SetDisplay));
  88.         STMFLASH_Write(address,buf,50);

  89.         memset(buf,0,100);
  90.         address=Frost_Set_ADDR;
  91.         memcpy(buf,&Frost_Set,sizeof(Frost_Set));
  92.         STMFLASH_Write(address,buf,50);

  93.     memset(buf,0,100);
  94.         address=Fan_ADDR;
  95.         memcpy(buf,&Fan,sizeof(Fan));
  96.         STMFLASH_Write(address,buf,50);

  97.         memset(buf,0,100);
  98.         address=Door_ADDR;
  99.         memcpy(buf,&Door_s,sizeof(Door_s));
  100.         STMFLASH_Write(address,buf,50);

  101.         memset(buf,0,100);
  102.         address=Aux_s_ADDR;
  103.         memcpy(buf,&Aux_s,sizeof(Aux_s));
  104.         STMFLASH_Write(address,buf,50);

  105.         memset(buf,0,100);
  106.         address=Alarm_s_ADDR;
  107.         memcpy(buf,&Alarm_s,sizeof(Alarm_s));
  108.         STMFLASH_Write(address,buf,50);

  109.         memset(buf,0,100);
  110.         address=RTC_s_ADDR;
  111.         memcpy(buf,&Rtc_Set,sizeof(Rtc_Set));
  112.         STMFLASH_Write(address,buf,50);

  113. }

  114. void UapdateProc(void)
  115. {

  116.    if(UpdateFlag>0)
  117.    {
  118.       UpdateFlag=0;
  119.       WriteSetData();
  120.           Buzzer_Cnt=3;
  121.    }
  122. }
复制代码
小肥羊dsf 回答时间:2019-11-19 16:52:31
  1. #include "keep.h"
复制代码
小肥羊dsf 回答时间:2019-11-19 16:53:15
Flash读写函数
  1. #include "stmflash.h"
  2. /
复制代码
小肥羊dsf 回答时间:2019-11-19 16:53:50
  1. #include "stmflash.h"

复制代码
小肥羊dsf 回答时间:2019-11-19 16:56:17
系统延时发多了
小肥羊dsf 回答时间:2019-11-20 13:31:56
自己给自己顶
小肥羊dsf 回答时间:2019-12-9 11:41:45
butterflyspring 回答时间:2019-12-10 10:05:19
试试对比一下前后AD相关的配置寄存器内容是否有变化,包括时钟配置,IO配置的内容。如有变化可以顺着线索找找哪里逻辑需要补充
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版