嵌入式作业7

1、2个或以上同学相互连接,利用CAN通信,向对方发送带有本人姓名的信息。连线方式:按基本原理性电路(不带收发器芯片)连接,参考教材图10-1。

2、在ADC实验中,结合热敏电阻,分别通过触摸芯片表面和热敏电阻,引起A/D值变化,显示芯片内部温度和当前温度。

3、用实验验证,对于有数据的某扇区,如果没有擦除(Flash_erase),可否写入新数据?注:扇区号为学号 后2位,数据文本中要有姓名。

四、程序源码

内容1:can总线连接互相发送信息:

五、运行结果

用适当的文字、截图、图片等描述实验的结果,实验1需包含连线图。

 Main.c

#define GLOBLE_VAR

#include "includes.h"      //包含总头文件

//----------------------------------------------------------------------

//声明使用到的内部函数

//main.c使用的内部函数声明处

//----------------------------------------------------------------------

//主函数,一般情况下可以认为程序从此开始运行(实际上有启动过程,参见书稿)

int main(void)

{

       //(1)======启动部分(开头)==========================================

       //(1.1)声明main函数使用的局部变量

       vuint32_t mMainLoopCount;  //主循环次数变量

       uint8_t  mFlag;           //灯的状态标志

       uint32_t mLightCount;     //灯的状态切换次数

       uint32_t localMsgID;

       uint32_t txMsgID;

       uint32_t BitRate;

       //(1.2)【不变】关总中断

       DISABLE_INTERRUPTS;

       //(1.3)给主函数使用的局部变量赋初值

    mMainLoopCount=0;    //主循环次数变量

       mFlag='A';           //灯的状态标志

       mLightCount=0;       //灯的闪烁次数

       localMsgID = 0x0BU;

       txMsgID = 0x0AU;

       BitRate = 36;

       //(1.4)给全局变量赋初值

       //(1.5)用户外设模块初始化

       gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_ON);      //初始化蓝灯

    emuart_init(UART_User,115200);

    uart_init(UART_3,115200);

    //【***CAN模块初始化***】

    can_init(CAN_1,localMsgID,BitRate);

    //(1.6)使能模块中断

    uart_enable_re_int(UART_User);

    uart_enable_re_int(UART_3);

    //【***使能CAN模块中断***】

    can_enable_recv_int(CAN_1);

    //(1.7)【不变】开总中断

       ENABLE_INTERRUPTS;

       //(1)======启动部分(结尾)==========================================

       //(2)======主循环部分(开头)========================================

       for(;;)   //for(;;)(开头)

       {

              //(2.1)主循环次数变量+1

        mMainLoopCount++;

        //(2.2)未达到主循环次数设定值,继续循环

              if (mMainLoopCount<=12889000)  continue;

              //(2.3)达到主循环次数设定值,执行下列语句,进行灯的亮暗处理

              //(2.3.1)清除循环次数变量

              mMainLoopCount=0;

              //(2.3.2)如灯状态标志mFlag为'L',灯的闪烁次数+1并显示,改变灯状态及标志

              if (mFlag=='L')                    //判断灯的状态标志

              {

                     mLightCount++;

                     printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);

                     mFlag='A';                       //灯的状态标志

                     gpio_set(LIGHT_RED,LIGHT_ON);  //灯“亮”

                     printf(" LIGHT_RED:ON--\n");   //串口输出灯的状态

                     //【***CAN模块发送一帧数据***】

                     if(can_send(CAN_1, txMsgID, 8, (uint8_t*)"IamnodeB") != 0) printf("failed\r\n");

              }

              //(2.3.3)如灯状态标志mFlag为'A',改变灯状态及标志

              else

              {

                     mFlag='L';                       //灯的状态标志

                     gpio_set(LIGHT_RED,LIGHT_OFF); //灯“暗”

                     printf(" LIGHT_RED:OFF--\n");  //串口输出灯的状态

              }

       }  //for(;;)结尾

       //(2)======主循环部分(结尾)========================================

}   //main函数(结尾)

//======以下为主函数调用的子函数===========================================

//========================================================================

