AT32F413RCT7替代STM32F105R8T6
AT32F413RCT7替代STM32F105R8T6 主要使用双CAN功能目前直接将代码烧录进去的情况下CAN1是正常工作的CAN2是无法工作的能否指点一下如何解决呀是不是有什么区别 目前烧录的是原始105的程序吗?105与413的CAN是有差异的,主要表现在105的两个CAN有主从关系共享28个过滤器,413是相互独立的各CAN配备14个过滤器。因此对应的驱动会有小部分差异。你可以去对比下,如果无法解决,可以提供精简的源码,我帮你看看 hoop 发表于 2021-6-5 18:51
目前烧录的是原始105的程序吗?
105与413的CAN是有差异的,主要表现在105的两个CAN有主从关系共享28个过滤 ...
好的谢谢我先试试看 代码不是完全兼容的吧 guijial511 发表于 2021-6-7 21:22
代码不是完全兼容的吧
应该是不完全兼容 在找解决办法 代码不能完全兼容的。 先检查时钟和初始化配置 hoop 发表于 2021-6-5 18:51
目前烧录的是原始105的程序吗?
105与413的CAN是有差异的,主要表现在105的两个CAN有主从关系共享28个过滤 ...
void CAN1_Config(uint8_t sjw,uint8_t bs1,uint8_t bs2,uint16_t pres)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDefCAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 打开GPIO时钟、AFIO时钟,CAN时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* CAN1 RX PB8 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* CAN1 TX PB9 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* CAN1 Enabling interrupt */
NVIC_InitStructure.NVIC_IRQChannel=CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* CANBaudRate = RCC_APB1PeriphClock/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW=sjw;
CAN_InitStructure.CAN_BS1=bs1;
CAN_InitStructure.CAN_BS2=bs2;
CAN_InitStructure.CAN_Prescaler=pres;
CAN_Init(CAN1,&CAN_InitStructure); // CAN1
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; // 标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; // 32位过滤器
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; // 过滤器标识符
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; // 过滤器屏蔽标识符
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; // FIFO0指向过滤器
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);// CAN1
}
/*****************************************
CAN2 Config
FIFO_1
返回:
*****************************************/
void CAN2_Config(uint8_t sjw,uint8_t bs1,uint8_t bs2,uint16_t pres)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDefCAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 打开GPIO时钟、AFIO时钟,CAN时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
/* CAN2 RX PB5 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* CAN2 TX PB6 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_CAN2,ENABLE);
/* CAN2 Enabling interrupt */
NVIC_InitStructure.NVIC_IRQChannel=CAN2_RX1_IRQn; // FIFO_1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* CANBaudRate = RCC_APB1PeriphClock/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler */
CAN_DeInit(CAN2);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW=sjw;
CAN_InitStructure.CAN_BS1=bs1;
CAN_InitStructure.CAN_BS2=bs2;
CAN_InitStructure.CAN_Prescaler=pres;
CAN_Init(CAN2,&CAN_InitStructure); // CAN2
CAN_FilterInitStructure.CAN_FilterNumber=14; //
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; // 标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; // 32位过滤器
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; // 过滤器标识符
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; // 过滤器屏蔽标识符
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO1; // FIFO1指向过滤器
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN2,CAN_IT_FMP1,ENABLE);// CAN2
} hoop 发表于 2021-6-5 18:51
目前烧录的是原始105的程序吗?
105与413的CAN是有差异的,主要表现在105的两个CAN有主从关系共享28个过滤 ...
大神帮忙看看应该如何修改不知道如何操作
你现在是有什么具体问题呢?
代码里面暂时就只看到CAN_FilterInitStructure.CAN_FilterNumber=14; 这一句的14需要改成0或任意一个小于14的值 hoop 发表于 2021-7-16 19:59
你现在是有什么具体问题呢?
代码里面暂时就只看到CAN_FilterInitStructure.CAN_FilterNumber=14; 这一句的 ...
现在的问题是这样配置的情况下CAN2不工作 只有CAN1能正常发送接收 将滤波器的14改为1也是一样的
之前有用户也遇到这个问题,有以下几种原因。你可以看看你这边有没有这些原因:
1、库函数关于CAN2时钟使能的宏定义有误(改为 #define RCC_APB1Periph_CAN2 ((uint32_t)0x80000000)),
同时断言判断需要更改(改为 #define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x41003600) == 0x00) && ((PERIPH) != 0x00)));
2、103的库配置filter是默认选择了CAN1,库函数需要更改;
3、413仅支持filter number 0~13,客户选择了14. 可以参考下附件的配置
林堪堪 发表于 2021-7-19 18:18
之前有用户也遇到这个问题,有以下几种原因。你可以看看你这边有没有这些原因:
1、库函数关于CAN2时钟使能 ...
我先尝试修改一下试下到时候有问题发代码出来 林堪堪 发表于 2021-7-19 18:27
可以参考下附件的配置
我将初始化配置改的和您那边一模一样 结果还是CAN2不能正常使用 CAN1是正常的 我是在105的双CAN代码上改的 林堪堪 发表于 2021-7-19 18:27
可以参考下附件的配置
方便的话加个微信方便请教学习 15001879389
页:
[1]