1.在 CubeMX 生成的文件中添加用户代码的时候,必须是写在/ USER CODE BEGIN n/和/* USER CODE
    END n*/之间。这样如果需要改变 Cube 工程的配置,在重新生成代码时,在这两句注释之间的语
    句不会被覆盖。而用户新建或添加的文件不会受到影响。

    使用回调函数,直接在用户文件中重定义即可
    如何在工程中找功能/回调函数:进入外设的源文件,点击右键进入头文件,找到功能/回调函数
    **

    2.cube中配置要点(各外设)
    (1)按键输入的引脚一般设置上拉,需要设置GPIO PUll-up/down
    (2)外部中断:在 Pinout 界面下配置 输入引脚为 EXTI 功能,NVIC中配置中断优先级
    (注意:涉及中断,必须有使能中断这一步配置)
    (3)定时器:选择内部时钟源,arr、psc等参数配置好 图片.png**上图的这一组回调函数接口,是所有定时器共用的。所以,如果在实际应用中开启了多个定时器中断,则需要在重写的callback函数中先判断是哪一个定时器的中断。
    eg:if(TIMx == htim->Instance)
    **其他外设同理,比如在 CubeMX 生成的程序框架中,GPIO 外部中断共用一个回调凼数接口。要想知道是哪个中断源,就判断其输入参数 GPIO_Pin)


    3.举例:
    (1)操作GPIO的 HAL 库函数,HAL_GPIO_WritePin()
    (2)串口发送函数:HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size,uint32_t Timeout)
    注意:该函数是有返回值的,返回值反映的是整个发送过程是否有错误,比如如果发送某个字符的时间超过了所给的timeout,则函数会返回 HAL_TIMEOUT。
    (3)HAL_SYSTICK_Callback()函数是 STM32CubeMX 生成的代码框架中的一个回调函数,该函数由
    系统 Tick 定时器中断调用,周期是 1ms
    (4) 利用key_scan()函数扫描+滴答定时器,巧妙实现了按键的消抖,且占用时间很少
    图片.png
    (5)HAL_TIM_Bsae_Start_IT(&htimx) 使能定时器的函数,类似的都可在对应头文件中找到。