最近关于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(); /* 使能 复用寄存器时钟 */ 没有使能。