STM32之CAN总线例程

发布者:Shuxiang最新更新时间:2019-03-07 来源: eefocus关键字:STM32  CAN总线 手机看文章 扫描二维码
随时随地手机看文章

#include "stm32f10x.h"


/* RCC时钟配置 */

void RCC_config(void)

 ErrorStatus HSEStartUpStatus;


 /* RCC寄存器设置为默认配置 */

 RCC_DeInit();

 /* 打开外部高速时钟 */

 RCC_HSEConfig(RCC_HSE_ON);

 /* 等待外部高速时钟稳定 */

 HSEStartUpStatus = RCC_WaitForHSEStartUp();

 if(HSEStartUpStatus == SUCCESS) 

 { 

  /* 设置HCLK = SYSCLK */

  RCC_HCLKConfig(RCC_SYSCLK_Div1);

  /* 设置PCLK2 = HCLK */

  RCC_PCLK2Config(RCC_HCLK_Div1);

  /* 设置PCLK1 = HCLK / 2 */

  RCC_PCLK1Config(RCC_HCLK_Div2);

//  /* 设置FLASH代码延时 */

//  FLASH_SetLatency(FLASH_Latency_2);

//  /* 使能预取址缓存 */

//  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  /* 设置PLL时钟源为HSE倍频9 72MHz */

  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  /* 使能PLL */

  RCC_PLLCmd(ENABLE);

  /* 等待PLL稳定 */

  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

  /* 设置PLL为系统时钟源 */

  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  /* 等待系统时钟源切换到PLL */

  while(RCC_GetSYSCLKSource() != 0x08);

 }

}


/* GPIO配置 */

void GPIO_config(void)

{

 GPIO_InitTypeDef GPIO_InitStructure;


 /* 时钟配置 */

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);


 /* RX */

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


 /* TX */

    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);

}


/* 中断嵌套控制器配置 */

void NVIC_config(void)

{

 NVIC_InitTypeDef NVIC_InitStructure;

 

 /* 选择中断分组2 */

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


 /* 设置CAN接收中断 */

 NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

 NVIC_Init(&NVIC_InitStructure);

}


/* CAN总线配置 */

void CAN_config(void)

{

 CAN_InitTypeDef CAN_InitStructure;

 CAN_FilterInitTypeDef CAN_FilterInitStructure;


 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

 

 /* CAN1默认参数 */

 CAN_DeInit(CAN1);

 

 /* 将结构体填入默认参数 */

 CAN_StructInit(&CAN_InitStructure);


 /* 关闭时间触发模式 */

 CAN_InitStructure.CAN_TTCM = DISABLE;

 /* 关闭自动离线管理 */

 CAN_InitStructure.CAN_ABOM = ENABLE;

 /* 关闭自动唤醒 */

 CAN_InitStructure.CAN_AWUM = ENABLE;

 /* 自动重传 */

 CAN_InitStructure.CAN_NART = DISABLE;

 /* 禁止FIFO溢出时覆盖原报文 */

 CAN_InitStructure.CAN_RFLM = DISABLE;

 /* 关闭优先级取决于ID */

 CAN_InitStructure.CAN_TXFP = DISABLE;

 /* 正常模式 */

 CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;


 /* 设置波特率 */

 CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;

 CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;

 CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;

 CAN_InitStructure.CAN_Prescaler = 4;

 /* 初始化CAN总线 */

 CAN_Init(CAN1, &CAN_InitStructure);


 /* 过滤器配置 */

 CAN_FilterInitStructure.CAN_FilterNumber = 0;

 CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;

 CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

 CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0020;

 CAN_FilterInitStructure.CAN_FilterIdLow = 0x0007;

 CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0020;

 CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

 CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;

 CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;

 CAN_FilterInit(&CAN_FilterInitStructure);


 /* 接收挂起中断 */

 CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

}



/* 毫秒延时函数 */

void delay_ms(uint16_t time)

{    

 uint16_t i = 0; 


 while(time--)

 {

  i = 12000;

  while(i--);    

 }

}


CanTxMsg TxMessage;


