amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 511|回复: 2

疑惑:一个函数在主函数和中断里面同时被调用会怎样?

[复制链接]
发表于 2015-9-7 16:13:56 | 显示全部楼层 |阅读模式
  目前发现一个很奇怪的问题。  MCU:15W408AS
  主函数循环里面调用一个SPI函数,同时串口中断里面有时候也会调用。
  发现:居然会导致单片机无休止的复位(我是通过在main的while前面加上一个串口发送来判断MCU重启了)。 是不是我设置上的问题?
  附上代码:(程序可能有点乱,这是一下午慢慢排查删减出来的结果。。。。)
  附上STC设置选项(还有一个奇怪的发现:同一个程序,)
  void Send_spi_byte(uint8_t SAddr , uint8_t Sdata)
{
    uint8_t i = 0 ;
   
    SPI_SCLK = LOW;
    SPI_nSEL = LOW;
    SPI_SDI = HIGH;
   
    //先发送地址码
    for (i = 0; i < 8; i++)               
    {                               
          if (SAddr & 0x80) SPI_SDI = HIGH;
          else SPI_SDI = LOW;
          SPI_SCLK = HIGH;
      SAddr <<= 1;
      SPI_SCLK = LOW ;
    }
    SPI_SDI = HIGH;
    //再发送数据
    for (i = 0; i < 8; i++)               
    {                               
          if (Sdata & 0x80) SPI_SDI = HIGH;
            else SPI_SDI = LOW;
          SPI_SCLK = HIGH;
      Sdata <<= 1;
      SPI_SCLK = LOW;
    }
   
    SPI_nSEL = HIGH;
    SPI_SDI = HIGH;
}

void SI4432_init(void)
{         
   Send_spi_byte(0x6C|0x80, 0x01);                                              //
   Send_spi_byte(0x6D|0x80, 0x0F);                                              //(发射功率:最大发射功率)
}       

void Set_SI4432_Data(void)
{
   Send_spi_byte(0x05|0x80, 0x04);                                                // 使能包发射完成中断                       
   Send_spi_byte(0x07|0x80, 0x09);                                                  // 进发射模式
}


void Check_SI4432_Online(void)
{
      SDN = 0 ;                           //拉低SDN,重新给SI4432上电,等待复位延时时间
      SI4432_init();
}

/**********************串口读取命令变量*******************************/
/**********************************************************************
************ 函数名:UartInit()                   ********************
************ 功能:串口通讯波特率初始化(独立)     ********************
************ 输入:无                             ********************
************ 输出:无                             ********************
**********************************************************************/
void UartInit(void)                //115200bps@22.1184MHz串口1 定时器2
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xD0;                    //设定定时初值
        T2H = 0xFF;                      //设定定时初值
        AUXR |= 0x10;                //启动定时器2
        ES = 1;             //打开串口中断
}
/**********************************************************************
************ 函数名:Send_Char()              ************************
************ 功能:串行口发送数据功能函数     ************************
************ 输入:txd                        ************************
************ 输出:无                         ************************
**********************************************************************/
void Send_Char(unsigned char txd)
{
  SBUF = txd;
  while(!TI);                          // 等特数据传送
  TI = 0;                                  // 清除数据传送标志
}

/**********************************************************************
************ 函数名:Uart_Isr()                   ********************
************ 功能:串口通讯中断函数()             ********************
************ 输入:无                             ********************
************ 输出:无                             ********************
**********************************************************************/
void Uart_Isr() interrupt 4
{
  unsigned char Recive_Tmp = 0 ;
  if(RI)
    {
      RI = 0;
      Recive_Tmp = SBUF;
      Check_SI4432_Online();                             //检查SI4432是否在线:不在线,重启SI4432模块.
    }//for"if(IR)"
}

void main()
{                              
  /*************************初始化中断配置*****************************/
  UartInit();                                             //串口发送初始化
  
  /***********************打开中断,程序开始***************************/
  IP = 0X09 ;
  EA =1 ;
  TR0 = 1;
  Send_Char(0x66);
  while(1)
   {
         Set_SI4432_Data();           
   }
}

这个配置会导致重启

这个配置会导致重启

同一个程序,这个配置就不会重启

同一个程序,这个配置就不会重启
发表于 2015-9-7 16:51:03 | 显示全部楼层
理解一下 可重入函数
发表于 2015-9-7 23:29:50 | 显示全部楼层
这个跟什么MCU没有关系,关键是你先了解什么是重入函数,再说其它。
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-6-19 14:16

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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