关于stm32f4的4kb备份区域读写问题

2019-07-20 12:27发布

for(i=0;i<buffer_size;i++)
        {
                aTxbuffer[i]=0x1156+i;
               
        }
这是我准备写进去的数据,但读出来的却是56,57,,,,丢失前面的11,这是哪里设置错了吗,程序如下,又打什么帮忙看下吧!!!!谢谢了
#include "stm32f4xx_hal.h"
UART_HandleTypeDef huart1;
#ifdef _GNUC_
#define PUTCHAR_PROTOTYPE int_io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int8_t write_to_backup_sram( uint32_t *data, uint16_t bytes, uint16_t offset );
int8_t read_from_backup_sram( uint32_t *data, uint16_t bytes, uint16_t offset );
uint32_t aTxbuffer[20];
uint32_t aRxbuffer[20];
uint16_t i;
#define buffer_size 20
int main(void)
{
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();

        for(i=0;i<buffer_size;i++)
        {
                aTxbuffer[i]=0x1156+i;
               
        }
write_to_backup_sram(aTxbuffer,20,0x0111);
read_from_backup_sram(aRxbuffer,20,0x0111);
for(i=0;i<buffer_size;i++)
        {
                printf("%08x ",aRxbuffer[i]);
        }
}
/* 写操作
*/
int8_t write_to_backup_sram( uint32_t *data, uint16_t bytes, uint16_t offset )
{
  const uint16_t backup_size = 0x1000;
  uint8_t* base_addr = (uint8_t *) BKPSRAM_BASE;
  uint16_t i;
  if( bytes + offset >= backup_size )
        {
    /* ERROR : the last byte is outside the backup SRAM region */
    return -1;
        }
        __HAL_RCC_BKPSRAM_CLK_ENABLE();
  /* disable backup domain write protection */
  __HAL_RCC_PWR_CLK_ENABLE() ;                          // set RCC->APB1ENR.pwren
    HAL_PWR_EnableBkUpAccess();                         // set PWR->CR.dbp = 1;
          HAL_PWREx_EnableBkUpReg();                          // Enables the Backup Regulator.
  for( i = 0; i < bytes; i++ )
        {
    *(__IO uint32_t *)(base_addr + offset + i) = *(data+i);
  }
  return 0;
}
/* 读操作
*/
int8_t read_from_backup_sram( uint32_t *data, uint16_t bytes, uint16_t offset )
{
  const uint16_t backup_size = 0x1000;
  uint8_t* base_addr = (uint8_t *) BKPSRAM_BASE;
  uint16_t i;
  if( bytes + offset >= backup_size ) {
    /* ERROR : the last byte is outside the backup SRAM region */
    return -1;
               
  }
__HAL_RCC_BKPSRAM_CLK_ENABLE();
  for( i = 0; i < bytes; i++ ) {
    *(data+i) = *(base_addr + offset + i);
  }
  return 0;
}


void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* USART1 init function */
static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

}

/** Pinout Configuration
*/
static void MX_GPIO_Init(void)
{

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
正点原子
1楼-- · 2019-07-20 16:28
 精彩回答 2  元偷偷看……
jk501
2楼-- · 2019-07-20 16:37
需要ST品牌的样品吗? 填一份扫IC网问卷可以得到三种ST任意型号的样品。 》》点击此处申请

一周热门 更多>