stm32f103单片机的串口IAP升级程序

发布者:chaxue1987最新更新时间:2020-08-13 来源: 51hei关键字:stm32f103  单片机  串口IAP  升级程序 手机看文章 扫描二维码
随时随地手机看文章

使用stm32f103r8t6 实现IAP升级代码精简但是很实用
可以用来制作远程升级

单片机源程序如下:

/*******************************************************************************

** 文件名:                 mian.c

** 版本:                  1.0

** 工作环境:         RealView MDK-ARM 4.14

** 作者:                 wuguoyana

** 生成日期:         2011-04-28

** 功能:                USART初始化和RCC设置,然后从common.c中执行主菜单

** 相关文件:        stm32f10x.h


*******************************************************************************/

/* 包含头文件 *****************************************************************/

#include "common.h"

#define USART1_IRQChannel            ((u8)0x25)  /* USART1 global Interrupt */

/* 类型声明 ------------------------------------------------------------------*/

/* 宏 ------------------------------------------------------------------------*/

#define LED2   GPIO_Pin_6

#define LED3   GPIO_Pin_7

#define LED4   GPIO_Pin_8

#define LED5   GPIO_Pin_9


#define TRUE        0xff

#define FALSE        0x00


/* 变量 ----------------------------------------------------------------------*/

extern pFunction Jump_To_Application;

extern uint32_t JumpAddress;


/* 函数声明 ------------------------------------------------------------------*/

void Delay(__IO uint32_t nCount);

void LED_Configuration(void);

static void IAP_Init(void);

void KEY_Configuration(void);

void GPIO_Configuration(void);

void USART_Configuration(void);

unsigned char RCC_Configuration(void);

void NVIC_Configuration(void);

/* 函数功能 ------------------------------------------------------------------*/


/*******************************************************************************

  * @函数名称        main

  * @函数说明   主函数

  * @输入参数   无

  * @输出参数   无

  * @返回参数   无

*******************************************************************************/

int main(void)

{

        //Flash 解锁

        FLASH_Unlock();

        NVIC_Configuration();

    LED_Configuration();

    //配置按键

    KEY_Configuration() ;

    IAP_Init();

    //按键是否按下

    //if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)  == 0x00)

    if (1)

    {

        //假如按键按下

        //执行IAP驱动程序更新Flash程序


        SerialPutString("rn======================================================================");

        SerialPutString("rn=                                                                    =");

        SerialPutString("rn=     In-Application Programming Application  (Version 1.0.0)        =");

        SerialPutString("rn=                                                                    =");

        SerialPutString("rn======================================================================");

        SerialPutString("rnrn");

        Main_Menu ();

    }

    //否则执行用户程序

    else

    {

        //判断用户是否已经下载程序,因为正常情况下此地址是栈地址。

        //若没有这一句的话,即使没有下载程序也会进入而导致跑飞。

        if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)

        {

            SerialPutString("Execute user Programrnn");

            //跳转至用户代码

            JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);

            Jump_To_Application = (pFunction) JumpAddress;


            //初始化用户程序的堆栈指针

            __set_MSP(*(__IO uint32_t*) ApplicationAddress);

            Jump_To_Application();

        }

        else

        {

            SerialPutString("no user Programrnn");

        }

    }


    while (1)

    {


    }

}



/*******************************************************************************

  * @函数名称        LED_Configuration

  * @函数说明   配置使用LED

  * @输入参数   无

  * @输出参数   无

  * @返回参数   无

*******************************************************************************/

void LED_Configuration(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    //使能LED所在GPIO的时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);

    //初始化LED的GPIO

    GPIO_InitStructure.GPIO_Pin = LED4 | LED5;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_SetBits(GPIOB,LED4 | LED5);  //熄灭LED2-5

}


void NVIC_Configuration(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;


  /* Set the Vector Table base location at 0x08000000 */

  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);   


  /* Configure one bit for preemption priority */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  

  /* Enable the EXTI8 Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}


/*******************************************************************************

  * @函数名称        KEY_Configuration

  * @函数说明   按键初始化

  * @输入参数   无

  * @输出参数   无

  * @返回参数   无

*******************************************************************************/

void KEY_Configuration(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);


    //配置按键

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

}


