【问题标题】:How to reset a PIC18 in C?如何在 C 中重置 PIC18?
【发布时间】:2010-09-17 18:46:48
【问题描述】:

使用 C 代码和 HiTech Pic18 C 编译器重置 PIC18 的最佳方法是什么?

编辑:

我正在使用

void reset()
{
#asm 
  reset
#endasm
}

但一定有更好的办法

【问题讨论】:

  • 有没有比调用单个 ASM 指令更好的方法来做任何事情?为什么需要重置整个控制器?您是否打算重置所有外围设备?刚刚写入 PGM 内存闪存? (这是唯一的好借口)

标签: embedded pic microchip


【解决方案1】:

除非编译器供应商的运行时库定义了一个库函数(如果这样的库甚至存在于微控制器世界中......但它应该存在),那么不。 C 本身当然不会帮助您,执行“重置”对于 C 来说是太多特定于平台的问题,无法涵盖它。

【讨论】:

    【解决方案2】:

    我使用 ccsinfo.com 编译器,它具有类似的 API 调用来重置 PIC,但我认为编译器的解决方案会做正确的事情。

    【讨论】:

      【解决方案3】:

      有一个FAQ here

      问:如何重置微型?

      一种方法是将所有变量重置为 它们的默认值,如 PIC 中所列 手动的。然后,使用汇编语言 跳转到位置 0x0000 微。

      #asm ljmp 0x0000

      #endasm

      使用起来非常安全,即使在 在中断内调用或 程序。 PIC 16x 系列微控制器 有 8 个堆栈级别。每次一个 过程被调用,一个堆栈级别 用于返回地址。它 是一个循环缓冲区,所以即使 微是 7 个程序级别的深度和 在复位时的中断 被称为,这是新的开始 堆栈缓冲区,而微将 照常继续。

      另一种方法是设置看门狗 当芯片被编程时定时器,和 全部使用 CLRWDT() 指令 代码。当你想要微 复位,停止清除看门狗位 并且微型将在大约之后重置 18ms 到 2 秒,具体取决于 预分频器。

      【讨论】:

      • 跳转到 0x0000 不会重置任何硬件外围设备。我会使用看门狗或重置汇编指令。
      • 我知道这是一个非常古老的问题,但我偶然发现了一个类似的问题。根据 Microchip youtube 页面link,PIC 中添加了一些新的增强指令。其中之一是复位指令。我还没有完成这项工作,也找不到太多关于它的信息,但看起来有办法。
      • @DanTwining:感谢您的更新。 Microchip 在过去的 3 年中添加此增强功能是有意义的 :)
      • 跳转到 0x0000 不会重置堆栈,在函数内执行足够多次,你会得到堆栈溢出!
      • @Cobusve:这个答案已经 7 岁了。提出将其更新为现代答案的编辑会更具建设性,以帮助偶然发现这个问题的人们。在这里,我把它变成了“社区 wiki”,让更新更容易。
      【解决方案4】:

      编译器通常内置有自己的 reset() 函数,但它的作用与您的函数完全一样,实际名称可能因编译器而异。

      你已经在做最好的方式了。

      【讨论】:

        【解决方案5】:

        你的回答是我所知道的最好的方式。关键是您在函数调用中拥有汇编指令,完全独立。 编译器不会优化其中包含内联汇编的函数,因此如果您将复位指令内联到一个非常大的函数中,编译器将不会优化该函数中的任何代码。您可以通过将 Reset 放在它自己的函数中来避免这种情况。这个函数中的代码不会被优化,但谁在乎呢,因为它是一个很小的函数。

        【讨论】:

          【解决方案6】:

          由于Mike 已在 11 年前编辑了这个原始问题,因此原始海报是否需要一个全面的答案似乎值得怀疑。事实上,在过去的 9 年里,OP 似乎只询问或回应了 2 个有关微控制器的话题。

          考虑到这一切,看看 PIC18F 控制器可以通过哪些方式使用 Hi-Tech C 或 XC8 编译的代码从复位向量开始执行可能会有所帮助,因为它现在由 Microchip 调用。

          此代码已使用 MPLABX v5.25、XC8 v2.05 和 PIC18F45K20 控制器进行测试。

          /*
           * File:     main.c
           * Author:   dan1138
           * Target:   PIC18F45K20
           * Compiler: XC8 v2.05
           *
           *                                                             PIC18F46K20
           *                 +---------+                 +---------+                 +----------+                 +----------+
           *           <>  1 : RC7/RX  :           -- 12 : NC      :           <> 23 : RA4      :           -- 34 : NC       :
           *      LED4 <>  2 : RD4     :           -- 13 : NC      :           <> 24 : RA5      : 32.768KHz -> 35 : RC1/SOSI :
           *      LED5 <>  3 : RD5     :           <> 14 : RB4     :           <> 25 : RE0      :           <> 36 : RC2      :
           *      LED6 <>  4 : RD6     :           <> 15 : RB5/PGM :           <> 26 : RE1      :           <> 37 : RC3      :
           *       GND ->  5 : VSS     :       PGC <> 16 : RB6/PGC :           <> 27 : RE2      :      LED0 <> 38 : RD0      :
           *       3v3 ->  6 : VDD     :       PGD <> 17 : RB7/PGD :       3v3 -> 28 : VDD      :      LED1 <> 39 : RD1      :
           *       SW1 <>  7 : RB0/INT :       VPP -> 18 : RE3/VPP :       GND -> 29 : VSS      :      LED2 <> 40 : RD2      :
           *           <>  8 : RB1     :       POT <> 19 : RA0/AN0 :      4MHz -> 30 : RA7/OSC1 :      LED3 <> 41 : RD3      :
           *           <>  9 : RB2     :           <> 20 : RA1     :      4MHz <- 31 : RA6/OSC2 :           <> 42 : RC4      :
           *           <> 10 : RB3     :           <> 21 : RA2     : 32.767KHz <- 32 : RC0/SOSO :           <> 43 : RC5      :
           *      LED7 <> 11 : RD7     :           <> 22 : RA3     :           -- 33 : NC       :           <> 44 : RC6/TX   :
           *                 +---------+                 +---------+                 +----------+                 +----------+
           *                                                              TQFP-44
           *
           *
           * Created on December 21, 2019, 2:26 PM
           */
          
          /* Target specific configuration words */
          #pragma config FOSC = INTIO67, FCMEN = OFF
          #pragma config IESO = OFF, PWRT = OFF, BOREN = SBORDIS, BORV = 18
          #pragma config WDTEN = OFF, WDTPS = 32768, CCP2MX = PORTC, PBADEN = OFF
          #pragma config LPT1OSC = ON, HFOFST = ON
          #pragma config MCLRE = ON, STVREN = ON, LVP = OFF, XINST = OFF
          #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
          #pragma config CPB = OFF, CPD = OFF
          #pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF
          #pragma config WRTC = OFF, WRTB = OFF, WRTD = OFF
          #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF
          #pragma config EBTRB = OFF
          
          /* Target specific definitions for special function registers */
          #include <xc.h>
          
          /* Declare the system oscillator frequency setup by the code */
          #define _XTAL_FREQ (4000000UL)
          
          /* reset instruction */
          void ResetMethod_1(void)
          {
              asm(" reset");
          }
          
          /* long jump to absolute address zero */
          void ResetMethod_2(void)
          {
              INTCON = 0;
              asm(" pop\n ljmp 0");
          }
          
          /* return to absolute address zero */
          void ResetMethod_3(void)
          {
              INTCON = 0;
              asm(" clrf TOSU\n clrf TOSH\n clrf TOSL\n");
          }
          
          /* provoke stackoverflow reset */
          void ResetMethod_4(void)
          {
              INTCON = 0;
              while (1) 
              {
                  asm(" push\n");
              }
          }
          
          /* provoke stackunderflow reset */
          void ResetMethod_5(void)
          {
              INTCON = 0;
              STKPTR = 0;
          }
          
          /* clear the program counter */
          void ResetMethod_6(void)
          {
              INTCON = 0;
              asm(" clrf PCLATU\n clrf PCLATH\n clrf PCL\n");
          }
          
          void main(void)
          {
              INTCON = 0;             /* Disable all interrupt sources */
              PIE1 = 0;
              PIE2 = 0;
              INTCON3bits.INT1IE = 0;
              INTCON3bits.INT2IE = 0;
          
              OSCCON = 0x50;          /* set internal oscillator to 4MHz */
              OSCTUNEbits.TUN = 0;    /* use factory calibration of internal oscillator */
              ANSEL = 0;
              ANSELH = 0;
              
              if(!RCONbits.nPOR)
              {
                  RCONbits.nPOR = 1;
                  LATD = 0;
              }
              
              TRISD = 0;
              /*
               * Application loop
               */
              while(1)
              {
                  __delay_ms(500);
                  if (LATDbits.LD0 == 0)
                  {
                      LATDbits.LD0 = 1;
                      ResetMethod_1();
                  }
                  
                  if (LATDbits.LD1 == 0)
                  {
                      LATDbits.LD1 = 1;
                      ResetMethod_2();
                  }
          
                  if (LATDbits.LD2 == 0)
                  {
                      LATDbits.LD2 = 1;
                      ResetMethod_3();
                  }
                  
                  if (LATDbits.LD3 == 0)
                  {
                      LATDbits.LD3 = 1;
                      ResetMethod_4();
                  }
          
                  if (LATDbits.LD4 == 0)
                  {
                      LATDbits.LD4 = 1;
                      ResetMethod_5();
                  }
          
                  if (LATDbits.LD5 == 0)
                  {
                      LATDbits.LD5 = 1;
                      ResetMethod_6();
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-10
            • 1970-01-01
            • 2016-12-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多