STM32软件仿真的一个注意点
最近才做的板子由于自己的粗心把串口线搞反了,还好只有两条,飞线解决,而且现在还只是样板,但是还是应该引以为戒,以后做硬件一定要谨慎。
今天同事出差把CAN分析仪拿走了,本来在开发板上调试好的程序不知为何移植到板子上以后CAN突然不能发送数据了,恰好今天没法用硬件调试,只能用软件仿真了。除了CAN部分在主函数前还有和USART相关的操作,起初我苦思冥想也没想到这能有什么错,之前用开发板的时候串口和CAN都可以用。昨天仅仅把串口1移植到了串口2,尽管这两个串口不在同一个总线上,但是想起来和CAN八竿子打不着,怎么也不应该影响CAN呀。后来实在没办法了注释掉了main函数中while(1)之前串口发送的语句,意外地发现CAN部分终于发送数据了。

这是怎么回事?太奇怪了啊。没办法,单步调试,当进入串口发送函数时发现了这么一句:
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
继续执行,却会发现始终在这一句循环,也就是说函数不能返回。当然无法进入while循环发送CAN数据了,难怪之前只要把CAN的初始化部分放在USART发送函数之后,就会看到CAN一直处于sleep状态。这是为什么呢?看芯片手册:

TC标志位是在数据发送完成后由硬件置位的,而且库中已经定义了typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
所以循环回无法跳出,也就没法执行发送函数之后的操作了。当然同理,用以下的循环语句来判断数据是否转移到移位寄存器也是不能跳出循环的。
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
可以看出,由硬件自动进行操作的寄存器位的判断在软件仿真时都不能放在while循环中判断,否则会出现死循环,无法执行后面的操作。谨记,今天竟然犯了这么一个小错误,汗一个!
STM32软件仿真的一个注意点的更多相关文章
- STM32 PWM的输出与Keil软件仿真
导读:PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值). PWM控制技术在逆变电路中应用最广,应用 ...
- stm32 MDK5软件仿真之查看io口输出
软件MDK5 stm32的pack 打开MDK,添加工程 一.首先找到Project的Options选项,里面的Debug选为Use Simulator,也就是选择软件仿真. 然后再Logic ...
- STM32 mdk软件仿真时过不去时钟的问题
stm32的程序用MDK软件仿真时,由于系统时钟初始化函数里有个等待系统时钟准备好的循环,所以过不去. 设置方式如下:这么设置之后仿真时就可以直接进入main函数了.
- 单片机Keil软件仿真与调试技巧
一.引言 单片机软件开发过程中,软件调试遇到的各种问题常令初学者感到不知所措.实际上.各种仿真开发软件的程序调试基本方法和技巧大同小异,掌握正确的程序调试基本技巧.对于排查这些程序错误问题可以起到举一 ...
- STM32软件复位(基于库文件V3.5)
源:STM32软件复位(基于库文件V3.5) void SoftReset(void) { __set_FAULTMASK(); // 关闭所有中端 NVIC_SystemReset();// 复位 ...
- MDK软件仿真常见问题
一直不知道MDK该怎么仿真调试程序,之前试了好几次都没有成功.因为有个程序一直不知道里面的变量对应着外部怎么的模式,今天想起可以用仿真调试的方法查看当外部设置某种模式的时候, 内部变量的变化,这样想来 ...
- CCS V5 使用教程二:创建工程和配置软件仿真
新建CCS项目 选择File/New/CCS Project: 新建项目对话框 1) Project name: 指项目名称,这里要注意的项目名称不区分大小写. 2) Ou ...
- 转载 STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发
STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发 本文转载自 https://www.cnblogs.com/xingboy/p/9913963.html 这里我主要说一 ...
- STM32 Keil仿真调试
引用:http://blog.sina.com.cn/s/blog_3c63d2bd0102vt9a.html 问题描述:使用MDK进行软件设计时没有使用ST官方的模板而是手动建立的工程,使用ST官方 ...
随机推荐
- svn is already locked解决方案
在出错文件夹下,鼠标右键TortoiseSVN->Clean up. SVN错误:Attempted to lock an already-locked dir 1.出现这个问题后使用“清理”功 ...
- PHP5 session 详解
http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议.所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的.而越来越复杂的WEB应用,需要保存一些用户状 ...
- 谈谈怎么实现Oracle数据库分区表
谈谈怎么实现Oracle数据库分区表 数据库的读写分离 SQLSERVER性能监控级别步骤 Oracle索引问题诊断与优化(1)
- Samza文档翻译 : Backgroud
这一页提供了关于流处理的背景知识,描述什么是Samza,以及它为何而生. what is messaging?什么叫消息? 消息系统是用来实现近实时异步计算的一种流行方式.当事件发生时,消息可以被放在 ...
- python time相关操作
1.获取当前时间的两种方法: 代码如下: import datetime,timenow = time.strftime("%Y-%m-%d %H:%M:%S")print now ...
- POJ2527+多项式除法
模拟一遍即可. 注意一些特殊情况,见代码. #include<stdio.h> #include<stdlib.h> #include<math.h> #inclu ...
- 安装TokuDB引擎
前言:TokuDB 是一个高性能.支持事务处理的 MySQL 和 MariaDB 的存储引擎.TokuDB 的主要特点是高压缩比,高 INSERT 性能,支持大多数在线修改索引.添加字段,非常适合日志 ...
- 使用EventLog类写Windows事件日志
在程序中经常需要将指定的信息(包括异常信息和正常处理信息)写到日志中.在C#3.0中可以使用EventLog类将各种信息直接写入Windows日志.EventLog类在System.Diagnosti ...
- 使用ANT打包Android应用
大家好,今天来分享一下如何使用ANT打包Android应用. 通常我们习惯用eclipse来开发Android程序,它会自动帮我们打包当前的应用程序.如果在Navigator视图下,我们可以看到以下几 ...
- Zookeeper命令
常用命令 ZooKeeper 支持某些特定的四字命令字母与其的交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 telnet 或 nc 向 Zoo ...