红龙103开发板CAN IAP
来源:互联网 发布:php 命名空间加载文件 编辑:程序博客网 时间:2024/06/09 20:01
CAN IAP
CAN通信
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。CAN属于现场总线的范畴,它是一种有效支持分布式控制或实时控制的串行通信网络。较之许多RS485基于R线构建的分布式控制系统而言,基于CAN总线的分布式控制系统在以下方面具有明显的优越性:
1)网络各节点之间的数据通信实时性强
2)缩短了开发周期
3)已形成国际标准的现场总线
4)最有前途的现场总线之一
stm32的CAN控制器
stm32f103zet 属于增强型,拥有1 个 bxCAN 模块(Basic Extended CAN),即基本扩展 CAN,它支持 CAN 协议 2.0A 和 2.0B,它的设计目标是,以最小的CPU 负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。对于安全紧要的应用,bxCAN 提供所有支持时间触发通信模式所需的硬件功能。bxCAN 主要有如下特点:
1)支持 CAN 协议2.0A 和2.0B 主动模式
2)波特率最高可达1Mb/s
3)支持时间触发通信功能
4)3 个发送邮箱
5)3 个两级深度的 2 个 FIFO
6)可变滤波器组 14 个
stm32的CAN IAP引导程序
本次CAN IAP使用的是2.0B协议,通信速率200Kbps,分为应用程序编程板和应用程序目标板。
编程板:读取SD卡是否有“Can_Updata.bin”文件,若存在文件,则从CAN总线发送一个“UPDATA”信息,等待目标板返回“OK”信息,后读取文件内容,发送头八个字节即应用程序的MSP和中断向量起始地址,等待目标板返回“BEGIN”信息,接着继续从文件头开始读1024个字节,并通过CAN总线发送给目标板,等待目标板返回“CONTINUE”信号,接着发送1024个字节,直到读到文件尾部,即读出的字符个数小于1024个字节,发送最后读出的字符并发送,后发送“STOP”标记,应用程序发送完成。
目标板:复位开发板读取后备寄存器BKP_DR1==0x55AA是否成立,若成立则等待编程板发送“UPDATA”信息,随后返回“OK”,等待编程板发送一次数据,返回“BEGIN”,开始接收编程板的1024个字节后返回“CONTINUE”,继续接收,当接收到2048个字节后将这2048个字节写入到Flash中,继续等待接收下一个2048个字节,当最后接收到“STOP”信号后,标志应用程序接收完成,将最后接收到的数据写入到Flash中,随后将后备寄存器BKP_DR1=0xAA55,跳转到应用程序中开始执行应用程序。
int main(void){ uint32_t i,j; RCC_Configuration(); //初始化系统时钟 LED_Init(); //初始化LED User_CAN1Init(); //初始化CAN1 User_Uart1Init(); //初始化Uart1 printf("\r\nCAN总线下载BootLoader\r\n"); //CAN下载 printf("www.openmcu.com\r\n"); //输出欢迎信息测试串口 printf("\r\n"); //输出欢迎信息测试串口 printf("后备寄存器状态:%x\r\n",ReadBKP()); if(ReadBKP()==0x55AA) { Position=0; TotalLen=0; printf("\r\n开始更新...\r\n"); App_Updata (); //更新程序 printf("\r\n更新完成\r\n"); WriteBKP(0xAA55); Jump_App(); //跳转到应用程序 } else//否则执行用户程序 { printf("应用程序入口地址:%x\r\n",(*(__IO uint32_t*)(APP_ADDR_FLASH+4))); if (((*(__IO uint32_t*)(APP_ADDR_FLASH+4)) & 0xFF000000 ) == 0x8000000) {//判断是否已经下载程序,防止程序跑飞 Jump_App(); //跳转到应用程序 } else { WriteBKP(0x55AA); //保证没有用户程序,后备寄存器不为0x55AA,复位后能执行更新 printf("没有可执行的程序\r\n\n"); } while(1) { for(i=0;i<30000;i++) { for(j=0;j<300;j++); } LED_Turn(GPIO_Pin_6); //闪烁LED表示系统无卡死 } }}
CAN IAP应用程序
IAP下的应用程序与普通程序相差不大,其主要有以下几点区别:
1)ROM空间区别,普通程序的ROM空间从0x8000 0000开始,而在IAP下的应用程序的起始地址则是IAP跳转的地址,这里我们的引导程序跳转到应用程序的地址为0x801 0000,因此设置ROM空间为0x801 0000,如下图
2)中断向量表,普通程序若是从Flash启动,则中断向量表的偏移地址为0,而在IAP的应用程序中需要设置新的中断向量表,偏移地址即IAP程序存放的地址与应到程序的地址偏移即0x801 0000-0x800 0000,在程序中做如下设置SCB->VTOR = FLASH_BASE | 0x10000;//设置中断偏移
3)更新设置,当我们需要对应用程序进行更新时,而我们由于目标板的距离相对较远的情况下,使用传统的方法进行复位后更新是不太可能的,因此需要在应用程序中进行软件复位,本程序中使用的是CAN IAP,因此在应用程序中对CAN进行了配置,以便随时更新,当发送机发送“UPDATA”信号给目标板时,目标板进入中断,同时将后备寄存器BKP_DR1设置为0x55AA,并产生软件复位,复位后系统进入引导程序,判断BKP_DR1=0x55AA,因此开始执行更新。这里贴出CAN中断代码如下:
void CAN1_RX0_ISR(void){ if(CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET) { CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0); //清除中断标志 CAN_Receive(CAN1,CAN_FIFO0,&RxMessage); //读取数据 if(RxMessage.Data[0]=='U'&&RxMessage.Data[1]=='P'&&RxMessage.Data[2]=='D'&&RxMessage.Data[3]=='A'&&RxMessage.Data[4]=='T'&&RxMessage.Data[5]=='A') { WriteBKP(0x55AA); //设置后备寄存器 __set_FAULTMASK(1);//关闭所有中断 NVIC_SystemReset(); //进行软件复位 } }}
4.5、CAN IAP实验现象
本次实验下载CAN IAP引导程序到目标板,将发送程序下载到编程板,将编译好的应用程序“系统定时器”更名为“Can_Updata.bin”放入2G SD卡更目录下,用串口线将电脑与目标板的串口1相连,并设置波特率为115200,开启目标板,如图1是我们已经下载了应用程序,因此直接执行。下面对编程板进行复位,开始执行更新,更新完成后出现串口输出如图2内容。
图1 开发板内下载了程序直接运行
图2 程序执行更新
- 红龙103开发板CAN IAP
- STM32F072C8T6调试IAP(CAN)记录
- STM32开发板入门教程(十七) - IAP 之串口篇
- iap
- IAP
- IAP
- IAP
- IAP
- IAP
- stm32基于Can和uart的IAP实现
- 红牛开发板模拟器简要说明_V1.0
- 豆皮 - STM32开发板入门教程(十七) - IAP 之串口篇 (原创)
- IAP相关资源收集及开发总结
- iOS IAP的开发学习总结
- iOS IAP的开发学习总结
- iOS 内支付(IAP)开发步骤
- iOS应用内支付(IAP)开发步骤
- 6410开发板接CAN模块、调试
- 使用Eclipse调试错误页面
- 线性判别分析LDA
- TTF字体文件结构
- 自增长的ID重新排列
- SVN服务器搭建和使用
- 红龙103开发板CAN IAP
- document.ready()
- Yii 登录表单模型的简单操作
- UVa:127 "Accordian" Patience
- C++中引用(&)的用法和应用实例
- 浅析GCC下C++类对象的内存布局
- 【cognos 8教程第十六讲】URL后参数的含义
- 基本选择器,层次选择器
- VC文件扩展名解读大全