Różnice między wybraną wersją a wersją aktualną.
Nowa wersja | Poprzednia wersja | ||
studia:magisterskie:1sem:mikroprocesory [2016/03/15 19:34] 149.156.112.6 utworzono |
studia:magisterskie:1sem:mikroprocesory [2016/05/31 19:15] (aktualna) 149.156.112.6 |
||
---|---|---|---|
Linia 44: | Linia 44: | ||
endless_loop | endless_loop | ||
B endless_loop | B endless_loop | ||
+ | |||
+ | END</code> | ||
+ | ===== Zajęcia 4 ===== | ||
+ | <code asm> | ||
+ | THUMB | ||
+ | AREA vector_table, DATA, READONLY ;tablia wektorow przerwan - niepelna! | ||
- | ; ;BL clock_config | + | DCD 0x2000FFFF ;wartosc wskaznika stosu pod adresem 0x00000000 |
- | ; LDR R0,=RCC_AHB1ENR ;wlacz zegar portu GPIOG | + | DCD reset_handler ;komorka 0x00000004 - adres procedury obslugi przerwania reset |
- | ; LDR R1,[R0] | + | |
- | ; ORR R1,R1,#(1<<6) | + | ALIGN |
- | ; STR R1,[R0] | + | AREA program_data, DATA, READWRITE ;dane inicjowane wartoscia - tablica 8 liczb 32bitowych |
- | ; | + | |
- | ; LDR R0,=GPIOG_MODER ;tryb pracy lini 13 i 14 portu G - wyjscie | + | delay_tab DCB 0x0004, 0x0002, 0x0001, 0x0005, 0x0001 |
- | ; LDR R1,[R0] | + | ALIGN |
- | ; ORR R1,R1,#((1<<(2*13)) :OR: (1<<(2*14))) | + | AREA program_code, CODE, READONLY ;kod programu |
- | ; STR R1,[R0],#0x14 ;R0=GPIOG_ODR | + | ENTRY |
- | ; | + | reset_handler ;punkt wejsciowy - adres 1 instrukcji (ldr) |
- | ; ;LDR R0,=GPIOG_OTYPER ;typ wyjscia przeciwsobne | + | LDR R1,=delay_tab |
- | ; ;LDR R1,[R0] | + | LDRB R2,[R1],#1 |
- | ; ;ORR R1,R1,#0 | + | MOV R3,#0 |
- | ; ;STR R1,[R0] | + | petla_loop |
- | ; | + | LDRB R0,[R1],#1 |
- | ; ;LDR R0,=GPIOG_ODR ;GPIO output data register | + | CMP R0,R3 |
- | ; | + | IT HI |
- | ; MOV R2,#((1<<13) :OR: (1<<14)) ;maska ledow - jedynki na 13 i 14 pozycji | + | MOVHI R3,R0 |
- | ; MOV R1,#(1<<13) ;wartosc poczatkowa - zielony led | + | SUBS R2,R2,#1 |
- | ;; | + | BNE petla_loop |
- | ; LDR R7,=delay_tab ;R7 - baza- adres tablicy | + | endless_loop |
- | ; MOV R6,#0 ;w R6 wskaznik na pierwszy element | + | B endless_loop |
- | ;main_loop | + | END</code> |
- | ; LDR R4,[R7,R6, LSL #2] ;R4=delay_tab[baza+4*R6] | + | |
- | ; ADD R6,R6,#1 | + | ===== Zajęcia 5 ===== |
- | ; AND R6,R6,#7 ;przesun wskaznik (mod 8) | + | <code asm>RCC_AHB1ENR EQU 0x40023830 ;adres rejestru APB1 clock enable |
- | ; | + | GPIOG_MODER EQU 0x40021800 ;itd. |
- | ; MOV R5,#5 ;5 iteracji z kazda wartoscia zwloki | + | GPIOG_OTYPER EQU 0x40021804 |
- | ;inner_loop | + | GPIOG_ODR EQU 0x40021814 |
- | ; EORS R1,R1,R2 ;zamien ledy | + | |
- | ; STR R1,[R0] ;wyslij do portu i/o | + | THUMB |
- | ; | + | |
- | ; MOV R3,R4 ;wladuj liczbe iteracji | + | AREA vector_table, DATA, READONLY ;tablia wektorow przerwan - niepelna! |
- | ;delay_loop ;zwloka regulowana wartoscia z tablicy | + | |
- | ; SUBS R3,R3,#1 | + | DCD 0x2000FFFF ;wartosc wskaznika stosu pod adresem 0x00000000 |
- | ; BCS delay_loop | + | DCD reset_handler ;komorka 0x00000004 - adres procedury obslugi przerwania reset |
+ | |||
+ | ALIGN | ||
+ | AREA program_data, DATA, READWRITE ;dane inicjowane wartoscia - tablica 8 liczb 32bitowych | ||
+ | |||
+ | delay_tab DCB 0x0002, 0x0001, 0x0005, 0x0001 | ||
+ | ALIGN | ||
+ | AREA program_code, CODE, READONLY ;kod programu | ||
+ | ENTRY | ||
+ | reset_handler ;punkt wejsciowy - adres 1 instrukcji (ldr) | ||
+ | |||
+ | MOV R0,#0x0004 | ||
+ | LDR R1,=delay_tab | ||
+ | BL maks ; skok do labelki maks | ||
+ | maks | ||
+ | PUSH {R4, R5} ; wrzucenie na stos zeby ich nie zgubic | ||
+ | MOV R4,#0x80000000 | ||
+ | petla_loop | ||
+ | LDRB R5,[R1],#1 ;ladowanie pierwszego elementu | ||
+ | CMP R5,R4 ;porownanie | ||
+ | IT GT | ||
+ | MOVGT R4,R5 | ||
+ | SUBS R0,R0,#1 | ||
+ | BNE petla_loop | ||
+ | MOV R0, R4 | ||
+ | POP {R4, R5} ;pobranie ze stosu | ||
+ | BX LR ;skok do LR (adresu do ktorego ma wrocic funkcja) | ||
+ | |||
+ | endless_loop | ||
+ | B endless_loop | ||
+ | nop | ||
+ | END</code> | ||
+ | ===== Zajęcia 6 ====== | ||
+ | ==== asm_simple.s ==== | ||
+ | <code asm>RCC_AHB1ENR EQU 0x40023830 ;adres rejestru APB1 clock enable | ||
+ | GPIOG_MODER EQU 0x40021800 ;itd. | ||
+ | GPIOG_OTYPER EQU 0x40021804 | ||
+ | GPIOG_ODR EQU 0x40021814 | ||
+ | |||
+ | THUMB | ||
+ | IMPORT clock_config | ||
+ | |||
+ | |||
+ | AREA vector_table, DATA, READONLY ;tablia wektorow przerwan - niepelna! | ||
+ | |||
+ | DCD 0x2000FFFF ;wartosc wskaznika stosu pod adresem 0x00000000 | ||
+ | DCD reset_handler ;komorka 0x00000004 - adres procedury obslugi przerwania reset | ||
+ | |||
+ | ALIGN | ||
+ | AREA program_data, DATA, READWRITE ;dane inicjowane wartoscia - tablica 8 liczb 32bitowych | ||
+ | |||
+ | delay_tab DCD 0xC000, 0x10000, 0x18000, 0x20000, 0x30000, 0x40000, 0x60000, 0x80000 | ||
+ | |||
+ | ALIGN | ||
+ | AREA program_code, CODE, READONLY ;kod programu | ||
+ | |||
+ | ENTRY ;punkt wejsciowy - adres 1 instrukcji (ldr) | ||
+ | reset_handler | ||
+ | BL clock_config | ||
+ | LDR R0,=RCC_AHB1ENR ;wlacz zegar portu GPIOG | ||
+ | LDR R1,[R0] | ||
+ | ORR R1,R1,#(1<<6) | ||
+ | STR R1,[R0] | ||
+ | |||
+ | LDR R0,=GPIOG_MODER ;tryb pracy lini 13 i 14 portu G - wyjscie | ||
+ | LDR R1,[R0] | ||
+ | ORR R1,R1,#((1<<(2*13)) :OR: (1<<(2*14))) | ||
+ | STR R1,[R0],#0x14 ;R0=GPIOG_ODR | ||
+ | |||
+ | MOV R2,#((1<<13) :OR: (1<<14)) ;maska ledow - jedynki na 13 i 14 pozycji | ||
+ | MOV R1,#(1<<13) ;wartosc poczatkowa - zielony led | ||
+ | |||
+ | LDR R7,=delay_tab ;R7 - baza- adres tablicy | ||
+ | MOV R6,#0 ;w R6 wskaznik na pierwszy element | ||
+ | main_loop | ||
+ | LDR R4,[R7,R6, LSL #2] ;R4=delay_tab[baza+4*R6] | ||
+ | ADD R6,R6,#1 | ||
+ | AND R6,R6,#7 ;przesun wskaznik (mod 8) | ||
+ | |||
+ | MOV R5,#5 ;5 iteracji z kazda wartoscia zwloki | ||
+ | inner_loop | ||
+ | EORS R1,R1,R2 ;zamien ledy | ||
+ | STR R1,[R0] ;wyslij do portu i/o | ||
+ | |||
+ | MOV R3,R4 ;wladuj liczbe iteracji | ||
+ | delay_loop ;zwloka regulowana wartoscia z tablicy | ||
+ | SUBS R3,R3,#1 | ||
+ | BCS delay_loop | ||
- | ; SUBS R5,R5,#1 | + | SUBS R5,R5,#1 |
- | ; BCS inner_loop | + | BCS inner_loop |
- | ; B main_loop | + | B main_loop |
END</code> | END</code> | ||
+ | ==== clock_config.s ==== | ||
+ | <code asm>RCC_CR EQU 0x40023800 | ||
+ | RCC_PLLCFGR EQU 0x40023804 | ||
+ | RCC_CFGR EQU 0x40023808 | ||
+ | RCC_AHB1ENR EQU 0x40023830 | ||
+ | RCC_AHB2ENR EQU 0x40023834 | ||
+ | RCC_APB1ENR EQU 0x40023840 | ||
+ | |||
+ | RCC_PLLCFGR_CLR_MASK EQU 0xF0BC0000 | ||
+ | |||
+ | THUMB | ||
+ | EXPORT clock_config | ||
+ | AREA config_code, CODE, READONLY | ||
+ | ALIGN | ||
+ | |||
+ | clock_config | ||
+ | PUSH {R4-R6} | ||
+ | ;po resecie - wlaczony wewnetrzny oscylator (HSI) - 16MHz | ||
+ | LDR R4,=RCC_CR ;RCC_CR - CLOCK CONTROL REGISTER | ||
+ | LDR R5,[R4] | ||
+ | BIC R5,R5,#1<<0 ;HSI off | ||
+ | ORR R5,R5,#1<<16 ;HSE on | ||
+ | STR R5,[R4] | ||
+ | hse_stabilization | ||
+ | LDR R5,[R4] | ||
+ | ANDS R5,R5,#1<<17 ;czekaj na ustabilizowanie HSE | ||
+ | BEQ hse_stabilization | ||
+ | |||
+ | ;konfiguracja PLL: fout = (fin/M)*(N/P) | ||
+ | ;fin=16MHz dla HSI, 8MHz dla HSE | ||
+ | ;wartosci po resecie: | ||
+ | ;M=16 (bity 5-0) | ||
+ | ;N=192 (bity 14-6) | ||
+ | ;P=2 (bity 16-17) | ||
+ | ;Q=4 (bity 24-27) | ||
+ | |||
+ | LDR R6,=RCC_PLLCFGR_CLR_MASK | ||
+ | LDR R5,[R4,#4] ;RCC_PLLCFGR - PLL CONFIGURATION REGISTER | ||
+ | ANDS R5,R5,R6 ;maska - zostaw tylko bity 'reserved' | ||
+ | ORR R5,R5,#30 ;PLLM: 2 - 63 | ||
+ | ORR R5,R5,#432<<6 ;PLLN: 100 - 432 | ||
+ | ORR R5,R5,#1<<16 ;PLLP 0=/2 1=/4 2=/6 3=/8 | ||
+ | |||
+ | ORR R5,R5,#1<<22 ;wejscie PLL 22 bit HSE=1 HSI=0 | ||
+ | |||
+ | ORR R5,R5,#4<<24 ;PLLQ | ||
+ | STR R5,[R4,#4] | ||
+ | |||
+ | LDR R5,[R4] ;RCC_CR | ||
+ | ORR R5,R5,#1<<24 ;wlacz PLL | ||
+ | STR R5,[R4] | ||
+ | |||
+ | pll_stabilization | ||
+ | LDR R5,[R4] | ||
+ | ANDS R5,R5,#1<<25 ;czekaj na zatrzasniecie PLL | ||
+ | BEQ pll_stabilization | ||
+ | |||
+ | LDR R5,[R4,#8] ;RCC_CFGR | ||
+ | ORR R5,R5,#02 ;System Clock source: 0-HSI 1-HSE 2-PLL | ||
+ | ORR R5,R5,#0<<4 ;AHB PRESCALER 0 - /1, 8 - /2, 9 - /4 ,10 - /8 ... 15 - /512 | ||
+ | ORR R5,R5,#0<<10 ;APB1 PRESCALER LOW SPEED 0 - /1, 4 - /2, 5- /4, 6 - /8, 7 - /16 | ||
+ | ORR R5,R5,#0<<13 ;APB2 PRESCALER HI SPEED 0 - /1, 4 - /2, 5- /4, 6 - /8, 7 - /16 | ||
+ | STR R5,[R4,#8] | ||
+ | |||
+ | sys_clk_check | ||
+ | LDR R5,[R4,#8] | ||
+ | ANDS R5,R5,#02<<2 ;zaczekaj az bedzie gotowy, wartosci jak wyzej | ||
+ | BEQ sys_clk_check | ||
+ | |||
+ | POP {R4-R6} | ||
+ | BX LR | ||
+ | |||
+ | ALIGN | ||
+ | END</code> | ||
+ | ===== Zajęcia 8 ===== | ||
+ | {{:studia:magisterskie:1sem:wogus.zip|}} | ||
+ | ===== Zajęcia n-1 ===== | ||
+ | <code c> | ||
+ | #include <stdio.h> | ||
+ | //#include <stdlib.h> | ||
+ | #include "stm32f4xx.h" | ||
+ | #include "GLCD.h" | ||
+ | |||
+ | |||
+ | #define __FI 1 | ||
+ | #if (__FI == 1) | ||
+ | #define __FONT_WIDTH 16 | ||
+ | #define __FONT_HEIGHT 24 | ||
+ | #else | ||
+ | #define __FONT_WIDTH 6 | ||
+ | #define __FONT_HEIGHT 8 | ||
+ | #endif | ||
+ | |||
+ | uint32_t rand_lfsr32(void); | ||
+ | uint32_t rand_hw(void); | ||
+ | void clock_config(void); | ||
+ | |||
+ | uint32_t i,x; | ||
+ | char s[20]; | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | |||
+ | clock_config(); | ||
+ | |||
+ | RCC->AHB2ENR |= 1<<6; //wlacz zegar DRNG | ||
+ | RNG->CR |= 1<<2; //wlacz DRNG | ||
+ | |||
+ | GLCD_Initialize(); | ||
+ | GLCD_SetBackColor(Black); | ||
+ | GLCD_SetTextColor(White); | ||
+ | GLCD_Clear(Black); | ||
+ | |||
+ | x=0xabcdef12; | ||
+ | |||
+ | for (i=0;i<10;i++) { | ||
+ | |||
+ | x=rand_lfsr32(); | ||
+ | //x=rand_hw(); | ||
+ | |||
+ | sprintf(s,"%x", x); | ||
+ | GLCD_DisplayString(i, 0, __FI,s); | ||
+ | } | ||
+ | |||
+ | while (1); | ||
+ | } | ||
+ | |||
+ | |||
+ | void clock_config(void) | ||
+ | { | ||
+ | //wspolpraca z pamiecia FLASH | ||
+ | FLASH->ACR |= 5; //5 WaitStatow dla 180MHz | ||
+ | FLASH->ACR |= ((1<<8) | (1<<9) | (1<<10)); //wlacz prefetch oraz I&D cache | ||
+ | |||
+ | //wybor oscylatora | ||
+ | RCC->CR &= ~(1<<0); //HSI OFF | ||
+ | RCC->CR |= (1<<16); //HSE ON | ||
+ | while (!(RCC->CR & 1<<17)); //czekaj az sie HSE ustabilizuje | ||
+ | |||
+ | //konfiguracja PLL: fout = (fin/M)*(N/P) | ||
+ | RCC->PLLCFGR &= 0xF0BC0000; //zostaw tylko bity reserved, reszta 0 | ||
+ | RCC->PLLCFGR |= 4;//8; //M (2-63) | ||
+ | RCC->PLLCFGR |= 360<<6;//192<<6; //N (192-432) | ||
+ | RCC->PLLCFGR |= 1<<16; //P 0=/2 1=/4 2=/6 3=/8 | ||
+ | RCC->PLLCFGR |= 15<<25; //2<<24; //Q (2-15) USB SDIO random number generator | ||
+ | RCC->PLLCFGR |= 1<<22; //wejscie PLL 1=HSE, 0=HSI | ||
+ | |||
+ | RCC->CR |= 1<<24; // 1 - PLL ON, 0 - PLL OFF | ||
+ | while (!(RCC->CR & 1<<25)); //czekaj az PLL sie zatrzasnie | ||
+ | |||
+ | RCC->CFGR |= 2; //0 - HSI, 1 - HSE, 2 - PLL jako SYSCLK | ||
+ | RCC->CFGR |= 0<<4; //AHB PRESCALER 8 - /2, 9 - /4 ,10 - /8 ... | ||
+ | RCC->CFGR |= 7<<10; //APB1 PRESCALER LOW SPEED 4 - /2, 5- /4, 6 - /8, 7 - /16 | ||
+ | RCC->CFGR |= 0<<13; //APB2 PRESCALER HI SPEED | ||
+ | } | ||
+ | |||
+ | |||
+ | //uzupelnic LFSR-32bit | ||
+ | //wielomian: x^32+x^30+x^26+x^25 | ||
+ | __asm uint32_t rand_lfsr32(void) | ||
+ | { | ||
+ | LDR R3,=__cpp(&x) | ||
+ | LDR R0,[R3] | ||
+ | ROR R0,R0,#1 | ||
+ | ASR R1,R0,#31 | ||
+ | AND R1,R1, #0x23000000 | ||
+ | EOR R0,R0,R1 | ||
+ | bx lr | ||
+ | } | ||
+ | |||
+ | //uzupelnic - generator sprzetowy | ||
+ | __asm uint32_t rand_hw(void) | ||
+ | { | ||
+ | LDR R1,=0x50060800 | ||
+ | rand_loop | ||
+ | LDR R0,[R1,#4] | ||
+ | ANDS R0, #1 | ||
+ | BEQ rand_loop | ||
+ | |||
+ | LDR R0,[R1,#8] | ||
+ | bx lr | ||
+ | } | ||
+ | |||
+ | </code> |