硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3265|回复: 11
收起左侧

[GPIO] 一桩跑马灯例程引发的疑案

[复制链接]

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2021-6-12 09:03:38 | 显示全部楼层 |阅读模式
本人小白,请教大佬们,万分感激!


个人stm32知识背景:


零基础,购买安富莱开发板跟着用户手册学习不到一个星期,刚看到18章。视频教程已看完。


开发环境:



WIN10+MDK+ST-LINK+STM32-V7开发板


Keil V5.34.0.0+Keil.STM32H7xx_DFP.2.7.0.pack


一、哪个才是跑马灯例程的正常效果


复位是指:按一下S7复位键或开关STM32-V7开发板电源


依学习文档正常编译下载跑马灯程序hex后:

(a)下载完成后不做任何动作(不复位),跑马灯是LED1快闪(由例程看应该是100ms的周期),LED2和LED3同步慢闪(由例程看应该是500ms的周期),LED4独自慢闪(由例程看应该是500ms的周期),即

     100ms周期:LED1亮-->LED1灭-->LED1亮

     500ms周期:LED2、LED3亮,LED4灭-->LED2、LED3灭,LED4亮-->LED2、LED3亮,LED4灭

(b)下载完成后复位,跑马灯是LED1快闪(由例程看应该是100ms的周期),LED2、LED3和LED4同步慢闪(由例程看应该是500ms的周期),即

     100ms周期:LED1亮-->LED1灭-->LED1亮

     500ms周期:LED2、LED3、LED4亮-->LED2、LED3、LED4灭-->LED2、LED3、LED4亮

问题来了:

1.哪个才是跑马灯正常的效果?(跑马灯跑马灯,上述情况(a)的效果才名副其实。)

2.可为什么复位后同时闪了呢?


附加其它:
在while循环前加入如下代码只有(a)的效果:
        bsp_LedOn(2);
        bsp_LedOff(4);
        bsp_LedOn(3);


下载.png

二、boot的疑问

跑马灯例程的hex文件:

第一行、第二行内容为:
:020000040800F2
:10000000B8210020B1020008D72C0008BD03000869

倒数第二行内容为:
:04000005080002B13C

由第一、第二行可知0x0800 0000~0x0800 0003地址内容为0x2000 21B8,即__initial_sp(MSP主栈顶)的地址;0x0800 0004~0x0800 0007地址内容为0x0800 02B1,即Reset_Handler(复位中断)的地址

由倒数第二行可知,hex文件0x0000 0000~0x0000 0004地址的内容为0x0800 02B1,即Reset_Handler(复位中断)的地址

由此想到程序启动第一个读到的应该是hex文件倒数第二行的内容,即Reset_Handler(复位中断)的地址。

其它附加:
1、更改”options for target“中的两个地址为0x0700 0000(随意修改),原有值为0x0800 0000(即flash bank 1的首地址),如下图:


下载 (1).png
下载 (2).png

2、编译链接汇编,可以通过,并生成hex。

3、下载hex到STM32开发板,不能下载,提示"No Algorithm found for: 0700 0000H - 0700 5307H",map文件显示“Total ROM Size (Code + RO Data + RW Data)      21256 (  20.76kB)”,即程序ROM的大小

4、重复1、和2、的操作,但把地址改为0x0810 0000(即flash bank 2的首地址),可以成功下载并运行

问题来了:

1.flash的地址(包括flash bank 1、flash bank2、SRAMx、system memory、ITCM、DTCM等)是都已经规定死了不可以自己remap配置吗?

2.上电复位和reset按键复位是否有区别?(感觉应该是一样的)