/*******************************************************************************

  * @函数名称        GPIO_Configuration

  * @函数说明   配置使用USART1的相关IO管脚

  * @输入参数   无

  * @输出参数   无

  * @返回参数   无

*******************************************************************************/

void GPIO_Configuration(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

        

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    // 配置 USART1 Tx (PA.09) 作为功能引脚并上拉输出模式

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    //配置 USART1 Tx (PA.10) 作为功能引脚并是浮空输入模式

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

}


/*******************************************************************************

  * @函数名称        IAP_Init

  * @函数说明   配置使用IAP

  * @输入参数   无

  * @输出参数   无

  * @返回参数   无

*******************************************************************************/

void IAP_Init(void)

{

    USART_InitTypeDef USART_InitStructure;

        GPIO_Configuration();


    /* USART1 配置 ------------------------------------------------------------

         USART1 配置如下:

          - 波特率      = 115200 baud

          - 字长        = 8 Bits

          - 一个停止位

          - 无校验

          - 无硬件流控制

          - 接受和发送使能

    --------------------------------------------------------------------------*/

    USART_InitStructure.USART_BaudRate = 115200;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;



    USART_Init(USART1, &USART_InitStructure);

    // 使能 USART1

    USART_Cmd(USART1, ENABLE);

        

}


/*******************************************************************************

  * @函数名称        Delay

  * @函数说明   插入一段延时时间

  * @输入参数   nCount: 指定延时时间长度

  * @输出参数   无

  * @返回参数   无

*******************************************************************************/

[1] [2]
关键字:stm32f103  单片机  串口IAP  升级程序 引用地址:stm32f103单片机的串口IAP升级程序

上一篇:激光测距VL53LX1 配合STM32F103T8U6测试成功
下一篇:基于srtm32驱动步进电机Proteus仿真程序

推荐阅读最新更新时间:2024-10-19 04:28

