This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] ADC 的 TMS320C5505计时器中断

Guru**** 2924210 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/665000/tms320c5505-timer-interrupt-for-adc

尊敬的:

以下是我的代码。

我希望在每1ms 延迟后读取 ADC 通道。

我也遵循了 TI 的计时器指南和示例代码...

但是、我每400ms 而不是1ms 收到一次准确的1ms..it 点击量。请仔细检查并告诉我什么是问题。

#include
#include "CSL_GPT.h"
#include "cSL_intc.h"
#include

#include "cSL_UART.h"
#include "CSL_uartAux.h"
#include "cSL_sysctrl.h"
#include "usbstk5515.h"
#include "usbstk5515_UART.h"

#include "usbstk5515_gpio.h"
#include "usbstk5515_led.h"

#define SARCTRL ((ioport volatile unsigned*) 0x7012)
#define SARDATA ((ioport volatile unsigned*) 0x7014)
#define SARCLKCTRL ((ioport volatile unsigned*) 0x7016)
#define SARPINCTRL ((ioport volatile unsigned*) 0x7018)
#define SARGPOCTRL ((ioport volatile unsigned*) 0x701A)

#define SYS_PCGCR1 *(volatile ioport UINT16*)(0x1c02)
#define SYS_PCGCR2 *(volatile ioport UINT16*)(0x1c03)

#define WR_STR_LEN (80u)
#define RD_STR_LEN (10U)

#define CSL_PLL_DIV_000 (0)
#define CSL_PLL_DIV_001 (1U)
#define CSL_PLL_DIV_002 (2U)
#define CSL_PLL_DIV_003 (3U)
#define CSL_PLL_DIV_004 (4U)
#define CSL_PLL_DIV_005 (5U)
#define CSL_PLL_DIV_006 (6U)
#define CSL_PLL_DIV_007 (7U)

#define CSL_PLL_CLOCKIN (32768u)

#define PLL_CNTL1 *(ioport volatile unsigned *) 0x1C20
#define PLL_CNTL2 *(ioport volatile unsigned *) 0x1C21
#define PLL_CNTL3 *(ioport volatile unsigned *) 0x1C22
#define PLL_CNTL4 *(ioport volatile unsigned *) 0x1C23


#define CSL_TEST_FAILED (1U)
#define CSL_TEST_PASSED(0)

extern void VECSTART (void);
uint32 cpucycleCount = 0;
uint32 SYSCLK;
易失性 UINT16 hitIsr = 0;