3.相关学习文档资料说,启动过程是上电(硬件)复位后先设置SP=__initial_sp(MSP主栈顶),再设置PC=Reset_Handler(复位中断),可是hex文件0x0000 0000~0x0000 0004地址的内容为0x0800 02B1,即Reset_Handler(复位中断)的地址,是不是说除了上电复位和reset按键复位时PC=0H(上电复位和reset按键复位时PC=0H吗?),还有其他情况比如看门狗复位等导致PC=0H,hex文件0x0000 0000~0x0000 0004地址的内容为0x0800 02B1即Reset_Handler(复位中断)的地址主要是用作看门狗复位等导致PC=0H的复位main程序?

4.回到跑马灯例程下载运行和上电复位运行效果不一样的问题,是不是下载后不是上电复位导致控制LED的IO口未初始化?





output(mdk).hex

58.44 KB, 下载次数: 3

跑马灯例程hex文件

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-6-12 09:31:25 | 显示全部楼层
一、我修改为如下这样,帮你测试了,没问题,随便复位,硬件复位或者重新开关电源。建议你把你的下载器等都拔掉,开发板接外置电源,看看是否正常
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: main
  4. *        功能说明: c程序入口
  5. *        形    参: 无
  6. *        返 回 值: 错误代码(无需处理)
  7. *********************************************************************************************************
  8. */
  9. int main(void)
  10. {

  11.         bsp_Init();                /* 硬件初始化 */
  12.         
  13.         PrintfLogo();        /* 打印例程名称和版本等信息 */
  14.         PrintfHelp();        /* 打印操作提示 */

  15.         /* 先做个LED1的亮灭显示 */
  16.         bsp_LedOn(1);
  17.         bsp_DelayMS(100);
  18.         bsp_LedOff(1);
  19.         bsp_DelayMS(100);
  20.         
  21.         bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 */
  22.         bsp_StartAutoTimer(1, 500);        /* 启动1个500ms的自动重装的定时器 */
  23.         
  24.         
  25.         bsp_LedOn(2);
  26.         bsp_LedOff(4);
  27.         bsp_LedOn(3);
  28.         
  29.         /* 进入主程序循环体 */
  30.         while (1)
  31.         {
  32.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */

  33.                 /* 判断定时器超时时间 */
  34.                 if (bsp_CheckTimer(0))        
  35.                 {
  36.                         /* 每隔100ms 进来一次 */  
  37.                         bsp_LedToggle(1);                        
  38.                 }
  39.                
  40.                 /* 判断定时器超时时间 */
  41.                 if (bsp_CheckTimer(1))        
  42.                 {
  43.                         /* 每隔500ms 进来一次 */
  44.                         bsp_LedToggle(2);                        
  45.                         bsp_LedToggle(3);                        
  46.                         bsp_LedToggle(4);
  47.                 }
  48.         }
  49. }
复制代码


二、

1、不能。

2、一样。

3、这些复位都是一样的效果:

QQ截图20210612094035.png

4、你那边测试不正常。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-6-12 09:44:59 | 显示全部楼层
下载了你的程序测试了,你的程序有问题。

你发的程序确实是同时闪的。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2021-6-12 15:08:22 | 显示全部楼层
eric2013 发表于 2021-6-12 09:44
下载了你的程序测试了,你的程序有问题。

你发的程序确实是同时闪的。

这么说跑马灯正常是交替闪?同时闪是异常?


附上两个跑马灯MDK工程文件。


(V7学习资料网盘下载)同时闪跑马灯例程: V7-001_跑马灯.rar (2.66 MB, 下载次数: 4)
(根据学习资料说明按步骤创建,各种源文件复制粘贴)下载后交替闪复位后同时闪跑马灯例程: led_test.rar (2.59 MB, 下载次数: 1)




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-6-12 15:38:37 | 显示全部楼层
eilie 发表于 2021-6-12 15:08
这么说跑马灯正常是交替闪?同时闪是异常?

你发的这两个例子,我都下载了,需要我帮你测试什么。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2021-6-12 16:56:44 | 显示全部楼层
eric2013 发表于 2021-6-12 15:38
你发的这两个例子,我都下载了,需要我帮你测试什么。

