TMS320F28335開発ボードのクロックおよびウォッチドッグモジュール

 

1.クロックモジュール

    28335DSPの公称動作クロック周波数は150MHzです。クロック周波数が高いと必然的に電磁干渉が発生します。電磁干渉を低減するには、水晶振動子の出力周波数を下げる必要があります。これが「周波数分割と周波数乗算」の概念です。分割と周波数乗算を使用すると、さまざまな周波数を簡単に取得できます。28335の倍数の分周と周波数増倍の範囲は0.25〜10倍で、内蔵の水晶振動子は30MHzです(私のものはこのようなものですが、人によって異なる場合があります)。150MHzを取得したい場合は、最初に2で割り、次に10倍にすることができます。周波数、あなたは150MHZを得ることができます。そうすることの利点は、電磁干渉を効果的に減らすだけでなく、水晶振動子の製造コストも減らすことができます。30MHzの水晶振動子を使用する必要がありますか?他の水晶振動子(20MHzなど)を使用できますか?理論的には可能ですが、分周は通常1/2のn乗、増倍周波数は通常整数なので、最適な水晶振動子を選択してください。

  1.クロック回路は、マイクロプロセッサ回路システムの重要な部分であり、その動作のベンチマークです。TMS320F2833x DSPプロセッサ内のモジュールで使用されるクロックソースは異なり、主に5種類のクロック信号があります。

  • 外部クリスタル(クリスタルオシレーター):XCLKIN / X1からピンX1、X2または外部クロックを介して提供されるクロック信号。クロック信号はOSCCLKとして記録されます。
  • OSCCLKは、フェーズロックループ(PLL)モジュールを通過するか、CPUに直接送信されます。このクロック信号はCPUクロック入力であり、CLKINとして示されます。
  • CLKINがCPUに入力された、CPUはそれを出力します。これはCPUクロック出力またはシステム出力クロックと呼ばれ、SYSCLKOUTとして示されます。SYSCLKOUTの周波数はCLKINと同じです。
  • オンチップペリフェラルで使用される高速ペリフェラルクロックHSPCLKこのクロック信号は、CPUクロックSYSCLKOUTの周波数を除算することによって得られます。
  • オンチップペリフェラルで使用される低速ペリフェラルクロックLSPCLKこのクロック信号は、CPUクロックSYSCLKOUTの周波数を除算することによって得られます。

 

2.クロックモジュールの構成:

  • PLL(フェーズドロックループ);
  • クリスタルオシレーター(クリスタルオシレーター);
  • クロックモニター回路(クロックモニター回路);
  • クロックイネーブル回路(クロックイネーブル回路)。

 

3.クリスタルオシレーターとPLLモジュール

    F2833xシリーズDSPは、外部水晶振動子と外部クロック信号を介してクロックを提供し、内部位相ロックループループを介して周波数を乗算した後、システムをシステムに提供できます。ユーザーは、実際の動作周波数に応じて必要な周波数増倍率を計算し、ソフトウェアを使用してPLL周波数増倍率を設定できます。次の図は、オンチップ周辺クロックの生成を示しています。

 

QQæªå¾20160113130637.png

4.PLLベースのクロックモジュール

F2833xチップには、PLLベースのクロックモジュールが搭載されています。このモジュールには、CPUのさまざまなクロック周波数を選択できる4ビットの比例制御レジスタがあります。以下は、オシレーターとPLLモジュールの構造図です。

4510474a-a849-42e7-9c87-b75a04b8b6cd.jpg

 PLLベースのクロックモジュールは、次の2つの動作モードを提供できます。

1)クリスタルオシレーターの動作。オンチップオシレーターを使用すると、外部クリスタルオシレーターを使用してチップの時間基準を提供できます。クリスタルオシレーターはX1ピンとX2ピンに接続され、XCLKINピンはローに引き下げられます。

2)外部クロックソース操作。オンチップ発振器を使用しない場合、このモードでは内部発振器をバイパスでき、チップクロックはX1ピンまたはXCLKINピンの外部クロックソースから生成されます。

