初级会员

- 积分
- 75
- 金钱
- 75
- 注册时间
- 2016-6-28
- 在线时间
- 35 小时
|
10金钱
大家好,我有个模块在debug调试的时候没有问题,复位执行或者断电重启执行都有问题。所以想问问大家debug和实际运行有什么区别?优化等级设置的level 0 ?执行时间?
大概流程是这样:
将程序编译并烧录到MCU后,按复位键执行,发送0x56开头的小量数据一切正常,
发送0x55开头的一万个数据后,无法再接收任何电脑发过来的数据。
问题应该是DMA接收这边,因为串口接收指示灯没有反应,说明没有接收到数据,示波器测量PA3即串口RX引脚有数据。
0X55数据有一万个左右,DMA接收长度设置为2626个,后面的数据不需要。
CNDTR到0后执行无线发送,延时等待其余数据传输完成,再重新设置CNDTR长度,并启用DMA传输。
以下为接收部分代码
[mw_shl_code=c,true] /*********************************************************************************/
if (DMA1_Channel5->CNDTR < DMA_URX_LEN) //无线发送
{
while (1) //等待串口接收完成
{
i=DMA1_Channel5->CNDTR;
Delay_ms(10);
if (i==DMA1_Channel5->CNDTR) break ;
}
USART_RX=1;
if (RS485_RX_LEN==0){RS485_RX_LEN=DMA_URX_LEN;}
for (j=0;j<DMA_URX_LEN-j;j++)
{
if(RS485_RX_BUF[j]!=0x00)
{
RS485_RX_NUM=j;
break;
}
}
RS485_RX_LEN=DMA_URX_LEN-i-RS485_RX_NUM+1;
NRF24L01_TX_Mode();
switch (RS485_RX_BUF[RS485_RX_NUM])
{
case 0x55:
{
for (i=RS485_RX_NUM+1313;i<RS485_RX_LEN;i=i+30)
{
if(i+30<RS485_RX_LEN)
{
Delay_ms(20);
if(NRF24L01_TxPacket(i,0,30+RadioTx_num)!=TX_OK)
{
RadioTx_failnum++;
}
RadioTx_num++;
}
else
{
Delay_ms(20);
if(NRF24L01_TxPacket(i,1,DMA_URX_LEN-i)!=TX_OK)
{
RadioTx_failnum++;
}
RadioTx_num++;
}
}
Delay_ms(5000); //等待剩余数据传输完成
break;
}
case 0x56:
{
for (i=RS485_RX_NUM;i<RS485_RX_LEN;i=i+30)
{
if(i+30<RS485_RX_LEN)
{
Delay_ms(20);
if(NRF24L01_TxPacket(i,0,30+RadioTx_num)!=TX_OK)
{
RadioTx_failnum++;
}
RadioTx_num++;
}
else
{
Delay_ms(20);
if(NRF24L01_TxPacket(i,1,RS485_RX_LEN-i+RS485_RX_NUM)!=TX_OK)
{
RadioTx_failnum++;
}
RadioTx_num++;
}
}
break;
}
}
USART_RX=0; //LED指示
USART_DE=0; //485芯片接收使能
MYDMA_Enable_RX(); //DMA接收使能
Delay_ms(5);
NRF24L01_RX_Mode(); //无线接收模式使能
} //无线发送
/*********************************************************************************/
[/mw_shl_code]
void MYDMA_Enable_RX(void)
{
USART_DE=0;
Delay_ms(1);
DMA1_Channel5->CCR&=~(1<<0); //关闭DMA传输
DMA1_Channel5->CNDTR=DMA_URX_LEN+1; //DMA1,传输数据量
DMA1_Channel5->CCR|=1<<0; //开启DMA传输
}
|
|