要移植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 ENDP 11 ALIGN 12 ;******************************************************************************* 13 ;UserStack and Heap initialization 14 ;*******************************************************************************
-
- 结合以前的经验发现,我好像并没有设置中断,后来仔细阅读文档,发现它这个中断的调用机制是下面这样的,如果还需要在中断里面做点别的事情的话,则调用回调函数。
-
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库!
- 修改之后问题解决,以上! 纪要!
时间: 2024-11-05 06:31:54