使用HAL库,编写STM32F407串口接收数据,保存在内部FLASH程序
时间: 2024-05-09 22:15:00 浏览: 125
首先需要开启内部FLASH的写入保护,以免误操作导致数据丢失或者写入错误。可以通过以下代码实现:
```c
FLASH_OBProgramInitTypeDef OBInit;
HAL_FLASH_Unlock();
// 开启写入保护
HAL_FLASH_OB_Unlock();
OBInit.OptionType = OPTIONBYTE_WRP;
OBInit.WRPSector = FLASH_SECTOR_6;
OBInit.WRPState = OB_WRPSTATE_ENABLE;
HAL_FLASHEx_OBProgram(&OBInit);
HAL_FLASH_OB_Lock();
```
接下来就可以编写串口数据接收的代码了。假设使用的是USART2和PA2作为接收引脚,可以使用以下代码进行初始化:
```c
GPIO_InitTypeDef GPIO_InitStruct;
UART_HandleTypeDef UART_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART2_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
UART_InitStruct.Instance = USART2;
UART_InitStruct.Init.BaudRate = 115200;
UART_InitStruct.Init.WordLength = UART_WORDLENGTH_8B;
UART_InitStruct.Init.StopBits = UART_STOPBITS_1;
UART_InitStruct.Init.Parity = UART_PARITY_NONE;
UART_InitStruct.Init.Mode = UART_MODE_RX;
UART_InitStruct.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&UART_InitStruct);
```
然后可以使用HAL库提供的函数进行数据接收和保存。假设要接收的数据长度为100字节,保存在内部FLASH的地址为0x08008000,可以使用以下代码实现:
```c
uint8_t recv_data[100];
uint32_t flash_addr = 0x08008000;
HAL_UART_Receive(&UART_InitStruct, recv_data, 100, HAL_MAX_DELAY);
HAL_FLASH_Unlock();
for (int i = 0; i < 100; i++) {
HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, flash_addr + i, recv_data[i]);
}
HAL_FLASH_Lock();
```
注意,这里的地址是内部FLASH的物理地址,需要查阅芯片手册来确定。另外,由于内部FLASH的写入需要进行解锁和锁定操作,因此需要使用HAL_FLASH_Unlock()和HAL_FLASH_Lock()函数来控制解锁和锁定操作。
阅读全文