SSブログ

STM32L151とCubeMXでfreeRTOS [電子工作]

例によってLaunchpadのGNU ARM Embedded Toolchain環境とOpenOCD+CMSIS-DAP

罠っていうかSTM32L1用のFWバグってるじゃんという

1. CubeMXでプロジェクト作成

[Pinout]

・[Middlewares]-[FREERTOS]-[Enabled]をチェック

※以下はそれぞれのボードに合わせて
・[Peripherals]-[RCC]-[High Speed Clock (HSE)]を'Crystal/Ceramic Resonator'
・[SYS]-[Debug]を'Serial Wire'

※テスト用のLED出力ピン
・PC13
GPIO_Output, ラベル='LED1'
・PC14
GPIO_Output, ラベル='LED2'


[Clock Configuration]

System Clock MuxでHSEを選択


[Configuration]

FREERTOSの設定

[Config parametes]

・[Memory management settings]-[Memory Management scheme]がデフォルトで'heap_4'なので'heap_1'に変更
(しなくてもいいけど)

[Task and Queues]

・LED1TaskとLED2Taskを、それぞれosPriorityNormalで設定

-> [Project]-[Settings]-[Project]で[Toolchain / IDE]を'SW4STM32'にして、Code Generate

2. makefile

こんな感じ

PROJECT = stm32l151
 
DIR=~/gcc-arm/bin
CC=$(DIR)/arm-none-eabi-gcc
NM=$(DIR)/arm-none-eabi-nm
CP=$(DIR)/arm-none-eabi-objcopy
OD=$(DIR)/arm-none-eabi-objdump
SZ=$(DIR)/arm-none-eabi-size

# SEMIHOST_LIB = --specs=rdimon.specs -lrdimon
NANOLIB = --specs=nosys.specs --specs=nano.specs

OPENOCD=~/openocd
TARGETCNF=stm32l1.cfg
#INTERFACECNF=stlink-v2-1.cfg
INTERFACECNF=cmsis-dap.cfg

DEFS = -DUSE_HAL_DRIVER -DSTM32L151xB -DGCC_ARMCM3

MCU = cortex-m3
MCFLAGS  = -MD -mcpu=$(MCU) -march=armv7-m -mtune=$(MCU)
MCFLAGS += -std=gnu99
MCFLAGS += -mthumb -mlittle-endian -mno-unaligned-access -mno-sched-prolog
# MCFLAGS += -mfloat-abi=hard  -mfpu=fpv4-sp-d16
MCFLAGS += -fno-strict-aliasing -fsigned-char
MCFLAGS += -ffunction-sections -fdata-sections
MCFLAGS += -fno-schedule-insns2
MCFLAGS += -fno-common -fno-hosted
MCFLAGS += -mthumb-interwork
MCFLAGS += -fmessage-length=0
MCFLAGS += -ffreestanding
MCFLAGS += -fno-move-loop-invariants
MCFLAGS += -fsingle-precision-constant
# MCFLAGS += -nostartfiles
MCFLAGS += -Wl,--gc-sections
# MCFLAGS += -u _printf_float

STM32_INCLUDES = \
	-IInc \
	-IDrivers/CMSIS/Device/ST/STM32L1xx/Include \
	-IDrivers/CMSIS/Include \
	-IDrivers/STM32L1xx_HAL_Driver/Inc/Legacy \
	-IDrivers/STM32L1xx_HAL_Driver/Inc \
	-IMiddlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS \
	-IMiddlewares/Third_Party/FreeRTOS/Source/include \
	-IMiddlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3

# OPTIMIZE = -gdwarf-2 -O0 -flto-partition=none -fipa-sra
OPTIMIZE = -Os -finline -finline-functions-called-once

CFLAGS  = $(MCFLAGS) $(OPTIMIZE) $(NANOLIB) $(SEMIHOST_LIB) $(DEFS) $(STM32_INCLUDES)
CFLAGS += -Wl,-cref -T STM32L151C8Tx_FLASH.ld
AFLAGS  = $(MCFLAGS)

CSRC = \
	$(wildcard Src/*.c) \
	$(wildcard Drivers/STM32L1xx_HAL_Driver/Src/*.c) \
	$(wildcard Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/*.c) \
	$(wildcard Middlewares/Third_Party/FreeRTOS/Source/*.c) \
	$(wildcard Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/*.c) \
	$(wildcard Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/*.c) \
	$(wildcard Middlewares/Third_Party/FreeRTOS/Source/portable/*.c)

ASRC = startup/startup_stm32l151xb.s

COBJ = $(CSRC:.c=.o)
AOBJ = $(ASRC:.s=.o)

all: build size

build: elf hex lst sym

elf: $(PROJECT).elf
hex: $(PROJECT).hex
lst: $(PROJECT).lst
sym: $(PROJECT).sym

%.hex: %.elf
	@echo
	$(CP) -O ihex $< $@

%.lst: %.elf
	@echo
	$(OD) -h -S -C $< > $@

%.sym: %.elf
	@echo
	$(NM) -n $< > $@

size:
	@echo
	$(SZ) $(PROJECT).hex
	$(SZ) $(PROJECT).elf
	$(SZ) -A -x $(PROJECT).elf

%.elf: $(AOBJ) $(COBJ)
	@echo
	$(CC) $(CFLAGS) $^ -o $@

$(COBJ) : %.o : %.c
	@echo
	$(CC) -c $(CFLAGS) $< -o $@

$(AOBJ) : %.o : %.s
	@echo
	$(CC) -c $(CFLAGS) $< -o $@

clean:
	@echo
	find . -name '*.o' -print -or -name '*.d' -print | xargs rm -f
	rm -f $(PROJECT).elf $(PROJECT).hex $(PROJECT).lst $(PROJECT).sym

flash: $(PROJECT).elf
#	$(OPENOCD)/src/openocd -s $(OPENOCD)/tcl -f board/st_nucleo_l1.cfg -c "program $^ verify reset exit"

	$(OPENOCD)/src/openocd -s $(OPENOCD)/tcl -f interface/$(INTERFACECNF) -f target/$(TARGETCNF) -c "program $^ verify reset exit"


3. ソース修正!

クロックソースをMSI以外にしている場合、'STM32Cube FW_L1 V1.6.0'のSystemClock_Config()ではバグっていて起動しません。
(コンパイルオプションと運次第では起動することもある)

void SystemClock_Config(void)の下記の部分で、RCC_OSCILLATORTYPE_MSIを削除

    /**Initializes the CPU, AHB and APB busses clocks 
    */
//  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }


やらなくてもいいけれど、使わないMSIを止めたい場合は
HAL_RCC_ClockConfigでSYSCLKSourceを変更した後で

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
  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();
  }

    /* ADD: stop MSI after changing SYSCLKSource */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.MSIState = RCC_MSI_OFF;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
 


4. テスト用のTaskの実装

適当に

 /* StartLED1Task function */
void StartLED1Task(void const * argument)
{

  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, SET);
    osDelay(500);
    HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, RESET);
    osDelay(500);
  }
  /* USER CODE END 5 */ 
}

/* StartLED2Task function */
void StartLED2Task(void const * argument)
{
  /* USER CODE BEGIN StartLED2Task */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, SET);
    osDelay(1000);
    HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, RESET);
    osDelay(1000);
  }
  /* USER CODE END StartLED2Task */
}

nice!(1)  コメント(1)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 1

コメント 1

Cialis 20 mg best price

沒有醫生的處方
how do cialis pills work http://kawanboni.com/ Cialis kaufen
by Cialis 20 mg best price (2018-04-14 00:56) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。