int adc_out[65]=0、Tx_data_lsb、Tx_data_msb、i=0、j、count=0、count_int;
int adc_data[1300];
int adc_single_data=0;
char *str={"\n ADC data:"};
char msg[]={"};
char msg1='s';
char *wrbuffer;
char *结果;
CSL_Handle hGpt;

int32 read_GPAIN1 (void);
void Init_SAR (void);
int16 EVM5515_UART_open();
int16 CSL_gptIntTest (void);
uint32 getSysClk (void);
void Send_data (int adc_data);
/**
*\brief GPT 中断服务例程
*
*\param none
*
*\不返回任何内容
*
中断空 gpt0Isr (空)

hitIsr = true;

/*清除定时器中断聚合标志寄存器(TIAFR)*/
CSL_SYSCTRL_REGS->TIAFR = 0x01;

//USBSTK5515_ULED_ON (4);
USBSTK5515_ULED_OFF (3);
USBSTK5515_waitusec (1000);
USBSTK5515_ULED_ON (3);
USBSTK5515_waitusec (1000);
/*for (i=0;msg[i]!='\0';i++)

while ((UART_LSR & 0x60)=0);//等待 TX 就绪
EVM5515_UART_putChar (msg[i]);//写入1个字节

}*/

//Send_data (ADC_Single_data);

for (i=0;i<100;i++)

adc_out[i]=read_GPAIN1 ();

//发送数据(ADC_OUT[i]);


COUNT_INT++;
printf ("\n 计数值=%d\n"、count_int);

IRQ_CLEAR (TINT_EVENT);


void main (void)


int i=0;
SYS_PCGCR1=0;//init 时钟
SYS_PCGCR2=0;//init 时钟
SYS_EXBUSSEL = 0x0A00;//启用外部总线上的用户 LED

//USBSTK5515_GPIO_setDirection (18、GPIO_OUT);
USBSTK5515_ULED_INIT ();

EVM5515_UART_OPEN ();
printf ("\nadc testing");

init_SAR ();

/*for (j=0;j<20;j++)

csl_gptIntertTest();


while (i!=1240)

ADC_DATA[i]= ADC_OUT[i];
i++;
}*/
while (1)

// printf (“i 的值=%d”,i);
csl_gptIntertTest();


void Send_data (int adc_data)

TX_DATA_lsb=(ADC_DATA&0xFF);//lsb
TX_DATA_MSB=((ADC_DATA>>8)&0xFF);//MSB

while ((UART_LSR & 0x60)=0);//等待 TX 就绪
EVM5515_UART_putChar (Tx_DATA_lsb);//写入1个字节

USBSTK5515_waitusec (1000);

EVM5515_UART_putChar (Tx_DATA_MSB);//写入1个字节
USBSTK5515_waitusec (1000);

空 Init_SAR (空)

//*SARCTRL = 0x4000;//选择 CH4、GPAIN2
* SARCTRL = 0x3400;//选择 AIN3、即 GPAIN1
* SARCLKCTRL = 0x0031;// 100/50 = 2MHz
* SARPINCTRL = 0x7104;//基于带隙的基准电压设置为0.8V。
* SARGPOCTRL = 0;
返回;

Int32 READ_GPAIN1 (空)

int32 val=0;
uint16 i;

//bit15=SoC、位14 13 12 iE 011、因此选择 ch3、位10=1进行一次转换。
//* SARCTRL = 0xB400;//对于 ch3单转换
* SARCTRL = 0xB800;//对于 ch3连续转换
//* SARCTRL = 0xC000;//CH4连续转换

while (1)

对于(i=0;i<50;i++)
asm (" nop");
Val =* SARDATA;
//val=(val/1023);
if ((val&0x8000)==0)

中断;

返回 val;

int16 CSL_gptIntTest (void)

CSL_Status 状态;
CSL_Config hwconfig;
CSL_GptObj GptObj;
uint32 cpucycleDelta;

hitIsr = false;
状态= 0;

/*获取 CPU 当前运行的系统时钟值*/
SYSCLK = getSysClk ();

/* CPU 时钟周期为 SYSCLK"值的1%*/
cpucycleDelta =(SYSCLK/100);

printf ("\n\n\nCPU 时钟以%ldKHz 运行\n"、SYSCLK);
printf ("定时器预分频器分频值设置为4分频\n");
printf ("GPT 以 CPU 系统时钟的1/4速率运行\n"\};
printf ("GPT 计数初始化为每毫秒1/4个 CPU 时钟周期\n"\});
printf ("参考 CPU 时钟 GPT 需要1毫秒时间将计时器倒计时为0\n");
printf ("因此 CPU 应执行大约%ld (±1%)个时钟周期"、SYSCLK);
printf ("从计时器开始到计时器过期");

/*打开 CSL GPT 模块*/
hGpt = gpt_open (gpt_0、&gptObj、&status);
if ((NULL =hGpt)||(CSL_Sok!= status))

printf ("GPT 打开失败\n");
返回(CSL_TEST_FAILED);

其他

printf ("GPT 打开成功\n");

/*重置 GPT 模块*/
STATUS = GPT_RESET (hGpt);
if (CSL_SOK!=状态)

printf ("GPT 重置失败\n"\});
返回(CSL_TEST_FAILED);

其他

printf ("GPT 重置成功\n");

/*清除所有挂起的中断*/
IRQ_CLEARALL();

