主题:CC2540中讨论的其他部件
我尝试用计时器和DMA来组成一个shim。 在DMA的帮助下,我想在计时器的比较寄存器中记下这些值。 我花费了初始化时间,但由于某种原因,DMA上的中断不起作用。 请帮帮我。
静态uint8 a;
静态uint8低= 0x0C;
静态uint8高= 0x1A;
静态uint8 comp_mas[24];
DMA_DESC T3_DMA;
void rgm_init(void)
{
#IF已定义( CC2540_MINIDK )
//RGB подсоединен к P1_4
//Будем использовать 计时器3通道1
PERCFG >=~0x20;//计时器3备用位置1
P1DIR |= 0x10;// P1_4 =输出
T3CTL &=~0xE0;//预校准器= 1
T3CTL &=~0x10;//停止计时器3 (如果正在运行)
T3CTL &=~0x08;//禁用计时器3溢出中断
T3CTL |= 0x02;//计时器3模式= 1 -模数
T3CCTL0 &=~0x40;//禁用通道0中断
T3CCTL0 |= 0x04;// Ch0模式=比较
T3CCTL1 &=~0x40;//启用通道1中断
T3CCTL1 |= 0x04;// Ch1模式=比较
T3CCTL1 |= 0x20;//通道1输出比较模式=100
#endif
}
//Процедура Отправки данных RGB
void rgm_start( UINT32 mas )
{
UINT32 A;
rgm_init();
A = 0x80万;
对于(i=0;i < 24;i++)
{
如果((mas和a)= 0x00)
{
comp_mas[i]=低;
}
否则
{
comp_mas[i]=高;
}
A = A >> 1;
}
T3CTL |= 0x04;//清除计时器3.
T3CC0 = 0x28;//Установим значение до которого считать(частота 32МГц(0.0.3125万 мкс,период 1.25 мкс)
T3CC1 = comp_mas[0];
timerStartDma (&T3_DMA,(&comp_mas[1]));
P1SEL |= 0x10;
T3CTL |= 0x10;//启动计时器
同时(1)
{
}
T3CTL &=~0x10;//停止计时器3.
P1SEL &=~0x10;
P1_4 = 0;
}
void timerStartDma (DMA_DESC *timerDmaDescr,
UINT8 *时间/会议/会议/会议/会议/会议/会议/会议
{
timerDmaDescr ->SRCADDRH =(无符号短整型)(TimerBuf)>8;
timerDmaDescr ->SRCADDRL =(无符号短整型)(TimerBuf);
timerDMaDescr -> DESTADDRH = 0x70;
timerDMaDescr -> DESTADDRL = 0xCF;
timerDmaDescr -> LENH = 0x00;
TimerDmaDescr -> LENL =23;
timerDmaDescr -> VLEN = HAL_DMA_VLEN_USE_LEN;
timerDmaDescr ->WORDSIZE = HAL_DMA_WORDSIZE_BYTE;
timerDmaDescr -> TMODE = HAL_DMA_TMODE_single;
timerDmaDescr -> trig = HAL_DMA_TRIG _T3_CH0;
timerDmaDescr ->SRCINC = HAL_DMA_SRCINC_1;
timerDmaDescr ->DESTINC = HAL_DMA_DSTINC_0;
timerDmaDescr ->IRQMACK = HAL_DMA_IRQMASK_ENE;
timerDmaDescr ->M8 = HAL_DMA_M8_USE_8_bits;
timerDmaDescr ->优先级= HAL_DMA_PRI_HIGH;
DMA0CFGH =(unsigned char)((unsigned short) timerDmaDesc>>8);
DMA0CFGL =(unsigned char)((unsigned short) timerDmaDescr & 0xFF);
DMAARM = 0x01;
ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");
ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");
ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");
ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");
ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");
ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");ASM ("NOP");
ASM ("NOP");ASM ("NOP");ASM ("NOP");
IEN0 |= 0x80;
IEN1 |= 0x01;
IRCON &=~0x01;
}
_pragma (向量= dma_vector)
__interrupt void DMA_ISR(void)
{
IRCON &=~0x01;
IF (DMAIRQ和0x02)
{
DMAIRQ &=~0x02;
}
}