调试STM32-HAL

要移植UCOS的话,最先要把闪灯和串口给解决好,闪灯已经做好了,现在是串口了。
  1. 找到HAL库文件中的如何使用这个Driver这一章。
  2. 在安装目录下面,找到STM32F4xx的模板,里面找到串口的中断传输这个模板代码。
  3. 读模板代码,将里面的初始化部分看一遍之后,结合第1步的介绍,慢慢将其移植到自己的代码中间来。
  4. 注意里面有一个MSP初始化的部分,看了半天,理解就是这是一个针对具体板卡的初始化,以后再调用模块初始化(ppp_Init)的时候,它再来调用这个(ppp_MspIit),也蛮有意思的。
  5. 一开始就出现问题,直接调到下面这个地方第10行(原startup_stm32f407xx.s文件第406行):
    1.  1 I2C3_ER_IRQHandler
       2 OTG_HS_EP1_OUT_IRQHandler
       3 OTG_HS_EP1_IN_IRQHandler
       4 OTG_HS_WKUP_IRQHandler
       5 OTG_HS_IRQHandler
       6 DCMI_IRQHandler
       7 HASH_RNG_IRQHandler
       8 FPU_IRQHandler
       9 B .
      10 ENDP
      11 ALIGN
      12 ;*******************************************************************************
      13 ;UserStack and Heap initialization
      14 ;*******************************************************************************

       

     
  6. 结合以前的经验发现,我好像并没有设置中断,后来仔细阅读文档,发现它这个中断的调用机制是下面这样的,如果还需要在中断里面做点别的事情的话,则调用回调函数。
    1.  1 /**
       2 * @brief This function handles UART interrupt request.
       3 * @param None
       4 * @retval None
       5 * @Note This function is redefined in "main.h" and related to DMA stream
       6 * used for USART data transmission
       7 */
       8 void USART1_IRQHandler(void)
       9 {
      10 HAL_UART_IRQHandler(&huart);
      11 }

       

  7. 修改之后再试,尝试了一下发送没有问题,能够每个0.5s发送一段文字。
  8. 但是接收的时候出问题了。我的代码是这样的
    1.  1 /**
       2 * @brief Rx Transfer completed callback
       3 * @param UartHandle: UART handle
       4 * @note This example shows a simple way to report end of IT Rx transfer, and
       5 * you can add your own implementation.
       6 * @retval None
       7 */
       8 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *hsart)
       9 {
      10 uint8_t c ='a';
      11 /* Set transmission flag: trasfer complete*/
      12 UartReady= SET;
      13 // HAL_USART_Transmit_IT(husart, &c, 1);
      14 /* Turn LED4 on: Transfer in reception process is correct */
      15 HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
      16 }

      症状表现如下:

    1. 会间断性的向上位机发送0xFF,即使我没有调用Transmit这个函数
    2. 如果直接运行的话,会不停的进这个回调Handler中断,但是只要在USART1_Handler那个中断这里断一下之后,就不会再进了,即使我上位机开始发送。
  9. 这个问题折腾了我好久,症状也不固定,中断这个东西也不是很好调试,从单步,到慢慢删代码,到不停的查阅文档和例程看有什么遗漏之处,最后被逼的对着参考手册跟踪寄存器。(其实一般的调试思路也都是这样的吧)
  10. 接近3个小时的奋战后,发现串口的CR2:CLKEN位总是会使能,这表示它进入的是同步串口模式,而我们电脑上用的都是异步串口啊。更诡异的是,反复翻阅文档,都没有找到这一位要用什么函数禁用掉!
  11. 最后很无语的发现,异步串口是UART,而我由于一直以来的习惯,直接调用的是USART,这个在很多地方都是不分的,比如USART1模块,可以通过设置成同步的或者是异步的。但是这个HAL库里面就分了,异步的必须使用UART库!
  12. 修改之后问题解决,以上! 纪要!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2014-11-19 16:05  sprone  阅读(3751)  评论(1编辑  收藏  举报