startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx
startup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx
startup_stm32f10x_hd_vl.s 大容量的STM32F100xx
startup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx
startup_stm32f10x_ld_vl.s 小容量的STM32F100xx
startup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM32F103xx
startup_stm32f10x_md_vl.s 中容量的STM32F100xx
startup_stm32f10x_xl.s FLASH在512K到1024K字节的STM32F101xx,STM32F102xx,STM32F103xx
cl:互联型产品,stm32f105/107系列
vl:超值型产品,stm32f100系列
xl:超高密度产品,stm32f101/103系列
ld:低密度产品,FLASH小于64K
md:中等密度产品,FLASH=64 or 128
hd:高密度产品,FLASH大于128
在KEIL下可以在项目的选项C/C++/PREPROMCESSOR symbols的Define栏里定义,比如STM32F10X_CL
也可以在STM32F10X.H里用宏定义
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
#define STM32F10X_HD
#endif
如果芯片更换,除了做如上所述的更改外,还需以下几步
第一步 system_stm32f10x.c的系统主频率,依实际情况修改
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL)
#define SYSCLK_FREQ_24MHz 24000000
#else
#define SYSCLK_FREQ_72MHz 72000000
#endif
另外外部时钟在文件:stm32f10x.h 依实际修改
第二步 定时器的参数依系统主时钟做适当修改
第三步 flash地址misc.h中的NVIC_VectTab_Flash 0x08000000 要与KEIL选项target的IROM1的地址一致,如果是IAP程序,依ISP程序占用大小,APP的FLASH地址向后延,比如0X8002000,那么KEIL选项target的IROM1的地址也要就0x8002000,SIZE因为ISP占用了2000,所以就为0x40000-0x2000,即只能填写0X3E000
第四步 ISP程序与APP程序连接----(这一步我还不明白意思,需要验证)
打开 User 选项卡 在 Run User Programs Before Build/Rebuild 中,勾选 Run#1,并在
其中填入
D:KeilARMBIN40fromelf.exe --bin -o ./obj/Project.bin ./obj/Project.axf
其中,Project.bin 和 Project.axf 要和 Output 选项卡中的 Name of Executable 的名字
IAP我的总结
1 先FLASH_Unlock();
2 小于或等于128K的STM每页为1k bytes,大于128K的每页为2K BYTES,减去从地址0x8002000占用的0x2000后,算出页数,比如IAP占用8K,则64K的MD的STM32F系列用for(i=0;i<(64-8);i++) FLASH_ErasePage(0x8002000+0x400*i);循环按页擦除FLASH
3 按从外部串口获取到的数据,FLASH_ProgramWord(address,dat);//注意是按4字节方式写入的
if (*(uint32_t*)address!= dat)//字编程后校验
关键字:STM32 启动文件 宏定义
引用地址:
STM32启动文件的选择及宏定义
推荐阅读最新更新时间:2024-03-16 14:40
基于STM32内部RTC的时钟程序
在网站上找了一些软件时钟程序,在秒时与日历转换时,大多是逐年计算,计算周期会随着年份增加,而增多。于是自己写了一个简化的秒时与日历转换程序,按闰年周期进行除法运算,计算周期固定,不随秒时与基础年时间差增长而增长,效率明显提高。 程序带有闰年计算与星期计算,基础年为2001年1月1日0时0分0秒,算法可支持到3200年2月28日23时59分59秒。但由于RTC计数器是32位,所以硬件只能支持到2137年2月7日6时28分15秒,也足够使用了。 以下为程序代码: /**************************************************************************** * 函数名: G
[单片机]
stm32定时器的妙用
一、初步了解定时器 stm32定时器时钟图如下: 定时器2-7:普通定时器 定时器1、8:高级定时器 二、使用定时器 以下,我使用定时器7(以下TIM7)去实现计算获取一条指令的运行时间。 1.TIM7初始化 以下初始化函数中 入口参数:TIMx:TIM7,arr:重载值,psc分频值 函数功能:TIM7的定时配置 返回参数:无 说明:和timer7只具有更新中断功能 void Timer7_Init(TIM_TypeDef * TIMx, unsigned short arr, unsigned short psc) { TIM_TimeBaseInitTypeDef timer_initstruct; N
[单片机]
stm32-afio的使用
1. AFIO的功能 为了优化64脚或100脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射。这时,复用功能不再映射到它们的原始分配上。 简言之,AFIO实现了复用功能的重新映射。 2. 在什么情况下,需要开启AFIO时钟? 参考手册中写道:对寄存器AFIO_EVCR, AFIO_MAPR和AFIO_EXTICRX进行读写操作前,应当首先打开AFIO的时钟。 在数据手册的引脚定义中(pin definitions),复用功能 Alternate functions 栏下分为两栏:默认 Default 和重映射 R
[单片机]
STM32 新固件库创建相关
上次那篇《STM32 RVMDK快速创建工程》,其实就是直接用keil安装库来创建工程。我认为不要用下载的固件库来创建工程,觉得容易出错。其实,我当时初窥stm32,很多东西没有搞清楚,所以才这么认为。直接用keil4的安装库来建立工程固然简单,但是那个库旧得要命,都是2.0左右的版本(我原以为新安装的必然是最新的库,其实不然)。 用新的固件库放于本地创建工程,之所以容易出错,我想有两点: 1、虽然把整个库放在本地,但不一定真的就用了本地的库,由于include paths没有设置完整或者没有在在选项里定义关键的defind,很容易造成编译器直接调用安装库,而不是本地库。 2、新库函数和旧库不兼容,如果用旧库写的程序
[单片机]
STM32之SPI串行线与HC595使用
/* 名称:STM32之SPI串行线与HC595使用 说明: SPI:串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、 LCD 等设备与 MCU 间,要求通讯速率较高的场合。对于SPI来说,其使用主要有四根线:分别是CS、MOSI、MISO、CLK;其中片选线CS,一般用普通的GPIO口来代替。 其次,SPI是全双工通信线路,其发送的时候同时也在接收着。因此要注意发送的时候接收的数据是否是垃圾数据。 就我理解,SPI一般用于外围的部件中,如FLASH、ADC、LCD和MCU。这些部件一般都包含了SPI接口,方便和主机进行通信。但是也有用于普通的串行线,用于一般的串行传输中。如此处的和HC59
[单片机]
基于STM32的MIT-BIH心电数据D/A回放设计
基于STM32的MIT-BIH心电数据D/A回放设计,对整体设计方案、硬件组成、软件设计等进行了介绍。通过读取心电数据将其进行D/A转换,输出波形与原始波形进行比较,较好地实现了回放功能。由此可见,该系统的性能指标达到了设计要求。能很好地实现心电数据回放,为一系列心电算法的仿真实践及实时心电监护仪的研制打好了基础。 心电信号是人类最早开展研究并应用于临床医学的生物电信号之一,通过对心电信号的分析处理能有效地预测心脏疾病。如何利用心电数据开发研究相关的医疗设备是对科研人员至关重要。心电数据的回放就是将原有的存储的MIT-BIH心电数据,根据其存储的格式,利用设计的系统通过D/A转换最终从终端回放出模拟信号。本文介绍基于ARM
[单片机]
STM32串口中断接收和中断发送
先贴出中断函数: void USART1_IRQHandler(void){ if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART1, USART_IT_RXNE); USART1_Buffer =USART_ReceiveData(USART1); //USART1_Buffesh是一个自己定义的接收数组 if(i 3){ SendFlag = 1; } } if(USAR
[单片机]
STM32 PCB触摸按键(RC检测法)
无意中翻出了大学刚毕业时用来来忽悠老板的触摸按键的程序,突然感概白发又多了。做硬件的不容易,做软件的也不容易,做硬件又做软件的更不容易。。。。 回想起来印象也不深刻,感觉纯粹为了好玩,又发现了键盘边有个有三个焊盘的pcb板,心血来潮把就它翻新了一下。 感觉触摸按键比物理按键简单多了,物理按键还要按键(废话),但是触摸按键的可是是一个铜片,铁片,金属片(反正是导体就行了)。如果手头上又没有pcb按钮的,可以自己随便找个废板,在有铜片的地方挖个按钮引条线出来也是可以的,甚至拿一条导线也可以。手按按钮时要在按键上贴个胶纸绝缘,不然,按下的时候电流都被人体吸光了。 要说明一下,程序和硬件都是借鉴STM8,ST有相关例程,是AN几就忘了
[单片机]