一、实验目的
- 掌握CAN总线的工作编程方法。
- 掌握ADC编程方法。
- 熟悉FLASH编程方法。
二、实验设备和资料
软硬件工具和实验一相同,包括:
- 硬件部分:PC或笔记本电脑一台、AHL-STM32L431开发套件一套
- 软件部分:从苏州大学嵌人式学习社区网站,按照教材1.1.2节内容,下载相关的电子资源。并进行集成开发环境的安装。
- 电子资料:\04-Software\CH08、\04-Software\CH10文件夹中的各程序
- 参考教材:嵌入式技术基础与实践(第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函数的擦除必须要小心,先擦除在写数据,避免读取时读取其他的东西,同时扇区擦除要小心,避免擦除的扇区上有重要的数据从而导致重启失败。