Keil_MDK调试经验总结三

1. UART7 串口的中断优先级太低 会导致串口不进去中断

HAL_NVIC_SetPriority(UART7_IRQn, 4, 0);
要大于
HAL_NVIC_SetPriority(USART6_IRQn, 5, 0);

2.在FreeRTOS的任务中不能屏蔽延时函数Osdelay();否则会导致程序在该任务下找不到跳出的接口。

3. keil修改为绿色护眼背景建议参数

在这里插入图片描述
色调 87 红 193
饱和度 77 绿223
亮度 196 蓝198
效果如下:
在这里插入图片描述

4.舵机四足对角步态代码记录

void ListLeg(void)               //规划Z轴 对角步态
{
	static int L_count = 0;  //这里的count和walk中的count是不相同的 因为这个count用了static
	
	int MAX_HIGH = body.rotate*2;  //抬腿的最大高度等于body.rotate
	L_count ++;
	uint8_t L_cycle = 30;                                   //延时5ms重复执行,T = 54 * 2* 5 = 540ms
	FR_Leg.last_state = FR_Leg.state;                       //更新每个腿的状态用于 walk 标志位的检测
	BL_Leg.last_state = BL_Leg.state;
	FL_Leg.last_state = FL_Leg.state;
	BR_Leg.last_state = BR_Leg.state;
	
	if(L_count<=L_cycle)                                      //前右和后左   1 < L_count <= 54
	{
		FR_Leg.state = Down;                         
		BL_Leg.state = Down;
		FL_Leg.state = Up;
		BR_Leg.state = Up;
		if(L_count < L_cycle/2)                                  //1 <= L_count < 27   
		{
			
			FL_Leg.delta_z = -L_count*MAX_HIGH/L_cycle;            //  -1*50/54 = -0.93      -26*50/54 = - 24.07
			BR_Leg.delta_z = -L_count*MAX_HIGH/L_cycle;
		}
		else                                                      //27 <= L_count <= 54  
		{
			FL_Leg.delta_z = -(L_cycle-L_count)*MAX_HIGH/L_cycle;     //-(54-27)*50/54 = -25  -(54-54)*50/54 = 0
			BR_Leg.delta_z = -(L_cycle-L_count)*MAX_HIGH/L_cycle;
		}
	}
	else if(L_count < 2 * L_cycle)                             //54 < L_count < 54*2 = 108 
	{
		FR_Leg.state = Up;                           
		BL_Leg.state = Up;                           
		FL_Leg.state = Down;
		BR_Leg.state = Down;
		if(L_count < L_cycle*3/2)                                 //54 < L_count < 54*3/2 = 81 
		{
			FR_Leg.delta_z  = -(L_count-L_cycle)*MAX_HIGH/L_cycle;     //-(54-54)*50/54 = 0  -(81-54)*50/54 = -25
			BL_Leg.delta_z  = -(L_count-L_cycle)*MAX_HIGH/L_cycle;
		}
		else                                                       //81 < L_count < 54*3/2 = 108 
		{
			FR_Leg.delta_z = -(2*L_cycle-L_count)*MAX_HIGH/L_cycle;    //-(108-81)*50/54 =  -25  -(108-108)*50/54 = 0
			BL_Leg.delta_z = -(2*L_cycle-L_count)*MAX_HIGH/L_cycle;
		}
	}
	else       //count的值从0-108 
	{
		L_count = 0;
	}
//   printf("z%f\r\n",FR_Leg.delta_z);
}

5.cubemx配置的DMA只能发送一次,存在bug

6.typedef的用法

typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。
具体区别在于:
若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n;
若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n;
区别就在于使用时,是否可以省去struct这个关键字。
分三块来讲述:
1 首先:
在C中定义一个结构体类型要用typedef:

typedef struct Student
{
int a;
}Stu;
或者
typedef struct
{
int a;
}Stu;

于是在声明变量的时候就可:Stu stu1;
如果没有typedef就必须用struct Student stu1;来声明
这里的Stu实际上就是struct Student的别名。
但在c++里很简单,直接

struct Student
{
int a;
};

于是就定义了结构体类型Student,声明变量时直接Student stu2;
2.声明结构体变量时,必须在结构体变量定义的后面
3.

typedef struct aa{
}aa_t;

等价于

typedef struct {
}aa_t;

typedef 相比直接用struct ,其在声明的时候不用加 struct

4.不管什么变量,现在自己的.c文件中定义,要想在其他.c文件中使用
必须做到以下两点:
第一点:在自己的.h文件中 用extern 声明
第二点:在想要使用它的的.c文件中 包含该.h文件

5.枚举定义可以多个变量
enum{
Up,
Down
}state,last_state;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值