====== 7. Blikání LED v assembleru ====== ===== Cíle cvičení ===== - Seznámit se s instrukční sadou - Seznámit se se zápisem programu v assembleru - Vytvořit program v assembleru, který bude blikat s LED2 na nucleu nebo s jinou LED na rozšiřujícím kitu - Ověřit funkčnost ostatních instrukcí, např. BL, AND, OR, EOR, LSR, LSL, ... ===== Co je třeba si připravit ===== - Prostudovat {{ :courses:b2m37mam:stm32f4_instruction_set.pdf#page=50 |instrukční sadu}} od strany 50 nebo alespoň sekci [[courses:b2m37mam:tutorials:asm_stm32|Vybraná instrukční sada pro STM32]] - Zopakovat si práci s registry RCC, GPIOx mikrokontroléru STM32F401 v {{ :courses:b2m37mam:stm32f401_refmanual.pdf |referenčním manuálu}} a předchozího cvičení - Prostudovat příklad blikání s LED v assembleru v sekci příkladů: [[courses:b2m37mam:priklady:stm32:01-gpio|01 - GPIO LED]] ===== Podklady pro cvičení ===== {{ :courses:b2m37mam:labs:mam_2025-cviceni_7.pdf | Podklady pro cvičení_7 - Skalický}} {{ :courses:b2m37mam:labs:had_asm.zip | ASM program blikaní LED}} {{ :courses:b2m37mam:labs:had_asm_c.zip | Jazyk C s volaným ASM podprogramem}} {{ :courses:b2m37mam:labs:asm_fir.zip | Jazyk C s volaným ASM a proměnnými definovanými v ASM i C }} {{ :courses:b2m37mam:labs:terminal.zip | USART terminál}} {{ :courses:b2m37mam:labs:cortex-m4_generic_user_guide.pdf | Jádro ARM M4}} {{ :courses:b2m37mam:labs:cortex_m4_technical_ref_manual.pdf | Cortex ARM M4 Technical Reference Manual}} {{ :courses:b2m37mam:stm32f401_refmanual.pdf | Referenční manuál STM32F401 }} {{ :courses:b2m37mam:stm32f4_instruction_set.pdf | Instrukční sada STM32F4}} {{ :courses:b2m37mam:labs:stm32f401re.pdf | Datasheet STM32F401 }} ===== Kódy pro cvičení ===== .global main_asm .equ RCC_BASE, 0x40023800 .equ RCC_AHB1ENR_OFFSET, 0x30 .equ RCC_AHB1ENR_GPIOA_EN, 0x0001 .equ GPIOA_BASE, 0x40020000 .equ GPIO_MODER_OFFSET, 0x00 .equ GPIO_ODR_OFFSET, 0x0014 .equ GPIO_MODER_OUTPUT_PA5, 0x0400 .equ GPIO_ODR_PA5, 0x0020 .equ DELAY_MS, 500 .equ COUNT_1MS, 5332 @ ---------------------------- delay_function: bx lr @ ---------------------------- blink_led: bx lr @ ---------------------------- init_function: bx lr @ ---------------------------- main_asm: bl init_function loop: bl delay_function bl blink_led b loop ===== Počítadlo cyklů ===== V každém jádře ARM procesoru lze najít blok DWT (Data Watchpoint and Trace Unit), který počítá počet instrukcních cyklů, které procesor vykonal. Lze tímto způsobem si ověřit, jak dlouho bude trvat zpoždění, v našem případě počet cyklů pro 500ms. Tuto informaci najdete v {{ :courses:b2m37mam:labs:cortex_m4_technical_ref_manual.pdf#page=88 | Cortex ARM M4 Technical Reference Manual}}. Konkrétně registr ''DWT_CYCCNT'' na adrese ''0xE0001004'' nám udává počet cyklů.