/* 主函数 */

int main(void)

{

 uint8_t TransmitMailbox = 0;

 

 /* RCC时钟配置 */

 RCC_config();

 

 /* GPIO配置 */

 GPIO_config(); 


 /* CAN总线配置 */

 CAN_config();

 

 /* 中断嵌套控制器配置 */

 NVIC_config();

 

 while(1)

 {

        TxMessage.StdId = 1;

        TxMessage.ExtId = 0;

        TxMessage.IDE = CAN_ID_STD;

        TxMessage.RTR = CAN_RTR_DATA;

        TxMessage.DLC = 8;

        TxMessage.Data[0] = 0x11;

        TxMessage.Data[1] = 0x22;

        TxMessage.Data[2] = 0x33;

        TxMessage.Data[3] = 0x44;

        TxMessage.Data[4] = 0x55;

        TxMessage.Data[5] = 0x66;

        TxMessage.Data[6] = 0x77;

        TxMessage.Data[7] = 0x88;


  TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);

  while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK));

  

  delay_ms(1000);

 }

}




void USB_LP_CAN1_RX0_IRQHandler(void)

{

 CanRxMsg RxMessage;

    volatile CanRxMsg Message;


    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);


    Message.StdId = RxMessage.StdId;

    Message.ExtId = RxMessage.ExtId;

    Message.IDE = RxMessage.IDE;

    Message.RTR = RxMessage.RTR;

    Message.DLC = RxMessage.DLC;


    Message.Data[0] = RxMessage.Data[0];

    Message.Data[1] = RxMessage.Data[1];

    Message.Data[2] = RxMessage.Data[2];

    Message.Data[3] = RxMessage.Data[3];

    Message.Data[4] = RxMessage.Data[4];

    Message.Data[5] = RxMessage.Data[5];

    Message.Data[6] = RxMessage.Data[6];

    Message.Data[7] = RxMessage.Data[7];

}

关键字:STM32  CAN总线 引用地址:STM32之CAN总线例程

上一篇:STM32之ADC单通道连续例程
下一篇:STM32之CAN总线原理

推荐阅读最新更新时间:2024-03-16 16:25

