Microchip 32位MCU CAN驱动图文教程-附源码

news/2024/5/18 16:21:29

文章目录

    • 创建一个新的32位MCU工程
    • Microchip MCC Harmony配置界面说明
    • 在MCC下配置系统的时钟
    • 在MCC下配置所需要使用的模块
      • 配置调试打印模块
      • 配置CAN模块
      • 配置管脚功能
      • 修改系统堆栈大小
      • 生成代码
    • 添加用户代码

创建一个新的32位MCU工程

确保电脑上已经安装最新的MPlab X IDE、XC32编译器和MCC harmony软件仓库,比如当前所使用的MPlab X IDE版本是V6.20

  • 打开MPlab X IDE后,选择File->New Project:
    在这里插入图片描述
  • 选择Application Project,点击下一步:
    在这里插入图片描述
  • 选择需要选择的器件型号,比如本教程选用的ATSAME54P20 MCU,点击下一步:
    在这里插入图片描述
  • 选择交叉编译工具,点击下一步:
    在这里插入图片描述
  • 输入工程名称和选择存储路径,最后点击完成Finish
    在这里插入图片描述
  • 需要确保本地电脑上已经下载了Microchip MCC Harmony针对于所使用MCU型号的软件包,可以从github或者国内的gitee进行下载,并在MPlab X IDE里面进行配置。
    • 配置过程可以通过Tools -> Option进入
      在这里插入图片描述

Microchip MCC Harmony配置界面说明

Microchip MCC harmony提供图形化的配置界面,能够方便的增减各种外设驱动库、中间件,提供图形化的系统时钟、管脚、DMA、事件系统和网络协议栈的配置,当完成配置后能够一键生成代码。
在这里插入图片描述

  • 在官方SAME54 Xplained Pro开发板上完成以下配置目标
    • 采用外部12MHz晶振输入
    • 提供40M clock给CAN模块
    • CAN工作在500kbps速率,采样点为75%
    • 使用RX FIFO0来接收标准帧,FIFO1接收扩展帧
    • 标准帧过滤器(Classic、Range模式)设置参考(只接收ID为0x1D00x1D7和0x1F00x1F8的帧)
    • 扩展帧过滤器(Classic、Range模式)设置参考(只接收ID为0x1FFF1240~0x1FFF1248的帧)

在MCC下配置系统的时钟

在Plugins里面打开Clock Configuration
在这里插入图片描述
打开时钟配置界面后,将看到以下的配置界面:
在这里插入图片描述
外部无源晶振输入的配置(外部12MHz晶振输入接在XOSC1上):
在这里插入图片描述
XOSC CTRL配置的高级选项:
在这里插入图片描述
MCU通用时钟发生器1~4的配置:
在这里插入图片描述
通用时钟发生器GCLK2的配置:
在这里插入图片描述
通用时钟发生器GCLK3的配置:
在这里插入图片描述
MCU锁相环 FDPLL0的配置:
在这里插入图片描述
FDPLL0的高级配置:
在这里插入图片描述
外设时钟的配置:
在这里插入图片描述

在MCC下配置所需要使用的模块

配置调试打印模块

添加SERCOM2模块,选择MCC Resource Management -> Device Resources -> Libraries -> Harmony -> Peripherals -> SERCOM -> SERCOM2
在这里插入图片描述
配置SERCOM2模块,在Project Graph界面下左键单击新添加的SERCOM2模块
在这里插入图片描述
一个SERCOM模块有4个PAD,PAD0~3,参考SAME54开发板原理图,打印用的串口PAD1为RX,PAD0为TX,所以配置SERCOM2的Receive/Transmit Pinout需要和原理图保持一致
在这里插入图片描述
添加STDIO模块,选择MCC Resource Management -> Device Resources -> Libraries -> Harmony -> Tools -> STDIO
在这里插入图片描述
配置STDIO模块
在这里插入图片描述
将STDIO和SERCOM2关联起来,右键点击STDIO组件下的粉色边框,选择Satisfiers下的SERCOM2即可
在这里插入图片描述
STDIO标准打印接口绑定到SERCOM2,STDIO调试信息将输出到SERCOM2口
在这里插入图片描述

