OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2893|回复: 1

STM32F429 CAN总线重新配置

[复制链接]

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
发表于 2019-8-2 08:35:45 | 显示全部楼层 |阅读模式
在STM32固件库中串口有使能函数USART_Cmd(TTL_USART, DISABLE);,关闭或者打开串口,在程序运行的时候可以关闭串口重新配置,然后再使能开启但是CAN总线的固件库函数中没有类似的使能函数,如果想重新配置怎么办,直接配置吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
 楼主| 发表于 2019-8-2 08:39:03 | 显示全部楼层
//CAN的GPIO 配置
void CAN_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;          

  /* 使能GPIO时钟*/
  RCC_AHB1PeriphClockCmd(CAN_TX_GPIO_CLK|CAN_RX_GPIO_CLK, ENABLE);
       
          /* 引脚源*/
  GPIO_PinAFConfig(CAN_TX_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);
  GPIO_PinAFConfig(CAN_RX_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);

          /* 配置 CAN TX 引脚 */
  GPIO_InitStructure.GPIO_Pin = CAN_TX_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(CAN_TX_GPIO_PORT, &GPIO_InitStructure);
       
          /* 配置 CAN RX 引脚 */
  GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_Init(CAN_RX_GPIO_PORT, &GPIO_InitStructure);
}
//CAN的NVIC 配置
void CAN_NVIC_Config(void)
{
           NVIC_InitTypeDef NVIC_InitStructure;
                /* Configure one bit for preemption priority */
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
                 /*中断设置*/
                NVIC_InitStructure.NVIC_IRQChannel = CAN_RX_IRQ;           //CAN RX中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                          
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
//CAN的模式 配置
void CAN_Mode_Config(void)
{
        CAN_InitTypeDef        CAN_InitStructure;
        /************************CAN通信参数设置**********************************/
        /* Enable CAN clock */
  RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

        /*CAN寄存器初始化*/
        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);

        /*CAN单元初始化*/
        CAN_InitStructure.CAN_TTCM=DISABLE;                           //MCR-TTCM  关闭时间触发通信模式使能
        CAN_InitStructure.CAN_ABOM=ENABLE;                           //MCR-ABOM  使能自动离线管理
        CAN_InitStructure.CAN_AWUM=ENABLE;                           //MCR-AWUM  使用自动唤醒模式
        CAN_InitStructure.CAN_NART=DISABLE;                           //MCR-NART  禁止报文自动重传          
        CAN_InitStructure.CAN_RFLM=DISABLE;                           //MCR-RFLM  接收FIFO 不锁定 溢出时新报文会覆盖原有报文  
        CAN_InitStructure.CAN_TXFP=DISABLE;                           //MCR-TXFP  发送FIFO优先级 取决于报文标示符
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;  //正常工作模式
        CAN_InitStructure.CAN_SJW=CAN_SJW_2tq;                   //BTR-SJW 重新同步跳跃宽度 2个时间单元
         
        /* ss=1 bs1=5 bs2=3 位时间宽度为(1+5+3) 波特率即为时钟周期tq*(1+3+5)  */
        CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;                   //BTR-TS1 时间段1 占用了5个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;                   //BTR-TS1 时间段2 占用了3个时间单元       
       
        /* CAN Baudrate = 1 MBps (1MBps已为stm32的CAN最高速率) (CAN 时钟频率为 APB 1 = 45 MHz) */     
        CAN_InitStructure.CAN_Prescaler =5;                  //BTR-BRP 波特率分频器  定义了时间单元的时间长度 45/(1+5+3)/5=1 Mbps
        CAN_Init(CANx, &CAN_InitStructure);
}
//CAN的筛选器 配置
void CAN_Filter_Config(void)
{
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;

        /*CAN筛选器初始化*/
        CAN_FilterInitStructure.CAN_FilterNumber=0;                                                //筛选器组0
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;        //工作在掩码模式
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;        //筛选器位宽为单个32位。
        /* 使能筛选器,按照标志的内容进行比对筛选,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */

        CAN_FilterInitStructure.CAN_FilterIdHigh= ((((u32)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF0000)>>16;                //要筛选的ID高位
        CAN_FilterInitStructure.CAN_FilterIdLow= (((u32)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要筛选的ID低位
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0xFFFF;                        //筛选器高16位每位必须匹配
        CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0xFFFF;                        //筛选器低16位每位必须匹配
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0 ;                                //筛选器被关联到FIFO0
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                        //使能筛选器
        CAN_FilterInit(&CAN_FilterInitStructure);
        /*CAN通信中断使能*/
        CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);
}
//CAN初始化
void CAN_Config(void)
{
  CAN_GPIO_Config();
  CAN_NVIC_Config();
  CAN_Mode_Config();
  CAN_Filter_Config();   
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 16:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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