/*禁用所有中断*/
IRQ_disableAll();

IRQ_setVecs ((uint32)(&VECSTART));
IRQ_plug (tint_event、&gpt0Isr);
IRQ_ENABLE (TINT_EVENT);

hwConfig.autoLoad = GPT_AUTO_ENABLE;
hwconfig.ctrlTim = gp_t_timer_enable;
hwconfig.preScaleDiv = gpt_pre_sc_DIV_1;
//持续1ms
// hwconfig.prdLow =(SYSCLK)/4;
//hwconfig.prdHigh = 0x0000;

hwconfig.prdLow =((SYSCLK)*5)&0xFFFF);
hwconfig.prdHigh =((((SYSCLK)*5)>16);
// 20ms 5*SYSCLK=5*262000=1310000=13FD30
//对于1000ms=1sec=250*SYSCLK=250*262000=65500000=03E77360
//hwconfig.prdLow = 0x7360;
//hwconfig.prdHigh = 0x03E7;

/*配置 GPT 模块*/
status = gpt_config (hGpt、hwconfig);
if (CSL_SOK!=状态)

printf ("GPT 配置失败\n");
返回(CSL_TEST_FAILED);

其他

printf ("GPT 配置成功\n");

/*启用 CPU 中断*/
IRQ_globalEnable();

/*启动计时器*/
GPT_START (hGpt);

/*等待计时器中断*/
/*此循环需要12个 CPU 周期才能在迭代时执行。
因此、CPU 在启动计时器后一直执行到
计时器到期时间为12*cpucycleCount。 *
while (hitIsr!= true)

cpucycleCount++;

/*禁用 CPU 中断*/
IRQ_globalDisable();

/*清除所有挂起的中断*/
IRQ_CLEARALL();

/*禁用所有中断*/
IRQ_disableAll();

/*停止计时器*/
STATUS = GPT_STOP (hGpt);
if (CSL_SOK!=状态)

printf ("GPT 停止失败\n");
返回(CSL_TEST_FAILED);

其他

printf ("GPT 停止成功\n");

STATUS = GPT_RESET (hGpt);

/*显示执行的 CPU 周期数*/
printf ("\n 定时器计数达到零\n");
cpucycleCount *= 12;
printf ("\n\n 在定时器启动后直到定时器到期时执行的 CPU 周期数:");
printf ("%ld\n"、cpucycleCount);

/*如果"cpuCycles"值在范围内、则测试通过
(((SYSCLK)±(SYSCLK 的1%))*/
if ((((cpuCycleCount - cpuCycleDelta)< SYSCLK)&&
((cpuCycleCount + cpuCycleDelta)> SYSCLK))

printf ("GPT 正以配置的速率运行!\n\n");

其他

printf ("GPT 未以配置的速率运行!\n\n");
返回(CSL_TEST_FAILED);

/*关闭 GPT 模块*/
status = gpt_close (hGpt);
if (CSL_SOK!=状态)

printf ("GPT 关闭失败\n");
返回(CSL_TEST_FAILED);

返回(CSL_TEST_PASSED);


#IF (已定义(CHIP_C5505_C5515)||已定义(CHIP_C5504_C5514)

uint32 getSysClk (空)

bool pllRDB旁 路;
bool pllOutDiv;
uint32 SYSCLK;
uint16 pllM;
uint16 pllRD;
uint16 pllOD;

pllM = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR1、SYS_CGCR1_M);

pllRD = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR2、SYS_CGCR2_RDRATIO);
pllOD = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR4、SYS_CGCR4_ODRATIO);

PLLRDB旁 路= CSL_FEXT (CSL_SYSCTRL_REGS->CGCR2、SYS_CGCR2_RDBYPASS);
pllOutDiv = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR4、SYS_CGCR4_OUTDIVEN);

SYSCLK = CSL_PLL_CLOCKIN;

如果(0 = pllRDB旁 路)

SYSCLK = SYSCLK/(pllRD + 4);

