前提:正点原子的stm32f103RCT6 容量大小256kb
实际使用的是stm32f103c8t6 容量大小64kb
启动文件的选择
ST 公司提供了 3 个启动文件给我们,分别用于不同容量的 STM32 芯片,这三个文件是:
startup_stm32f10x_ld.s
startup_stm32f10x_md.s
startup_stm32f10x_hd.s
其中,ld.s 适用于小容量 产品;md.s 适用于中等容量产品;hd 适用于大容量产品
启动文件的一点小修改
不过这个启动文件,我们做了一点点修改,具体是 Reset_Handler 函数,该函数修改后代码
如下:
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
;寄存器版本代码,因为没有用到 SystemInit 函数,所以注释掉
;库函数版本代码,建议加上这里(外部必须实现 SystemInit 函数),以
;初始化 stm32 时钟等。
;IMPORT SystemInit
;LDR R0, =SystemInit
;BLX R0
LDR R0, =__main
BX R0
ENDP
这段代码,我们屏蔽了复位中断服务函数(Reset_Handler)对函数 SystemInit 的调用,如
果是库函数版本,可以取消这个函数的注释,并在外部实现 SystemInit 函数。
sys.h和sys.c是由正点原子提供
sys 文件夹内共 5 个文件:sys.c、sys.h、stm32f10x.h、system_stm32f10x.h 和 core_cm3.h。
**其中sys.c和sys.h是由ALIENTEK提供,**我们将重点介绍。而其他三个文件则是拷贝自STM32F1
的 CMSIS 库文件,主要包含了 STM32F1 的寄存器定义、位定义以及内存映射等,我们的代码
里面需要用到这些内容,所以直接拷贝过来即可
个人总结
-
查了很多博客还有《cortex-cm3权威指南》这一本书,基于cm3内核的寄存器映射等,应该都是一样的!
-
正点原子的sys.c和sys.h好像只是,具体的实现了位带的操作!以后看到详细的作用还会继续补充,也欢迎各位网友给出指导意见!
-
具体操作中忘记了相应的io口的配置,导致程度烧录的不如预期!没有配置时钟使能,设置相应的io口为推挽输出!
没有搞清楚的知识点
- 选错了芯片会造成什么影响?
- 其二文件的配置为什么要这样配置?
指导内容在《stm32不完全寄存器手册》中有,但是为什么这样配置有点百思不得其解!