CUBE配置
1.引脚设置:
2:开启串口2的异步模式
3.添加DMA通道
4.时钟选择
5.生成程序。
用户代码
OLED部分代码可参考之前的帖子。
(此处省略OLED部分,重点体现回调函数。)
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);
uint8_t ASCII_To_Hex(uint8_t number);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t Rev_Flag = 0;
uint8_t Rev_count = 0;
uint8_t RXBuffer[100];
uint8_t rxbuffer[100];
uint8_t TxBuffer[50] = {'R', 'e', 'c', 'i', 'v', 'e', 'O', 'K'};
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_UART_Receive_DMA(&huart2,RXBuffer,50);//启动串口DMA接收
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (RXBuffer[49] == 0xEE)
{
RXBuffer[49] = 0;
Rev_count++;
HAL_UART_Transmit(&huart2, TxBuffer, 8, 50);
}
if (Rev_Flag == 1)//回调函数执行后,进入该条件
{
Rev_Flag = 0;
//发送字符串ReciveOK
HAL_UART_Receive_DMA(&huart2, RXBuffer, 50);
}
}
/* USER CODE END 3 */
/* USER CODE BEGIN 4 */
/**
* @brief 串口DMA接收完成的回调函数,打开Rev_Flag标志,并且反转PA1.
* @param None
* @retval None
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
Rev_Flag = 1;//将接收标志置1,表示接收回调执行。
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);//翻转点评
}
/* USER CODE END 4 */
}
回调函数的解释
在stm32l0xx_hal_uart.c
文件中找到了此虚函数的定义
/**
* @brief Rx Transfer completed callback.
* @param huart UART handle.
* @retval None
*/
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback can be implemented in the user file.
*/
}
参考这篇帖子。
https://blog.youkuaiyun.com/super828/article/details/79120066
因此在使用时只需要去实现这个函数即可,详情见用户代码中USER CODE 4
。