/*

 知识要素:

 (1)main.c是一个模板,该文件所有代码均不涉及具体的硬件和环境,通过调用构件

      实现对硬件的干预。

 (2)本文件中对宏GLOBLE_VAR进行了定义,所以在包含"includes.h"头文件时,会定

      义全局变量,在其他文件中包含"includes.h"头文件时,

      编译时会自动增加extern

 */

内容2:在ADC实验中,结合热敏电阻,分别通过触摸芯片表面和热敏电阻,引起A/D值变化,显示芯片内部温度和当前温度。

//主函数

int main(void)

{

    uint16_t num_AD1;     

    uint16_t num_AD2;

    uint16_t num_AD3;

    uint32_t mMainLoopCount;  //主循环次数变量

   

    //关总中断

    DISABLE_INTERRUPTS;

   

    mMainLoopCount=0;    //主循环次数变量

    adc_init(ADC_CHANNEL_1,AD_DIFF);                     //初始化ADC通道1,

    adc_init(ADC_CHANNEL_15,AD_DIFF);                   //初始化ADC通道15

    adc_init(ADC_CHANNEL_TEMPSENSOR,AD_SINGLE);     //初始化ADC通道:内部温度

   

    ENABLE_INTERRUPTS;

   

    printf("------------------------------------------------------\n");

    printf("金葫芦提示:                                           \n");

    printf("(1)目的:ADC单端输入与差分输入测试                    \n");

    printf("(2)单端:内部温度传感器,通道号17,无需引脚对应        \n");

    printf("     差分:GEC引脚47、46(通道1、2)                  \n");

    printf("           GEC引脚12、11(通道15、16)                  \n");

    printf("(3)测试方法:单端:手摸芯片表面,A/D值增大,不要摸    \n");

    printf("                    到引脚,静电可能损坏芯片           \n");

    printf("              差分:将引脚47接地、46接3.3V,观察通道1情况\n");

    printf("                    将引脚46接地、47接3.3V,观察通道1情况\n");

    printf("             类似方法,观察通道15                      \n");

    printf("------------------------------------------------------\n");

   

    for(;;)

    {

           //主循环次数变量+1

        mMainLoopCount++;

        //未达到主循环次数设定值,继续循环

        //延时1秒

        if (mMainLoopCount<=30000000)  continue;

        //达到主循环次数设定值,执行下列语句,进行灯的亮暗处理

        //清除循环次数变量

        mMainLoopCount=0;

       

        num_AD1 = adc_ave(ADC_CHANNEL_1,8);

        num_AD2 = adc_ave(ADC_CHANNEL_15,8);

        num_AD3 = adc_ave(ADC_CHANNEL_TEMPSENSOR,8);

        printf("通道1(GEC47、46)的A/D值: %d\r\n",num_AD1);

        printf("通道1(GEC47、46)的温度值: %f\r\n",Regression_Ext_Temp(num_AD1));

        printf("通道15(GEC12、11)的A/D值:%d\r\n",num_AD2);

        printf("通道15(GEC12、11)的温度值:%f\r\n",Regression_Ext_Temp(num_AD2));

        printf("32106100129内部温度A/D值:%d\r\n",num_AD3);

        printf("梁毅轩内部温度温度值:%f\r\n\n",Regression_MCU_Temp(num_AD3));

    }

}

内容三:

用实验验证,对于有数据的某扇区,如果没有擦除(Flash_erase),可否写入新数据?注:扇区号为学号 后2位,数据文本中要有姓名。

首先写入数据:

int main(void)

