新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2019-9-21
- 在线时间
- 7 小时
|
5金钱
本帖最后由 yanjianxiang 于 2019-10-20 23:09 编辑
f427的板子,在Ucosiii下,can发送中断总是不进入,且数据也没有发出去。裸机就可以正常运行
这是初始化
void CAN1_InitConfig(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
CAN_InitTypeDef CAN_InitStruct;
CAN_FilterInitTypeDef CAN_FilterInitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD,&GPIO_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = CAN1_RX0_IRQn; //注意与中断向量表区别 refer to stm32f4xx.h file
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = CAN1_TX_IRQn; //注意与中断向量表区别 refer to stm32f4xx.h file
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
NVIC_Init(&NVIC_InitStruct);
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStruct);
CAN_InitStruct.CAN_Prescaler = 3; //CAN BaudRate 42/(1+9+4)/3=1Mbps //分频系数(Fdiv)为3+1
CAN_InitStruct.CAN_Mode = CAN_Mode_Normal; //模式设置
CAN_InitStruct.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStruct.CAN_BS1 = CAN_BS1_9tq; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStruct.CAN_BS2 = CAN_BS2_4tq; //Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStruct.CAN_TTCM = DISABLE; //非时间触发通信模式
CAN_InitStruct.CAN_ABOM = DISABLE; //软件自动离线管理
CAN_InitStruct.CAN_AWUM = DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
CAN_InitStruct.CAN_NART = DISABLE; //禁止报文自动传送
CAN_InitStruct.CAN_RFLM = DISABLE; //报文不锁定,新的覆盖旧的
CAN_InitStruct.CAN_TXFP = ENABLE; //优先级由报文标识符决定
CAN_Init(CAN1,&CAN_InitStruct);
CAN_FilterInitStruct.CAN_FilterIdHigh = 0x0000; //32位ID
CAN_FilterInitStruct.CAN_FilterIdLow = 0x0000; //32位ID
CAN_FilterInitStruct.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStruct.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //过滤器0关联到FIFO0;
CAN_FilterInitStruct.CAN_FilterNumber = 0; //过滤器0,范围0---13
CAN_FilterInitStruct.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStruct.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStruct.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStruct);
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO0消息挂号中断允许,打开接收中断
CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE); //打开发送中断
}
这是中断函数
void CAN1_TX_IRQHandler(void)
{
OSIntEnter(); //进入中断
LED_RED_ON;
if (CAN_GetITStatus (CAN1,CAN_IT_TME)!=RESET) //发送邮箱空中断
{
CAN1_Tx_Message_Flag=1;
CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
}
OSIntExit(); //触发任务切换软中断
}
|
|