SYSCLK =(SYSCLK *(pllM + 4));

如果(1 = pllOutDiv)

SYSCLK = SYSCLK/(pllOD + 1);

/*返回以 KHz 为单位的系统时钟值*/
RETURN (SYSCLK/1000);

#Elif (定义的(CHIP_C5517))
uint32 getSysClk (空)

uint32 SYSCLK;
浮点乘法器;
uint16 OD;
uint16 OD2;
UINT16 RD、REFCLK;
uint32 temp1、temp2、temp3、VCO;
uint16 DIV;

TEMP2 = PLL_CNTL2;
temp3 =(temp2 & 0x8000)<<1;
TEMP1 = temp3 + PLL_CNTL1;
乘法器= temp1/256 +1;
Rd =(PLL_CNTL2 & 0x003F);

REFCLK = 12000/(RD+1);

VCO =乘法器*(uint32) REFCLK;

OD =(PLL_CNTL4和0x7);

SYSCLK = VCO/(OD+1);

OD2 =(((PLL_CNTL4 >> 10)和0x1F);

IF (PLL_CNTL3 & 0x8000)// PLL 旁路
SYSCLK = REFCLK;
其他
SYSCLK = VCO/(OD+1);

if ((PLL_CNTL4 & 0x0020)=0)/* OutDiv2 */
SYSCLK = SYSCLK /(2*(OD2+1));

/*返回以 KHz 为单位的系统时钟值*/
返回(SYSCLK);

其他

uint32 getSysClk (空)

bool pllRDB旁 路;
bool pllOutDiv;
bool pllOutDiv2;
uint32 SYSCLK;
uint16 pllvp;
uint16 pllvs;
uint16 pllRD;
uint16 pllVO;
uint16 pllDivider;
uint32 pll 乘法器;

pllVP = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR1、SYS_CGCR1_MH);
pllVS = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR2、SYS_CGCR2_ML);

pllRD = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR2、SYS_CGCR2_RDRATIO);
pllVO = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR4、SYS_CGCR4_ODRATIO);

PLLRDB旁 路= CSL_FEXT (CSL_SYSCTRL_REGS->CGCR2、SYS_CGCR2_RDBYPASS);
pllOutDiv = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR4、SYS_CGCR4_OUTDIVEN);
pllOutDiv2 = CSL_FEXT (CSL_SYSCTRL_REGS->CGCR4、SYS_CGCR4_OUTDIV2BYPASS);
pllDivider =((pllOutDiv2)|(pllOutDiv << 1)|(pllRDB旁 路<< 2));

pllMultiplier =((uint32) CSL_PLL_CLOCKIN *((pllVP << 2)+ pllVS + 4));

开关(pllDivider)

CSL_PLL_DIV_000案例:
CSL_PLL_DIV_001案例:
SYSCLK =乘法器/(pllRD + 4);
中断;

CSL_PLL_DIV_002案例:
SYSCLK =乘法器/((pllRD + 4)*(pllVO + 4)* 2);
中断;

案例 CSL_PLL_DIV_003:
SYSCLK =乘法器/((pllRD + 4)* 2);
中断;

案例 CSL_PLL_DIV_004:
CSL_PLL_DIV_005案例:
SYSCLK =乘法器;
中断;

CSL_PLL_DIV_006案例:
SYSCLK =乘法器/((pllVO + 4)* 2);
中断;

CSL_PLL_DIV_007案例:
SYSCLK =乘法器/2;
中断;

/*返回以 KHz 为单位的系统时钟值*/
RETURN (SYSCLK/1000);

#endif

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的:

    以下是我的代码。

    我希望在每1ms 延迟后读取 ADC 通道。

    我也遵循了 TI 的计时器指南和示例代码...

    但是、我每400ms 而不是1ms 收到一次准确的1ms..it 点击量。请仔细检查并告诉我什么是问题。

    e2e.ti.com/.../8407.timer.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已通知软件团队。

    此致、
    Yordan