硬汉嵌入式论坛

 找回密码
 立即注册
查看: 9364|回复: 11
收起左侧

[有问必答] 修改V5的Ex004-消息队列例子,CAN裸机程序正常,加UCOS III和emwin后不进入CAN接收中

[复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2013-9-5 21:20:10 | 显示全部楼层 |阅读模式
该例子中:加入bsp_int.c编译出错
..\..\User\bsp\bsp_int.c(304): error:  #20: identifier "BSP_INT_ID_WWDG" is undefined

裸机运行CAN可以收发数据,中断正常响应,但在该例子中加入CAN通信功能,则中断无法响应,
请问如何在ucosIII中设置中断响应?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2013-9-5 21:24:53 | 显示全部楼层
不要加入这个bsp_int.c,这个是官方的一种,中断管理方法。
这个管理非常不适合现在的M3/M4内核,不能充分的发挥他们的优越性。
就用现在的ST官方那种就可以了。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2013-9-5 21:29:07 | 显示全部楼层
怎么加呢?我不会呢
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2013-9-5 21:31:05 | 显示全部楼层
我的CAN代码
#include "stm32f4xx.h"



/**
  * @brief  Configures the NVIC for CAN.
  * @param  None
  * @retval None
  */
void CAN_NVIC_Config(void)
{
  NVIC_InitTypeDef  NVIC_InitStructureCAN1;
  NVIC_InitTypeDef  NVIC_InitStructureCAN2;
//#ifdef  USE_CAN1
  NVIC_InitStructureCAN1.NVIC_IRQChannel = CAN1_RX0_IRQn;
    NVIC_InitStructureCAN1.NVIC_IRQChannelPreemptionPriority = 0x0;
  NVIC_InitStructureCAN1.NVIC_IRQChannelSubPriority = 0x0;
  NVIC_InitStructureCAN1.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructureCAN1);
//#else  /* USE_CAN2 */
  NVIC_InitStructureCAN2.NVIC_IRQChannel = CAN2_RX0_IRQn;
  NVIC_InitStructureCAN2.NVIC_IRQChannelPreemptionPriority = 0x0;
  NVIC_InitStructureCAN2.NVIC_IRQChannelSubPriority = 0x0;
  NVIC_InitStructureCAN2.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructureCAN2);
}

/**
  * @brief  Configures the CAN1.
  * @param  None
  * @retval None
  */
void CAN_Config_CAN1(void)
{
  GPIO_InitTypeDef  GPIO_InitStructureCAN1;
  CAN_InitTypeDef        CAN_InitStructureCAN1;
    CAN_FilterInitTypeDef  CAN_FilterInitStructureCAN1;
  /* CAN GPIOs configuration **************************************************/
    //方法1--good
    //使能RX--GPIOI---&gtIN9
  /* Enable GPIO clock */
  //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI, ENABLE);
  /* Connect CAN pins to AF9 */
    //配置CAN1--RX
  /*GPIO_PinAFConfig(GPIOI, GPIO_PinSource9, GPIO_AF_CAN1);
    GPIO_InitStructureCAN1.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructureCAN1.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructureCAN1.GPIO_PuPd  = GPIO_PuPd_UP;//RX为上拉输入
    GPIO_InitStructureCAN1.GPIO_OType = GPIO_OType_PP;
    GPIO_Init(GPIOI, &GPIO_InitStructureCAN1);*/
    //配置CAN1--TX
    /*RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
    GPIO_PinAFConfig(GPIOH, GPIO_PinSource13, GPIO_AF_CAN1);
    GPIO_InitStructureCAN1.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructureCAN1.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructureCAN1.GPIO_PuPd  = GPIO_PuPd_UP;//RX为上拉输入
    GPIO_InitStructureCAN1.GPIO_OType = GPIO_OType_PP;
    GPIO_Init(GPIOH, &GPIO_InitStructureCAN1);*/
   
   
    //方法2--good
  /* Enable GPIO clock */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI, ENABLE);
  /* Connect CAN pins to AF9 */
  GPIO_PinAFConfig(GPIOI, GPIO_PinSource9, GPIO_AF_CAN1);//RX
  GPIO_PinAFConfig(GPIOH, GPIO_PinSource13, GPIO_AF_CAN1);//TX
  
  /* Configure CAN RX and TX pins */
  GPIO_InitStructureCAN1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_13;
  GPIO_InitStructureCAN1.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructureCAN1.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructureCAN1.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructureCAN1.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(GPIOI, &GPIO_InitStructureCAN1);
    GPIO_Init(GPIOH, &GPIO_InitStructureCAN1);
  /* CAN configuration ********************************************************/  
  /* Enable CAN clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  
  /* CAN register init */
  CAN_DeInit(CAN1);

  /* CAN cell init */
  CAN_InitStructureCAN1.CAN_TTCM = DISABLE;
  CAN_InitStructureCAN1.CAN_ABOM = DISABLE;
  CAN_InitStructureCAN1.CAN_AWUM = DISABLE;
  CAN_InitStructureCAN1.CAN_NART = DISABLE;
  CAN_InitStructureCAN1.CAN_RFLM = DISABLE;
  CAN_InitStructureCAN1.CAN_TXFP = ENABLE;
  CAN_InitStructureCAN1.CAN_Mode = CAN_Mode_Normal;
  CAN_InitStructureCAN1.CAN_SJW = CAN_SJW_1tq;
   
  /* CAN Baudrate = 1 MBps (CAN clocked at 30 MHz) */
  CAN_InitStructureCAN1.CAN_BS1 = CAN_BS1_6tq;
  CAN_InitStructureCAN1.CAN_BS2 = CAN_BS2_8tq;
  CAN_InitStructureCAN1.CAN_Prescaler = 4;//2 --->>  1M速度 ; 4  --->>  500k速度
  CAN_Init(CAN1, &CAN_InitStructureCAN1);

  /* CAN filter init */
  CAN_FilterInitStructureCAN1.CAN_FilterNumber = 0;
  CAN_FilterInitStructureCAN1.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructureCAN1.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructureCAN1.CAN_FilterIdHigh = 0x0000;
  CAN_FilterInitStructureCAN1.CAN_FilterIdLow = 0x0000;
  CAN_FilterInitStructureCAN1.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructureCAN1.CAN_FilterMaskIdLow = 0x0000;
  CAN_FilterInitStructureCAN1.CAN_FilterFIFOAssignment = 0;
  CAN_FilterInitStructureCAN1.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructureCAN1);
  /* Enable FIFO 0 message pending Interrupt */
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}
   
/**
  * @brief  Configures the CAN2.
  * @param  None
  * @retval None
  */
void CAN_Config_CAN2(void)
{
  GPIO_InitTypeDef  GPIO_InitStructureCAN2;
  CAN_InitTypeDef        CAN_InitStructureCAN2;
    CAN_FilterInitTypeDef  CAN_FilterInitStructureCAN2;
  /* CAN GPIOs configuration **************************************************/

  /* Enable GPIO clock */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  /* Connect CAN pins to AF9 */
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_CAN2);//RX
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_CAN2); //TX
  
  /* Configure CAN RX and TX pins */
  GPIO_InitStructureCAN2.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;//RX--TX
  GPIO_InitStructureCAN2.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructureCAN2.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructureCAN2.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructureCAN2.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(GPIOB, &GPIO_InitStructureCAN2);

  /* CAN configuration ********************************************************/  
  /* Enable CAN clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2/*CAN_CLK*/, ENABLE);
  
  /* CAN register init */
  CAN_DeInit(CAN2);

  /* CAN cell init */
  CAN_InitStructureCAN2.CAN_TTCM = DISABLE;
  CAN_InitStructureCAN2.CAN_ABOM = DISABLE;
  CAN_InitStructureCAN2.CAN_AWUM = DISABLE;
  CAN_InitStructureCAN2.CAN_NART = DISABLE;
  CAN_InitStructureCAN2.CAN_RFLM = DISABLE;
  CAN_InitStructureCAN2.CAN_TXFP = ENABLE;
  CAN_InitStructureCAN2.CAN_Mode = CAN_Mode_Normal;
  CAN_InitStructureCAN2.CAN_SJW = CAN_SJW_1tq;
   
  /* CAN Baudrate = 1 MBps (CAN clocked at 30 MHz) */
  CAN_InitStructureCAN2.CAN_BS1 = CAN_BS1_6tq;
  CAN_InitStructureCAN2.CAN_BS2 = CAN_BS2_8tq;
  CAN_InitStructureCAN2.CAN_Prescaler = 4;//2 --->>  1M速度 ; 4  --->>  500k速度
  if(CAN_Init(CAN2, &CAN_InitStructureCAN2)!=CANINITOK)
    {
        printf("can init error\\r\\n");

    }
    //CAN_Init(CAN2, &CAN_InitStructureCAN2);

  /* CAN filter init */
  CAN_FilterInitStructureCAN2.CAN_FilterNumber = 14;
  CAN_FilterInitStructureCAN2.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructureCAN2.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructureCAN2.CAN_FilterIdHigh = 0x0000;
  CAN_FilterInitStructureCAN2.CAN_FilterIdLow = 0x0000;
  CAN_FilterInitStructureCAN2.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructureCAN2.CAN_FilterMaskIdLow = 0x0000;
  CAN_FilterInitStructureCAN2.CAN_FilterFIFOAssignment = 0;
  CAN_FilterInitStructureCAN2.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructureCAN2);
  /* Enable FIFO 0 message pending Interrupt */
  CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
}


//CAN初始化
void InitCANBus()
{
    CAN_NVIC_Config();
    printf("CAN_NVIC_Config\\r\\n");
    CAN_Config_CAN1();
    printf("CAN_Config_CAN1\\r\\n");
    CAN_Config_CAN2();
    printf("CAN_Config_CAN2\\r\\n");   
   
}
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2013-9-5 21:32:29 | 显示全部楼层
在stm32f4xx_it.c定义了:
//以下为CAN接收数据的中断处理函数
/**
  * @brief  This function handles CAN1 RX0 request.
  * @param  None
  * @retval None
  */
void CAN1_RX0_IRQHandler(void)
{
    CPU_SR_ALLOC();
    CPU_CRITICAL_ENTER();  
    OSIntNestingCtr++;
    CPU_CRITICAL_EXIT();
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
  printf("CAN1_RX0_IRQHandler\\r\\n");
  if ((RxMessage.StdId == 0x321)&&(RxMessage.IDE == CAN_ID_STD) && (RxMessage.DLC == 1))
  {
    //LED_Display(RxMessage.Data[0]);
   // KeyNumber = RxMessage.Data[0];
  }
    OSIntExit();
}


/**
  * @brief  This function handles CAN2 RX0 request.
  * @param  None
  * @retval None
  */
void CAN2_RX0_IRQHandler(void)
{
    CPU_SR_ALLOC();
    CPU_CRITICAL_ENTER();  
    OSIntNestingCtr++;
    CPU_CRITICAL_EXIT();
   
  CAN_Receive(CAN2, CAN_FIFO0, &RxMessage);
    printf("CAN2_RX0_IRQHandler\\r\\n");
    //RxMessage.StdId = 0x21;
    //CAN_Transmit(CAN2, &TxMessage);
  if ((RxMessage.StdId == 0x321)&&(RxMessage.IDE == CAN_ID_STD) && (RxMessage.DLC == 1))
  {
    //LED_Display(RxMessage.Data[0]);
    //KeyNumber = RxMessage.Data[0];
  }
   
    OSIntExit();
}
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2013-9-5 21:34:38 | 显示全部楼层
中断仍无法响应
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2013-9-5 21:38:08 | 显示全部楼层

回 sharpjj 的帖子

sharpjj:中断仍无法响应 (2013-09-05 21:34) 
楼主,我的QQ是512464265,明天联系我,我给你弄,今天有点事得先回去下
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2013-9-5 21:43:09 | 显示全部楼层
在ucosIII中加入任务:        
/**************创建CAN任务*********************/            
    OSTaskCreate((OS_TCB       *)&AppTaskCANTCB,              
                 (CPU_CHAR     *)"App Task CANCOMM",
                 (OS_TASK_PTR   )AppTaskCAN,
                 (void         *)0,
                 (OS_PRIO       )APP_CFG_TASK_CAN_PRIO,
                 (CPU_STK      *)&AppTaskCANStk[0],
                 (CPU_STK_SIZE  )APP_CFG_TASK_CAN_STK_SIZE / 10,
                 (CPU_STK_SIZE  )APP_CFG_TASK_CAN_STK_SIZE,
                 (OS_MSG_QTY    )0,
                 (OS_TICK       )8,
                 (void         *)0,
                 (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR       *)&err);
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2013-9-6 10:44:41 | 显示全部楼层
看了你的工程,3个需要修改的地方
1. 这个地方要修改
1.png


#define  APP_CFG_TASK_START_PRIO                             2u
#define  APP_CFG_TASK_UPDATE_PRIO                           3u
#define  APP_CFG_TASK_COM_PRIO                                 4u
#define  APP_CFG_TASK_USER_IF_PRIO                          5u
//定义CAN任务优先级
#define  APP_CFG_TASK_CAN_PRIO                                  6u

#define  APP_CFG_TASK_GUI_PRIO                              (OS_CFG_PRIO_MAX - 4u)
#define  APP_CFG_TASK_GUIRefresh_PRIO                 (OS_CFG_PRIO_MAX - 4u)

改成下面这样,就是提升一下CAN任务的优先级

#define  APP_CFG_TASK_START_PRIO                             2u
#define  APP_CFG_TASK_UPDATE_PRIO                           3u

//定义CAN任务优先级#define  APP_CFG_TASK_CAN_PRIO                                  4u

#define  APP_CFG_TASK_COM_PRIO                                 5u
#define  APP_CFG_TASK_USER_IF_PRIO                          6u

#define  APP_CFG_TASK_GUI_PRIO                              (OS_CFG_PRIO_MAX - 4u)
#define  APP_CFG_TASK_GUIRefresh_PRIO                 (OS_CFG_PRIO_MAX - 4u)

2. 修改下这个地方

OSTaskCreate((OS_TCB       *)&AppTaskCANTCB,              
                 (CPU_CHAR     *)"App Task CANCOMM",
                 (OS_TASK_PTR   )AppTaskCAN,
                 (void         *)0,
                 (OS_PRIO       )APP_CFG_TASK_CAN_PRIO,
                 (CPU_STK      *)&AppTaskCANStk[0],
                 (CPU_STK_SIZE  )APP_CFG_TASK_CAN_STK_SIZE / 10,
                 (CPU_STK_SIZE  )APP_CFG_TASK_CAN_STK_SIZE,
                 (OS_MSG_QTY    )0,
                 (OS_TICK       )0, 改成0就可以的,这个是用于时间片调度的。
                 (void         *)0,
                 (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR       *)&err);

3. CAN的初始化地方

  //初始化CAN   
  InitCANBus();
放到这里
2.png


4. 还有个地方你也修改一下 ,这个不能是分组0,要不CAN中断没法抢占滴答中断的,
你这里先改成分组4试试
3.png
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2013-9-14 16:55:09 | 显示全部楼层
仍然不能正常工作,我在程序中配置了两个CAN,把它们互相连起来,可以互相收发,但我和其他的CAN设备相连,就不能正常工作
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2013-9-14 16:55:31 | 显示全部楼层
我的裸机程序可以正常工作的
回复

使用道具 举报

760

主题

1052

回帖

3337

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3337
发表于 2013-9-14 21:35:29 | 显示全部楼层
你先把 C:\\Keil\\ARM\\INC\\ST\\STM32F4xx  这个文件夹换个名字 再编译工程
会发现编译错误
然后 把这个 : ..\\..\\Libraries\\CMSIS\\Include  加入 include  解决错误。
先排除MDK自带的库的问题,用ST固件中的文件。

这样之后测试一下你的程序
如果故障依旧
就修改main() 在OS启动前,增加 while (1)之后,程序的运行结果应该和裸机没有区别了。

int main(void)
{
    OS_ERR  err;

//    BSP_IntDisAll();                                          /* Disable all interrupts.                              */
   
   bsp_Init();
   InitCANBus();
   
   while (1);
....

另外,你需要把 CAN中断处理函数中的和OS相关的语句行先删除,保持和裸机1致。一步步确认问题范围。


这样修改后,看CAN中断能否进入。先排除是否ucos的问题。
如果不能进入,就是  bsp_Init();  InitCANBus();  这2个函数的问题。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 15:53 , Processed in 0.051544 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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