@@ -25,8 +25,8 @@ use smoltcp::time::Instant;
25
25
use smoltcp:: wire:: { EthernetAddress , IpAddress , IpCidr , Ipv4Address } ;
26
26
use stm32_eth:: { Eth , EthPins , PhyAddress , RingEntry } ;
27
27
28
- use stm32f1xx_hal:: { prelude:: * , flash:: FlashExt } ;
29
28
use rtt_target:: { rprintln, rtt_init_print} ;
29
+ use stm32f1xx_hal:: { flash:: FlashExt , prelude:: * } ;
30
30
31
31
const SRC_MAC : [ u8 ; 6 ] = [ 0x00 , 0x00 , 0xDE , 0xAD , 0xBE , 0xEF ] ;
32
32
@@ -37,21 +37,73 @@ static ETH_PENDING: Mutex<RefCell<bool>> = Mutex::new(RefCell::new(false));
37
37
fn main ( ) -> ! {
38
38
rtt_init_print ! ( ) ;
39
39
40
- let p = Peripherals :: take ( ) . unwrap ( ) ;
40
+ let p = stm32f1xx_hal :: stm32 :: Peripherals :: take ( ) . unwrap ( ) ;
41
41
let mut cp = CorePeripherals :: take ( ) . unwrap ( ) ;
42
42
43
43
let mut flash = p. FLASH . constrain ( ) ;
44
- let mut rcc = p. RCC . constrain ( ) ;
45
44
46
45
// HCLK must be at least 25MHz to use the ethernet peripheral
47
46
rprintln ! ( "Setting up clocks" ) ;
47
+
48
+ // Code below handle situation when ethernet controller has its own clock
49
+
50
+ // let mut rcc = p.RCC.constrain();
51
+ // let clocks = rcc
52
+ // .cfgr
53
+ // .use_hse(8.mhz())
54
+ // .sysclk(72.mhz())
55
+ // .hclk(72.mhz())
56
+ // .pclk1(36.mhz())
57
+ // .freeze(&mut flash.acr);
58
+ ///////////////////////////////////////////////////////////////////////////////
59
+
60
+ // This case handles case when ethernet controller clock is connected to MCO pin of STM32F107
61
+ // MCU has connected 25 MHz oscillator to XTAL
62
+ // Prescaller valuses (see clock diagram for STM32F107)
63
+ // PREDIV2 = /5
64
+ // PLL2MUL = x8
65
+ // PREDIV1 = /5 (We have 8 Mhz for 'Clock from PREDIV1')
66
+ // PLL3MUL = x10
67
+ // PREDIV1SRC = PPL2
68
+ let rcc = p. RCC ;
69
+ rcc. cfgr2 . write ( |w| {
70
+ w. prediv2 ( )
71
+ . div5 ( )
72
+ . pll2mul ( )
73
+ . mul8 ( )
74
+ . prediv1src ( )
75
+ . pll2 ( )
76
+ . prediv1 ( )
77
+ . div5 ( )
78
+ . pll3mul ( )
79
+ . mul10 ( )
80
+ } ) ;
81
+
82
+ // enable HSE and wait for it to be ready
83
+ rcc. cr . modify ( |_, w| w. hseon ( ) . set_bit ( ) ) ;
84
+ while rcc. cr . read ( ) . hserdy ( ) . bit_is_clear ( ) { }
85
+
86
+ // enable PLL2 and wait until ready
87
+ rcc. cr . modify ( |_, w| w. pll2on ( ) . set_bit ( ) ) ;
88
+ while rcc. cr . read ( ) . pll2rdy ( ) . bit_is_clear ( ) { }
89
+
90
+ // enable PLL3 and wait until ready
91
+ rcc. cr . modify ( |_, w| w. pll3on ( ) . set_bit ( ) ) ;
92
+ while rcc. cr . read ( ) . pll3rdy ( ) . bit_is_clear ( ) { }
93
+
94
+ // Get PLL3 clock on PA8 pin (MCO)
95
+ rcc. cfgr . modify ( |_, w| w. mco ( ) . pll3ethernet ( ) ) ;
96
+
97
+ let mut rcc = rcc. constrain ( ) ;
98
+ let acr = & mut flash. acr ;
99
+
48
100
let clocks = rcc
49
101
. cfgr
50
- . use_hse ( 8 . mhz ( ) )
102
+ . use_hse ( 8 . mhz ( ) ) // HSE (Clock from PREDIV1), PLL configuration PREDIV2/PLL2MUL changes 25Mhz to 8Mhz
51
103
. sysclk ( 72 . mhz ( ) )
52
- . hclk ( 72 . mhz ( ) )
53
104
. pclk1 ( 36 . mhz ( ) )
54
- . freeze ( & mut flash. acr ) ;
105
+ . freeze ( acr) ;
106
+ ///////////////////////////////////////////////////////////////////////////////
55
107
56
108
rprintln ! ( "Setting up systick" ) ;
57
109
setup_systick ( & mut cp. SYST ) ;
@@ -61,6 +113,9 @@ fn main() -> ! {
61
113
let mut gpiob = p. GPIOB . split ( & mut rcc. apb2 ) ;
62
114
let mut gpioc = p. GPIOC . split ( & mut rcc. apb2 ) ;
63
115
116
+ // PLL3CLK goes to MCO (Main Clock Output) (PA8)
117
+ let _mco = gpioa. pa8 . into_alternate_push_pull ( & mut gpioa. crh ) ;
118
+
64
119
let ref_clk = gpioa. pa1 . into_floating_input ( & mut gpioa. crl ) ;
65
120
let md_io = gpioa. pa2 . into_alternate_push_pull ( & mut gpioa. crl ) ;
66
121
let crs = gpioa. pa7 . into_floating_input ( & mut gpioa. crl ) ;
0 commit comments