[STM32]使用HAL庫簡單的實現UART中斷回收實驗

參照STM32火哥方式將使用別名方式定義參數,方便移植,只需要修改head file就可以進行移植。
uart.c
UART_HandleTypeDef  UART1_InitStruct;
char aRxBuffer[RXBUFFERSIZE];
void UART1_Init(void)
{
UART1_InitStruct.Instance=DEBUG_USART; //在head file定義Instance
UART1_InitStruct.Init.WordLength=UART_WORDLENGTH_8B ; //設定8位data
UART1_InitStruct.Init.BaudRate=DEBUG_USART_BAUDRATE; //在Head file定義baurd rate
UART1_InitStruct.Init.StopBits=UART_STOPBITS_1; //停止位1位
UART1_InitStruct.Init.Parity=UART_PARITY_NONE; //無奇偶校驗 UART1_InitStruct.Init.Mode=UART_MODE_TX_RX; //使用TX & RX
UART1_InitStruct.Init.HwFlowCtl=UART_HWCONTROL_NONE; //不使用HW flow control
UART1_InitStruct.Init.OverSampling=UART_OVERSAMPLING_16; //過採樣16位
UART1_InitStruct.Init.OneBitSampling=UART_ONE_BIT_SAMPLE_DISABLE ;

HAL_UART_Init(&UART1_InitStruct);
HAL_UART_Receive_IT(&UART1_InitStruct, (u8 *)aRxBuffer, RXBUFFERSIZE);
        /*HAL_UART_Receive_IT -->開啟接收&接收中斷,包含三個入口參數,句柄、接收緩              存、緩存大小*/
}

/*重定義UART回調函數*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(huart->Instance==USART1) //需要習慣使用if判斷instance
{
DEBUG_USART_TX_RX_GPIO_CLK(); //在head file定義GPIO clock enable
DEBUG_USART_CLK(); //在head file定義UART clock enable
}
GPIO_InitStruct.Pin=DEBUG_USART_RX_PIN | DEBUG_USART_TX_PIN; //在head file定義TX & RX Pin
GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull=GPIO_PULLUP;
GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate=GPIO_AF7_USART1;
HAL_GPIO_Init(DEBUG_USART_TX_RX_GPIO_PORT,&GPIO_InitStruct); //在head file定義UART Pin所使用的port
HAL_NVIC_SetPriority(DEBUG_USART_IRQ,3,3); //在head file定義IRQ別名
HAL_NVIC_EnableIRQ(DEBUG_USART_IRQ);
}

void DEBUG_USART_IRQHandler(void)
{
HAL_UART_IRQHandler(&UART1_InitStruct);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&UART1_InitStruct,(u8 *)aRxBuffer,RXBUFFERSIZE,1000);
HAL_UART_Receive_IT(&UART1_InitStruct, (u8 *)aRxBuffer, RXBUFFERSIZE);//在接收中斷處理函數內再次開啟接收&接收中斷,否則接收到訊息之後就不會在觸發接收,因為我在while迴圈內開啟,實際上也可透過main.c 的while迴圈監聽uart的rx是否有接收。
}

這裡需一提的是,RXBUFFERSIZE這個變數所定義的大小,代表字符串的接收大小,如果定義的字符串為100,代表接收端在接收到100個字符串之後才會觸發中斷,在這邊我定義為1,因為我要很即時的看到我在PC端所丟的字串。

uart.h
#ifndef __BSP_UART_H
#define __BSP_UART_H

#include "sys.h"

#define DEBUG_USART                                            USART1
#define DEBUG_USART_CLK()                               __HAL_RCC_USART1_CLK_ENABLE()
#define DEBUG_USART_BAUDRATE                    115200  //串口波特率

#define DEBUG_USART_TX_RX_AF                      GPIO_AF7_USART1
#define DEBUG_USART_TX_RX_GPIO_CLK()     __HAL_RCC_GPIOA_CLK_ENABLE()
#define DEBUG_USART_TX_RX_GPIO_PORT     GPIOA
#define DEBUG_USART_RX_PIN                           GPIO_PIN_10
#define DEBUG_USART_TX_PIN                           GPIO_PIN_9


#define DEBUG_USART_IRQHandler                     USART1_IRQHandler
#define DEBUG_USART_IRQ                                  USART1_IRQn
#define RXBUFFERSIZE      1  //接收緩存大小

void UART1_Init(void);


#endif /*__BSP_UART_H*/


留言