嫁吱裨 发表于 前天 15:13

记录个IAR程序下载后硬件复位不运行,必须断电复位才运行的问题

【问题测试】
有个F407的跑马灯的例子,是MDK和IAR两个版本,MDK版本的例子下载并复位后可以正常看到LED闪烁,而IAR的例子下进去后,不会闪烁。
使用TOOL的上位机内核寄存器监测工具测试发现,硬件复位后竟然还在调试状态,邪门了


https://img2024.cnblogs.com/blog/1379107/202507/1379107-20250727163744772-535118714.png
必须断电复位,断电复位后正常了:

或者LUA命令控制退出调试状态


【问题解决】

起初以为是启动代码里面封装的函数__iar_program_start造成,将其注释掉,直接跳转到mian也不行

最后测试发现是半主模式配置问题,之前测试的8.50版本是半主模式配置 + fputc重新写,实际测试不会再执行半主操作了

进入IAR9,X后,这种配置不行了,必执行半主操作,导致运行起来了,还处于调试模式状态。使用9.X要关闭半主,并且重新定向串口

/*******************
*
* Copyright 1998-2017 IAR Systems AB.
*
* This is a template implementation of the "__write" function used by
* the standard library.Replace it with a system-specific
* implementation.
*
* The "__write" function should output "size" number of bytes from
* "buffer" in some application-specific way.It should return the
* number of characters written, or _LLIO_ERROR on failure.
*
* If "buffer" is zero then __write should perform flushing of
* internal buffers, if any.In this case "handle" can be -1 to
* indicate that all handles should be flushed.
*
* The template implementation below assumes that the application
* provides the function "MyLowLevelPutchar".It should return the
* character written, or -1 on failure.
*
********************/

#include <LowLevelIOInterface.h>

#pragma module_name = "?__write"

int MyLowLevelPutchar(int x)
{
comSendChar(COM1, x);
   
return x;

}

/*
* If the __write implementation uses internal buffering, uncomment
* the following line to ensure that we are called with "buffer" as 0
* (i.e. flush) when the application terminates.
*/

size_t __write(int handle, const unsigned char * buffer, size_t size)
{
/* Remove the #if #endif pair to enable the implementation */
#if 1

size_t nChars = 0;

if (buffer == 0)
{
    /*
   * This means that we should flush internal buffers.Since we
   * don't we just return.(Remember, "handle" == -1 means that all
   * handles should be flushed.)
   */
    return 0;
}

/* This template only writes to "standard out" and "standard err",
   * for all other file handles it returns failure. */
if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR)
{
    return _LLIO_ERROR;
}

for (/* Empty */; size != 0; --size)
{
    if (MyLowLevelPutchar(*buffer++) < 0)
    {
      return _LLIO_ERROR;
    }

    ++nChars;
}

return nChars;

#else

/* Always return error code when implementation is disabled. */
return _LLIO_ERROR;

#endif



来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 记录个IAR程序下载后硬件复位不运行,必须断电复位才运行的问题