{

       uint8_t mK1[32];   //按照逻辑读方式从指定flash区域中读取的数据

       uint8_t result;        //判断扇区是否为空标识

       uint16_t sector = 29U;

      

       //初始化扇区内容

       flash_erase(sector);

       flash_write(sector,0,32,(uint8_t *) "Iam32106100129梁毅轩");

       printf("初始化%d扇区。\n",sector);

       flash_read_logic(mK1,sector,0,32); //从指定扇区读取32个字节到mK1中

       printf("擦除前%d扇区32字节的内容:%s\n",sector,mK1);

       result = flash_isempty(sector,MCU_SECTORSIZE); // 判断指定扇区是否为空

       printf("扇区判空,1空,0不空:%d\n",result);

      

    //擦除指定扇区

       flash_erase(sector);

       printf("\n擦除%d扇区。\n",sector);

      

       flash_read_logic(mK1,sector,0,32); //从指定扇区读取32个字节到mK1中

       printf("擦除后%d扇区32字节的内容:%s\n",sector,mK1);

      

       result = flash_isempty(sector,MCU_SECTORSIZE); // 判断指定扇区是否为空

       printf("扇区判空,1空,0不空:%d\n",result);

      

    //向指定扇区第0偏移地址开始写32个字节数据

    flash_write(sector,0,32,(uint8_t *) "广州大学!32106100129梁毅轩");

    printf("\n写入%d扇区。\n",sector);

   

       flash_read_logic(mK1,sector,0,32); //从指定扇区读取32个字节到mK1中

       printf("写入后%d扇区32字节的内容:%s\n",sector,mK1);

      

       result = flash_isempty(sector,MCU_SECTORSIZE); // 判断指定扇区是否为空

       printf("扇区判空,1空,0不空:%d\n",result);

      

       for(;;)   //for(;;)(开头)

       {

       }

}

//======以下为主函数调用的子函数===========================================

//========================================================================

/*

 知识要素:

 (1)main.c是一个模板,该文件所有代码均不涉及具体的硬件和环境,通过调用构件

      实现对硬件的干预。

 (2)本文件中对宏GLOBLE_VAR进行了定义,所以在包含"includes.h"头文件时,会定

      义全局变量,在其他文件中包含"includes.h"头文件时,

      编译时会自动增加extern

 */

擦除后得验证:

//======================================================================

//文件名称:main.c(应用工程主函数)

//框架提供:SD-Arm(sumcu.suda.edu.cn)

//版本更新:20191108-20200419

//功能描述:见本工程的..\01_Doc\Readme.txt

//移植规则:【固定】

//======================================================================

#define GLOBLE_VAR

#include "includes.h"      //包含总头文件

//----------------------------------------------------------------------

//声明使用到的内部函数

//main.c使用的内部函数声明处

//----------------------------------------------------------------------

//主函数,一般情况下可以认为程序从此开始运行(实际上有启动过程,参见书稿)

//主函数

int main(void)

{

       uint8_t mK1[32];   //按照逻辑读方式从指定flash区域中读取的数据

       uint8_t result;        //判断扇区是否为空标识

       uint16_t sector = 92U;//因为我的学号后两位29不知为何无法执行,因此调换顺序

      

       //初始化扇区内容

       flash_erase(sector);

       flash_write(sector,0,32,(uint8_t *) "789546");

       printf("初始化%d扇区。\n",sector);

       flash_read_logic(mK1,sector,0,32); //从指定扇区读取32个字节到mK1中

       printf("擦除前%d扇区32字节的内容:%s\n",sector,mK1);

       result = flash_isempty(sector,MCU_SECTORSIZE); // 判断指定扇区是否为空

       printf("扇区判空,1空,0不空:%d\n",result);

      

    //擦除指定扇区

       flash_erase(sector);

       printf("\n擦除%d扇区。\n",sector);

      

       flash_read_logic(mK1,sector,0,32); //从指定扇区读取32个字节到mK1中

       printf("擦除后%d扇区32字节的内容:%s\n",sector,mK1);

      

       result = flash_isempty(sector,MCU_SECTORSIZE); // 判断指定扇区是否为空

       printf("扇区判空,1空,0不空:%d\n",result);

      

    //向指定扇区第0偏移地址开始写32个字节数据

    flash_write(sector,0,32,(uint8_t *) "广州大学!32106100129梁毅轩");

    printf("\n写入%d扇区。\n",sector);

   

       flash_read_logic(mK1,sector,0,32); //从指定扇区读取32个字节到mK1中

       printf("写入后%d扇区32字节的内容:%s\n",sector,mK1);

      

       result = flash_isempty(sector,MCU_SECTORSIZE); // 判断指定扇区是否为空

       printf("扇区判空,1空,0不空:%d\n",result);

      

       for(;;)   //for(;;)(开头)

       {

       }

}

//======以下为主函数调用的子函数===========================================

//========================================================================

