C 如何理解DSP的编程代码?
我的“数字信号处理器简介”课程使用C2000 Piccolo Launchpad教授数字信号处理器 现在,我完全迷路了。因为,我的老师似乎不想给我们提供任何在家学习的材料 比如说, 以下代码来自Texas Instrument的软件包C 如何理解DSP的编程代码?,c,embedded,signal-processing,microcontroller,processor,C,Embedded,Signal Processing,Microcontroller,Processor,我的“数字信号处理器简介”课程使用C2000 Piccolo Launchpad教授数字信号处理器 现在,我完全迷路了。因为,我的老师似乎不想给我们提供任何在家学习的材料 比如说, 以下代码来自Texas Instrument的软件包 //######################################################################## // //文件:f2802x_examples/timed_led_blink/Example_f2802xled
//########################################################################
//
//文件:f2802x_examples/timed_led_blink/Example_f2802xledbink.c
//
//标题:F2802x LED闪烁入门程序。
//
//组别:C2000
//目标设备:TMS320F2802x
//
//! \addtogroup示例\u列表
//! LED闪烁
//!
//! 此示例将CPU定时器0配置为500毫秒,并进行切换
//! GPIO0-4指示灯每中断一次。出于测试目的,以下示例
//! 每次定时器断言中断时,也会增加一个计数器。
//!
//! 监视变量:
//! - 中断计数
//!
//! 监控GPIO0-4 LED闪烁(500毫秒)和闪烁(500毫秒)
//! 在2802x0控制卡上。
//
//(C)2012年德克萨斯仪器公司版权所有。
//#############################################################################
//$TI发布:包名称$
//$发布日期:软件包发布日期$
//#############################################################################
#包括“DSP28x_Project.h”//设备头文件,示例包括文件
#包括“f2802x_公共/include/adc.h”
#包括“f2802x_公共/包括/时钟h”
#包括“f2802x_公共/include/flash.h”
#包括“f2802x_公共/include/gpio.h”
#包括“f2802x_公共/include/pie.h”
#包括“f2802x_公共/包括/锁相环h”
#包括“f2802x_公共/include/timer.h”
#包括“f2802x_公共/include/wdog.h”
//在此文件中找到的函数的原型语句。
__中断无效cpu\u定时器0\u isr(无效);
uint16\u t中断计数=0;
ADC_Handle myAdc;
CLK_Handle myClk;
闪光灯(我的闪光灯);;
GPIO_处理myGpio;
我的馅饼;
定时器\我的定时器;
真空总管(真空)
{
CPU_处理myCpu;
PLL_手柄myPll;
WDOG_Handle myWDog;
//初始化此应用程序所需的所有句柄
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));
//执行基本系统初始化
WDOG_禁用(myWDog);
时钟启用时钟(myClk);
(*设备校准)();
//选择内部振荡器1作为时钟源
时钟设置OscSrc(myClk,时钟OscSrc内部);
//为x10/2设置PLL,其将产生50Mhz=10Mhz*10/2
PLL_设置(myPll、PLL_乘法器_10、PLL_divide选择_ClkIn_by_2);
//禁用饼图和所有中断
PIE_禁用(myPie);
反对派(myPie);
CPU_禁用全局链接(myCpu);
CPU_clearIntFlags(myCpu);
//如果从闪存复制RAM运行,则只能将功能复制到RAM
#ifdef_闪存
memcpy(&RamfuncsRunStart,&RamfuncsLoadStart,(size\u t)&RamfuncsLoadSize);
#恩迪夫
//设置调试向量表并启用饼图
PIE_SetDebuggIntVectorTable(myPie);
PIE_启用(myPie);
//在饼图向量表中注册中断处理程序
PIE\u registerPieIntHandler(myPie、PIE\u GroupNumber\u 1、PIE\u SubGroupNumber\u 7、(intVec\u t)和cpu\u Timer 0\u isr);
//将CPU计时器0配置为每500毫秒中断一次:
//60MHz CPU频率,50毫秒周期(以秒为单位)
//配置cputimer(&CpuTimer0,60,500000);
计时器停止(myTimer);
定时器设置周期(myTimer,50*500000);
定时器设置预分频器(myTimer,0);
重新加载计时器(myTimer);
定时器\设置仿真模式(myTimer,定时器\仿真模式\下一次减量后停止);
计时器启用点(myTimer);
定时器启动(myTimer);
//将GPIO 0-3配置为输出
GPIO_设置模式(myGpio、GPIO_编号_0、GPIO_0模式_一般用途);
GPIO_设置模式(myGpio、GPIO_编号_1、GPIO_0_模式_一般用途);
GPIO_设置模式(myGpio、GPIO_编号_2、GPIO_0_模式_一般用途);
GPIO_设置模式(myGpio、GPIO_编号_3、GPIO_0_模式_一般用途);
GPIO_设置方向(myGpio、GPIO_编号_0、GPIO_方向_输出);
GPIO_设置方向(myGpio、GPIO_编号_1、GPIO_方向_输出);
GPIO_设置方向(myGpio、GPIO_编号_2、GPIO_方向_输出);
GPIO_设置方向(myGpio、GPIO_编号_3、GPIO_方向_输出);
GPIO_设置低(myGpio,GPIO_编号为0);
GPIO_设置高(myGpio,GPIO_编号_1);
GPIO_setLow(myGpio,GPIO_编号_2);
GPIO_设置高(myGpio,GPIO_编号_3);
//启用连接到CPU计时器0的CPU INT1:
CPU_enableInt(myCpu,CPU_IntNumber_1);
//在饼图中启用TINT0:组1中断7
PIE_enableTimer0Int(myPie);
//启用全局中断和更高优先级的实时调试事件
CPU_enableGlobalInts(myCpu);
CPU_enableDebugInt(myCpu);
对于(;;){
__asm(“NOP”);
}
}
__中断无效cpu\U定时器0\U isr(无效)
{
中断计数++;
//切换GPIOs
GPIO_切换(myGpio,GPIO_编号_0);
GPIO_切换(myGpio,GPIO_编号_1);
GPIO_切换(myGpio、GPIO_编号_2);
GPIO_切换(myGpio、GPIO_编号_3);
//确认此中断以接收来自组1的更多中断
PIE_clearInt(myPie,PIE_GroupNumber_1);
}
//===========================================================================
//没有了。
//===========================================================================
正如我所看到的,这里发生了很多事情。但是,我找不到学习编码C2000的基础知识的地方
我有一些巴西威士忌
//########################################################################
//
// 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.
//===========================================================================
cat /proc/interrupts