flash r/w
This commit is contained in:
parent
2bb4a9fe16
commit
2108f0f286
@ -2,7 +2,7 @@ CC=arm-none-eabi-gcc
|
|||||||
CP=arm-none-eabi-objcopy
|
CP=arm-none-eabi-objcopy
|
||||||
SZ=arm-none-eabi-size
|
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)
|
OBJ=$(SRC:.c=.o)
|
||||||
INC=-Isrc/ -Isrc/cmsis -Ilib/
|
INC=-Isrc/ -Isrc/cmsis -Ilib/
|
||||||
LDSCRIPT=stm32l432xx.ld
|
LDSCRIPT=stm32l432xx.ld
|
||||||
|
93
targets/stm32l442/src/flash.c
Normal file
93
targets/stm32l442/src/flash.c
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#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);
|
||||||
|
}
|
15
targets/stm32l442/src/flash.h
Normal file
15
targets/stm32l442/src/flash.h
Normal file
@ -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
|
@ -1,5 +1,6 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include "stm32l4xx.h"
|
#include "stm32l4xx.h"
|
||||||
#include "stm32l4xx_ll_gpio.h"
|
#include "stm32l4xx_ll_gpio.h"
|
||||||
#include "stm32l4xx_ll_rcc.h"
|
#include "stm32l4xx_ll_rcc.h"
|
||||||
@ -13,6 +14,7 @@
|
|||||||
#include "stm32l4xx_ll_tim.h"
|
#include "stm32l4xx_ll_tim.h"
|
||||||
|
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
|
#include "flash.h"
|
||||||
|
|
||||||
#define Error_Handler() _Error_Handler(__FILE__,__LINE__)
|
#define Error_Handler() _Error_Handler(__FILE__,__LINE__)
|
||||||
|
|
||||||
@ -69,7 +71,7 @@ void test_colors()
|
|||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
|
|
||||||
printf("%d: %d\r\n", j++, millis());
|
printf("%d: %lu\r\n", j++, millis());
|
||||||
|
|
||||||
printf("white pulse\r\n");
|
printf("white pulse\r\n");
|
||||||
time = millis();
|
time = millis();
|
||||||
@ -126,13 +128,10 @@ void test_colors()
|
|||||||
update();
|
update();
|
||||||
rgb((i<<8) | (i<<0));
|
rgb((i<<8) | (i<<0));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t __65_seconds = 0;
|
uint32_t __65_seconds = 0;
|
||||||
void TIM6_DAC_IRQHandler()
|
void TIM6_DAC_IRQHandler()
|
||||||
{
|
{
|
||||||
@ -143,9 +142,11 @@ void TIM6_DAC_IRQHandler()
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
uint8_t str[] = "YouCompleteMe: a code-completion engine for Vim";
|
||||||
|
uint8_t buf[500];
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
int inc = 1;
|
|
||||||
hw_init();
|
hw_init();
|
||||||
|
printf("hello solo\r\n");
|
||||||
|
|
||||||
|
|
||||||
/*LL_GPIO_SetPinMode(LED_PORT, LED_PIN_R, LL_GPIO_MODE_OUTPUT);*/
|
/*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_R);*/
|
||||||
/*LL_GPIO_SetOutputPin(LED_PORT, LED_PIN_G);*/
|
/*LL_GPIO_SetOutputPin(LED_PORT, LED_PIN_G);*/
|
||||||
/*LL_GPIO_SetOutputPin(LED_PORT, LED_PIN_B);*/
|
/*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)
|
while (1)
|
||||||
{
|
{
|
||||||
rgb(i | (i << 8) | (i << 16));
|
rgb(i | (i << 8) | (i << 16));
|
||||||
|
|
||||||
delay(100);
|
delay(1000);
|
||||||
printf("%d: %d\r\n", i++, millis());
|
printf("%lu: %lu\r\n", i+=50, millis());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user