高中生
最后登录1970-1-1
在线时间 小时
注册时间2017-2-16
|

楼主 |
发表于 2017-3-4 20:14:52
|
显示全部楼层
经过我的尝试和不断修改,初步完成了CAN的通讯实验,在这里给大家分享一下代码把,希望对大家有用,然后大家也多都提改进意见
/*-----------------------------------------------------------一下是CAN的两个任务,一个接收一个发送-------------------------------------------------------------------------------------*/
static void AppTaskCANRx ( void * p_arg )
{
OS_ERR err;
uint8_t i;
CPU_SR_ALLOC();
(void)p_arg;
while (DEF_TRUE) { //任务体
/* 阻塞任务,直到KEY1被单击 */
OSTaskSemPend ((OS_TICK )0, //无期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //如果信号量不可用就等待
(CPU_TS *)0, //获取信号量被发布的时间戳
(OS_ERR *)&err); //返回错误类型
OS_CRITICAL_ENTER(); //进入临界段,避免串口打印被打断
printf ( "接收到的数据ID为:\r\n0x%x\r\n接受到的数据为:",ExID);
for(i=0;i<8;i++)
{printf("%3x",CAN1_data[i]);}
printf("\n\r");
OS_CRITICAL_EXIT(); //退出临界段
}
}
static void AppTaskCANTx (void * p_arg )
{ uint8_t i;
OS_ERR err;
CPU_SR_ALLOC();
(void )p_arg;
while(DEF_TRUE)
{
OSTaskSemPend((OS_TICK )0, //无期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //如果信号量不可用就等待
(CPU_TS *)0, //获取信号量被发布的时间戳
(OS_ERR *)&err); //返回错误类型
CAN_SetMsg(&TxMessage);
CAN_Transmit(CANx,&TxMessage);
OS_CRITICAL_ENTER();
printf("\r\n需要发送的数据ID为:0x%x\n\r发送的数据为:",TxMessage.ExtId);
for(i=0;i<8;i++)
{
printf("%3x",TxMessage.Data[i]);
}
printf("\n\r");
OS_CRITICAL_EXIT();
}
}
/*---------------------------------------------------------------------以下是两个中断服务函数,第一个是接受CAN通道,第二个是按键------------------------------------------------------------------------------------------- */
extern uint8_t CAN1_data[8];
extern uint32_t ExID;
extern OS_TCB AppTaskCANRxTCB;
void macCAN_RX_IRQHandler(void)
{ uint8_t i;
OS_ERR err;
CanRxMsg RxMessage;
OSIntEnter(); //进入中断
/* 从内存分区 mem 获取一个内存块 */
CAN_Receive(CANx, CAN_FIFO0, &RxMessage);
ExID = RxMessage.ExtId;
for(i = 0;i < 8;i ++)
{
CAN1_data[i] = RxMessage.Data[i];
}
CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0); /* 清除挂起中断 */
OSTaskSemPost((OS_TCB *)&AppTaskCANRxTCB, //目标任务
(OS_OPT )OS_OPT_POST_NONE, //没选项要求
(OS_ERR *)&err); //返回错误类型
OSIntExit(); //退出中断
}
extern OS_TCB AppTaskCANTxTCB;
void macEXTI_INT_FUNCTION(void)
{
OS_ERR err;
OSIntEnter(); //进入中断
if(EXTI_GetITStatus(macEXTI_LINE) != RESET) //确保是否产生了EXTI Line中断
{
/* 发送任务信号量到任务 AppTaskKey */
OSTaskSemPost((OS_TCB *)&AppTaskCANTxTCB, //目标任务
(OS_OPT )OS_OPT_POST_NONE, //没选项要求
(OS_ERR *)&err); //返回错误类型
EXTI_ClearITPendingBit(macEXTI_LINE); //清除中断标志位
}
OSIntExit(); //退出中断
}
有不足的地方多多指正! |
|