Różnice między wybraną wersją a wersją aktualną.
Poprzednia rewizja po obu stronach Poprzednia wersja | |||
studia:magisterskie:1sem:mikroprocesory [2016/04/26 19:23] 149.156.112.6 |
studia:magisterskie:1sem:mikroprocesory [2016/05/31 19:15] (aktualna) 149.156.112.6 |
||
---|---|---|---|
Linia 259: | Linia 259: | ||
===== Zajęcia 8 ===== | ===== Zajęcia 8 ===== | ||
{{:studia:magisterskie:1sem:wogus.zip|}} | {{: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> |