gpt4 book ai didi

c - 如何理解这段DSP编程代码?

转载 作者:行者123 更新时间:2023-11-30 20:51:14 25 4
gpt4 key购买 nike

我的“数字信号处理器简介”类(class)使用 C2000 Piccolo Launchpad 来教授数字信号处理器。

目前,我完全迷失了。因为,我的老师似乎没有兴趣为我们提供任何在家学习的 Material 。

例如,

以下代码来自德州仪器的controlSUITE包。

//########################################################################
//
// File: f2802x_examples/timed_led_blink/Example_F2802xLedBlink.c
//
// Title: F2802x LED Blink Getting Started Program.
//
// Group: C2000
// Target Device: TMS320F2802x
//
//! \addtogroup example_list
//! <h1>LED Blink</h1>
//!
//! This example configures CPU Timer0 for a 500 msec period, and toggles
//! the GPIO0-4 LEDs once per interrupt. For testing purposes, this example
//! also increments a counter each time the timer asserts an interrupt.
//!
//! Watch Variables:
//! - interruptCount
//!
//! Monitor the GPIO0-4 LEDs blink on (for 500 msec) and off (for 500 msec)
//! on the 2802x0 control card.
//
// (C) Copyright 2012, Texas Instruments, Inc.
//#############################################################################
// $TI Release: PACKAGE NAME $
// $Release Date: PACKAGE RELEASE DATE $
//#############################################################################

#include "DSP28x_Project.h" // Device Headerfile and Examples Include File

#include "f2802x_common/include/adc.h"
#include "f2802x_common/include/clk.h"
#include "f2802x_common/include/flash.h"
#include "f2802x_common/include/gpio.h"
#include "f2802x_common/include/pie.h"
#include "f2802x_common/include/pll.h"
#include "f2802x_common/include/timer.h"
#include "f2802x_common/include/wdog.h"

// Prototype statements for functions found within this file.
__interrupt void cpu_timer0_isr(void);

uint16_t interruptCount = 0;

ADC_Handle myAdc;
CLK_Handle myClk;
FLASH_Handle myFlash;
GPIO_Handle myGpio;
PIE_Handle myPie;
TIMER_Handle myTimer;

void main(void)
{

CPU_Handle myCpu;
PLL_Handle myPll;
WDOG_Handle myWDog;

// Initialize all the handles needed for this application
myAdc = ADC_init((void *)ADC_BASE_ADDR, sizeof(ADC_Obj));
myClk = CLK_init((void *)CLK_BASE_ADDR, sizeof(CLK_Obj));
myCpu = CPU_init((void *)NULL, sizeof(CPU_Obj));
myFlash = FLASH_init((void *)FLASH_BASE_ADDR, sizeof(FLASH_Obj));
myGpio = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
myPie = PIE_init((void *)PIE_BASE_ADDR, sizeof(PIE_Obj));
myPll = PLL_init((void *)PLL_BASE_ADDR, sizeof(PLL_Obj));
myTimer = TIMER_init((void *)TIMER0_BASE_ADDR, sizeof(TIMER_Obj));
myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));

// Perform basic system initialization
WDOG_disable(myWDog);
CLK_enableAdcClock(myClk);
(*Device_cal)();

//Select the internal oscillator 1 as the clock source
CLK_setOscSrc(myClk, CLK_OscSrc_Internal);

// Setup the PLL for x10 /2 which will yield 50Mhz = 10Mhz * 10 / 2
PLL_setup(myPll, PLL_Multiplier_10, PLL_DivideSelect_ClkIn_by_2);

// Disable the PIE and all interrupts
PIE_disable(myPie);
PIE_disableAllInts(myPie);
CPU_disableGlobalInts(myCpu);
CPU_clearIntFlags(myCpu);

// If running from flash copy RAM only functions to RAM
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif

// Setup a debug vector table and enable the PIE
PIE_setDebugIntVectorTable(myPie);
PIE_enable(myPie);

// Register interrupt handlers in the PIE vector table
PIE_registerPieIntHandler(myPie, PIE_GroupNumber_1, PIE_SubGroupNumber_7, (intVec_t)&cpu_timer0_isr);

// Configure CPU-Timer 0 to interrupt every 500 milliseconds:
// 60MHz CPU Freq, 50 millisecond Period (in uSeconds)
// ConfigCpuTimer(&CpuTimer0, 60, 500000);
TIMER_stop(myTimer);
TIMER_setPeriod(myTimer, 50 * 500000);
TIMER_setPreScaler(myTimer, 0);
TIMER_reload(myTimer);
TIMER_setEmulationMode(myTimer, TIMER_EmulationMode_StopAfterNextDecrement);
TIMER_enableInt(myTimer);

TIMER_start(myTimer);

