1.串口的实现
    (1)初始化
    用Cube配置UART1使能并生成代码后可以看到有三个关键函数:
    1、void MX_USART1_UART_Init(void)
    这个函数是Cube配置完成后自动帮我们生成的,存在于用户文件usart.c中(如果Cube中有配置选项生成用户.c文件,否则在main函数中),并且在最后有一个语句:if (HAL_UART_Init(&huart1) != HAL_OK),通过这个来调用HAL_UART_Init函数。
    2、HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
    这个函数在HAL库文件stm32f0xx_hal_uart.c中,在上一个函数 MX_USART1_UART_Init(void)中有被调用,这个函数将初始化UART1,使能UART1,而重点是里面有调用一个函数HAL_UART_MspInit(huart)。
    3、__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)
    这个函数也在HAL库文件stm32f0xx_hal_uart.c中,它是weak修饰的,也就是可以重写。我们发现在Cube生成的用户文件usart.c文件中有对这个函数进行重写,主要实现对UART1的TX、RX引脚的IO口配置,以及开启串口中断等设置。
    HAL库的串口外设初始化操作步骤:
    ①对串口的结构体参数进行配置 ②对HAL_UART_MspInit函数进行重写

    (2)中断接收:(主要涉及以下函数)
    1、HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size)
    函数有是三个参数,分别是串口结构体,要传输的数据指针以及待传输数据的大小,这其实是对中断接收的一个配置函数,指定当接收到Size大小的字节后就产生一次中断进入中断处理。

    2、USART1_IRQHandler(void)、HAL_UART_IRQHandler(&huart1)
    第一个是在it.c中的通用的硬件中断入口函数,其中在里面调用了HAL_UART_IRQHandler(&huart1),也就进入了UART1的中断处理,HAL_UART_IRQHandler函数在stm32f0xx_hal_uart.c文件中,主要进行中断标志的判定**,当判定接收到数据时,调用UART_Receive_IT(huart)函数。

    3、HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
    这个函数也在stm32f0xx_hal_uart.c中,这才是真正的处理数据的函数,读取接收寄存器,将数据赋值给结构体huart的pRxBuffer并清除中断标志,而在里面还调用了一个函数HAL_UART_RxCpltCallback(huart);

    (2.3的函数cube自动给我们配好,不需要我们去编写)

    4、__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    这个是用户真正可以进行重写实现自己所需功能的函数,在msp.c中将其重写。如果要实现连续采用中断接收数据,也要这个函数中调用HAL_UART_Receive_IT()。因为这个回调函数是每次中断发生都会调用,也就相当于每次发生中断处理完数据后又将中断打开,从而实现连续中断接收数据。

    用户主要在callback函数里实现想要的功能

    1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    2. {
    3. …………………………………………
    4. HAL_UART_Receive_IT(huart,&RxData,1);
    5. }