Skip to content

add stm32g070-st-nucleo bsp #3732

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,14 @@ env:
- RTT_BSP='stm32/stm32f767-atk-apollo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32f767-fire-challenger' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32f767-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32g070-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32g071-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32g431-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32h743-atk-apollo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32h743-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32h747-st-discovery' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32l4r9-st-eval' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32l010-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32l010-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32l053-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32l412-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='stm32/stm32l432-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
Expand Down
7 changes: 5 additions & 2 deletions bsp/stm32/libraries/HAL_Drivers/SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ src = Split("""

if GetDepend(['RT_USING_PIN']):
src += ['drv_gpio.c']

if GetDepend(['RT_USING_SERIAL']):
src += ['drv_usart.c']

Expand All @@ -35,7 +35,7 @@ if GetDepend(['BSP_USING_ETH', 'RT_USING_LWIP']):

if GetDepend(['RT_USING_ADC']):
src += Glob('drv_adc.c')

if GetDepend(['RT_USING_DAC']):
src += Glob('drv_dac.c')

Expand All @@ -58,6 +58,9 @@ if GetDepend('BSP_USING_LCD_MIPI'):
if GetDepend('BSP_USING_ONCHIP_RTC'):
src += ['drv_rtc.c']

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32G0']):
src += ['drv_flash/drv_flash_g0.c']

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32F0']):
src += ['drv_flash/drv_flash_f0.c']

Expand Down
230 changes: 230 additions & 0 deletions bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_g0.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2020-06-27 NU-LL first version
*/

#include "board.h"

#ifdef BSP_USING_ON_CHIP_FLASH
#include "drv_config.h"
#include "drv_flash.h"

#if defined(PKG_USING_FAL)
#include "fal.h"
#endif

// #define DRV_DEBUG
#define LOG_TAG "drv.flash"
#include <drv_log.h>

/**
* @brief Gets the page of a given address
* @param Addr: Address of the FLASH Memory
* @retval The page of a given address
*/
static uint32_t GetPage(uint32_t addr)
{
uint32_t page = 0;
page = RT_ALIGN_DOWN(addr-STM32_FLASH_START_ADRESS, FLASH_PAGE_SIZE)/FLASH_PAGE_SIZE;
return page;
}

/**
* Read data from flash.
* @note This operation's units is word.
*
* @param addr flash address
* @param buf buffer to store read data
* @param size read bytes size
*
* @return result
*/
int stm32_flash_read(rt_uint32_t addr, rt_uint8_t *buf, size_t size)
{
size_t i;

if ((addr + size) > STM32_FLASH_END_ADDRESS)
{
LOG_E("read outrange flash size! addr is (0x%p)", (void *)(addr + size));
return -RT_EINVAL;
}

for (i = 0; i < size; i++, buf++, addr++)
{
*buf = *(rt_uint8_t *) addr;
}

return size;
}

/**
* Write data to flash.
* @note This operation's units is word.
* @note This operation must after erase. @see flash_erase.
*
* @param addr flash address
* @param buf the write data buffer
* @param size write bytes size
*
* @return result
*/
int stm32_flash_write(rt_uint32_t addr, const uint8_t *buf, size_t size)
{
size_t i, j;
rt_err_t result = 0;
rt_uint64_t write_data = 0, temp_data = 0;

if ((addr + size) > STM32_FLASH_END_ADDRESS)
{
LOG_E("ERROR: write outrange flash size! addr is (0x%p)\n", (void*)(addr + size));
return -RT_EINVAL;
}

if(addr % 8 != 0)
{
LOG_E("write addr must be 8-byte alignment");
return -RT_EINVAL;
}

HAL_FLASH_Unlock();

__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR);

if (size < 1)
{
return -RT_ERROR;
}

for (i = 0; i < size;)
{
if ((size - i) < 8)
{
for (j = 0; (size - i) > 0; i++, j++)
{
temp_data = *buf;
write_data = (write_data) | (temp_data << 8 * j);
buf ++;
}
}
else
{
for (j = 0; j < 8; j++, i++)
{
temp_data = *buf;
write_data = (write_data) | (temp_data << 8 * j);
buf ++;
}
}

/* write data */
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, write_data) == HAL_OK)
{
/* Check the written value */
if (*(uint64_t*)addr != write_data)
{
LOG_E("ERROR: write data != read data\n");
result = -RT_ERROR;
goto __exit;
}
}
else
{
result = -RT_ERROR;
goto __exit;
}

temp_data = 0;
write_data = 0;

addr += 8;
}

__exit:
HAL_FLASH_Lock();
if (result != 0)
{
return result;
}

return size;
}

/**
* Erase data on flash.
* @note This operation is irreversible.
* @note This operation's units is different which on many chips.
*
* @param addr flash address
* @param size erase bytes size
*
* @return result
*/
int stm32_flash_erase(rt_uint32_t addr, size_t size)
{
rt_err_t result = RT_EOK;
uint32_t PAGEError = 0;

/*Variable used for Erase procedure*/
FLASH_EraseInitTypeDef EraseInitStruct;

if ((addr + size) > STM32_FLASH_END_ADDRESS)
{
LOG_E("ERROR: erase outrange flash size! addr is (0x%p)\n", (void *)(addr + size));
return -RT_EINVAL;
}

HAL_FLASH_Unlock();

/* Fill EraseInit structure*/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Page = GetPage(addr);
EraseInitStruct.NbPages = (size + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE;

if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
{
result = -RT_ERROR;
goto __exit;
}

__exit:
HAL_FLASH_Lock();

if (result != RT_EOK)
{
return result;
}

LOG_D("erase done: addr (0x%p), size %d", (void *)addr, size);
return size;
}

#if defined(PKG_USING_FAL)

static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size);
static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size);
static int fal_flash_erase(long offset, size_t size);

const struct fal_flash_dev stm32_onchip_flash = { "onchip_flash", STM32_FLASH_START_ADRESS, STM32_FLASH_SIZE, FLASH_PAGE_SIZE, {NULL, fal_flash_read, fal_flash_write, fal_flash_erase} };

static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size)
{
return stm32_flash_read(stm32_onchip_flash.addr + offset, buf, size);
}

static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size)
{
return stm32_flash_write(stm32_onchip_flash.addr + offset, buf, size);
}

static int fal_flash_erase(long offset, size_t size)
{
return stm32_flash_erase(stm32_onchip_flash.addr + offset, size);
}

#endif
#endif /* BSP_USING_ON_CHIP_FLASH */
9 changes: 7 additions & 2 deletions bsp/stm32/libraries/STM32G0xx_HAL/SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ if GetDepend(['RT_USING_I2C']):

if GetDepend(['RT_USING_SPI']):
src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c']
src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c']
src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c']
src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_spi.c']

if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']):
Expand All @@ -50,7 +50,12 @@ if GetDepend(['RT_USING_WDT']):
src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_iwdg.c']
src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_wwdg.c']

path = [cwd + '/STM32G0xx_HAL_Driver/Inc',
if GetDepend(['RT_USING_RTC']):
src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc.c']
src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc_ex.c']
src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rtc.c']

path = [cwd + '/STM32G0xx_HAL_Driver/Inc',
cwd + '/CMSIS/Device/ST/STM32G0xx/Include',
cwd + '/CMSIS/Include']

Expand Down
Loading