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
こんな感じ
3. ソース修正!
クロックソースをMSI以外にしている場合、'STM32Cube FW_L1 V1.6.0'のSystemClock_Config()ではバグっていて起動しません。
(コンパイルオプションと運次第では起動することもある)
void SystemClock_Config(void)の下記の部分で、RCC_OSCILLATORTYPE_MSIを削除
やらなくてもいいけれど、使わないMSIを止めたい場合は
HAL_RCC_ClockConfigでSYSCLKSourceを変更した後で
4. テスト用のTaskの実装
適当に
罠っていうか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 */ }
沒有醫生的處方
how do cialis pills work http://kawanboni.com/ Cialis kaufen
by Cialis 20 mg best price (2018-04-14 00:56)