stm32f103单片机串口IAP升级程序
使用stm32f103r8t6 实现IAP升级代码精简但是很实用 可以用来制作远程升级 单片机源程序如下: /******************************************************************************* ** 文件名: mian.c ** 版本: 1.0 ** 工作环境: RealView MDK-ARM 4.14 ** 作者: wuguoyana ** 生成日期: 2011-04-28 ** 功能: USART初始化和RCC设置,然后从common.c中执行主菜单 ** 相关文件:
[单片机]
<font color='red'>stm32f103</font><font color='red'>单片机</font>的<font color='red'>串口</font><font color='red'>IAP</font><font color='red'>升级</font><font color='red'>程序</font>
STM32F103代码远程升级(二)基于串口IAP的简单实现
一、确定需要解决的问题 这里我就记录一下我的学习过程。 首先确定几个问题: 实现IAP编程需要着手编写两个程序,一个是Bootloader程序,一个是APP应用程序。 需要对STM32的Flash进行擦除和写入操作。 需要根据APP应用程序开始地址设置中断向量表的偏移 需要改变代码存放的地址空间(因为BootLoader要存放在0x08000000处,用户程序要存放在0x08005000处,而默认的代码存放的地址空间为0x08000000)。 在下载完更新文件之后需要进行PC指针的强制跳转,跳转时需要做什么 串口接收的用户代码数据是什么样的代码数据,是一种什么样的文件,该如何得到该格式文件 然后我开始一个一个解决问题。 二
[单片机]
<font color='red'>STM32F103</font>代码远程<font color='red'>升级</font>(二)基于<font color='red'>串口</font><font color='red'>IAP</font>的简单实现
STM32F103C8T6实现串口IAP方式升级固件
首先下载官方STM32F10X的IAP Bootloader源码,STM32F10x_AN2557_FW_V3.3.0。 源码包地址:http://download.csdn.net/download/yunyin_link/10151170 用Keil4打开工程代码STM32F10x_AN2557_FW_V3.3.0\Project\IAP\MDK-ARM\IAP.uvproj 第一步:因为我们是用的STM32F103C8T6 是64K Flash,所以特别重要的是修改Flash宏,如下图示,改为:STM32F10X_MD。 代码中对不同规格的Flash做了处理。 第二步:限定一下IAP Boot
[单片机]
<font color='red'>STM32F103</font>C8T6实现<font color='red'>串口</font><font color='red'>IAP</font>方式<font color='red'>升级</font>固件
STM32F103c8t6通过串口实现IAP在线升级固件
STM32f103c8t6 IAP在线升级 设计思路:(自己理解的哈,如果有问题,欢迎大家提出来,一起学习哈) 首先程序每次执行都会从基地址0x0800 0000开始执行。IAP程序升级最重要的就是写BOOTLOADER程序,进行引导升级,加载,跳转app程序。每次上电后进入bootloader判断是否升级如果需要升级,就就收bin文件进行升级,如果不升级直接跳入原app程序执行。 bootloader和app程序的FLASH大小根据实际情况自己确定分配就可以了 下面是我自己画得一个流程图:主要介绍整个大的流程 bin文件的生成方法可以百度一下,网上很多的 代码:(我是根据正点原子的例程改的,代码只贴了重要部分,如果有需要
[单片机]
<font color='red'>STM32F103</font>c8t6通过<font color='red'>串口</font>实现<font color='red'>IAP</font>在线<font color='red'>升级</font>固件
STM32F103实现IAP在线升级应用程序
一、环境介绍 MCU: STM32F103ZET6 编程IDE: Keil5.25 工程附加源码包下载地址: CSDN https://download.csdn.net/download/xiaolong1126626497/25652410 二、 IAP介绍 IAP,全称是“In-Application Programming”,中文解释为“在程序中编程”。IAP是一种对通过微控制器的对外接口(如USART,IIC,CAN,USB,以太网接口甚至是无线射频通道)对正在运行程序的微控制器进行内部程序的更新的技术(注意这完全有别于ICP或者ISP技术)。 ICP(In-Circuit Programming)技
[单片机]
<font color='red'>STM32F103</font>实现<font color='red'>IAP</font>在线<font color='red'>升级</font>应用<font color='red'>程序</font>
STM32F103C8T6单片机IAP升级
关于IAP升级的方法和原理,网上已经有很多资料了,这块就不再说了,现在就将bootloader和app配置方法整理如下: APP程序就是一个简单的LED闪烁。 APP设置为从FLASH中启动: STM32F103C8T6单片机flash有64K,前20K空间留给bootloader,从20K之后开始存放APP程序。所以IROM1开始地址设置为 0x8005000,大小为20K。如果APP程序比较大的话,可以修改这个大小值。 然后在程序开始位置设置重新映射复位向量表。让程序从0x8005000位置开始执行。 APP设置为从SRAM中启动: APP要从SRAM中运行,那么就要重新映射SRAM中的复位向量表。 由于在
[单片机]
<font color='red'>STM32F103</font>C8T6<font color='red'>单片机</font><font color='red'>IAP</font><font color='red'>升级</font>
LPC1768单片机串口IAP升级实例源码
LPC1768 IAP升级方法 实例 测试说明: 本实验通过串口0对开发板进行IAP升级,本工程为引导程序,将开发板上的USB转串口连接到电脑 插上3.2寸彩屏模块,下载程序到开发板,彩屏显示按键功能: INTO键:擦除应用程序 方向键 ok:进行IAP升级,等待串口接收应用程序 方向键 down:运行应用程序 方向键 up:显示菜单 当按下ok键等待串口接收应用程序时,电脑通过超级终端发送预先编译好的应用程序(BIN)格式 以1K Xmodem模式进行发送给开发板,开发板接收完成后显示 Updata Complete,按方向键down 开始执行应用程序 单片机源程序如下: /**
[单片机]
STM32F103C8T6用官方bootloader实现IAP升级操作方法
在使用STM32F103C8T6单片机IAP功能时,可以自己写bootloader程序,也可以使用官方bootloader文件。下面说一下使用官方bootloader的使用方法。 首先下载官方bootloader文件 目前使用的是这个版本,打开文件夹,选择适合自己编译器的工程。 目前使用的是keil,所以打开MDK-ARM文件夹 打开IAP工程 打开后根据自己的单片机型号,对工程进行简单的修改。用的是STM32F103C8T6单片机,FLASH为64K,SRAM为20K。 设置IROM1的起始地址和大小。 设置引用的头文件,STM32F103C8T6为中等容量,所以设置文件为STM32F10X_MD,。
[单片机]
<font color='red'>STM32F103</font>C8T6用官方bootloader实现<font color='red'>IAP</font><font color='red'>升级</font>操作方法
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved