OpenEdv-开源电子网

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

STM32F103使用匿名上位机通信会卡死,请问是怎么回事

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-7-10
在线时间
11 小时
发表于 2021-11-9 10:12:13 | 显示全部楼层 |阅读模式
20金钱
我这边使用原子的F103ZET6最小系统板进行匿名上位机实验,发现存在以下问题:
1、当链接匿名上位机V7后,程序会卡死。但并不是死机状态,如果此时改为XCOM读取串口信息,程序会恢复正常。
2、已经证实,通过XCOM可以正常读取串口信息。经过逐帧验证,匿名上位机协议没有问题。
3、实验使用的串口为USART1,初始化程序使用原子家工程模板自带程序。
4、调用传输函数的是100ms的TIM6定时器中断。

因此想要向大家请教一下,这种情况是怎么回事,需要做那些修改?

传输代码如下:
///////////////////////////////////////////////////
extern u8 Debug_Buf[14];

//匿名上位机通信协议
//执行担当 -> USART1
//调pid用
//数据内容 给定 实际(速度)
void Debug_Data(int Speed_Set, int Speed_Get)
{
        u8 Count = 0;
        u8 SumCheck = 0;
        u8 AddCheck = 0;
        u8 i;
       
        //拆分成u8数据
        for(Count = 4; Count < (Debug_Buf[3]+4); Count ++)
        {
                i = Count % 4;
               
                if((Count-4) < 4)
                {Debug_Buf[Count] = (u8)(Speed_Set >> (i * 8));}
                else
                {Debug_Buf[Count] = (u8)(Speed_Get >> (i * 8));}
        }
       
        //计算校验码
        for(i = 0; i < (Debug_Buf[3]+4); i ++)
        {
                SumCheck += Debug_Buf;
                AddCheck += SumCheck;
        }
       
        //填充校验码
        Debug_Buf[Debug_Buf[3]+4] = SumCheck;
        Debug_Buf[Debug_Buf[3]+5] = AddCheck;
       
        for(Count = 0; Count < 14; Count ++)
        {
                USART_SendData(USART1, Debug_Buf[Count]);
                delay_us(100);
        }

定时器代码如下:
///////////////////////////////////////////////////////////
void Motor_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能
       
        //定时器TIM6初始化
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE ); //使能指定的TIM6中断,允许更新中断

        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM6中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

        TIM_Cmd(TIM6, ENABLE);  //使能TIMx                                         
}


//定时器3中断服务程序
void TIM6_IRQHandler(void)   //TIM6中断
{
        if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM6更新中断发生与否
                {
                        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);  //清除TIMx更新中断标志
                       
                        LED0=!LED0;
                        Debug_Data(1234, 5678);
                }
}


主函数如下:
//////////////////////////////////////////////////////////
u8 Debug_Buf[14] =
                {0XAA, 0XFF, 0XF1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

int main(void)
{               

        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);         //串口初始化为115200
        LED_Init();                             //LED端口初始化
        Encode_Init();
        Motor_Init(999,7199);//10Khz的计数频率,计数到5000为500ms
       
       
           while(1)
        {
                LED1=!LED1;
                delay_ms(200);                  
        }         
}


以下是XCOM收到的数据:

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

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1734
金钱
1734
注册时间
2021-4-11
在线时间
320 小时
发表于 2021-11-9 14:56:11 | 显示全部楼层
回复

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2021-11-9 17:00:47 | 显示全部楼层
帮顶         
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2021-11-9 17:12:16 | 显示全部楼层
USART_SendData(USART1, Debug_Buf[Count]);
delay_us(100);
别用延时,发多字节参考正点的例程吧。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-7-10
在线时间
11 小时
 楼主| 发表于 2021-11-10 09:12:02 | 显示全部楼层
wklhwkl 发表于 2021-11-9 17:12
USART_SendData(USART1, Debug_Buf[Count]);
delay_us(100);
别用延时,发多字节参考正点的例程吧。

好的,我去看一下。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-26 09:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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