Start converting c code to rust

This commit is contained in:
hodasemi 2022-07-19 23:05:19 +02:00
parent 1be26cd758
commit 510e834de0
2 changed files with 128 additions and 1 deletions

View file

@ -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
View 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 _) },
}
}
}