关于STM32芯片,PB6 PB7引脚重定义为USART1问题。HAL库版

文章讲述了作者在将PB6和PB7引脚重新定义为USART1通信时遇到的问题,通过在.C文件中添加`__HAL_RCC_SYSCFG_CLK_ENABLE()`来使能复用寄存器时钟解决了串口无法使用的问题。
摘要由CSDN通过智能技术生成

        最近关于PB6 PB7引脚重定义为USART1问题,调试了很久都没有搞好。查找了很长时间都没有找到全面的解决方法。还是在一个有同样问题的人发帖的回答才解决。

        直接代码:

.h文件

主要是些宏定义

/******************************************************************************************/
/* E33 引脚 定义 PA2->USART2_TX  PA3->USART2_RX*/


#define E33_RX_GPIO_PORT                  GPIOB        /* E33 RX 引脚 定义 */
#define E33_RX_GPIO_PIN                   GPIO_PIN_7
#define E33_RX_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)             /* PB口时钟使能 */

#define E33_TX_GPIO_PORT                  GPIOB        /* E33 TX 引脚 定义 */
#define E33_TX_GPIO_PIN                   GPIO_PIN_6
#define E33_TX_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)             /* PB口时钟使能 */

#define E33_UX                        USART1
#define E33_UX_IRQn                   USART1_IRQn
#define E33_UX_IRQHandler             USART1_IRQHandler
#define E33_UX_CLK_ENABLE()           do{ __HAL_RCC_USART1_CLK_ENABLE();}while(0)

#define UART1BUFLEN               40          /* 定义最大接收字节数  */
#define E33_EN_RX                 1           /* 使能(1)/禁止(0) */
 

.C文件

串口1初始化函数

 /**USART1 GPIO Configuration
    PB6     ------> USART1_TX
    PB7     ------> USART1_RX
    */

void e33_init(uint32_t baudrate)
{
    GPIO_InitTypeDef gpio_initure = {0};
    
    /* IO 及 时钟配置 */
    E33_TX_GPIO_CLK_ENABLE();           /* 使能 串口PB6 TX脚 时钟 */
    E33_RX_GPIO_CLK_ENABLE();           /* 使能 串口PB7 RX脚 时钟 */
    E33_UX_CLK_ENABLE();                /* 使能 串口1 时钟 */
    __HAL_RCC_SYSCFG_CLK_ENABLE();      /* 使能 复用寄存器时钟 */
    __HAL_AFIO_REMAP_USART1_ENABLE();   /* 使能 复用寄存器时钟串口1 时钟 */
    
    
    gpio_initure.Pin = E33_TX_GPIO_PIN;
    gpio_initure.Mode = GPIO_MODE_AF_PP;
    gpio_initure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(E33_TX_GPIO_PORT, &gpio_initure);     /* 串口TX 脚 模式设置 */

    gpio_initure.Pin = E33_RX_GPIO_PIN;
    gpio_initure.Mode = GPIO_MODE_INPUT;
    gpio_initure.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(E33_RX_GPIO_PORT, &gpio_initure);     /* 串口RX 脚 必须设置成输入模式 */
    

    /* USART1 初始化设置 */
    g_E33_handler.Instance = E33_UX;                    /* 选择485对应的串口 */
    g_E33_handler.Init.BaudRate = baudrate;             /* 波特率 */
    g_E33_handler.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */
    g_E33_handler.Init.StopBits = UART_STOPBITS_1;      /* 一个停止位 */
    g_E33_handler.Init.Parity = UART_PARITY_NONE;       /* 无奇偶校验位 */
    g_E33_handler.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */
    g_E33_handler.Init.Mode = UART_MODE_TX_RX;          /* 收发模式 */
    HAL_UART_Init(&g_E33_handler);                      /* HAL_UART_Init()会使能UART1 */

#if E33_EN_RX /* 如果使能了接收 */
    /* 使能接收中断 */
    __HAL_UART_ENABLE_IT(&g_E33_handler, UART_IT_RXNE); /* 开启接收中断 */
    HAL_NVIC_EnableIRQ(E33_UX_IRQn);                    /* 使能USART1中断 */
    HAL_NVIC_SetPriority(E33_UX_IRQn, 0, 1);            /* 抢占优先级0,子优先级1 */
#endif

}
 

        一直出现串口不能用的是因为:__HAL_RCC_SYSCFG_CLK_ENABLE();      /* 使能 复用寄存器时钟 */  没有使能。

   

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值