初级会员

- 积分
- 58
- 金钱
- 58
- 注册时间
- 2020-9-9
- 在线时间
- 9 小时
|
5金钱
按照CAN例程接了一个can接口IMU。将解析放在主函数内可以正常获取。但是,将解析放在CAN中断函数内,主函数内调用时串口输出的确实pitch与roll的初值。
u8 angle[8]={1,2,3,4,5,6,7,8};
//u8 canbuf[8];
u8 res;
double pitch=1,roll=2;
#if CAN1_RX0_INT_ENABLE //使能RX0中断
//中断服务函数
void CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
CAN_Receive(CAN1, 0, &RxMessage);
// res=CAN1_Receive_Msg(canbuf);
// if(res)
// {
// for(int i=0;i<8;i++)
// angle[i]=canbuf[i];
// }
for(int i=0;i<8;i++)
angle[i]=RxMessage.Data[i];
//俯仰角计算
if((angle[0]&0xf0)>>4)//俯仰角正负 高位是否为1,
pitch=-((angle[0]&0x0f)*100+((angle[1]&0xf0)>>4)*10+(angle[1]&0x0f)\
+((angle[2]&0xf0)>>4)/10.0+(angle[2]&0x0f)/100.0);
else
pitch=(angle[0]&0x0f)*100+((angle[1]&0xf0)>>4)*10+(angle[1]&0x0f)\
+((angle[2]&0xf0)>>4)/10.0+(angle[2]&0x0f)/100.0;
//横滚角计算
if((angle[3]&0xf0)>>4)//横滚角正负
roll=-((angle[3]&0x0f)*100+((angle[4]&0xf0)>>4)*10+(angle[4]&0x0f)\
+((angle[5]&0xf0)>>4)/10.0+(angle[5]&0x0f)/100.0) ;
else
roll=(angle[3]&0x0f)*100+((angle[4]&0xf0)>>4)*10+(angle[4]&0x0f)\
+((angle[5]&0xf0)>>4)/10.0+(angle[5]&0x0f)/100.0;
}
#endif
extern u8 angle[8];
extern double pitch,roll;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,12,CAN_Mode_Normal);//CAN初始化环回模式,波特率250Kbps
while(1)
{
delay_ms(100);
//测试
printf("pitch:%.2f roll:%.2f \r\n",pitch,roll);
}
}
|
最佳答案
查看完整内容[请看2#楼]
已解决 can.h内#define CAN1_RX0_INT_ENABLE 1 默认为0,改为1就好了
|