// Configure GPIO 0-3 as outputs
GPIO_setMode(myGpio, GPIO_Number_0, GPIO_0_Mode_GeneralPurpose);
GPIO_setMode(myGpio, GPIO_Number_1, GPIO_0_Mode_GeneralPurpose);
GPIO_setMode(myGpio, GPIO_Number_2, GPIO_0_Mode_GeneralPurpose);
GPIO_setMode(myGpio, GPIO_Number_3, GPIO_0_Mode_GeneralPurpose);

GPIO_setDirection(myGpio, GPIO_Number_0, GPIO_Direction_Output);
GPIO_setDirection(myGpio, GPIO_Number_1, GPIO_Direction_Output);
GPIO_setDirection(myGpio, GPIO_Number_2, GPIO_Direction_Output);
GPIO_setDirection(myGpio, GPIO_Number_3, GPIO_Direction_Output);

GPIO_setLow(myGpio, GPIO_Number_0);
GPIO_setHigh(myGpio, GPIO_Number_1);
GPIO_setLow(myGpio, GPIO_Number_2);
GPIO_setHigh(myGpio, GPIO_Number_3);

// Enable CPU INT1 which is connected to CPU-Timer 0:
CPU_enableInt(myCpu, CPU_IntNumber_1);

// Enable TINT0 in the PIE: Group 1 interrupt 7
PIE_enableTimer0Int(myPie);

// Enable global Interrupts and higher priority real-time debug events
CPU_enableGlobalInts(myCpu);
CPU_enableDebugInt(myCpu);

for(;;){
__asm(" NOP");
}

}

__interrupt void cpu_timer0_isr(void)
{
interruptCount++;

// Toggle GPIOs
GPIO_toggle(myGpio, GPIO_Number_0);
GPIO_toggle(myGpio, GPIO_Number_1);
GPIO_toggle(myGpio, GPIO_Number_2);
GPIO_toggle(myGpio, GPIO_Number_3);

// Acknowledge this interrupt to receive more interrupts from group 1
PIE_clearInt(myPie, PIE_GroupNumber_1);
}

//===========================================================================
// No more.
//===========================================================================

正如我所见,这里发生了很多事情。但是,我找不到学习 C2000 编码基础知识的地方。

我有一些基本问题:

(1) __interrupt 是什么意思?和__asm关键词呢?在哪里可以找到这些关键字的引用?

(2) 我如何知道我需要多少个句柄?例如,对于这个 LED 闪烁应用程序,他们声明了 9 个句柄。为什么?

(3)什么是“基址”?

(4) 为什么 WachDog 被禁用?为什么 PIE 和 CPU 及其中断被禁用?

(5)什么是定时器预标量?

(6)什么是定时器仿真模式?

(7) GPIO_setmode 的作用是什么?该模式是关于什么的?

(8) 我可以从哪里开始了解所有这些细节?

这是一个很好的开始 Material 还是浪费时间? http://www.ti.com/lit/ug/spru430f/spru430f.pdf

最佳答案

  1. __interrupt 和 __asm 关键字有什么作用?在哪里可以找到这些关键字的引用?

__interrupt 告诉编译器用适合平台的代码包装函数,通常是保存和恢复函数使用的寄存器,这样被中断的代码就不会受到影响,并以“return”返回从中断”指令而不是“从子程序返回”指令

__asm 告诉编译器在编译器的输出发送到汇编器之前插入机器级指令

  • 我如何知道我需要多少个句柄?例如,对于这个 LED 闪烁应用程序,他们声明了 9 个句柄。为什么?
  • 因为代码使用了 TI 库和头文件定义的九个硬件子系统

  • 什么是“基址”?
  • 在硬件中,有一组寄存器控制I/O、定时器等硬件功能。每组寄存器都分配有一个内存范围,从基地址开始。可能有多个相同的组,例如多个计时器。通过为每个组使用基地址,可以在所有实例之间共享处理该功能的代码(例如计时器)。

  • 为什么 WachDog 被禁用?为什么 PIE 和 CPU 及其中断被禁用?
  • 我怀疑正在执行的任何初始化都需要比看门狗间隔更长的时间,因此将其禁用以防止 CPU 被看门狗重置

  • 什么是定时器预标量?
  • 它是定时器源时钟的分频器,用于为定时器创建适当的分辨率和范围

  • 什么是定时器仿真模式?
  • 我不知道。也许这只是“模式”的一个奇怪的名字。或者它可能是一种传统模式。

  • GPIO_setmode 有什么作用?该模式是关于什么的?
  • GPIO 硬件必须具有选项,例如,将中断附加到边缘,或更改转换速率或迟滞,或许多事情中的任何一个。

  • 我可以从哪里开始了解所有这些详细信息?
  • C2000 Piccolo 引用手册C2000 Piccolo 数据表编译器文档controlSUITE包文档

    关于c - 如何理解这段DSP编程代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33814377/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com