/*

 知识要素:

 (1)main.c是一个模板,该文件所有代码均不涉及具体的硬件和环境,通过调用构件

      实现对硬件的干预。

 (2)本文件中对宏GLOBLE_VAR进行了定义,所以在包含"includes.h"头文件时,会定

      义全局变量,在其他文件中包含"includes.h"头文件时,

      编译时会自动增加extern

 */

实验结果截图以及实例:

内容1:

连接设备

发送信息:

内容二:

内容3:

写入:

验证:

结论:未擦除无法写入新数据。

六、分析思考

通过本次实验,我深刻体会到了嵌入式系统设计的复杂性和挑战性。我学习到了如何综合运用硬件知识和软件编程技能来解决实际问题。

在实验过程中,我首先学习了CAN总线的工作原理和通信协议。通过实践,我掌握了如何配置CAN控制器和编写相应的通信代码。

ADC温度检测部分,我学习了模拟信号到数字信号的转换过程,并编写了相应的采集程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705775.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Photoshop 2024 mac/win版:探索图像处理的全新境界

Photoshop 2024是Adobe推出的最新图像处理与设计软件&#xff0c;它在继承了前作所有优秀特性的基础上&#xff0c;实现了多个方面的质的飞跃。这款软件凭借其卓越的图像处理性能、丰富的创意工具以及精确的选区编辑功能&#xff0c;成为了图像处理领域的佼佼者。 Photoshop 2…

UEditor文件上传超出大小限制修改无效问题

网上说的方法&#xff0c;试过了&#xff0c;不生效 百度ueditor富文本编辑框怎么设置上传图片大小限制_umeditor 控制图片上传不得超过1m-CSDN博客 直接修改此处

探索未来边界:前沿技术引领新纪元

目录 引言 一、人工智能与深度学习&#xff1a;智慧生活的引擎 1.医疗应用 2.智能家居 3.自动驾驶 二、量子计算&#xff1a;解锁宇宙的密钥 1.量子比特示意图 2.量子计算机实物图 3.分子模拟应用 三、生物技术&#xff1a;生命科学的革新 1.CRISPR-Cas9基因编辑图 2.合成生…

史上最全盘点:一文告诉你什么是erp?erp系统厂商分别有哪些?

✅ 什么是ERP&#xff1f; ERP是Enterprise Resource Planning&#xff08;企业资源计划&#xff09;的简称&#xff0c;ERP是针对物资资源管理&#xff08;物流&#xff09;、人力资源管理&#xff08;人流&#xff09;、财务资源管理&#xff08;资金流&#xff09;、信息资…

智能家居建材,打造未来家居生活

智能家居建材&#xff0c;正引领着家居行业的新潮流。它融合了先进的科技与人性化的设计&#xff0c;为我们打造了一个充满未来感的家居新体验。 想象一下&#xff0c;当你走进家门&#xff0c;智能门锁自动识别你的身份&#xff0c;轻轻一推即可进入。室内环境自动调节到最舒适…

正大国际期货:小小的钱如何在期货市场翻身?

小小的钱 &#xff0c;莫名喜感→在小小的花园里面哇呀哇呀挖 有可能性&#xff0c;因为有杠杆所以收益大&#xff0c;同时风险亏损起来也快&#xff0c;&#xff0c;所以必须用小亏损换大收益&#xff0c;&#xff0c;比如跌过这个位置就止损退出&#xff08;永远在低点附近买…

SQL聚合函数---汇总数据

此篇文章内容均来自与mysql必知必会教材&#xff0c;后期有衍生会继续更新、补充知识体系结构 文章目录 SQL聚集函数表&#xff1a;AGV()count()根据需求可以进行组合处理 max()min()max&#xff08;&#xff09;、min&#xff08;&#xff09;、avg&#xff08;&#xff09;组…

江协科技51单片机学习- p4 点亮一个LED灯

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

vue2文件下载和合计表格

vue2文件数据不多可以直接下载不需要后端的时候 1.首先&#xff0c;确保你已经安装了 docx 和 file-saver 库 npm install file-saver npm install docx file-saver2.全部代码如下 <template><a-modaltitle"详情"width"80%"v-model"visi…

【x264】变换量化模块的简单分析