配置CAN模块

添加CAN1模块,选择MCC Resource Management -> Device Resources -> Libraries -> Harmony -> Peripherals -> CAN -> CAN1
在这里插入图片描述

  • 对添加的CAN1模块进行配置:
    • 满足过滤规则的帧将存储在指定的FIFO中
    • 提供40M clock给CAN模块
    • CAN工作在500 kbps速率,采样点为75%
    • 使用RX FIFO0来接收标准帧,FIFO1接收扩展帧
    • 如果需要将CAN工作速率修改为250 kbps,只需Bit Rate手动输入250即可
      在这里插入图片描述
      在这里插入图片描述
  • CAN1模块标准帧过滤器设置规则如下:
    • 满足过滤规则的标准帧将存储在指定的RX FIFO0中
    • 只接收帧ID在0x1D0 ~ 0x1D7范围内的帧(过滤器0用Classic方式实现)
    • 只接收帧ID在0x1F0 ~ 0x1F8范围内的帧(过滤器1用Range方式实现)
  • CAN1模块扩展帧过滤器设置规则如下:
    • 满足过滤规则的扩展帧将存储在指定的RX FIFO1中
    • 只接收帧ID在0x1FFF1230 ~ 0x1FFF1237范围内的帧(过滤器0用Classic方式实现)
    • 只接收帧ID在0x1FFF1240 ~ 0x1FFF1248范围内的帧(过滤器1用Range方式实现)
      在这里插入图片描述
      在这里插入图片描述

配置管脚功能

配置STDIO打印用到的SERCOM口TX、RX管脚,CAN1模块用到的CAN1_TX、CAN1_RX和CAN收发器standby控制管脚PC13
在这里插入图片描述
在Project Graph界面下,打开Pin Configuration
在这里插入图片描述
随后在Pin Setting下对所需要的管脚进行配置
在这里插入图片描述

修改系统堆栈大小

从Project Graph界面下,点击System模块,从右边配置树中修改Heap Size
在这里插入图片描述

生成代码

在这里插入图片描述

添加用户代码

在main.c文件下,首先添加PLIB CAN驱动需要用到CAN消息缓存buffer和变量的定义。很多变量需要在回调函数中使用,而回调函数是在中断处理代码中被调用,因此需要定义为volatile类型,参考代码如下图所示:

/* CAN message storage buffer definition */
uint8_t Can1MessageRAM[CAN1_MESSAGE_RAM_CONFIG_SIZE] __attribute__((aligned (32)));/* Standard identifier id[28:18]*/
#define WRITE_ID(id) (id << 18)
#define READ_ID(id)  (id >> 18)//static uint8_t g_txFiFo[MCAN1_TX_FIFO_BUFFER_SIZE]; /* CAN TX message buffer */
static uint8_t g_rxFiFo0[CAN1_RX_FIFO0_SIZE];      /* CAN FIFO 0 RX buffer */
static uint8_t g_rxFiFo1[CAN1_RX_FIFO1_SIZE];      /* CAN FIFO 1 RX buffer */static volatile bool    g_txdone  = false;         /* CAN TX completion flag */
static volatile bool    g_rx0done = false;         /* FIFO 0 got new message */
static volatile bool    g_rx1done = false;         /* FIFO 1 got new message */
static volatile uint8_t g_rxnum0 = 0;              /* FIFO 0 new message number */
static volatile uint8_t g_rxnum1 = 0;              /* FIFO 0 new message number */

随后定义CAN PLIB驱动中用到的RX FIFOx接收完成回调函数和TX FIFO发送完成回调函数,其中使用RX FIFO0用于存储标准帧,RX FIFO1用于存储扩展帧。需要在CAN驱动初始化的时候注册FIFO发送完成和接收完成的回调函数。需要注意的是,回调函数是在中断上下文中执行:

