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

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配置的内容。如有变化可以顺着线索找找哪里逻辑需要补充
Glenxu 回答时间:2019-12-11 10:07:13
建议AD前后不要做PWM等开关动作大的操作,或相对空闲进行AD,并采取防止意外的程序
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版