首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用bluepill开发板上的stm32f1xx_hal实现GPIO输出的外设初始化

用bluepill开发板上的stm32f1xx_hal实现GPIO输出的外设初始化
EN

Stack Overflow用户
提问于 2021-07-27 00:22:40
回答 1查看 63关注 0票数 0

我想初始化蓝色药丸板上的基本输出GPIO引脚。我使用的是铁锈和stm32f1xx_hal板条箱。我想创建一个结构Peripherals,它用以下方式保存输出的句柄:

代码语言:javascript
复制
use cortex_m_rt;

use stm32f1xx_hal::{
  pac, 
  prelude::*,
  gpio,
  afio,
  serial::{Serial, Config},
};

use crate::pac::{USART1};

type GpioOutput = gpio::gpioc::PC13<gpio::Output<gpio::PushPull>>;

pub struct Peripherals{
  led: Option<GpioOutput>
}

impl Peripherals {
  fn init() -> Peripherals {

    let dp = pac::Peripherals::take().unwrap();
    let cp = cortex_m::Peripherals::take().unwrap();

    // set clock frequency to internal 8mhz oscillator
    let mut rcc = dp.RCC.constrain();
    let mut flash = dp.FLASH.constrain();
    let clocks = rcc.cfgr.sysclk(8.mhz()).freeze(&mut flash.acr);

    // access PGIOC registers
    let mut gpioc = dp.GPIOC.split(&mut rcc.apb2);

    return Peripherals{
      led: Peripherals::init_led(&mut gpioc)
    }
  }

  fn init_led(gpioc: &mut gpio::gpioc::Parts) -> Option<GpioOutput> {
    let led = &gpioc.pc13.into_push_pull_output(&mut gpioc.crh);
    return Some(led);
  }
}

此代码不起作用,因为init_led返回Option<&GpioOutput>。现在,我想知道在Peripherals结构中使用生命周期参数并在结构中存储对GpioOutput的引用是否有意义。或者存储未引用的值更明智--我该如何实现这两个选项?

唯一可行的解决方案是将init_led代码移到初始化函数的作用域中:

代码语言:javascript
复制
return Peripherals{
  led: Some(gpioc.pc13.into_push_pull_output(&mut gpioc.crh))
}

但是我想在它自己的函数中分离这些代码。我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2021-07-28 07:30:47

好吧,我想出了一种方法,以防其他人也有同样的问题:

代码语言:javascript
复制
  pub fn init() -> Peripherals {

    let dp = pac::Peripherals::take().unwrap();
    let cp = cortex_m::Peripherals::take().unwrap();

    // set clock frequency to internal 8mhz oscillator
    let rcc = dp.RCC.constrain();

    let mut flash = dp.FLASH.constrain();

    // access PGIOC and PGIOB registers and prepare the alternate function I/O registers
    let mut apb2 = rcc.apb2;
    let gpioc = dp.GPIOC.split(&mut apb2);

    let clocks = rcc.cfgr.sysclk(8.mhz()).freeze(&mut flash.acr);

    return Peripherals{
      led: Peripherals::init_led(gpioc)
    }
  }

  fn init_led(mut gpioc: stm32f1xx_hal::gpio::gpioc::Parts) -> Option<GpioOutput> {
    let led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh);
    return Some(led);
  }

我只是想知道这是不是正确的方法,或者它会增加额外的开销,因为我是通过值而不是在init_led函数中通过引用来传递gpioc的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68533316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档