调试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. 修改之后问题解决,以上! 纪要!
时间: 2024-11-05 06:31:54

调试STM32-HAL的相关文章

调试STM32程序一些浅显又不易发现的问题

1 串口映射Printf后是否勾选上USE MicroLIB ? 今天没有勾选这个选项结果无法进入main函数 2 定义计数用的变量cntx时是否大于255但是仍然用的u8 ? u8最大值是255 这个错误非常低级但是总是让人费很大的劲才找到. 3 像下面这种语句 ,这条if后面多了个分号.非常容易被忽略 if(flag); { ...... } 调试STM32程序一些浅显又不易发现的问题

使用ST-LINK V2和openocd调试STM32时出现电压过低的问题及解决

转载请贴上原帖地址. 最近项目需要用到STM32,使用GCC+openocd的编译环境调试STM32.出现了个很奇怪的现象,单独使用ST-LINK给STM32供电,会出现触发电压过低的错误,且无法连接上STM32. 其实问题很简单,ST-LINK带有检测目标板电压的功能,如果检测到目标板电压过低,则会报错. 20pin  Jtag的1.2脚为TVCC,这两个引脚就是负责检测目标板的电压. 在openocd中报错信息说target voltage只有0.5V,但测试1.2脚却有1.6V.于是用示波

Linux下arm-none-eabi-gdb调试STM32

一.环境描述 硬件开发板:野火STM32开发板 下载器与调试接口:Jlink + JTAG 操作系统:虚拟机VMware6.5 + Ubuntu12.0.4 调试工具:arm-none-eabi-gdb 调试服务器:JLink GDB Server 调试工程目标文件:LED_Test.elf 二.步骤 1.安装Jlink驱动 参考Linux下STM32开发环境的搭建 2.安装交叉编译链arm-none-eabi-gcc 参考Linux下STM32开发环境的搭建 3.编译工程以生成elf文件 参考

使用Eclipse+jlink调试STM32

使用Eclipse+JLINK调试STM32 一.            准备工作 安装eclipse + CDT. 安装交叉编译工具(工具链ARM CROSS GCC,之后安装器件库,自动下载安装较慢,可获取下载地址后使用下载工具(迅雷速度还不错)下载,放在eclipse的下载路径下手动安装)和make 工具(gcc-arm-none-eabi-6-2017-q2-update-win32.exe) STM32F4官方固件库(我直接使用的开发板资料里提供的STM32F4xx_DSP_StdPe

STM32 HAL库和LL库的区别

上次开发一个项目,使用一个小容量的STM32 ARM CORTEX核心的单片机,使用STM32CUBEMX自动生成配置代码,正准备编写程序的时候,发现容量竟然有6K多.这个容量在使用大容量FLASH的单片机时不感到什么,可是使用小容量单片机的时候,就明显不够用了. 没有办法,只好打算回去使用原来的StdLib库,前两年不就这么干的嘛,也没什么难的.可是回头找对应库的时候,发现悲剧了,没有这个序列的标准库. 这也难不倒我们老司机!我就从HAL库里面把必须的寄存器语句摘出来,把冗余的有效检验和冲突处

eclipse+gcc环境 + Jlink 调试stm32

前言: 在嵌入式领域,最热门的是keil和iar.这两款老牌工具在编译.调试方面的是很靠谱的,然而其编辑和阅读功能却过于简单.没有选中高亮,不能全局搜索函数变量(这里是指基于符号索引,而不是基于文本的简单find next),不能查看函数调用关系,等等等等. 正是因为keil和iar编辑阅读功能不足,有些工程师会这么干:用source insight写代码,用keil编译.我以前也这么做过,而当我发现eclipse可以用于嵌入式开发后,就立马弃暗投明了.个人认为eclipse的编辑阅读功能比so

STM32 HAL固件库编程的文件构架

对于我这种以前只接触过51和AVR单片机编程的小菜来说,现在开始学习STM32的编程,对于函数的功能以及C语言的语法都还好理解,难的是它提供的那一套硬件抽象层(HAL)驱动是怎么和其他的东东搭配在一起组成一个又一个的工程. 首先上两张从ST官方提供的HAL固件库文档截图 从这两张图的话,能对它的构架看出个一二,下面稍稍具体一点分析 HAL固件库编程,它的文件组织大致分三个部分 - HAL驱动 - CMSIS驱动 - 用户编写程序 而假如你使用的是ST官网的开发板,那么你还有一套现成的驱动可供使用

在Linux下开发和调试STM32

因为最近需要做一些STM32的开发,而我大部分的其他开发都在Linux上,经常在Windows和Linux下切换感觉比较不方便,于是就研究了一下Linux下开发STM32的工具,顺便在这边做下记录. 使用的开发工具 软件平台: Eclipse Luna 下载:https://eclipse.org/downloads/packages/release/luna/sr2 用于安装System Workbench for STM32插件,建议下载Eclipse IDE for C/C++ Devel

STM32 HAL drivers < STM32F7 >

Overview of HAL drivers The HAL drivers were designed to offer a rich set of APIs and to interact easily with the application upper layers.Each driver consists of a set of functions covering the most common peripheral features.The development of each

使用VSCode和VS2017编译调试STM32程序

近两年,微软越来越拥抱开源支持跨平台,win10搭载Linux子系统,开源VSCode作为跨平台编辑器,VS2017官方支持了Linux和嵌入式开发功能. ST也是,近两年开发的软件工具基本都是跨平台(基于Java)的,比如STM32CubeMX,MCUFinder,STM32CubeProgrammer等.17年年底收购了truestudio的开发公司-Atollic.这个公司的IDE就是基于Eclipse使用GNU套装的. 官方都支持了,那我们有必要了解一下.要是好用,说不定就可以淘汰老旧的