QQæªå¾20160113134932.png

  • PLL制御レジスタPLLCR

QQæªå¾20160113142413.png

QQæªå¾20160113144850.png

  • ペリフェラルクロック制御レジスタPCLKCR0、1、3

    PCLKCR0 / 1/3レジスタは、さまざまな周辺モジュールの入力クロック信号を有効/無効にします。PCLKCR0 / 1/3レジスタの書き込み操作により、2SYSCLKOUTサイクルの遅延が発生します。周辺GPIOは多重化されているため、すべての周辺機器を同時に使用することはできません。ただし、周辺機器のクロックを同時に有効にすることは可能ですが、そのような構成は無効です。

  • 高速ペリフェラルクロックプリスケーラレジスタ(HISPCP)

  • 低速周辺クロックプリスケーラレジスタ(LOSPCP)

  • PLLステータスレジスタ(PLLSTS)

  • 低電力モード制御レジスタ(LPMCR0)

2.ウォッチドッグモジュール

 

1.ウォッチドッグの機能:

    ウォッチドッグ(WatchDog、WD)は、プログラムの実行を監視するためによく使用されます。8ビットウォッチドッグカウンターが最大値に達する限り、モジュールは割り込みを生成するか、プロセッサーをリセットします。上記の状況を回避するには、ユーザーはカウンターを無効にするか、プログラムに2つのデータ0x55と0xAAを時間どおりに書き込む必要があります(順序を逆にすることはできません)。ウォッチドッグ(「フィードドッグ」)のキーワードレジスタを使用して、ウォッチドッグカウンターをリセットします。 。

 

2.ウォッチドッグクロック

    外部発振器クロック信号(OSCCLK)が512分周器を通過した後、ウォッチドッグ分周器WDPS(2:0)で除算され、ウォッチドッグクロック信号であるWDCLK信号が生成されます。

    ウォッチドッグ制御レジスタWDCRのWDDISビットが0の場合、WDCLKがウォッチドッグカウンタレジスタWDCNTRのカウントクロックとして使用され、カウントされます。8ビットカウンタが最大値に達すると、ウォッチドッグは出力パルス(/ WDRST)または(/ WDINT)割り込み信号を生成します(幅は512 OSCCLKクロックサイクルです)。

 

3.ウォッチドッグの構成

  • WDカウンター
  • ウォッチドッグリスタートマネージャーWDリセットレジスタ
  • ウォッチドッグクロックジェネレータ
  • ウォッチドッグステータスビット

QQスクリーンショット20160113161652.png

 

4.ウォッチドッグのリセット、割り込みモード

    ウォッチドッグカウンターが最大値に達すると、ウォッチドッグはリセット信号(/ WDRST)または割り込み信号(/ WDINT)を出力します。前者は亜鉛チップをリセットし、後者は割り込み要求を発行します。

    1)リセットモード。ウォッチドッグカウンターが最大値に達すると、(/ WDRST)リセット信号を出力します。これにより、チップリセットピン(/ XRS)がローになり、512OSCCLKサイクルが維持されます。

    2)割り込みモード。ウォッチドッグカウンターが最大値に達すると、割り込み信号(/ WDINT)が出力され、ローに引き下げられ、512 OSCCLKサイクルの間維持されます。PIE割り込みで割り込みが有効になっている場合、WAKEPIEはPIEによって応答されます。ウォッチドッグ割り込みは/ WDINT信号の立ち下がりエッジによってトリガーされるため、/ WDINT信号が無効になる前にWAKEINT割り込みが有効になっている場合、プログラムはすぐに次のWAKEINT割り込みに入るわけではなく、次のWAKEINT割り込みが次回発生します。ウォッチドッグがオーバーフローしたときに発生します。

    / WDINTがまだ有効なときにウォッチドッグが割り込みモードからリセットモードに設定されている場合、デバイスはすぐにリセットされます。ウォッチドッグをリセットモードに再構成する前に、SCSRレジスタのWDINTSビットを読み取って、現在の/ WDINT信号がまだ有効な状態にあるかどうかを判断できます。

 

