实验四 CAN总线、ADC和FLASH编程

一、实验目的

  1. 掌握CAN总线的工作编程方法。
  2. 掌握ADC编程方法。
  3. 熟悉FLASH编程方法。

二、实验设备和资料

软硬件工具和实验一相同,包括:

  1. 硬件部分:PC或笔记本电脑一台、AHL-STM32L431开发套件一套
  2. 软件部分:从苏州大学嵌人式学习社区网站,按照教材1.1.2节内容,下载相关的电子资源。并进行集成开发环境的安装。
  3. 电子资料:\04-Software\CH08、\04-Software\CH10文件夹中的各程序
  4. 参考教材:嵌入式技术基础与实践(第6版),王宜怀等. 清华大学出版社

三、实验内容

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

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

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

四、程序源码

1.

int main()

{

         vuint32_t mMainLoopCount;

         uint32_t localMsgID;

         uint32_t txMsgID;

         uint32_t BitRate;

         localMsgID = 0x0AU;

         txMsgID = 0x0BU;

         BitRate = 36;

         DISABLE_INTERRUPTS;

         emuart_init(UART_User,115200);

         uart_init(UART_3,115200);

         can_init(CAN_1,localMsgID,BitRate);

         uart_enable_re_int(UART_User);

    uart_enable_re_int(UART_3);

    can_enable_recv_int(CAN_1);

    ENABLE_INTERRUPTS;

         while(1)

         {

                  mMainLoopCount++;

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

                  if (mMainLoopCount<=12889000)  continue;

                  mMainLoopCount=0;

                  if(can_send(CAN_1, txMsgID, 20, (uint8_t*)"陈泽豪") != 0) printf("failed\r\n");

                  printf("\n");

         }

}

2.

void Delay_ms(uint16_t u16ms);

float Regression_Ext_Temp(uint16_t tmpAD);      //环境温度AD值转为实际温度

float Regression_MCU_Temp(uint16_t mcu_temp_AD); //MCU温度AD值转为实际温度

int main()

{

       float a15=0,a17=0;

       uint16_t d15=0,d17=0;

       adc_init(15,AD_SINGLE);

       adc_init(17,AD_SINGLE);

       while(1)

       {

              Delay_ms(2000);

              d15=adc_read(15);

              Delay_ms(100);

              d17=adc_read(17);

              a15=tempRegression(d15);

              a17=adc_mcu_temp(d17);

              printf("温度AD%d  ",d15);

              printf("温度为%6.2f  ",a15);

              printf("芯片温度AD%d  ",d17);

              printf("芯片温度为%6.2f  ",a17);

              printf("\n");

       }

}

float Regression_Ext_Temp(uint16_t tmpAD)

{

    float Vtemp,Rtemp,temp;

    if(tmpAD<=72)

    {

       return -274;

    }

    Vtemp = (tmpAD*3300.0)/4096;

    Rtemp = Vtemp/(3300.0 - Vtemp)*10000.0;

    temp = (1/(log(Rtemp/10000.0)/3950.0 + (1/(273.15 + 25)))) - 273.15 + 0.5;

    return temp;

}

float Regression_MCU_Temp(uint16_t mcu_temp_AD)

{

       float mcu_temp_result;

       mcu_temp_result=(float)(55+(100*((float)(mcu_temp_AD) - AD_CAL1))/(AD_CAL2 - AD_CAL1));

       return mcu_temp_result;

}

3.

int main()

{

       uint8_t str_r[100],str_w[100]="罗景俊";

       int len,i;

       len=strlen(str_w);

       flash_init();

       flash_erase(42);

       flash_read_logic(str_r,42,0,32);

       for(i=0;i<32;i++)printf("%x",str_r[i]);

       printf("\n");

       flash_write(42,0,32,str_w);

       flash_read_logic(str_r,42,0,32);

       for(i=0;i<len;i++)printf("%c",str_r[i]);

}

五、运行结果

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

1.

2.

3.

上图是程序的运行结果

如果没有清除扇区,即把flash_erase(42)给注释掉,输出的结果为,如下图

能正常写入但是会顶替原来姓名的位置。

擦除后,原来的数据全部不见了,只剩下

六、分析思考

CAN允许多个设备在同一总线上发送和接收消息,任何设备都可以成为主设备。当两个设备同时发送消息时,CAN协议可以检测到冲突并采取措施解决。CAN协议具有错误检测机制,包括奇偶校验、CRC校验等,以确保数据传输的可靠性。总的来说,CAN通信解决了大部分电路通信的问题,在汽车行业使用比较广泛。

FLASH函数的擦除必须要小心,先擦除在写数据,避免读取时读取其他的东西,同时扇区擦除要小心,避免擦除的扇区上有重要的数据从而导致重启失败。

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值