首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >USART与寄存器配置不起作用

USART与寄存器配置不起作用
EN

Stack Overflow用户
提问于 2022-07-18 15:16:08
回答 2查看 42关注 0票数 0

我正试图为我的董事会(F746G-Disco)执行USART的驱动程序。就目前而言,我实施:

代码语言:javascript
复制
#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。我已经这样做了,但仍然没有什么改变。参考手册

数据表(参见第76页,以获得其他函数映射)

解决方案编辑:我已经解决了这个问题。问题是我没有为USART启用时钟。一旦__HAL_RCC_USART1_CLK_ENABLE();宏在uart_gpio_pin_init函数中被调用,就在USART的注册调整之前,我们解决了这个问题!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-02 20:04:48

问题在于未启用USART时钟的代码。一旦__HAL_RCC_USART1_CLK_ENABLE();宏在uart_gpio_pin_init函数中被调用,就在USART的注册调整之前,我们解决了这个问题!

票数 0
EN

Stack Overflow用户

发布于 2022-07-18 15:17:36

部分

代码语言:javascript
复制
    // ENABLE USART1
    USART1->CR1 = 0x01;

将取消设置在

代码语言:javascript
复制
    USART1->CR1 |= (1U << 3); // USART1 TRASNMITTER MODE
    USART1->CR1 |= (1U << 2); // USART1 RECEIVER MODE

您可能希望使用OR而不是简单的赋值:

代码语言:javascript
复制
    // ENABLE USART1
    USART1->CR1 |= 0x01;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73024680

复制
相关文章

相似问题

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