static void CAN1_TXFIFO_Txdone(uintptr_t contextHandle)
{g_txdone = true;
}static void CAN1_RXFIFO0_Rxdone(uint8_t numberOfMessage, uintptr_t contextHandle)
{g_rx0done = true;g_rxnum0  = numberOfMessage;
}static void CAN1_RXFIFO1_Rxdone(uint8_t numberOfMessage, uintptr_t contextHandle)
{g_rx1done = true;g_rxnum1  = numberOfMessage;
}

在CAN驱动初始化的时候需要调用GPIO PC13的clear操作,用于将CAN收发器ATA6561跳出standby模式。同时提供一个打印接收的CAN数据帧的函数,用来观察收到的CAN数据帧。打印函数的参数定义如下:
.fifonum – CAN RX FIFO通道号:
.numberofMessage——接收的消息数量:
.rxBuf——接收消息的缓存区首地址:
.rxBufLen——单条消息缓存区的长度:

static inline void CAN1_Demo_Initialization(void)
{GPIO_PC13_Clear();CAN1_TxFifoCallbackRegister(CAN1_TXFIFO_Txdone, 0);CAN1_RxFifoCallbackRegister(CAN_RX_FIFO_0, CAN1_RXFIFO0_Rxdone, 0);CAN1_RxFifoCallbackRegister(CAN_RX_FIFO_1, CAN1_RXFIFO1_Rxdone, 0);
}/* Print Rx Message */
static void print_message(CAN_RX_FIFO_NUM fifonum, uint8_t numberOfMessage, CAN_RX_BUFFER *rxBuf, uint8_t rxBufLen)
{uint8_t msgLength = 0;uint32_t id = 0;for (uint8_t count = 0; count < numberOfMessage; count++){/* Print message to Console */printf(" Rx FIFO%d: ", fifonum == CAN_RX_FIFO_0 ? 0:1);id = rxBuf->xtd ? rxBuf->id : READ_ID(rxBuf->id);msgLength = rxBuf->dlc;printf(" Message - ID=0x%x Length=%d\r\n", (unsigned int)id, (unsigned int)msgLength);rxBuf += rxBufLen;}
}

在while(1)主循环中添加以下代码,判断RX FIFOx是否有接收到新的数据帧,如果有则清除标记位并记录当前收到的帧数,需要注意的是加入临界区保护代码。读取CAN数据帧时,先将用户帧缓存内容清零,然后从FIFO中读取指定数量的帧到缓存区,最后打印接收的帧内容:

int main ( void )
{uint8_t rx_num;/* Initialize all modules */SYS_Initialize ( NULL );printf(" ------------------------------ \r\n");printf("            CAN Demo            \r\n");printf(" ------------------------------ \r\n");/* Set Message RAM Configuration */CAN1_MessageRAMConfigSet(Can1MessageRAM);CAN1_Demo_Initialization();while ( true ){/* Maintain state machines of all polled MPLAB Harmony modules. */SYS_Tasks ( );if (g_rx0done){__disable_irq();g_rx0done = false;rx_num    = g_rxnum0;__enable_irq();memset(g_rxFiFo0, 0x00, (rx_num * CAN1_RX_FIFO0_ELEMENT_SIZE));if (CAN1_MessageReceiveFifo(CAN_RX_FIFO_0, rx_num, (CAN_RX_BUFFER *)g_rxFiFo0) == true){print_message(CAN_RX_FIFO_0, rx_num, (CAN_RX_BUFFER *)g_rxFiFo0,CAN1_RX_FIFO0_ELEMENT_SIZE);}else{printf(" Error in FIFO0 received message\r\n");}}if (g_rx1done){__disable_irq();g_rx1done = false;rx_num    = g_rxnum1;__enable_irq();memset(g_rxFiFo1, 0x00, (rx_num * CAN1_RX_FIFO1_ELEMENT_SIZE));if (CAN1_MessageReceiveFifo(CAN_RX_FIFO_1, rx_num, (CAN_RX_BUFFER *)g_rxFiFo1) == true){print_message(CAN_RX_FIFO_1, rx_num, (CAN_RX_BUFFER *)g_rxFiFo1,CAN1_RX_FIFO1_ELEMENT_SIZE);}else{printf(" Error in FIFO1 received message\r\n");}}}/* Execution should not come here during normal operation */return ( EXIT_FAILURE );
}

