尊敬的:
以下是我的代码。
我希望在每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