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

文章目录

    • 创建一个新的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.mzph.cn/web/1537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu安装QEMU

qemu虚拟机的使用&#xff08;一&#xff09;——ubuntu20.4安装QEMU_ubuntu安装qemu-CSDN博客 遇到的问题&#xff1a; (1)本来使用git clone https://github.com/qemu/qemu.git fatal: 无法访问 https://github.com/qemu/qemu.git/&#xff1a;GnuTLS recv error (-110): …

[阅读笔记18][CITING]LARGE LANGUAGE MODELS CREATE CURRICULUM FOR INSTRUCTION TUNING

这篇论文是23年10月提交到arxiv上的&#xff0c;也是用大模型蒸馏小模型的思路。 作者在这篇论文中提出了课程指令微调&#xff0c;大体流程如下图所示&#xff0c;教师模型给出一个问题&#xff0c;让学生模型回答一下&#xff0c;这时候学生回答大概率不够准确&#xff0c;这…

深度学习之图像分割从入门到精通——基于unet++实现细胞分割

模型 import torch from torch import nn__all__ [UNet, NestedUNet]class VGGBlock(nn.Module):def __init__(self, in_channels, middle_channels, out_channels):super().__init__()self.relu nn.ReLU(inplaceTrue)self.conv1 nn.Conv2d(in_channels, middle_channels, …

生态短讯 | Tapdata 与 TDengine 完成产品兼容性互认证,打造物联网实时数据生态

近月&#xff0c;深圳钛铂数据有限公司&#xff08;以下简称钛铂数据&#xff09;自主研发的实时数据平台&#xff08;Tapdata Live Data Platform&#xff09;与北京涛思数据科技有限公司&#xff08;以下简称涛思数据&#xff09;自主研发的大数据平台 TDengine&#xff0c;已…

【深度学习】Dropout、DropPath

一、Dropout 1. 概念 Dropout 在训练阶段会让当前层每个神经元以drop_prob&#xff08; 0 ≤ drop_prob ≤ 1 0\leq\text{drop\_prob}\leq1 0≤drop_prob≤1&#xff09;的概率失活并停止工作&#xff0c;效果如下图。 在测试阶段不会进行Dropout。由于不同批次、不同样本的神…

数据库管理-第171期 Oracle是用这种方式确保读一致的(20240418)

数据库管理171期 2024-04-18 数据库管理-第171期 Oracle是用这种方式确保读一致的&#xff08;20240418&#xff09;1 基本概念2 用处3 注意事项总结 数据库管理-第171期 Oracle是用这种方式确保读一致的&#xff08;20240418&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#x…

MySQL中explain的用法

执行结果各字段的含义 EXPLAIN SQL语句 如&#xff1a; EXPLAIN SELECT * FROM test 执行结果&#xff1a; 列名描述id在一个大的查询语句中每个SELECT关键字都对应一个 唯一的idselect_typeSELECT关键字对应的那个查询的类型table表名partitions匹配的分区信息type针对单表…

P2P面试题

1&#xff09;描述一下你的项目流程以及你在项目中的职责&#xff1f; 一个借款产品的发布&#xff0c;投资人购买&#xff0c;借款人还款的一个业务流程&#xff0c;我主要负责测注册&#xff0c;登录&#xff0c;投资理财这三个模块 2&#xff09;你是怎么测试投资模块的&am…

HttpServlet,ServletContext,Listener它仨的故事

1.HttpServlet。 听起来是不是感觉像是个上古词汇&#xff0c;是不是没有阅读下去的兴趣了&#xff1f;Tomcat知道吧&#xff0c;它就是一个servlet容器&#xff0c;当用户向服务器发送一个HTTP请求时&#xff0c;Servlet容器&#xff08;如Tomcat&#xff09;会根据其配置找到…

overflow(溢出)4个属性值,水平/垂直溢出,文字超出显示省略号的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

解析 IP(IPv4)地址

IPv 4 地址 一、组成二、IPv4 的分类三、子网掩码四、特殊的地址五、私有 IP 地址六、全局 IP 地址七、私有 IP 地址和全局 IP 地址的关系八、广播地址九、网络地址十、IP 地址个数计算十一、查看电脑的 IP 地址&#xff08;window&#xff09;十二、手动设置电脑的 IP 地址 为…

华为Pura 70系列,一种关于世界之美的可能

1874年&#xff0c;莫奈创作了《印象日出》的油画&#xff0c;在艺术界掀起了一场革命。当时的主流艺术&#xff0c;是追求细节写实&#xff0c;追求场面宏大的学院派。他们称莫奈等人是“印象派”&#xff0c;认为莫奈的画追求光影表达&#xff0c;追求描绘抽象的意境&#xf…

DRF: 序列化器、View、APIView、GenericAPIView、Mixin、ViewSet、ModelViewSet的源码解析

前言&#xff1a;还没有整理&#xff0c;后续有时间再整理&#xff0c;目前只是个人思路&#xff0c;文章较乱。 注意路径匹配的“/” 我们的url里面加了“/”&#xff0c;但是用apifox等非浏览器的工具发起请求时没有加“/”&#xff0c;而且还不是get请求&#xff0c;那么这…

天才简史——Sylvain Calinon

一、研究方向 learning from demonstration&#xff08;LfD&#xff09;领域的专家&#xff0c;机器人红宝书&#xff08;Springer handbook of robotics&#xff09;Robot programming by demonstration章节的合作者。主要研究兴趣包括&#xff1a; 机器人学习、最优控制、几…

[数据结构]——排序——插入排序

目录 ​编辑 1 .插入排序 1.基本思想&#xff1a; 2.直接插入排序&#xff1a; ​编辑 1.代码实现 2.直接插入排序的特性总结&#xff1a; 3.希尔排序( 缩小增量排序 ) 1.预排序 2.预排序代码 3.希尔排序代码 4.希尔排序的特性总结&#xff1a; 1 .插入排序 1.基本思…

从头开始构建自己的 GPT 大型语言模型

图片来源&#xff1a; Tatev Aslanyan 一、说明 我们将使用 PyTorch 从头开始构建生成式 AI、大型语言模型——包括嵌入、位置编码、多头自注意、残差连接、层归一化&#xff0c;Baby GPT 是一个探索性项目&#xff0c;旨在逐步构建类似 GPT 的语言模型。在这个项目中&#xff…

Linux 文件描述符

1、文件描述符 程序和进程的区别&#xff1a; 1、test.c&#xff1a;是一个程序&#xff0c;只占用磁盘空间&#xff0c;不占用内存空间 2、可执行文件 test&#xff1a;是一个程序&#xff0c;只占用磁盘空间&#xff0c;不占用内存空间 3、启动 可执行文件 test&#xff…

强固型工业电脑在码头智能化,龙门吊/流机车载电脑的行业应用

码头智能化行业应用 对码头运营来说&#xff0c;如何优化集装箱从船上到码头堆场到出厂区的各个流程以及达到提高效率。 降低成本的目的&#xff0c;是码头营运获利最重要的议题。为了让集装箱码头客户能够安心使用TOS系统来调度指挥码头上各种吊车、叉车、拖车和人员&#xf…

第一届 _帕鲁杯_ - CTF挑战赛

Mis 签到 题目附件&#xff1a; 27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 2…

matplotlib从起点出发(15)_Tutorial_15_blitting

0 位图传输技术与快速渲染 Blitting&#xff0c;即位图传输、块传输技术是栅格图形化中的标准技术。在Matplotlib的上下文中&#xff0c;该技术可用于&#xff08;大幅度&#xff09;提高交互式图形的性能。例如&#xff0c;动画和小部件模块在内部使用位图传输。在这里&#…