首页 > 代码库 > 调试STM32-HAL
调试STM32-HAL
要移植UCOS的话,最先要把闪灯和串口给解决好,闪灯已经做好了,现在是串口了。
- 找到HAL库文件中的如何使用这个Driver这一章。
- 在安装目录下面,找到STM32F4xx的模板,里面找到串口的中断传输这个模板代码。
- 读模板代码,将里面的初始化部分看一遍之后,结合第1步的介绍,慢慢将其移植到自己的代码中间来。
- 注意里面有一个MSP初始化的部分,看了半天,理解就是这是一个针对具体板卡的初始化,以后再调用模块初始化(ppp_Init)的时候,它再来调用这个(ppp_MspIit),也蛮有意思的。
- 一开始就出现问题,直接调到下面这个地方第10行(原startup_stm32f407xx.s文件第406行):
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 ENDP11 ALIGN12 ;*******************************************************************************13 ;UserStack and Heap initialization14 ;*******************************************************************************
- 结合以前的经验发现,我好像并没有设置中断,后来仔细阅读文档,发现它这个中断的调用机制是下面这样的,如果还需要在中断里面做点别的事情的话,则调用回调函数。
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 }
- 修改之后再试,尝试了一下发送没有问题,能够每个0.5s发送一段文字。
- 但是接收的时候出问题了。我的代码是这样的
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 }
症状表现如下:
- 会间断性的向上位机发送0xFF,即使我没有调用Transmit这个函数
- 如果直接运行的话,会不停的进这个回调Handler中断,但是只要在USART1_Handler那个中断这里断一下之后,就不会再进了,即使我上位机开始发送。
- 这个问题折腾了我好久,症状也不固定,中断这个东西也不是很好调试,从单步,到慢慢删代码,到不停的查阅文档和例程看有什么遗漏之处,最后被逼的对着参考手册跟踪寄存器。(其实一般的调试思路也都是这样的吧)
- 接近3个小时的奋战后,发现串口的CR2:CLKEN位总是会使能,这表示它进入的是同步串口模式,而我们电脑上用的都是异步串口啊。更诡异的是,反复翻阅文档,都没有找到这一位要用什么函数禁用掉!
- 最后很无语的发现,异步串口是UART,而我由于一直以来的习惯,直接调用的是USART,这个在很多地方都是不分的,比如USART1模块,可以通过设置成同步的或者是异步的。但是这个HAL库里面就分了,异步的必须使用UART库!
- 修改之后问题解决,以上! 纪要!
调试STM32-HAL
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。