STM32:USART替代功能不工作

STM32:USART替代功能不工作,stm32,Stm32,我正在使用stm32f767zi,我正在尝试通过USART外围设备发送测试数据。我在任何设备上都做了相同的配置,但这次它没有输出任何东西。。。我找不到错误,有人能帮忙吗 时钟设置 // Enables TIM8 (Delay), USART1 (STDOUT) RCC->APB2ENR |= (RCC_APB2ENR_TIM8EN | RCC_APB2ENR_USART1EN); // Enables GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIO

我正在使用stm32f767zi,我正在尝试通过USART外围设备发送测试数据。我在任何设备上都做了相同的配置,但这次它没有输出任何东西。。。我找不到错误,有人能帮忙吗

时钟设置

// Enables TIM8 (Delay), USART1 (STDOUT)
RCC->APB2ENR |= (RCC_APB2ENR_TIM8EN
    | RCC_APB2ENR_USART1EN);

// Enables GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, DMA1
RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN
    | RCC_AHB1ENR_GPIOBEN
    | RCC_AHB1ENR_GPIOCEN
    | RCC_AHB1ENR_GPIODEN
    | RCC_AHB1ENR_GPIOEEN
    | RCC_AHB1ENR_GPIOFEN
    | RCC_AHB1ENR_DMA1EN);
初始化代码

// Makes A8 (TX) and A9 (RX) Alternative Function
GPIOA->MODER &= ~(GPIO_MODER_MODER8_Msk 
    | GPIO_MODER_MODER9_Msk);
GPIOA->MODER |= ((0x2 << GPIO_MODER_MODER8_Pos)
    | (0x2 << GPIO_MODER_MODER9_Pos));

// Selects AF7 for both A8 (TX) and A9 (RX).
GPIOA->AFR[1] &= ~(GPIO_AFRH_AFRH0_Msk
    | GPIO_AFRH_AFRH1_Msk);
GPIOA->AFR[1] |= ((7 << GPIO_AFRH_AFRH0_Pos)
    | (7 << GPIO_AFRH_AFRH1_Pos));

// Selects very high speed for A8 (TX) and A9 (RX)
GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR8_Msk
    | GPIO_OSPEEDR_OSPEEDR9_Msk);
GPIOA->OSPEEDR |= ((0x3 << GPIO_OSPEEDR_OSPEEDR8_Pos)
    | (0x3 << GPIO_OSPEEDR_OSPEEDR9_Pos)); 

// Calculates and sets the baud rate.
m_USART->BRR = (((2 * clk) + baud) / (2 * baud));

// Configures the USART peripheral further.
m_USART->CR1 = USART_CR1_TE     // Transmit Enable
    | USART_CR1_RE              // Receive Enable
    | USART_CR1_UE;             // USART Enable (EN)
//使A8(TX)和A9(RX)具有替代功能
GPIOA->MODER&=~(GPIO\u MODER\u MODER8\u Msk
|GPIO_MODER_MODER9_Msk);
GPIOA->MODER |=((0x2 AFR[1]|=((7 OSPEEDR |=((0x3 CR1=USART|U CR1|=传输启用
|USART\U CR1\U RE//接收启用
|USART_CR1_UE;//启用USART(英语)
以及写入功能:

*reinterpret_cast<uint8_t *>(m_USART->TDR) = c;
while (!(m_USART->ISR & USART_ISR_TC));
*重新解释(m_-USART->TDR)=c;
而(!(m_USART->ISR&USART_ISR_TC));

您的
重新解释演员表是不必要的,也是不正确的

我假设您实际上编写了
*reinterpret\u cast(&m\u USART->TDR)=c;
,但这仍然是错误的

编写标准设备头的人非常小心地确保USARTx->TDR已经有了正确的类型,我强烈建议您信任他们,不要强制转换它!在这种特殊情况下,他们会使它变得不稳定,而您没有,因此编译器可能认为它可以通过不费事的方式进行优化写一些你从未读过的东西

在其他STM32部件上,您可能没有遇到这种情况的原因是,它们的UART对于传输和接收都只有DR,因此读取DR进行接收使编译器认为它无法消除写入

此外,我不知道这一部分,但许多STM32在写入RCC->xxxENR和使用各自的外围设备之间需要额外的周期,这通常是通过读取相同的寄存器来完成的,例如:

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
(void)RCC->AHB1ENR;
// now safe to access GPIOA registers

你的问题是你设置了错误的引脚。应该是PA9和PA10

你写的也错了

应该是:

*reinterpret_cast<volatile uint8_t *>(&m_USART->TDR) = c;
您还检查了错误的标志

如果要在转换后禁用外围设备,TC非常重要。在正常情况下,请使用
TXE
标志

while (!(m_USART->ISR & USART_ISR_TXE));

您的cast建议通常是错误的,因为许多外围设备(具有FIFO的外围设备)关心写入的类型。因此,您需要强制编译器发出正确的存储指令。答案的其余部分与您没有阅读micro的文档一样糟糕。嘿,谢谢!我更改了它,但现在它保持在无限循环中,TXE永远不会被清除……看门狗重新启动芯片y、 是什么导致它无法传输?我以前从未有过这种情况。然后启动调试器并开始调试
while (!(m_USART->ISR & USART_ISR_TXE));