按键的检测
在本节中将介绍如何使用普通的 GPIO 按键,检测引脚的电平。
原理图
由原理图可知:我们的评估版只有两个按键,其中 RST 按键为系统复位按键,BOOT 按键有两个功能,在复位时候按下 BOOT 按键时,单片机将进入串口下载程序模式。当复位时候 BOOT 未按下,则单片机进入用户程序运行的模式,程序运行时,BOOT 按键可作为普通输入检测。
- BOOT 按键的引脚为 PF4
- BOOT 按键释放时候,电平为低电平,按下后电平为高电平
- 建议使用时 PF4 关闭上下拉即可
测试代码:examples/key.rs
#![no_std] #![no_main] use {defmt_rtt as _, panic_probe as _}; use embedded_hal::digital::v2::InputPin; use hal::delay; use hal::gpio::{Input, PinPullUpDown, PinSpeed}; use py32f030_hal as hal; #[cortex_m_rt::entry] fn main() -> ! { defmt::println!("examples: key"); let p = hal::init(Default::default()); let gpioa = p.GPIOF.split(); let key = Input::new(gpioa.PF4_BOOT0, PinPullUpDown::No, PinSpeed::Low); loop { defmt::info!("key: {}", key.is_low()); delay::delay_ms(1000); } }
例程代码非常简单,在循环中每隔 100 毫秒读取一次 引脚电平并打印到终端。
编译并烧录
cargo r --example key
测试
➜ py32f030-hal git:(main) ✗ cargo r --example key
warning: unused manifest key: dependencies.embedded-io-async.option
Compiling py32f030_hal v0.1.0 (/Users/hunter/mywork/py32/py32f030-hal)
Finished `dev` profile [optimized + debuginfo] target(s) in 6.42s
Running `probe-rs run --chip PY32F030x8 target/thumbv6m-none-eabi/debug/examples/key`
Erasing ✔ [00:00:00] [#################################################] 8.00 KiB/8.00 KiB @ 64.50 KiB/s (eta 0s )
Programming ✔ [00:00:02] [##################################################] 7.50 KiB/7.50 KiB @ 3.44 KiB/s (eta 0s ) Finished in 2.349s
<lvl> examples: key
└─ key::__cortex_m_rt_main @ examples/key.rs:22
INFO key: Ok(true)
└─ key::__cortex_m_rt_main @ examples/key.rs:22
INFO key: Ok(true)
└─ key::__cortex_m_rt_main @ examples/key.rs:22
INFO key: Ok(true)
└─ key::__cortex_m_rt_main @ examples/key.rs:22
INFO key: Ok(false)
└─ key::__cortex_m_rt_main @ examples/key.rs:22
INFO key: Ok(false)
└─ key::__cortex_m_rt_main @ examples/key.rs:22
INFO key: Ok(false)
└─ key::__cortex_m_rt_main @ examples/key.rs:22
INFO key: Ok(true)
└─ key::__cortex_m_rt_main @ examples/key.rs:22
你可能好奇的地方
- 为什么设置上拉为:
PinPullUpDown::No
? 因为 PF4 引脚内部默认为下拉,确保正常情况单片机能运行主flash程序,如果设置为上拉,可能导致捕获的电平不能识别。取决于开发版的下拉电阻大小。去勇敢尝试PullUp/PullDown
测试一下吧 - 如果提高检测效率?去开一个 embassy 任务吧,把检测放在单独的任务中,或者使用异步检测方式。