stm32f3 discovery usart is not sending



这是我用Rust编写的简单的寄存器级程序。在阅读了许多用C写的博客之后,我试图配置寄存器,就像他们在C中为发现板所做的那样,但不幸的是它没有像预期的那样工作。

我正在尝试通过wart1发送单个字符。在硬件方面,我按照发现书中的描述连接我的ftdi模块。

<>以前ftdi——stm32Rx - TxTX - rxgnd-----gnd发送时,ftdi rx指示灯闪烁,表示有数据发送。Mini-com应该显示这些数据,但是它在ftdi或Mini-com上什么也没有得到。

#![no_std]
#![no_main]
extern crate cortex_m_semihosting;
use cortex_m::asm;
use cortex_m_rt::entry;
use panic_halt as _;
//use stm32f3xx_hal::{pac, prelude::*}; without using hall
use stm32f3::stm32f303;
use cortex_m_semihosting::hprintln;
#[entry]
fn main() -> ! {
let mut peripherals = &stm32f303::Peripherals::take().unwrap();
let mut rcc = &peripherals.RCC;
let gpioa = &peripherals.GPIOA;
let usart1 = &peripherals.USART1;
//selecting and enabling clock for usart1
rcc.cfgr3.write(|w| w.usart1sw().bits(01)); //slecting clock source as pc_)clock (deefault)
rcc.apb2enr.write(|w| w.usart1en().set_bit());
//enabling port and pins assign for usart1
rcc.ahbenr.write(|w| w.iopaen().set_bit());

gpioa.moder.write(|w| w.moder9().bits(10));     // 00 => input, 01 => output, 10 => Alternate function
gpioa.otyper.write(|w| w.ot9().clear_bit());          //pa10 = rx,  pa9 = tx
gpioa.ospeedr.write(|w| unsafe {w.ospeedr9().bits(01)});

gpioa.moder.write(|w| w.moder10().bits(10));
gpioa.otyper.write(|w| w.ot10().clear_bit());
gpioa.ospeedr.write(|w| unsafe {w.ospeedr10().bits(01)});

gpioa.afrh.write(|w| w.afrh9().af7());    //selecting corrosponding alternate function register
gpioa.afrh.write(|w| w.afrh10().af7());
gpioa.pupdr.write(|w| unsafe {w.pupdr9().bits(00)});
gpioa.pupdr.write(|w| unsafe {w.pupdr10().bits(00)});
// defining the word length
usart1.cr1.write(|w| w.m().bit8());
// seting baud rate for usart1
usart1.cr1.write(|w| w.over8().set_bit());
usart1.brr.write(|w| w.brr().bits(0x47));
// setting numbers of stop bits
usart1.cr2.write(|w| w.stop().bits(00));
// enableing usart1 and transmission
usart1.cr1.write(|w|
w
.ue().set_bit()
.te().set_bit());
// wait till transmit data register empty
while !usart1.isr.read().txe().bit_is_set() {}
// send data
usart1.tdr.write(|w| w.tdr().bits(u16::from(b'X')));


loop {
while usart1.isr.read().tc().bit_is_clear() {}
let txe_status = usart1.isr.read().txe().bits(); 
let value = usart1.tdr.read().tdr().bits() as u8;
hprintln!("tdr value = {} and txe status = {}", value, txe_status);
}
}

我怀疑问题是您在可能想要使用modify()的情况下使用write()方法。根据svd2rust文档(这是为这些寄存器生成接口的东西),write()将写入使用单个存储进行注册。任何您没有显式指定的位将被设置为其默认值。因此,如果两次对同一个寄存器进行write()操作,则第二次写入将覆盖第一次写入所做的操作。

相反,modify()将首先读取寄存器,修改您指定的位,然后将修改后的值写回来。对于大多数寄存器,这可能是您想要做的。

最新更新