From 2108f0f28601a8ea54bff1bdd6810d1a02e44aab Mon Sep 17 00:00:00 2001 From: Conor Patrick Date: Sat, 20 Oct 2018 21:02:59 -0400 Subject: [PATCH] flash r/w --- targets/stm32l442/Makefile | 2 +- targets/stm32l442/src/flash.c | 93 +++++++++++++++++++++++++++++++++++ targets/stm32l442/src/flash.h | 15 ++++++ targets/stm32l442/src/main.c | 32 ++++++++---- 4 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 targets/stm32l442/src/flash.c create mode 100644 targets/stm32l442/src/flash.h diff --git a/targets/stm32l442/Makefile b/targets/stm32l442/Makefile index e9d897f..67db61c 100644 --- a/targets/stm32l442/Makefile +++ b/targets/stm32l442/Makefile @@ -2,7 +2,7 @@ CC=arm-none-eabi-gcc CP=arm-none-eabi-objcopy SZ=arm-none-eabi-size -SRC=src/main.c src/init.c src/redirect.c src/startup_stm32l432xx.s src/system_stm32l4xx.c $(wildcard lib/*c) +SRC=src/main.c src/init.c src/redirect.c src/flash.c src/startup_stm32l432xx.s src/system_stm32l4xx.c $(wildcard lib/*c) OBJ=$(SRC:.c=.o) INC=-Isrc/ -Isrc/cmsis -Ilib/ LDSCRIPT=stm32l432xx.ld diff --git a/targets/stm32l442/src/flash.c b/targets/stm32l442/src/flash.c new file mode 100644 index 0000000..e5a9a2f --- /dev/null +++ b/targets/stm32l442/src/flash.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include "stm32l4xx.h" + +#include "app.h" +#include "flash.h" + +static void flash_unlock() +{ + if (FLASH->CR & FLASH_CR_LOCK) + { + FLASH->KEYR = 0x45670123; + FLASH->KEYR = 0xCDEF89AB; + } +} +void flash_erase_page(uint8_t page) +{ + __disable_irq(); + // Wait if flash is busy + while (FLASH->SR & (1<<16)) + ; + FLASH->SR = FLASH->SR; + + // enable flash erase and select page + FLASH->CR &= ~((0xff<<3) | 7); + FLASH->CR |= (page<<3) | (1<<1); + + // Go! + FLASH->CR |= (1<<16); + while (FLASH->SR & (1<<16)) + ; + + if(FLASH->SR & (1<<1)) + { + printf("erase NOT successful %x\r\n", FLASH->SR); + } + + FLASH->CR &= ~(0x7); + __enable_irq(); +} + +void flash_write_dword(uint32_t addr, uint64_t data) +{ + __disable_irq(); + while (FLASH->SR & (1<<16)) + ; + FLASH->SR = FLASH->SR; + + // Select program action + FLASH->CR |= (1<<0); + + *(volatile uint32_t*)addr = data; + *(volatile uint32_t*)(addr+4) = data>>32; + + while (FLASH->SR & (1<<16)) + ; + + if(FLASH->SR & (1<<1)) + { + printf("program NOT successful %x\r\n", FLASH->SR); + } + + FLASH->SR = (1<<0); + FLASH->CR &= ~(1<<0); + __enable_irq(); +} + +void flash_write(uint32_t addr, uint8_t * data, size_t sz) +{ + int i,j; + uint8_t buf[8]; + + // dword align + addr &= ~(0x7); + + for(i = 0; i < sz; i+=8) + { + memmove(buf, data + i, (sz - i) > 8 ? 8 : sz - i); + if (sz - i < 8) + { + memset(buf + sz - i, 0xff, 8 - (sz - i)); + } + flash_write_dword(addr, *(uint64_t*)buf); + addr += 8; + } + +} + +void flash_lock() +{ + FLASH->CR |= (1<<31); +} diff --git a/targets/stm32l442/src/flash.h b/targets/stm32l442/src/flash.h new file mode 100644 index 0000000..67db60e --- /dev/null +++ b/targets/stm32l442/src/flash.h @@ -0,0 +1,15 @@ +#ifndef _FLASH_H_H +#define _FLASH_H_H + +void flash_erase_page(uint8_t page); +void flash_write_dword(uint32_t addr, uint64_t data); +void flash_write(uint32_t addr, uint8_t * data, size_t sz); + +#define FLASH_PAGE_SIZE 2048 + +#define flash_addr(page) (0x08000000 + ((page)*FLASH_PAGE_SIZE)) + +#define FLASH_PAGE_START 0 +#define FLASH_PAGE_END 127 + +#endif diff --git a/targets/stm32l442/src/main.c b/targets/stm32l442/src/main.c index d75aea8..a403987 100644 --- a/targets/stm32l442/src/main.c +++ b/targets/stm32l442/src/main.c @@ -1,5 +1,6 @@ #include #include +#include #include "stm32l4xx.h" #include "stm32l4xx_ll_gpio.h" #include "stm32l4xx_ll_rcc.h" @@ -13,6 +14,7 @@ #include "stm32l4xx_ll_tim.h" #include "app.h" +#include "flash.h" #define Error_Handler() _Error_Handler(__FILE__,__LINE__) @@ -69,7 +71,7 @@ void test_colors() while(1) { - printf("%d: %d\r\n", j++, millis()); + printf("%d: %lu\r\n", j++, millis()); printf("white pulse\r\n"); time = millis(); @@ -126,13 +128,10 @@ void test_colors() update(); rgb((i<<8) | (i<<0)); } - } - - - } + uint32_t __65_seconds = 0; void TIM6_DAC_IRQHandler() { @@ -143,9 +142,11 @@ void TIM6_DAC_IRQHandler() int main(void) { + uint8_t str[] = "YouCompleteMe: a code-completion engine for Vim"; + uint8_t buf[500]; uint32_t i = 0; - int inc = 1; hw_init(); + printf("hello solo\r\n"); /*LL_GPIO_SetPinMode(LED_PORT, LED_PIN_R, LL_GPIO_MODE_OUTPUT);*/ @@ -155,15 +156,28 @@ int main(void) /*LL_GPIO_SetOutputPin(LED_PORT, LED_PIN_R);*/ /*LL_GPIO_SetOutputPin(LED_PORT, LED_PIN_G);*/ /*LL_GPIO_SetOutputPin(LED_PORT, LED_PIN_B);*/ - test_colors(); + // Test flash + flash_erase_page(60); + flash_write(flash_addr(60), str, sizeof(str)); + memmove(buf,(uint8_t*)flash_addr(60),sizeof(str)); + printf("flash: \"%s\"\r\n", buf); + + // test timer + uint32_t t1 = millis(); + delay(100); + uint32_t t2 = millis(); + printf("100 ms delay (%lu)\r\n",t2-t1); + + // Test PWM + weighting of RGB + test_colors(); while (1) { rgb(i | (i << 8) | (i << 16)); - delay(100); - printf("%d: %d\r\n", i++, millis()); + delay(1000); + printf("%lu: %lu\r\n", i+=50, millis()); } }