http://www.mrgr.cn/p/64726635

相关文章

黑龙江—等保测评三级安全设计思路

需求分析 6.1、 系统现状 6.2、 现有措施 目前&#xff0c;信息系统已经采取了下述的安全措施&#xff1a; 1、在物理层面上&#xff0c; 2、在网络层面上&#xff0c; 3、在系统层面上&#xff0c; 4、在应用层面上&#xff0c; 5、在管理层面上&#xff0c; 6.…

几种中文字体的比较

根据自己的喜好给常见的几个中文字体的打分:字体选项 字体名 得分adobe Adobe 宋体 Std 5fandol FandolSong 0founder 方正书宋_GPK 10hanyi 汉仪宋体 6sinotype 华文宋体 3win 中易宋体 9fandol 缺少偏僻字体,故得零分。

数据治理之数据质量管理

一、数据质量概述什么是数据质量数据质量差的危害数据质量维度(数据六大评价标准)什么是数据质量测量数据质量测量必须要有目的数据质量测量必须可重复数据质量测量必须可解释什么是数据质量管理二、数据问题根因分析什么是根因分析为什么要进行根因分析产生数据问题的阶段规…

第十五届蓝桥杯省赛第二场C/C++B组A题【进制】题解(AC)

解题思路 按照题意进行模拟&#xff0c;计算 x x x 的 b b b 进制过程中&#xff0c;若出现余数大于 9 9 9&#xff0c;则说明 x x x 的 b b b 进制一定要用字母进行表示。 #include <iostream> #include <cstring> #include <algorithm> #include &l…

如何用微信发布考试成绩(如月考、期中、期末等)

自教育部《未成年人学校保护规定》颁布后,教育部明确表示:学校不得公开学生的考试成绩、排名等信息!同时学校应采取措施,便利家长知道学生的成绩等学业信息,对于教师来说,如何用微信发布考试成绩(如:月考、期中、期末等)就成了一道难题... 公开吧,会伤害到学生自尊心,甚至被投诉…

implicit declaration of item ‘write’; did him mean ‘fwrite’?

include <unistd.h> implicit declaration of item ‘write’; did him mean ‘fwrite’?Ask QuestionQuestions 2 years, 5 months ago Modified 2 years, 5 months ago Viewed 5k times 0IODIN bundled an case of a uncomplicated note-taking program that uses sav…

TapData + 实时数仓:实时数据如何赋能船舶制造业,助力数字化应用升级和科学管理运营

老牌国有制造企业实践案例:TapData + 实时数仓BI 系统,船舶制造如何基于实时数据平台解决方案实现数字化应用升级和科学管理运营 ?使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量代替 OGG、DSG 等同步工具,「CDC + 流处理 + 数据集成」组合拳,加速仓…

数据治理之元数据管理

一、元数据管理概述什么是元数据元数据的3种类型业务元数据技术元数据操作元数据元数据的作用什么是元数据管理元数据管理的目标建立指标解释体系提高数据溯源能力数据质量稽核体系元数据管理的阶段二、元数据管理方法业务目标理解建立企业数据资产目录消除冗余加强数据复用降低…

AHB介绍

1. 关于AHB协议 AMBA AHB是一种适用于高性能可综合设计的总线接口。它定义了组件之间的接口&#xff0c;例如master、互连和slave。 AMBA AHB实现了高性能、高时钟频率系统所需的特性&#xff0c;包括&#xff1a; 突发传输&#xff08;Burst transfers&#xff09;。单时钟…

【pytorch学习】之线性神经网络-图像分类数据集

