OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2738|回复: 2

keil5 debug调试和实际执行有什么区别

[复制链接]

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-6-28
在线时间
35 小时
发表于 2018-12-22 11:38:48 | 显示全部楼层 |阅读模式
10金钱
大家好,我有个模块在debug调试的时候没有问题,复位执行或者断电重启执行都有问题。所以想问问大家debug和实际运行有什么区别?优化等级设置的level 0 ?执行时间?


大概流程是这样:
无标题.png

将程序编译并烧录到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传输
}          


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-6-28
在线时间
35 小时
 楼主| 发表于 2018-12-22 22:25:10 | 显示全部楼层
经过测试,防止DMA->CNDTR 倒计到0 ,并且485芯片设置为发送模式再切换回接收模式 可以解决问题。
难道是 DMA1_Channel5->CNDTR=DMA_URX_LEN+1; 没能重新装载?

#define DMA_URX_LEN         2700        //串口最大接收长度


        if (DMA1_Channel5->CNDTR < DMA_URX_LEN) //无线发送
        {
            while (1)       //等待串口接收完成
            {
                i=DMA1_Channel5->CNDTR;               
                Delay_ms(5);
                if (i==DMA1_Channel5->CNDTR) break ;
                if(DMA1_Channel5->CNDTR<DMA_URX_LEN-2626) break;    //判断接收数据是否达到指定数量
            }
            USART_DE=1;         //485芯片接收使能
            USART_RX=1;
            MYDMA_Enable_RX();
            Delay_ms(5);
            USART_RX =0;
        }



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传输
}          



回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-23 02:17:21 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 17:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表