原来想找到原因的,现在感觉没必要。重新又试了一遍,程序又正常了。用beyondcompare对比了两个例子的,所有源码文件都一样,就是一些keil工程文件有些不同。新建工程时工程名没有用project,而是用了led_test,有可能名字不一样导致中间可能是一些配置不一样吧。不管了那么多细节了,以后工程名都用project,用文件夹名称区分各工程也没啥毛病。

感谢硬汉大佬!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-6-12 17:18:33 | 显示全部楼层
eilie 发表于 2021-6-12 16:56
原来想找到原因的,现在感觉没必要。重新又试了一遍,程序又正常了。用beyondcompare对比了两个例子的, ...

好的,后面有什么了,我们再交流
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2021-6-13 08:35:49 | 显示全部楼层
eric2013 发表于 2021-6-12 17:18
好的,后面有什么了,我们再交流

硬汉哥好!
跑马灯例程编译下载后不同时闪,需要复位重启后才同时闪的原因定位到了。看代码,同时闪才是正常的。

原因:
在MDK5的group中把bsp组别里的bsp_fmc_io.c和bsp_timer.c的顺序对调或者把bsp_fmc_io.c放到bsp_timer.c前面,跑马灯就会交替闪而需要复位重启后才能同时闪

个人觉得,group项目文件的顺序不应该影响编译链接的结果,应该是MDK内部编译链接的一些处理逻辑上不是很完善。
对MDK了解得不多。如果顺序有影响,请硬汉哥指正和科普。

总的来说是小细节,后续使用BSP组且涉及到timer和fmc时需要注意下顺序。
我们的学习文档资料也可以做个说明。
如果有价值和必要的话,硬汉哥可以深查下原因,哈哈。

再次感谢硬汉哥这两天的快速回复和宝贵的时间。

如下为现象复现的附加说明:

程序文件:前面回复中的“V7-001_跑马灯”附件,或者学习资料里的“V7-001_跑马灯”例程

交替闪的顺序:
1.png

同时闪(正常结果)的顺序:
2.png





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-6-13 09:30:35 | 显示全部楼层
eilie 发表于 2021-6-13 08:35
硬汉哥好!
跑马灯例程编译下载后不同时闪,需要复位重启后才同时闪的原因定位到了。看代码,同时闪才是 ...

帮你测试了,使用我们的原始例子。

Win10 64bit 家庭版
MDK5.30
MDK5.34
MDK带的STM32H7软件包使用的2.7.0。

全部正常,切换顺序文件或者不切换顺序,原始例子都是同时闪烁。

这个问题就交流这么多吧,你还发现什么细节了,我们再交流。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2021-6-13 10:07:49 | 显示全部楼层
eric2013 发表于 2021-6-13 09:30
帮你测试了,使用我们的原始例子。

Win10 64bit 家庭版

要说可能漏掉的细节的话,就是用的st-link的估计升级到了当前ST官网的最新版本(V2J38S7)吧

嗯嗯,我觉得这个问题也差不多理清了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-6-13 10:25:40 | 显示全部楼层
eilie 发表于 2021-6-13 10:07
要说可能漏掉的细节的话,就是用的st-link的估计升级到了当前ST官网的最新版本(V2J38S7)吧

嗯嗯,我觉 ...


这个貌似是STLINK的bug,在新版MDK上复位芯片一直有点问题,你把Enable这个对钩去掉,应该就正常了。
QQ截图20210613102457.png


早期在这个帖子还讨论过这个问题,10楼回复

http://www.armbbs.cn/forum.php?mod=viewthread&tid=94094


回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2021-6-13 12:25:39 | 显示全部楼层
eric2013 发表于 2021-6-13 10:25
这个貌似是STLINK的bug,在新版MDK上复位芯片一直有点问题,你把Enable这个对钩去掉,应该就正常了。
...

嗯嗯,试了。完美修复。

感谢大佬!

结案!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 15:52 , Processed in 0.349744 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表