我正试图为我的董事会(F746G-Disco)执行USART的驱动程序。就目前而言,我实施:
#include "UART_DRIVER.h"
#include "stm32f746xx.h"
#include "stm32f7xx_hal.h"
#include "stdint.h"
void uart_gpio_pin_init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
// PA9 FOR USART1 TX AND PB7 FOR USART1 RX
GPIOA->MODER |= (2U << 18); // ALTERNATE FUNCTION
GPIOA->OTYPER |= (1U << 9);
GPIOA->OSPEEDR |= (1U << 19);
GPIOA->PUPDR |= (1U << 19);
GPIOA->AFR[1] |= (7U << 4); // AF7
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIOB->MODER |= (2U << 6);
GPIOB->OTYPER |= (1U << 7);
GPIOB->OSPEEDR |= (1U << 17);
GPIOB->PUPDR |= (1U << 17);
GPIOB->AFR[0] |= (7U << 28); // AF7
}
void uart_init(void) {
uart_gpio_pin_init();
// disable USART
USART1->CR1 = 0x00; // Disable Uart => UE=0
USART1->CR1 &= (~(1U << 28) | ~(1 << 12)); // WORD LENGTH 8-BIT
USART1->CR1 &= ~(1U << 15); // 16BIT OVERSAMPLING
USART1->CR1 &= ~(1U << 10); // PARITY BIT DISABLE
USART1->CR1 |= (1U << 3); // USART1 TRASNMITTER MODE
USART1->CR1 |= (1U << 2); // USART1 RECEIVER MODE
// 115200kpbs BAUD-RATE, SYSTEMCLOCK:168 MHz
USART1->BRR = (0x5B2);
// ENABLE USART1
USART1->CR1 = 0x01;
}
void uart_transmit_data(const char *data) {
for (int var = 0; data[var] != '\0'; ++var) {
USART1->TDR = (uint32_t)data[var];
while((USART1->ISR & USART_ISR_TXE) == 0);
}
}但问题是,USART1->CR1的值并没有改变。在手册中,据说要有一个可写位,Uart Enable(UE)引脚必须是0。我已经这样做了,但仍然没有什么改变。参考手册
解决方案编辑:我已经解决了这个问题。问题是我没有为USART启用时钟。一旦__HAL_RCC_USART1_CLK_ENABLE();宏在uart_gpio_pin_init函数中被调用,就在USART的注册调整之前,我们解决了这个问题!
发布于 2022-08-02 20:04:48
问题在于未启用USART时钟的代码。一旦__HAL_RCC_USART1_CLK_ENABLE();宏在uart_gpio_pin_init函数中被调用,就在USART的注册调整之前,我们解决了这个问题!
发布于 2022-07-18 15:17:36
部分
// ENABLE USART1
USART1->CR1 = 0x01;将取消设置在
USART1->CR1 |= (1U << 3); // USART1 TRASNMITTER MODE
USART1->CR1 |= (1U << 2); // USART1 RECEIVER MODE您可能希望使用OR而不是简单的赋值:
// ENABLE USART1
USART1->CR1 |= 0x01;https://stackoverflow.com/questions/73024680
复制相似问题