红龙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最有前途的现场总线之一 

stm32CAN控制器

stm32f103zet 属于增强型,拥有个 bxCAN 模块(Basic Extended CAN),即基本扩展 CAN,它支持 CAN 协议 2.0A 和 2.0B,它的设计目标是,以最小的CPU 负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。对于安全紧要的应用,bxCAN 提供所有支持时间触发通信模式所需的硬件功能。bxCAN 主要有如下特点:

1)支持 CAN 协议2.0A 2.0B 主动模式

2)波特率最高可达1Mb/s

3)支持时间触发通信功能

4个发送邮箱

5个两级深度的 个 FIFO

6)可变滤波器组 14 

stm32CAN 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.5CAN IAP实验现象

本次实验下载CAN IAP引导程序到目标板,将发送程序下载到编程板,将编译好的应用程序“系统定时器”更名为“Can_Updata.bin”放入2G SD卡更目录下,用串口线将电脑与目标板的串口1相连,并设置波特率为115200,开启目标板,如图1是我们已经下载了应用程序,因此直接执行。下面对编程板进行复位,开始执行更新,更新完成后出现串口输出如图2内容。

图1 开发板内下载了程序直接运行

 

程序执行更新

 


0 0
原创粉丝点击