stm32

stm32实现iap远程固件更新

自古美人都是妖i 提交于 2019-12-29 11:25:51
前提 想来做iap升级了,应该不是什么新手。 下面的程序需要用到一些简单的功能 串口收发数据 开关总中断 虽然本文标题是实现远程固件更新,但是具体远程方案本文不做详细说明,重点在于介绍mcu接收到新的固件后怎么保存更新,以及更新失败回滚等。下面简单说明一下远程的事情。 stm32的通信方式有串口,spi,iic,以及sdio等。也就是说我们的固件可以通过这些方式传输到mcu,不过普遍常用的是串口或者用sdio(外接sd卡)这两种方式。个人觉得用sd卡来回copy也不怎么方便。简单点还是再加一个串口网络模块,然后把固件存到服务器,经由串口网络模块透传到mcu。比如用http协议把固件发送下来。远程下载就这么简单一说。接下来重点分析更新的事情。 固件生成 远程更新使用的固件和我们平时烧录程序用的固件格式有点区别,我们需要用二进制格式(.bin)文件。生成方式以mdk为例介绍一下,只需要添加一条命令行。 在mdk工程配置选项选择User,这个页面是让我们添加自定义命令行的,我们要添加的命令添加到第三个选项,即在编译完成后执行。下面是命令内容,需要注意的是 bin前面两个-,app1.bin就是生成的固件,名字可以自定义,**.axf是你工程实际的.axf文件,路径要正确。不知道你的axf在那在output页面查看。 fromelf.exe --bin -o ../app1.bin ./*

STM32按键处理

十年热恋 提交于 2019-12-28 11:59:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> #ifndef _COMM_KEY_H_ #define _COMM_KEY_H_ #include "soft_timer.h" /*与按键电路有关,当按键按下为低电平时定义COMM_KEY_DOWN为0,否则交换定义*/ #define COMM_KEY_UP 1 #define COMM_KEY_DOWN 0 typedef int(*key_callback_func)(void*); typedef enum { COMM_KEY_IDLE_STATUS =4, COMM_KEY_DOWN_STATUS =0, COMM_KEY_DOWN_SURE_STATUS =5, COMM_KEY_UP_STATUS =6, COMM_KEY_UP_SURE_STATUS =1, COMM_KEY_SHORT_PRESS =2, COMM_KEY_LONG_PRESS =3 }comm_key_status; typedef struct{ /*获取按键状态*/ key_callback_func key_status_get_func; /*短按回调函数*/ key_callback_func key_short_press_func; /*长按回调函数*/ key_callback_func key

STM32系统滴答_及不可不知的延时技巧

本小妞迷上赌 提交于 2019-12-28 10:39:48
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 下面为大家介绍一个曾见过的在裸机系统中,非阻塞延时的巧妙设计,当时它是被用在一导航影音娱乐系统的 MCU 驱动软件中,在此我对其作了一定的改动。 此章节涉及到 STM32 内容不多,以软件为主。 此延时软件的设计可以直接进行 10 、 50 、 100ms 及 1s 的查询定时,并且当若需其它时间要求的定时或延时可以很方便的自己编写软件很简单方便设定。 首先需要设置 SysTick 定时中断为 10MS 进入一次。然后在定时中断函数中作如下处理 void SysTick_Handler(void) { bTemp10Msec = TIMER_SET; ++gTimer.Tick10Msec; if (0 == (gTimer.Tick10Msec % 5)) { bTemp50Msec = TIMER_SET; } if (0 == (gTimer.Tick10Msec % 10)) { bTemp100Msec = TIMER_SET; } if (100 == gTimer.Tick10Msec) { gTimer.Tick10Msec = 0; bTemp1Sec = TIMER_SET; } } gTimer 是定义的一全局结构体变量, Timer_Struct gTimer;

【转】浅析STM32中SysTick在3.5固件库中的应用

荒凉一梦 提交于 2019-12-28 10:37:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 最近一直在忙STM32的学习,在学习中遇到了不少问题,也经过各种尝试解决问题,在这里我通过博文的形式写出来,也希望能够帮到遇见同样问题的人们。对于STM32系列的芯片,有一个好处就是官方给出了一个固件库,这个能够很方便大家伙的编程。省去了使用寄存器的方法。但是固件库的学习也有很多让人麻烦的地方。 比如更新速度快,这样大家可以在一棵树上吊死。只认一个版本的固件库。 在这里我所用的是3.5标准固件库。 STM32内核中有一个系统定时器,它是一个24位递减计数器。工作原理是系统时基定时器设定初值并使能后,每经过1个系统时钟周期,计数值就减,当计数值减到0时,系统定时器会重新自动重装初值,并继续下一次计数,同时内部的COUNTFLAG标志位会置位。触发中断。 在很早的固件库中,提供了很多函数,来对SysTick进行设置,但是到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS 定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化Systick 的设置,可是降低了用户对SysTick的可控性。 在CMSIS中提供的函数是 SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD

STM32系统滴答_及不可不知的延时技巧

一个人想着一个人 提交于 2019-12-28 10:37:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我想每个单片机爱好者及工程开发设计人员都有过点灯的经历。流水灯是个好东西,尤其是在调试资源有限的环境中,有时会帮上大忙。 然在最初入门时,如何让这些小灯们按照我们的想法欢快地跑起来呢,绝大多数小朋友的做法是:在一个 while 循环里加上延时程序,让小灯在每个状态下停留一段时间,再进入下一个状态,这样小灯们就会在不同的状态中切换,就可以根据我们设计的程序闪烁了。 这样这里就会涉及到一个延时程序的编写的问题,而一般的做法是一个 for 循环里去减一个很大的数,直到为 0 ,则延时完成,那个数的值则是根据时钟频率和指令运行周期,估算出来的,还记得较久以前看过一篇帖子介绍 51 单片机精确延时的几种方法,有一种方法是在 keil 中设定好时钟频率,然后通过软件仿真试来算延时时间,以达到较精确定时。 但这些方法一般都不够方便,延时也不够精确,更高阶一点的方法便是开一个定时器,在定时中断里面计数达到精确延时的目的。 在 STM32 的应用中,可考虑利用 SysTick 系统嘀嗒定时器来实现。但在 STM32 开发手册中对它的介绍却很少,几乎到没有的程度。因为它是 Cortex 内核的部分, CM3 为它专门开出一个异常类型,并且在中断向量表中占有一席之地(异常号 15 ),这样它可以很方便的移植到不同厂商出 CM3

【STM32】 RCC时钟树

隐身守侯 提交于 2019-12-28 04:16:29
------------------------------------- STM32-RCC复位时钟控制 2019-12-27 时钟:单片机的心脏 所有的外设想要工作都需要时钟 1.HSE时钟:精度较高 High Speed External Clock signal:高速的外部时钟 来源:无源晶振(4-16M),通常使用8M 控制:RCC_CR时钟控制寄存器的位16:HSEON控制 LSE时钟:精度较低 2.HSI时钟 High Speed Internal Clock signal,高速的内部时钟 来源:芯片内部,大小为8M,当HSE故障时,系统时钟会自动切换到HSI,指导HSE启动成功 控制:RCC_CR时钟控制寄存器的位0:HSION控制 3.锁相环时钟PLLCLK: 来源:(HSI/2、HSE)经过倍频所得 控制:CFGR:PLLXTPRE、PLLMUL 注意:PLL时钟源头使用HIS/2的时候,PLLMUL最大只能是16, 这个时候PLLCLK最大只能是64M,小于官方推荐的最大时钟&@M 4.系统时钟SYSCLK: 来源:HSI、HSE、PLLCLK 控制:CFGR:SW 注意:通常的配置是SYSCLK=PLLCLK=72M 5.HCLK时钟:给AHB的外设提供时钟 HCLK:AHB高度总线时钟,速度最高为72M。 为AHB总线的外设提供时钟

STM32固件库文件分析

不羁岁月 提交于 2019-12-28 02:51:03
1-汇编编写的启动文件 ** startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、调用C库函数_main最终去到C的世界: hd(high density) flash大小 2-时钟配置文件 system_stm32f10x.c:把外部时钟HSE=8M,经过PLL(锁相环)倍频为 72M。 3-外设相关的 stm32f10x.h:实现了内核之外的外设的寄存器映射 xxx:GPIO、USRAT、I2C、SPI、FSMC stm32f10x_xx.c:外设的驱动函数库文件 stm32f10x_xx.h:存放外设的初始化结构体,外设初始化结构体成员的参数列表,外设固件库函数的声明 4-内核相关的 CMSIS - Cortex 微控制器软件接口标准 core_cm3.h:实现了内核里面外设的寄存器映射 core_cm3.c:内核外设的驱动固件库 NVIC(嵌套向量中断控制器)、SysTick(系统滴答定时器) misc.h misc.c 5-头文件的配置文件 stm32f10x_conf.h:头文件的头文件 //stm32f10x_usart.h //stm32f10x_i2c.h //stm32f10x_spi.h //stm32f10x_adc.h //stm32f10x_fsmc.h 6-专门存放中断服务函数的C文件

STM32学习之路(二)

☆樱花仙子☆ 提交于 2019-12-28 01:36:24
特别注意: 硬件资源 USB_SLAVE:用于USB通信,用于模拟USB虚拟串口。 USB_232(USB转串口):有供电功能,可用于程序下载和代码调试。 总结:两者本质上都一样。只是USB_232是借助了外部芯片实现的,优点就是简单,缺点就是要增加成本.直接接USB,则可以省下这个芯片的费用,缺点,则是需要自己写驱动。-摘自正点原子论坛 可能是这个原因,MINI板上只保留了USB转串口这一接口。 突然想到我在别的地方买的最小系统板,插上USB不能识别,应该是板子的USB是USB_SLAVE,我去查阅了一下资料,果然是: 二、ISP下载 STM32的ISP下载只能使用串口1,即对应串口发送接收引脚PA9、PA10。其他引脚可以用来串口通信。 三、JLINK\ST-LINK下载 JINK下载时,必须先给开发板供电,USB或外接电源都可以。 下一步配置Flash Download页面: 最后一步: 编译出现的问题: GPIO(引脚)-具体详见中文参考手册: GPIO相关寄存器: 端口复用:最大限度利用资源 地址重映射:方便布线 来源: CSDN 作者: Angus_星河 链接: https://blog.csdn.net/qq_39171574/article/details/103738611

新建一个STM32的Keil V5工程

≡放荡痞女 提交于 2019-12-28 00:36:06
1、创建工程目录 目录结构: CMSIS(存放和内核相关的文件) Library(存放STM32F4 标准外设固件库源码文件和对应的头文件) Listing(存放列表文件) Output(存放编译过程中产生的中间文件) Project(存放工程文件) User(存放用户自己定义的源文件) 2、下载STM32的固件库 ST的官网地址: https://www.st.com/content/st_com/zh.html 在搜索框搜索“STM32 standard library” 选择自己要下的处理器系列(我的是STM32F4xx的) 点击获取软件 –> 接受 –>填写邮箱–> 下载 –> 进入邮箱下载 3、创建Keil 工程 Keil版本:Keil V5 5.29.0.0 1.创建新工程 打开keil Project New uVision Project 选择刚刚创建的Project目录,并取好工程名 2.选择目标设备 就是选择所要开发的芯片设备型号,如果找不到可能是Keil版本太旧了点。 可以通过搜索框来找,比较方便。 弹出的运行时环境管理器直接关掉。 3.添加标准固件库文件 现在就要用上刚刚下载的那个固件库了。 将 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Include 目录下的所有文件拷贝到 工程目录的CMSIS

【STM32】基础理论知识学习1

孤人 提交于 2019-12-27 04:52:43
0.CMSIS https://baike.baidu.com/item/CMSIS/4082822 ARM Cortex™ 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层(英文原文为:a vendor-independent hardware abstraction layer for the Cortex-M processor series and defines generic tool interfaces--来自ARM官方定义)。 使用CMSIS,可以为处理器和外设实现一致且简单的软件接口,从而简化软件的重用、缩短微控制器新开发人员的学习过程,并缩短新设备的上市时间。软件的创建被嵌入式行业公认为主要成本系数。通过在所有Cortex-M 芯片供应商产品中标准化软件接口,这一成本会明显降低,尤其是在创建新项目或将现有软件迁移到新设备时。最新版本的CMSIS为5.5.1。 ----- 翻译一下就是,ARM 的Cortex芯片的内核相同,但芯片厂商外设可能不同,所以不同芯片厂商开发的微控制器软件可能不兼容。所以ARM和芯片商建立CMSIS。 1.STM32标准外设库、HAL库、LL库 标准外设库的认识: STM32固件库文件分析