安全启动 - STM32安全启动应用
安全启动实现了信任根。 为了整体安全的需要,需要将信任传递到下一级。这个信任传递是通过加解密技术完成的。 在启动时,我们要至少保证下一级固件的完整可靠性。意味着,我们要使用认证技术,对用户固件进行验证。对用户固件进行验证可以使用哈希函数,也可以使用基于对称密钥的验证码 AES-GCM。 系统在安全启动前,需要保存已经烧录到 Flash 里的用户固件的哈希值。这个哈希值,通过前面所提到的 STM32 安全技术,保证它不会被内外攻击所改变。 系统在安全启动时,利用前面所构造的安全执行环境,对需要进一步执行的用户固件,进行一个哈希运算。哈希运算一般是采用 SHA256。 系统比较这两个值。如果计算出来的哈希值,与存储的哈希值相同,我们
[单片机]
stm32CAN波特率计算小程序(QT源码)
软件:Qt Creator 开发环境:Window7 用qt做得一个计算波特率的小程序,在实际的应用中我们设置波特率的时候是通过以下参数来定的: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; CAN_InitStructure.CAN_BS2=CAN_BS2_6tq; CAN_InitStructure.CAN_Prescaler=5; 波特率计算小程序的截图: 根据所需的的采样点、波特率以及错误率得到以上外设初始化所需的参数。 据网上资料,采样点的设置有以下规律: 75% when 波特率
[单片机]
stm32CAN波特率计算小程序(QT源码)
STM32—cubeMX+DMA+USART 接收任意长度的数据
前言     之前的一篇文章中我为了可以实现USART接收任意长度的数据,对HAL的库进行了修改,可以实现接收以0x0a结尾的任意长度数据,即认为接收到0x0a时接收结束,见链接:HAL USART接收任意长度。   然而,上述这种方法并不合适,原则上HAL库一般不去修改,不便于其他人移植程序,降低了程序中库的适用性,这是很不好的习惯,所以这种方法并不可取。   后查资料得知STM32中还可以利用DMA的方式实现串口的任意长度数据的接收,故开始学习DMA+串口接收任意长度的数据这种方式。 cubeMX软件配置过程 首先,第一步都是进行时钟树的配置,配置好系统的时钟,不同的芯片配置不同的时钟频率,如图。
[单片机]
<font color='red'>STM32</font>—cubeMX+DMA+USART 接收任意长度的数据
CRC校验、STM32中CRC计算单元、CRC应用
从这一段时间后台反馈的问题可以看得出来,好些朋友对CRC没有什么概念,今天就在这里讲述一下关于CRC校验、STM32中CRC计算单元相关内容。 1关于CRC校验 CRC:Cyclic Redundancy Check,即循环冗余校验码。 CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。 循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ---来自百度百科 学电子、计算机相关专业的同学都应该学习过CRC的基础原理。其原理说难不难,可以说就是一个公式。同时,
[单片机]
CRC校验、<font color='red'>STM32</font>中CRC计算单元、CRC应用
stm32 栈的大小问题
前几天写stm32程序,遇到一个奇怪的问题,有一个数组的值总被非法修改。 开始以为是哪里数组访问越界了,查了半天没发现有越界访问的数组。后来把程序一部分一部分注释掉,发现调用一个根本不相干,也不存在什么问题的函数时,那个数组就会被修改。然后又是不断地试,注释掉各个部分。最终也没有找到规律。没办法只好将两个局部数组移到外面,定义成全局变量,结果问题解决。 网上一查才发现,栈的大小是需要定义的,默认0x200。几天的工作啊,就是因为这个问题。记一辈子了。
[单片机]
STM32串口DMA问题详解
昨天晚上在STM32串口DMA的问题上纠结了好长时间,所以今天上午写篇博客来谈谈我对串口DMA发送的理解。 讨论三个问题: 1、什么叫串口DMA 请求; 2、串口简要复习; 3、串口DMA发送流程。 1、什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性。先导出原子哥的PPT内容: DMA 全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。 STM32有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道,DMA2有5个通道,
[单片机]
<font color='red'>STM32</font>串口DMA问题详解
基于CAN总线的电梯呼梯控制器的设计与实现
  1 引言   目前电梯的生产情况和使用数量成为一个国家现代化程度的标志之一。电梯是机电一体的高层建筑的复杂运输设备。它涉及机械工程、电子技术、电力电子技术、电机与拖动理论、自动控制理论等多个科学领域。电梯呼梯控制器是电梯的一个重要组成部分, 位于每一层楼电梯门的左边或者右边,是每一层楼的呼叫装置,用于给出每一楼层的呼叫请求信息,并显示电梯当前运行情况。乘客可以通过显示器、按键等了解到电梯运行的大量信息。本文采用CAN总线技术设计呼梯控制器,各控制器之间只需一对双绞线以一定的网络拓扑结构连接即可,安装极为方便,且可靠性高。对于不同楼层数的控制系统只需在CAN总线中加入相应数目的呼梯控制器即可,主控制器硬件软件不需做任何改动
[嵌入式]
STM32的一些基本知识总结
Cortex-M3缩略语 AMBA:先进单片机总线架构 ADK:AMBA设计套件 AHB:先进高性能总线 AHB-AP:AHB访问端口 APB:先进外设总线 ARM ARM:ARM架构参考手册 ASIC:行业领域专用集成电路 ATB :先进跟踪总线 BE8:字节不变式大端模式 CPI:每条指令的周期数 DAP:调试访问端口 DSP:数字信号处理(器) DWT:数据观察点及跟踪 ETM:嵌入式跟踪宏单元 FPB:闪存地址重载及断点 FSR:fault状态寄存器 HTM:Core Sight AHB跟踪宏单元 ICE:在线仿真器 IDE:集成开发环境 IRQ:中断请求(通常是外中断请求) ISA:指令系统架构 ISR:中断服务例程 I
[单片机]
<font color='red'>STM32</font>的一些基本知识总结
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved