Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska Projektowanie systemów wbudowanych dla Internetu Przedmiotów Programowanie mikrokontrolerów z rdzeniem ARM - Nucleo-F401RE dla SCR (tworzenie firmware) - wprowadzenie Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
NUCLEO-F401RE 11-2014 Zygmunt Kubiak
NUCLEO-F401RE 11-2014 Zygmunt Kubiak
NUCLEO-F401RE 11-2014 Zygmunt Kubiak
NUCLEO-F401RE 11-2014 Zygmunt Kubiak
NUCLEO-F401RE 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Oznaczenia mikrokontrolerów STM32xx, gdzie xx F0 - rdzeń Cortex-M0, tanie i proste układy, zegar do 48MHz. F1 - rdzeń Cortex-M3, zegar do 72MHz; niektóre układy mają specjalne peryferia do sterowania silnikami. F2 - mocniejsza wersja F1, zegar do 120MHz. F3 - rdzeń Cortex-M4, zegar max 72MHz, obsługa instrukcji DSP oraz koprocesor arytmetyczny. F4 - mocniejsza wersja F3, zegar do 180MHz. F7 - najnowsza wersja, szybsza względem F4, (2x). L0 - układ energooszczędny z rdzeniem Cortex-M0. L1 - model energooszczędny z rdzeniem Cortex-M3. 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Środowiska programistyczne System Workbench for STM32 - SW4STM32 (proj. OpenSTM32) TrueSTUDIO_for_STM32 (f. Atollic) MDK (f. Keil) EWARM (f. IAR) CoIDE (f. CooCox) STM32 ST-LINK interfejs do programowania STM32 Kompilator –najczęściej GCC STM32CubeMX – program konfiguratora STM32 ARM Mbed 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Blink File -> New -> C Project Blink, Empty Project, Ac6 STM32 MCU GCC => Next 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Blink File -> New -> C Project Blink, Empty Project, Ac6 STM32 MCU GCC => Next => Next 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Blink File -> New -> C Project Blink, Empty Project, Ac6 STM32 MCU GCC => Next STM32F4, NUCLEO-F401RE => Next 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Blink File -> New -> C Project Blink, Empty Project, Ac6 STM32 MCU GCC => Next STM32F4, NUCLEO-F401RE => Next StdPeriph; gdy prop. Firmware to załadować => Finish 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Blink Wygenerowany projekt StdPeriph_Driver - kod biblioteki inc – foder plików nagłówkowych (.h) src – folder plików z kodem programu (.c) Startup – pliki z kodem w asemblerze, uruchamianym po resecie CMSIS – biblioteka dostarczana przez ARM 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Blink #include "stm32f4xx.h" void delay(int time){ for (int i = 0; i < time * 3000; i++); } int main(void) { //Zezwolenie na zegar na magistrali AHB1 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //obiekt GPIO GPIO_InitTypeDef gpio; //Inicjacja struktury GPIO_StructInit(&gpio); 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Blink // PA5 wyjście – dioda LD2 gpio.GPIO_Pin = GPIO_Pin_5; gpio.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(GPIOA, &gpio); for(;;){ GPIO_SetBits(GPIOA, GPIO_Pin_5); // zał. LD2 delay(100); GPIO_ResetBits(GPIOA, GPIO_Pin_5); // wył. LD2 delay(50); } 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Button File -> New -> C Project Button, Empty Project, Ac6 STM32 MCU GCC => Next => Next STM32F4, NUCLEO-F401RE => Next StdPeriph; gdy prop. Firmware to załadować => Finish Wygenerowany projekt StdPeriph_Driver - kod biblioteki inc – foder plików nagłówkowych (.h) src – folder plików z kodem programu (.c) Startup – pliki z kodem w asemblerze, uruchamianym po resecie CMSIS – biblioteka dostarczana przez ARM 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Button #include "stm32f4xx.h„ int main(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitTypeDef gpio; GPIO_StructInit(&gpio); // Ustawienie wybranych parametrów w strukturze inicjującej gpio.GPIO_Pin = GPIO_Pin_5; // LEDG (LD2) 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Button gpio.GPIO_Mode = GPIO_Mode_OUT; // wyjście // gpio.GPIO_OType = GPIO_OType_PP; // PP GPIO_Init(GPIOA, &gpio); // Init port GPIOA gpio.GPIO_Pin = GPIO_Pin_13; // przycisk (B1) gpio.GPIO_Mode = GPIO_Mode_IN; // wejscie gpio.GPIO_PuPd = GPIO_PuPd_UP; // z rezystorem pull-up GPIO_Init(GPIOC, &gpio); // Init port GPIOC 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) - Button while(1) { if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) // gdy B1 wcisniety GPIO_SetBits(GPIOA, GPIO_Pin_5); // zapal LD2 else GPIO_ResetBits(GPIOA, GPIO_Pin_5); // inaczej wyłącz LD2 } 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) – Blink2 File -> New -> C Project Blink2, Empty Project, Ac6 STM32 MCU GCC => Next STM32F4, NUCLEO-F401RE => Next StdPeriph; gdy prop. Firmware to załadować => Finish Wygenerowany projekt StdPeriph_Driver - kod biblioteki inc – foder plików nagłówkowych (.h) src – folder plików z kodem programu (.c) Startup – pliki z kodem w asemblerze, uruchamianym po resecie CMSIS – biblioteka dostarczana przez ARM 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) – Blink2 #include "stm32f4xx.h" volatile u32 LT0, LT1, LT2, LT3, Tim_ms=0; volatile u8 T0, T1, T2, T3; int main(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitTypeDef gpio; GPIO_StructInit(&gpio); 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) – Blink2 Dostępny jest specjalny timer (24 bity) SysTick() SysTick_Handler() // Ustawienie wybranych parametrów w strukturze inicjującej gpio.GPIO_Pin = GPIO_Pin_5; gpio.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(GPIOA, &gpio); SysTick_Config(SystemCoreClock / 1000); //start przerwań co 1ms LT0=1000; T0=1; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) – Blink2 while(1) { while (T0) GPIO_SetBits(GPIOA, GPIO_Pin_5); LT1=400; T1=1; } while (T1) GPIO_ResetBits(GPIOA, GPIO_Pin_5); LT0=100; T0=1; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) – Blink2 /* while (T0) { GPIO_ToggleBits(GPIOA, GPIO_Pin_5); LT0=100; T0=1; } */ 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) – Blink2 void SysTick_Handler() // przerwania czasowe 1ms { Tim_ms++; if (T0) if (LT0 == 0) T0 =0; else LT0--; } if (T1) if (LT1 == 0) T1 = 0; else LT1--; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) – Blink2 if (T2) { if (LT2 == 0) T2 = 0; else LT2--; } if (T3) if (LT3 == 0) T3 = 0; else LT3--; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z biblioteką StdPeriph) – Sync Niezależne mruganie diodami Realizacja synchroniczna 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Sync – realizacja synchroniczna Niezależne mruganie diodami – diagram przepływu 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Sync – realizacja synchroniczna Niezależne mruganie diodami – algorytm synchroniczny 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Sync – realizacja synchroniczna Niezależne mruganie diodami – algorytm synchroniczny 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Sync – realizacja synchroniczna Niezależne mruganie diodami – program #include "stm32f4xx.h„ volatile uint32_t LT0, LT1, LT2, LT3, Tim_ms; volatile uint8_t T0, T1, T2, T3; uint8_t F0, F1, F2, F3; int main(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitTypeDef gpio; GPIO_StructInit(&gpio); // Ustawienie wybranych parametrów w strukturze inicjującej gpio.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; gpio.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(GPIOA, &gpio); SysTick_Config(SystemCoreClock / 1000); //start przerwań co 1ms 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Sync – realizacja synchroniczna Niezależne mruganie diodami – program GPIO_ResetBits(GPIOA, GPIO_Pin_5); GPIO_ResetBits(GPIOA, GPIO_Pin_6); LT0=500; LT1=179; F0=1; F1=0; F2=1; F3=0; T0=1; T1=1; while(1) { if (F0) if (T0==0) GPIO_SetBits(GPIOA, GPIO_Pin_5); // zapal LD2 F0=0; F1=1; LT0=200; T0=1; } 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Sync – realizacja synchroniczna Niezależne mruganie diodami – program if (F1) { if (T0==0) GPIO_ResetBits(GPIOA, GPIO_Pin_5); // wyłącz LD2 F1=0; F0=1; LT0=500; T0=1; } if (F2) if (T1==0) GPIO_SetBits(GPIOA, GPIO_Pin_6); // zapal LD3 F2=0; F3=1; LT1=179; T1=1; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Sync – realizacja synchroniczna Niezależne mruganie diodami – program if (F3) { if (T1==0) GPIO_ResetBits(GPIOA, GPIO_Pin_6); // wyłącz LD3 F2=0; F3=1; LT1=179; T1=1; } } // koniec main() 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Sync – realizacja synchroniczna Niezależne mruganie diodami – program void SysTick_Handler()// przerwania czasowe 1ms { Tim_ms++; if (T0) if (LT0 == 0) T0 = 0; else LT0--; } if (T1) if (LT1 == 0) T1 = 0; else LT1--; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Sync – realizacja synchroniczna Niezależne mruganie diodami – program if (T2) { if (LT2 == 0) T2 = 0; else LT2--; } if (T3) if (LT3 == 0) T3 = 0; else LT3--; // koniec programu „Sync” 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) Instalacja Help -> Install New Software… Plik „ en.stsw-stm32095.zip” 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) Instalacja Help -> Install New Software… Plik „ en.stsw-stm32095.zip” Window -> Perspective -> Open Perspective -> Other 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCube 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCube Border Selector Start Project 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCube Pinout 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCube Configuration 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCube Configuration 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCube Project -> Generate Code 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCube int main(void) { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCube HAL_Delay(1000); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); while (1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_Delay(500); } 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – ButCube int main(void) { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – ButCube while (1) { // if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET) if (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_SET) //HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); } 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCsync #include "main.h" #include "stm32f4xx_hal.h" extern volatile uint32_t LT0, LT1, LT2, LT3, Tim_ms; extern volatile uint8_t T0, T1, T2, T3; /* Private function prototypes --------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCsync int main(void) { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); SysTick_Config(SystemCoreClock / 1000); //start przerwań co 1ms LT0=1000; T0=1; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCsync while (1) { // HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); while (T0) HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); LT1=900; T1=1; } while (T1) HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); LT0=100; T0=1; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCsync !!! Zmiana w pliku „stm32f4xx_it.c” #include "stm32f4xx_hal.h" #include "stm32f4xx.h" #include "stm32f4xx_it.h" /* USER CODE BEGIN 0 */ volatile uint32_t LT0, LT1, LT2, LT3, Tim_ms; volatile uint8_t T0, T1, T2, T3; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCsync !!! Zmiana w pliku „stm32f4xx_it.c” void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ Tim_ms++; if (T0) if (LT0 == 0) T0 =0; else LT0--; } if (T1) if (LT1 == 0) T1 = 0; else LT1--; 11-2014 Zygmunt Kubiak
Projektowanie systemów wbudowanych dla Internetu Przedmiotów Wprowadzenie do programowania synchronicznego dla modułu NUCLEO-F401RE (środowisko SW4STM32 z konfig. STM32CubeMX) – BlinkCsync !!! Zmiana w pliku „stm32f4xx_it.c” if (T2) { if (LT2 == 0) T2 = 0; else LT2--; } if (T3) if (LT3 == 0) T3 = 0; else LT3--; /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); HAL_SYSTICK_IRQHandler(); 11-2014 Zygmunt Kubiak