PP:两个MOS管,主动输出高电平和低电平
GPIO_Mode_Out_OD(开漏输出)下拉MOS管,NMOS关闭 → 悬空
一、GPIO初始化
static void uart1_gpio_init(void){ __HAL_RCC_USART1_CLK_ENABLE();//开串口时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); //开GPIO时钟
GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = UART1_TX_PIN | UART1_RX_PIN; //AF_PP模式 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //AF到串口1 GPIO_InitStruct.Alternate = UART1_GPIO_AF;
HAL_GPIO_Init(UART1_GPIO_PORT, &GPIO_InitStruct);
// NVIC开启串口中断(轮询不用) HAL_NVIC_SetPriority(USART1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART1_IRQn);}二、串口初始化
static void uart1_open(uint32_t baud){ uart1_gpio_init();//配置GPIO huart1.Instance = USART1; huart1.Init.BaudRate = baud;//设置波特率 //8位宽 huart1.Init.WordLength = UART_WORDLENGTH_8B; //停止位 huart1.Init.StopBits = UART_STOPBITS_1; //无校验 huart1.Init.Parity = UART_PARITY_NONE; //收发 huart1.Init.Mode = UART_MODE_TX_RX; //无流控 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&huart1);}三、3种模式的选择
//1.轮询模式,数据在OUT,用一次调一次这个函数uint8_t out;HAL_UART_Receive(&huart1, out, 1, time_ms);
//2.中断模式(这里面不处理数据)HAL_UART_Receive_IT(&huart1, &rx1, 1);//中断入口函数//这是硬件的中断入口void USART1_IRQHandler(void){ //这是HAL库的 HAL_UART_IRQHandler(&huart1);//接收回调函数,之后调用下面的函数}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { // 收到的字节在 rx1 里 //一个自己写的函数,用于在其他文件里面传rx1 BSP_UART_RxByteCallback(1, rx1);
// 关键:重新开启下一次1字节接收,否则只收一次 HAL_UART_Receive_IT(&huart1, &rx1, 1); }}
//3.DMA模式/*rx_dma_buf → DMA接收缓冲区RX_DMA_LEN → 接收长度*/HAL_UART_Receive_DMA(&huart1, rx_dma_buf, RX_DMA_LEN);//中断函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { // DMA接收完成 }} Thanks for reading!
STM32 专栏
第 2 篇 / 共 5 篇