【x264】变换量化模块的简单分析 1. 变换量化1.1 变换&#xff08;transform&#xff09;1.2 量化&#xff08;quant&#xff09; 2. 编码入口&#xff08;x264_macroblock_encode&#xff09;2.1 内部编码&#xff08;macroblock_encode_internal&#xff09;2.1.1 SKIP模式2.…

CSS 字体颜色渐变

CSS 字体颜色渐变 css 代码: 注意&#xff1a;background: linear-gradient&#xff08;属性&#xff09;&#xff0c;属性可以调整方向 例如&#xff1a;to bottom 上下结构&#xff0c;to right 左右结构font-family: DIN, DIN;font-weight: normal;font-size: 22px;color:…

索尼cfa卡格式化了怎么恢复数据?这2种方法请收好

在摄影和视频制作领域&#xff0c;索尼CFA卡作为一种高性能的存储介质&#xff0c;深受专业用户的喜爱。然而&#xff0c;有时我们可能会不小心对CFA卡进行格式化操作&#xff0c;导致重要数据丢失。当面对这种情况时&#xff0c;许多用户会感到焦虑和困惑。本文将介绍索尼CFA卡…

线性代数|机器学习-P13计算特征值和奇异值

文章目录 1. 特征值1.1 特征值求解思路1.1 相似矩阵构造 1. 特征值 1.1 特征值求解思路 我们想要计算一个矩阵的特征值&#xff0c;一般是用如下公式&#xff1a; ∣ ∣ A − λ I ∣ ∣ 0 → λ 1 , λ 2 , ⋯ , λ n \begin{equation} ||A-\lambda I||0\rightarrow \lamb…

Wall国内开源程序照片墙,支持VR全景及安装教程

下载 GitHub官网&#xff1a;https://github.com/zhang-tong-yao/wall 软件下载&#xff1a;https://github.com/zhang-tong-yao/wall/releases&#xff0c;推荐下载最新的版本。 演示效果 目前支持PC端和移动端自适应。 演示地址&#xff1a;https://demo-wall.ityao.cn …

Python酷库之旅-比翼双飞情侣库(02)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …

盘点|AI大模型时代,2024医疗器械网络安全应对与挑战(上)

6月5日&#xff0c;以“AI驱动安全”为主题&#xff0c;2024全球数字经济大会数字安全高层论坛&#xff0c;暨北京网络安全大会战略峰会在北京国家会议中心开幕。 与会专家指出&#xff0c;攻击者可利用人工智能技术生成网络攻击和网络钓鱼工具&#xff0c;网络安全从人人对抗、…

多模态大模型:识别和处理图片与视频的技术详解

多模态大模型&#xff1a;识别和处理图片与视频的技术详解 多模态大模型&#xff1a;识别和处理图片与视频的技术详解1. 什么是多模态大模型&#xff1f;2. 多模态大模型的基本架构3. 识别和处理图片3.1 图像特征提取3.2 图像分类与识别3.3 图像生成与增强 4. 识别和处理视频4.…

【个人博客搭建】(25)做一个图形验证码功能

在系统的注册、登录等场景&#xff0c;都有很多类似的案例。也有类似于滑动验证、选字顺序验证等效果。今天带来的是文件流形式的&#xff0c;相当于动态图片吧 1、安装nuget包&#xff1a;Lazy.Captcha.Core 2、 在入口文件中注入&#xff1a; #region 图形验证码builder.Ser…

Spring对事务的支持

一、事务 事务防止进行操作时&#xff0c;数据库里面的数据丢失。 二、Spring事务注解方式 注解方式&#xff1a;在配置文件中配置事务管理器&#xff0c;利用注解&#xff0c;管理事务。 实例 银行转账&#xff1a;一个账户向另一个账户转账。 1&#xff09;先在数据库my…

串联谐振回路

等效电路 电感的损耗电阻&#xff0c;频率越高越大&#xff0c;与电感串联&#xff0c;会分走电压&#xff0c;不可忽略。 电容的漏电电阻&#xff0c;等效阻值大&#xff0c;与电容并联&#xff0c;高频时&#xff0c;电容容抗小&#xff0c;漏电电阻几乎分不走电流&#xf…