5.関連レジスタ

  • システム制御およびステータスレジスタ(SCSR)

WDINTS:ウォッチドッグ割り込みステータスビット; WDENINT:ウォッチドッグ割り込みイネーブルビット; WDOVERRIDE:ウォッチドッグ保護ビット

  • ウォッチドッグカウントレジスタ(WDCNTR)

  • ウォッチドッグリセットキーレジスタ(WDKEY)

  • ウォッチドッグ制御レジスタ(WDCR)

************************************************** ************************************************** *********************************************

ハードウェア部分は終わりました、以下はソフトウェア部分です

1. Example_2833xWatchdog.c [ウォッチドッグ実験]

// TI File $Revision: /main/9 $
// Checkin $Date: April 21, 2008 15:43:50 $
//###########################################################################
//
// FILE: Example_2833xWatchdog.c
//
// TITLE: DSP2833x Watchdog interrupt test program.
//
// ASSUMPTIONS:
//
// This program requires the DSP2833x header files.
//
// As supplied, this project is configured for "boot to SARAM"
// operation. The 2833x Boot Mode table is shown below.
// For information on configuring the boot mode of an eZdsp,
// please refer to the documentation included with the eZdsp,
//
// $Boot_Table:
//
// GPIO87 GPIO86 GPIO85 GPIO84
// XA15 XA14 XA13 XA12
// PU PU PU PU
// ==========================================
// 1 1 1 1 Jump to Flash
// 1 1 1 0 SCI-A boot
// 1 1 0 1 SPI-A boot
// 1 1 0 0 I2C-A boot
// 1 0 1 1 eCAN-A boot
// 1 0 1 0 McBSP-A boot
// 1 0 0 1 Jump to XINTF x16
// 1 0 0 0 Jump to XINTF x32
// 0 1 1 1 Jump to OTP
// 0 1 1 0 Parallel GPIO I/O boot
// 0 1 0 1 Parallel XINTF boot
// 0 1 0 0 Jump to SARAM <- "boot to SARAM"
// 0 0 1 1 Branch to check boot mode
// 0 0 1 0 Boot to flash, bypass ADC cal
// 0 0 0 1 Boot to SARAM, bypass ADC cal
// 0 0 0 0 Boot to SCI-A, bypass ADC cal
// Boot_Table_End$
//
// DESCRIPTION:
//
// This program exercises the watchdog.
//
// First the watchdog is connected to the WAKEINT interrupt of the
// PIE block. The code is then put into an infinite loop.
//
// The user can select to feed the watchdog key register or not
// by commenting one line of code in the infinite loop.
//
// If the watchdog key register is fed by the ServiceDog function
// then the WAKEINT interrupt is not taken. If the key register
// is not fed by the ServiceDog function then WAKEINT will be taken.
//
// Watch Variables:
// LoopCount for the number of times through the infinite loop
// WakeCount for the number of times through WAKEINT
//
//###########################################################################
// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $
// $Release Date: August 1, 2008 $
//###########################################################################
#include "DSP2833x_Device.h" // Headerfile Include File
#include "DSP2833x_Examples.h" // Examples Include File
// Prototype statements for functions found within this file.
interrupt void wakeint_isr(void); //若PIE模块使能,看门狗中断模式时中断信号的中断子程序;
// Global variables for this example
Uint32 WakeCount;
Uint32 LoopCount;
void main(void) //主函数
{
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
InitSysCtrl(); 这部分重点看一下 //看门狗只有用到的时候才会在初始化程序中,这里有必要看一看,“Open Definitions”,下面是我拿过来的初始化函数,大家可以分析一下。
void InitSysCtrl(void)
{
// Disable the watchdog
DisableDog(); //关闭看门狗
// Initialize the PLL control: PLLCR and DIVSEL
// DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
InitPll(DSP28_PLLCR,DSP28_DIVSEL); //初始化PLL模块,初始化这部分大家看看上面理论部分的PLL修改流程图,然后看看Initpll()函数内部.这里也稍作解释,DSP28_PLLCR变量和DSP28_DIVSEL变量可以用“Open Declarations”来看,DSP28_PLLCR=10,DSP28_DIVSEL=2,即对OSCCLK系统时钟进行10倍频和2分频获得150MHz的SYSCLKOUT或CLKIN给看门狗使用。
// Initialize the peripheral clocks
InitPeripheralClocks(); //初始化外设时钟,可以“Open Definitions”看看函数的作用。我这里直接写出来:将高速外设时钟=SYSCLKOUT/2,低速外设时钟=SYSCLKOUT/4,这部分也能使能/禁止所有外设的时钟
}

// Step 2. Initalize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio(); // Skipped for this example
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
InitPieVectTable();
// Interrupts that are used in this example are re-mapped to //以上系统初始化;
// ISR functions found within this file.
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.WAKEINT = &wakeint_isr; //将中断子程序的初始地址指向中断向量表(由于中断向量表是被写保护的,所以在开头和结尾要分别加上EALLOW和EDIS)
EDIS; // This is needed to disable write to EALLOW protected registers
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
// Step 5. User specific code, enable interrupts:
// Clear the counters
WakeCount = 0; // Count interrupts //记录看门狗中断次数;
LoopCount = 0; // Count times through idle loop //记录看门狗空循环次数;
// Connect the watchdog to the WAKEINT interrupt of the PIE
// Write to the whole SCSR register to avoid clearing WDOVERRIDE bit
EALLOW;
SysCtrlRegs.SCSR = BIT1; //配置看门狗系统控制和状态寄存器,具体BIT的值可以“Open Declarations”,在这里BIT1=0x0002,即看门狗中断使能,看门狗工作在中断模式;
EDIS;
// Enable WAKEINT in the PIE: Group 1 interrupt 8
// Enable INT1 which is connected to WAKEINT:
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block //PIE开中断
PieCtrlRegs.PIEIER1.bit.INTx8 = 1; // Enable PIE Gropu 1 INT8 //看门狗中断信号GROUP1 interrupt 8
IER |= M_INT1; // Enable CPU int1 //使能CPU 通道1
EINT; // Enable Global Interrupts //全局开中断
// Reset the watchdog counter
ServiceDog(); //看门狗程序,想要查看具体函数可以“Open Definitions”,这里是定时向看门狗复位关键字寄存器写入0xAA和0x55
// Enable the watchdog
EALLOW;
SysCtrlRegs.WDCR = 0x0028; //配置看门狗控制寄存器0x0010 1000,看门狗检查位WDCHK,必须为101;写入其他只会导致看门狗立即产生复位或中断
EDIS;
// Step 6. IDLE loop. Just sit and loop forever (optional):
for(;;)
{
LoopCount++;
// Uncomment ServiceDog to just loop here
// Comment ServiceDog to take the WAKEINT instead
ServiceDog(); //“喂狗”程序,在中断(溢出)之前清零看门狗计数器
}
}
// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:
// If local ISRs are used, reassign vector addresses in vector table as
// shown in Step 5
interrupt void wakeint_isr(void)
{
WakeCount++; //正是因为有“喂狗”程序,所以中断程序应该不会被执行
// Acknowledge this interrupt to get more from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
//===========================================================================
// No more.
//===========================================================================

上で説明したプログラミングの後、シミュレーションは以下から始まります。(特定のロードプロジェクトについては、[レクチャー7]プロジェクトの作成セクションを参照してください)

ここには「フィーディングドッグ」プログラムがあるため、ウォッチドッグカウンターは定期的にクリアされ、割り込み信号は送信されず、割り込みサブルーチンは実行されません。ここでは、変数LoopCountとWakeLoopを監視します。正しい現象は、LoopCountがそれ自体で増加し続け、WakeCountが常に0であることです。

実行後:

2回目の実行:

 

さて、この講義は終わりです〜

 

 


 

ウィズから

おすすめ

転載: blog.csdn.net/qq_36171263/article/details/89599765