Start converting c code to rust
This commit is contained in:
parent
1be26cd758
commit
510e834de0
2 changed files with 128 additions and 1 deletions
|
@ -1,8 +1,12 @@
|
|||
#![no_std]
|
||||
#![no_main]
|
||||
#![feature(abi_avr_interrupt)]
|
||||
|
||||
mod setup;
|
||||
|
||||
use arduino_hal::{delay_ms, pins, Peripherals};
|
||||
use core::panic::PanicInfo;
|
||||
use setup::Setup;
|
||||
|
||||
#[panic_handler]
|
||||
fn panic(_info: &PanicInfo) -> ! {
|
||||
|
@ -27,5 +31,15 @@ fn panic(_info: &PanicInfo) -> ! {
|
|||
|
||||
#[arduino_hal::entry]
|
||||
fn main() -> ! {
|
||||
loop {}
|
||||
let setup = Setup::default();
|
||||
|
||||
loop {
|
||||
fuzz(&setup);
|
||||
}
|
||||
}
|
||||
|
||||
fn fuzz(setup: &Setup<'_>) {}
|
||||
|
||||
#[avr_device::interrupt(atmega328p)]
|
||||
#[allow(non_snake_case)]
|
||||
fn TIMER1_COMPA() {}
|
||||
|
|
113
rust/src/setup.rs
Normal file
113
rust/src/setup.rs
Normal file
|
@ -0,0 +1,113 @@
|
|||
use core::mem;
|
||||
|
||||
use arduino_hal::{
|
||||
hal::{
|
||||
adc,
|
||||
port::{PB4, PB5, PC4, PC5, PD2},
|
||||
},
|
||||
pac::{
|
||||
adc::adc::ADC_SPEC,
|
||||
tc1::{ocr1a::OCR1A_SPEC, ocr1b::OCR1B_SPEC},
|
||||
},
|
||||
pins,
|
||||
port::{
|
||||
mode::{Input, Output, PullUp},
|
||||
Pin,
|
||||
},
|
||||
Peripherals,
|
||||
};
|
||||
use avr_device::generic::Reg;
|
||||
|
||||
pub struct Setup<'a> {
|
||||
pub led: Pin<Output, PB5>,
|
||||
pub footswitch: Pin<Input<PullUp>, PB4>,
|
||||
pub toggle: Pin<Input<PullUp>, PD2>,
|
||||
pub push_button_1: Pin<Input<PullUp>, PC5>,
|
||||
pub push_button_2: Pin<Input<PullUp>, PC4>,
|
||||
|
||||
ocr1a: &'a Reg<OCR1A_SPEC>,
|
||||
ocr1b: &'a Reg<OCR1B_SPEC>,
|
||||
|
||||
adc: &'a Reg<ADC_SPEC>,
|
||||
}
|
||||
|
||||
impl<'a> Setup<'a> {
|
||||
//defining the output PWM parameters
|
||||
// pwm frequency - 31.3KHz
|
||||
const PWM_FREQ: u16 = 0x00FF;
|
||||
// Fast (1) or Phase Correct (0)
|
||||
const PWM_MODE: u8 = 0;
|
||||
// 2 PWMs in parallel
|
||||
const PWM_QTY: u8 = 2;
|
||||
|
||||
pub fn write_output(&self, output: u16) {
|
||||
let high_byte = ((output + 0x8000) >> 8) & 0x00FF;
|
||||
let low_byte = output & 0x00FF;
|
||||
|
||||
self.ocr1a.write(|w| unsafe { w.bits(high_byte) });
|
||||
self.ocr1b.write(|w| unsafe { w.bits(low_byte) });
|
||||
}
|
||||
|
||||
pub fn get_input(&self) -> u16 {
|
||||
self.adc.read().bits()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Default for Setup<'a> {
|
||||
fn default() -> Self {
|
||||
let dp = Peripherals::take().unwrap();
|
||||
|
||||
// turn on outputs
|
||||
dp.PORTB.ddrb.write(|w| unsafe { w.bits(0x02) });
|
||||
|
||||
let pins = pins!(dp);
|
||||
|
||||
// defining harware resources
|
||||
let led = pins.d13.into_output();
|
||||
let footswitch = pins.d12.into_pull_up_input();
|
||||
let toggle = pins.d2.into_pull_up_input();
|
||||
let push_button_1 = pins.a5.into_pull_up_input();
|
||||
let push_button_2 = pins.a4.into_pull_up_input();
|
||||
|
||||
// setup ADC
|
||||
// left adjust, adc0, internal vcc
|
||||
dp.ADC.admux.write(|w| unsafe { w.bits(0x60) });
|
||||
// turn on adc, ck/32, auto trigger
|
||||
dp.ADC.adcsra.write(|w| unsafe { w.bits(0xe5) });
|
||||
// t1 capture for trigger
|
||||
dp.ADC.adcsrb.write(|w| unsafe { w.bits(0x07) });
|
||||
// turn off digital inputs for adc0
|
||||
dp.ADC.didr0.write(|w| unsafe { w.bits(0x01) });
|
||||
|
||||
// setup PWM
|
||||
dp.TC1.tccr1a.write(|w| unsafe {
|
||||
w.bits(((Self::PWM_QTY - 1) << 5) | 0x80 | (Self::PWM_MODE << 1))
|
||||
});
|
||||
// ck/1
|
||||
dp.TC1
|
||||
.tccr1b
|
||||
.write(|w| unsafe { w.bits((Self::PWM_MODE << 3) | 0x11) });
|
||||
// interrupt on capture interrupt
|
||||
dp.TC1.timsk1.write(|w| unsafe { w.bits(0x20) });
|
||||
dp.TC1.icr1.write(|w| unsafe { w.bits(Self::PWM_FREQ) });
|
||||
|
||||
let ocr1a = &dp.TC1.ocr1a;
|
||||
let ocr1b = &dp.TC1.ocr1b;
|
||||
let adc = &dp.ADC.adc;
|
||||
|
||||
unsafe { avr_device::interrupt::enable() };
|
||||
|
||||
Self {
|
||||
led,
|
||||
footswitch,
|
||||
toggle,
|
||||
push_button_1,
|
||||
push_button_2,
|
||||
|
||||
ocr1a: unsafe { mem::transmute(ocr1a as *const _) },
|
||||
ocr1b: unsafe { mem::transmute(ocr1b as *const _) },
|
||||
|
||||
adc: unsafe { mem::transmute(adc as *const _) },
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue