STM32 WARNING: T-bit of XPSR is 0 but should be 1. Changed to 1. 问题解决过程.

Stm32CubeIDE 代码生成好之后写入单片机却无法运行.
一直报下面的错误. 最明显的一句错误日志是.
Starting target CPU…
WARNING: T-bit of XPSR is 0 but should be 1. Changed to 1.
…Target halted (Vector catch, PC = 0xF3AF4804)

从日志来看,貌似写入程序是没问题的,
只是在启动程序的时候出错了.日志如下:

.........
Connecting to J-Link...
J-Link is connected.
Firmware: J-Link V9 compiled Dec  2 2017 15:35:20
Hardware: V9.20
S/N: 269200585
Feature(s): GDB, RDI, FlashBP, FlashDL, JFlash, RDDI
Checking target voltage...
Target voltage: 2.81 V
Listening on TCP/IP port 2331
Connecting to target...
J-Link found 2 JTAG devices, Total IRLen = 9
JTAG ID: 0x3BA00477 (Cortex-M3)
Connected to target
Waiting for GDB connection...Connected to 127.0.0.1
Reading all registers
WARNING: Failed to read memory @ address 0xF3AF4804
Connected to 127.0.0.1
Reading all registers
WARNING: Failed to read memory @ address 0xF3AF4804
Received monitor command: WriteDP 0x2 0x000000F0
O.K.
Received monitor command: ReadAP 0x2
O.K.:0xE00FF003
Reading 32 bytes @ address 0xE00FFFD0
Received monitor command: reset
Resetting target
Downloading 88 bytes @ address 0x08000000 - Verified OK
Downloading 4 bytes @ address 0x08000058 - Verified OK
Downloading 4 bytes @ address 0x0800005C - Verified OK
Writing register (PC = 0x 8000000)
Read 4 bytes @ address 0x08000000 (Data = 0x4C05B510)
Read 2 bytes @ address 0x08000000 (Data = 0xB510)
Read 4 bytes @ address 0x20004FFC (Data = 0x01000000)
Reading 64 bytes @ address 0x20004FC0
WARNING: Failed to read memory @ address 0xFFFFFFFE
WARNING: Failed to read memory @ address 0xFFFFFFFE
Read 4 bytes @ address 0xE000ED14 (Data = 0x00000000)
Downloading 4 bytes @ address 0xE000ED14 - Verified OK
Reading all registers
Read 4 bytes @ address 0x08000000 (Data = 0x4C05B510)
Read 2 bytes @ address 0x08000000 (Data = 0xB510)
WARNING: Failed to read memory @ address 0xFFFFFFFE
WARNING: Failed to read memory @ address 0xFFFFFFFE
Read 4 bytes @ address 0xE000EDFC (Data = 0x01000000)
Downloading 4 bytes @ address 0xE000EDFC - Verified OK
Reading all registers
Read 4 bytes @ address 0x08000000 (Data = 0x4C05B510)
Read 2 bytes @ address 0x08000000 (Data = 0xB510)
Starting target CPU...  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 这里,这里出错了.
WARNING: T-bit of XPSR is 0 but should be 1. Changed to 1.
...Target halted (Vector catch, PC = 0xF3AF4804)
Reading all registers
WARNING: Failed to read memory @ address 0xF3AF4804
WARNING: Failed to read memory @ address 0x4C05B504
Reading 64 bytes @ address 0x4C05B500
WARNING: Failed to read memory @ address 0x4C05B500
WARNING: Failed to read memory @ address 0x4C05B500
Reading 64 bytes @ address 0x4C05B500
WARNING: Failed to read memory @ address 0x4C05B500
WARNING: Failed to read memory @ address 0x4C05B500

为啥是这个错误呢?
我判断问题原因的大概方向可能性有如下几种
1.硬件有问题,线没接好,
2.芯片被烧了, 最近冬天身上静电多, 穿着毛茸茸的衣服容易有静电.
3.JLink驱动程序不匹配, 由于昨天我的电脑硬盘坏了, 整个系统重装了. 有可能不匹配
4.调试进不去还有一个可能,IOC配置文件中 SYS里面的Debug功能没开,如下第一个图.(如果是这个问题, 表现应该是下载也下载不进去.根据日志看,我的下载成功了. 应该不是这个错误.)
5.IOC配置文件有问题, 因为电脑硬盘没坏之前修改过IOC,没来得及调试第二天电脑就坏了.
6.源代码写的有问题, 这个基本上不太可能的,(调试进不进得去, 基本上跟手写的代码没多大关系,)
7.工程项目有问题.

还是采取了排除法, 逐一排除错误无疑比较慢,最快的方法是二分排除法, 先从问题的中间去排除.
我采取的方法是新建一个项目,比较简单, 可以快速的排除, 1,2,3, 种可能. 最有可能的是第5种IOC配置文件有问题.

首先新建一个新的项目, 这个项目里面就只配置Sys里面的SW调试功能, 其它的都不配置, 结果是可以调试的.
IOC配置如下:
只配置Sys里面的SW调试功能
调试配置如下.
调试项目配置图
调试器配置图

程序运行结果是可以进入调试的直接排除了1,2,3,4 种问题的可能性.
我的板子有点问题,第一次是直接进入失败void HardFault_Handler(void)函数里面, 第二次调试就可以了.估计是上次写入的程序有点问题引起的.
在这里插入图片描述

好, 到这里说明我的硬件是没问题的,包括JLink也是没问题的.JLink的软件也是没问题的. 虽然我的Jlink灯一红一绿的闪我也不知道啥意思, 先不管它了.

既然硬件没问题,其它的也没问题. 调试开关也打开了, 那么接下来就是第 5,6,7种可能了.

5.IOC配置文件有问题, 因为电脑硬盘没坏之前修改过IOC,没来得及调试第二天电脑就坏了.
6.源代码写的有问题, 这个基本上不太可能的,(调试进不进得去, 基本上跟手写的代码没多大关系,)
7.工程项目有问题.

先在资源管理器里面操作,把TTTT.ico改个名备份着, 把有问题项目的IOC文件复制过来., 然后把有问题的IOC文件改名成 TTTT.ioc
然后在STM32CubeIDE里面打开TTTT.ioc文件. 逐个尝试着删除配置. 一般心里还是有点谱的, 毕竟最近改了那些配置, 自己心理还是有点清楚的.
例如我自己最近配置了定时器TIM2和TIM4 于是我把配置复原.关掉这两个配置项目.先关了个TIM2
在这里插入图片描述
另外我的JLink比较老,每次都提示这个要更新固件, 我试着点过[是] 结果不行.后来每次都提示,我都是点[否], 想取消结果取消不了. 不管它了.
提示如下: 能用就好.谁知道如何关闭这个提示, 还请赐教.
在这里插入图片描述

保存配置->生成代码 什么代码都不写 -> 开始调试.
在这里插入图片描述

中奖, 第一次关掉TIM2就可以开始调试了… 嗯, 根据我老道的经验没这么简单的事情,不能高兴的太早. 再开启TIM2试试看.
咦!!! 竟然还可以调试, 莫非IOC文件配置的没问题? 是源代码的问题?

再重新复制一份有问题项目的IOC过来. 直接生成代码, 开始调试

咦!!! 竟然还可以调试, IOC文件配置的没问题,是源代码的问题?

第5种IOC文件配置的问题也排除了, 只能继续尝试第6种源代码的问题, 虽然前面被我给否定了. 但还是得排除.

那就把源代码文件也复制过来吧.
我习惯性的会把自己写的主要代码放到mymain.c中. 因为之前有发生过写在main.c中的代码因为生成卡住之后,我写的代码全丢失了. 所以后来重要的代码我基本上都是写在mymain.c中的.于是把4个主要的文件复制过来.
在这里插入图片描述
我自己的个人习惯写法
再次复制完4个文件,然后开始生成调试,

咦!!! 竟然还可以调试, 仍然正常的. 这什么鬼. 难道是项目问题?

只剩最后一个可能性了.项目有问题.
为了揪出问题的根本原因, 我先备份一下这个问题项目. 重新在另外一个文件夹再弄一个同名的项目, 再搞回去. 估计就是正常的了. 待会拿文件比较器BC比较一下,看看是哪里出了问题.

最终尝试结果确实是项目有问题,然后用BC比较了一下, 发现少了个 文件 Core/Startup/startup_stm32f103c8tx.s
在这里插入图片描述

问题也解决了, 具体问题8成是startup_stm32f103c8tx.s文件没包含进来, 8成是我手欠给删掉了.或者我新建项目的时候某个选项没选.有兴趣的可以再深入追究一下
俺的时间宝贵, 就不深究了. 建议年轻人再深入理解一下, 有助于日后工作更快的解决问题.

写这么多, 这么啰嗦, 主要目的是为了给后来的新手一个解决问题的思路. .
凡是看这个文章的基本上都是刚入门单片机的新手…
解决问题重在思路, 知道过程, 掐头去尾,中间二分排除. 基本上没有解决不了的问题.
最菜最笨的方法就是排除法,但是也最强悍, 几乎可以通杀所有的问题… 但排除法的前提是要知道过程和原理
稍微好一点的解决问题的方法是 二分排除法.我这篇文章采取的过程就是二分排除法…
不要从第一种可能直接下手排查, 效率太低. 直接从中间验证排查, 可以节约一半的时间…
找到问题后,再分一半排查, 还可以节约一半的时间.
二分排除法最适合快速解决这种串行的系统和过程性的系统上, 也就是依次依赖的流水线形式的系统, 98%都是这种系统.
本次这个例子, 单片机要想正常调试需要依赖于,1.单片机没烧, 2.调试线硬件连接无问题, 3.JLINK驱动的正确,4.IOC配置正确.等等.
当然从本次问题的解决过后, 还知道了, 需要依赖于startup_stm32f103c8tx.s文件的引入.
遇到的问题越多,解决起来也就越快, 编程就是这样, 刚开始是最慢的. 编程真的不难, 难得是能不能自己耐住性子. 逐个掌握这些问题, 逐个解决这些问题. 然后也逐步的在脑海中建立起了自己的知识图谱… 越到后面解决问题的过程就越快. 别人要一天,2天, 你可能只需要1分钟…

最后别忘了, 排除法的前提是要知道过程和原理哦

所以在做什么事情之前, 先搞清楚过程和原理, 绝对是有助于解决问题的. 节约的就是自己的时间. 砍柴不误磨刀功.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值