Cortex-M peripherals framework
This crate provides a common lightweight framework to target most Cortex-M devices from a single crate. This is done via conditional compilation of the different peripherals available in each device.
- 
Target the core peripherals of all Cortex-M devices (NVIC, SCB, etc...) and some unique ones (FPU, etc...) 
- 
WIP Target most common peripherals that can be used by the user (RCC, PWR, GPIO, etc...) - RCC
- GPIO
- IWDG
- WWDG
- CRC
- WIP I2C
- WIP SPI
- WIP RTC
- WIP PWR
- TIMx
- USB OTG
- SDIO
- Ethernet
- Flash
- RNG
 
- 
Allow for multithreaded applications by creating a "one instance only" system for the peripherals. 
- 
WIP Compatible with embedded-hal.- Delay
- Watchdog (PARTIAL)
- WIP Read/Write for SPI, I2C
 
- 
Create some examples. 
#![no_main]
#![no_std]
extern crate micro;
#[macro_use]
extern crate cortex_m_rt;
extern crate panic_halt;
use micro::common::{ ClockCfg, SrcClock };
use micro::common::{ VolatileStruct, asm, State };
use micro::common::{ PortConfig, OutputType, PUPD };
use micro::peripherals::extended::{ rcc, gpio, Gpio };
#[entry]
unsafe fn main() -> ! {
	let mut rcc = rcc::Rcc::from_addr(rcc::ADDRESS);
    // This part is only used to configure the SYSCLK, it can be skipped
	let cfg = ClockCfg {
        //  (plln, pllm, pllp, pllq)
		pllcfg: Some( ((200, 16, 2, 4), SrcClock::HSI) ),
		sysclk: (SrcClock::PLL, 0),
		hpre: (1, 0, 0),
		ppre: (10, 10, 0),
		i2scfg: (100, 2, 2),
	};
	let clocks = rcc.freeze(cfg);
	let mut gpiod = Gpio::new(gpio::ADDRESS_D);
	rcc.peripheral_state(State::ON, common::RCCPeripheral::GPIOD);
	let green  = gpiod.pin(12).unwrap();
	let orange = gpiod.pin(13).unwrap();
	let red    = gpiod.pin(14).unwrap();
	let blue   = gpiod.pin(15).unwrap();
	green.mode(PortConfig::Output as u32)
		.otype(OutputType::PushPull as u32)
		.pupd(PUPD::PullUp as u32);
	orange.mode(PortConfig::Output as u32)
		.otype(OutputType::PushPull as u32)
		.pupd(PUPD::PullUp as u32);
	red.mode(PortConfig::Output as u32)
		.otype(OutputType::PushPull as u32)
		.pupd(PUPD::PullUp as u32);
	blue.mode(PortConfig::Output as u32)
		.otype(OutputType::PushPull as u32)
		.pupd(PUPD::PullUp as u32);
	loop {
		green.set();
		asm::delay(10_000_000);
		orange.set();
		asm::delay(10_000_000);
		red.set();
		asm::delay(10_000_000);
		blue.set();
		asm::delay(10_000_000);
		green.reset();
		asm::delay(10_000_000);
		orange.reset();
		asm::delay(10_000_000);
		red.reset();
		asm::delay(10_000_000);
		blue.reset();
		asm::delay(10_000_000);
	}
}
Licensed under dual license APACHE-2.0 and MIT