STM32F107之CAN配置

STM32F107属于STMF10x系列的互联型产品,所以配有2个CAN模块即CAN1和CAN2。CAN模块正常工作模式和测试模式,且测试模式又分为环回模式、静默模式和环回静默模式,但一般都使用正常工作模式,所以在此仅介绍正常工作模式相关配置。

一、来说说CAN模块的配置步骤:

1、初始化CAN相关GPIO口;

2、初始化CAN控制器;

3、初始化CAN过滤器;

4、初始化CAN中断;

5、添加CAN中断接收函数;

二、CAN1部分具体代码如下(库函数版本为V3.50):

1、初始化CAN1相关GPIO口:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟                 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure);            //初始化IO

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

 

2、初始化CAN1控制器:   

    CAN_DeInit(CAN1); //默认初始化配置
    CAN_StructInit(&CAN_InitStructure);//CAN初始化结构图初始化

    CAN_InitStructure.CAN_TTCM=DISABLE;            //非时间触发通信模式  
    CAN_InitStructure.CAN_ABOM=DISABLE;            //软件自动离线管理     
    CAN_InitStructure.CAN_AWUM=DISABLE;      //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
    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=CAN_SJW_1tq;                //SJW = 1tq
    CAN_InitStructure.CAN_BS1=CAN_BS1_3tq;             //Tbs1 = 3tq
    CAN_InitStructure.CAN_BS2=CAN_BS2_5tq;                //Tbs2 = 5tq
    CAN_InitStructure.CAN_Prescaler=8; //分频系数8,即波特率为36M/((1+3+5)*8)= 500k,其中36M为PCLK1    
    CAN_Init(CAN1, &CAN_InitStructure);            //初始化CAN1 

3、初始化CAN1过滤器:   

    CAN_FilterInitStructure.CAN_FilterNumber=0;    //过滤器0,选择范围0 - 13
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;     //屏蔽位模式
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;     //32位宽 
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;    //32位ID
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0    

    CAN_FilterInit(&CAN_FilterInitStructure);            //滤波器初始化

4、初始化CAN1中断:   

    CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);                //FIFO0消息挂号中断允许.         

    NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 从优先级为0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

5、添加CAN1中断接收函数:

void CAN1_RX0_IRQHandler(void)
{
      CanRxMsg RxMessage;
      CAN_Receive(CAN1, CAN_Filter_FIFO0, &RxMessage);
      /*此处可添加接收消息处理逻辑*/
}

三、CAN2部分的具体代码:

    CAN2与CAN1大同小异,相关配置步骤也是一样,指示具体配置参数有所差别,这里只列出不同之处:

1、初始化CAN2相关GPIO口: 与CAN1配置类似

2、初始化CAN2控制器:与CAN1配置相同

3、初始化CAN2过滤器:

    CAN_FilterInitStructure.CAN_FilterNumber=14;    //过滤器14,选择范围14 - 27
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;     //屏蔽位模式
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;     //32位宽 
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;    //32位ID
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0    

    CAN_SlaveStartBank(14);//配置CAN2起始过滤器为14,此配置只当芯片有CAN2模块时才需要

    CAN_FilterInit(&CAN_FilterInitStructure);            //滤波器初始化,通过库函数可得知这里实际是配置CAN1相关寄存器,因CAN2不能直接访问SRAM,所以利用CAN1的寄存器来间接访问。

4、初始化CAN2中断:   

    CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);                //FIFO0消息挂号中断允许.            
    NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            // 从优先级为0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

5、添加CAN2中断接收函数;

void CAN2_RX0_IRQHandler(void)
{
      CanRxMsg RxMessage;
      CAN_Receive(CAN2, CAN_Filter_FIFO0, &RxMessage);
      /*此处可添加接收消息处理逻辑*/
}

到此代码部分已差不多,但以上内容均指示说明了一个大概过程与配置,具体为何这样配置需配合官方文档和其它相关资料分析。

 

 

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F107的ADC模块可以通过以下步骤进行配置: 1.先使能ADC时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); 2.配置ADC工作模式:ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); 3.配置ADC采样时间:ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_71Cycles5); 4.使能ADC:ADC_Cmd(ADC1, ENABLE); 5.校准ADC:ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); 6.读取ADC转换结果:ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); uint16_t adcValue = ADC_GetConversionValue(ADC1); 这些步骤的具体含义和作用如下: 1.使能ADC时钟:开启ADC模块时钟,使ADC模块处于工作状态。 2.配置ADC工作模式:设置ADC工作模式为独立模式,禁止扫描模式和连续转换模式,设置外部触发转换为无,设置数据对齐方式为右对齐,设置转换通道的数量为1。 3.配置ADC采样时间:设置ADC采样时间,即ADC在转换前需要等待的时间,用于稳定电压和消除噪声。 4.使能ADC:开启ADC模块,使其可以进行模数转换。 5.校准ADC:对ADC进行校准,保证转换结果的准确性和稳定性。 6.读取ADC转换结果:使用软件触发ADC转换,等待转换完成,然后读取转换结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值