图像分类数据集 MNIST数据集 (LeCun et al., 1998) 是图像分类中广泛使用的数据集之一,但作为基准数据集过于简单。我们将使用类似但更复杂的Fashion‐MNIST数据集 (Xiao et al., 2017)。 %matplotlib inline import torch import torchvision from torch.utils import data f…

docker的基本命令

基础命令 https://yeasy.gitbook.io/docker_practice/data_management/volume// 容器命令 1. docker command --help 查看对应命令的用法 2. docker ps -a 查看所有docker进程(无论是否在运行) -l最后一次创建的容器 3. docker logs containerId 查看容器日志 4. docker start…

【数据结构】串(String)

文章目录 基本概念顺序存储结构比较当前串与串s的大小取子串插入删除其他构造函数拷贝构造函数扩大数组空间。重载重载重载重载[]重载>>重载<< 链式存储结构链式存储结构链块存储结构 模式匹配朴素的模式匹配算法(BF算法)KMP算法字符串的前缀、后缀和部分匹配值nex…

AI生成内容(AIGC)技术:革新创作与挑战未来

如何看待AIGC技术&#xff1f; 本文将深入探讨人工智能生成内容&#xff08;AIGC&#xff09;技术的发展现状、多领域应用、伦理与风险&#xff0c;以及未来的发展趋势。AIGC技术正在改变信息和创作的景观&#xff0c;本文旨在为读者提供一个全面的视角&#xff0c;了解这一技…

强强联合,思迈特与科大讯飞星火智能体,完成大模型兼容性认证

近日&#xff0c;历经多项严格测试&#xff0c;思迈特商业智能与数据分析软件[简称Smartbi Insight ]V11与科大讯飞星火智能体完成相互兼容性测试&#xff0c;这一里程碑式的合作不仅再一次彰显了思迈特强大的产品实力&#xff0c;同时也是其在智能科技领域的一次重要突破&…

政企版 WPS Pro 专业版注册安装教程

政企版 WPS Pro 专业版安装及激活步骤 第 1 步&#xff1a;下载压缩包&#xff08;内含注册码&#xff09;【无解压密码】。 第 2 步&#xff1a;解压缩后&#xff0c;运行 exe 文件&#xff0c;默认步骤安装即可。 第 3 步&#xff1a;安装完成后&#xff0c;新建一个 Word …

RTX腾讯通升级至有度,无缝衔接信创国产即时通讯及协同办公平台

随着信息技术的快速发展,企业对于即时通讯和协同办公平台的需求日益增强。RTX腾讯通作为国内知名的即时通讯工具,一直以来都受到广大企业的青睐。然而,随着信创国产化趋势的加速推进,越来越多的企业开始寻求更加符合国产化要求的解决方案。在这样的背景下,RTX腾讯通升级至…

碎片和水位线回收的验证过程 转发 https://www.modb.pro/db/1780420808865845248

1、数据库基础内容 表空间-数据文件-段-区-块 一个表空间由一个或者多个数据文件组成 高水位线和表碎片的示意图 其中被划掉的字代表delete删除,其中 耶 就是后续的insert,只会在末尾增加,而不是填充被删除的字段,这样就会导致数据库在搜寻数据时会浪费很多资源。 整理碎片…

【学习笔记】Python 使用 matplotlib 画图

本文将介绍如何使用 Python 的 matplotlib 库画图,记录一些常用的画图 demo 代码目录安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图,记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip in…

记录一个小问题

引发错误结果的代码: class Solution {List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {backTracking(n, k, 1);return resul…

开源向量数据库比较:Chroma, Milvus, Faiss,Weaviate

语义搜索和检索增强生成(RAG)正在彻底改变我们的在线交互方式。实现这些突破性进展的支柱就是向量数据库。选择正确的向量数据库能是一项艰巨的任务。本文为你提供四个重要的开源向量数据库之间的全面比较,希望你能够选择出最符合自己特定需求的数据库。 什么是向量数据库?向…