打印

MDK4.6环境下STM32F10xxxx.S一段一段看

[复制链接]
楼主: 明月小厨
手机看帖
扫描二维码
随时随地手机跟帖
21
明月小厨|  楼主 | 2013-1-2 17:20 | 只看该作者 回帖奖励 |倒序浏览
系统模式到用户普通模式在哪里切换的?难道是最后一句返回指令?
双堆栈指针在哪里设的啊?我怎么没看见呢?

使用特权

评论回复
22
明月小厨|  楼主 | 2013-1-2 17:30 | 只看该作者
看完了,但感觉很失败;
如果有一种更简单的方式处理程序入口;中断的向量表;堆栈指针;还需要这么烦;搞个莫明其妙的汇编启动文件;象C51的处理方式就不错;

使用特权

评论回复
23
明月小厨|  楼主 | 2013-1-2 17:36 | 只看该作者
一个下午就这样浪费掉了,我要找ARM和KEIL索赔;

使用特权

评论回复
24
明月小厨|  楼主 | 2013-1-2 17:37 | 只看该作者
:curse::curse::curse::curse:

使用特权

评论回复
25
明月小厨|  楼主 | 2013-1-2 17:42 | 只看该作者
本帖最后由 明月小厨 于 2013-1-3 11:47 编辑


ADS以前处理的更让人恶心;
运行时都有很多种模式,系统模式,特权模式,用户模式,线程模式......
不同模式下的权限还不一样;不就一个破单片机,搞的好象有很多黑客入侵似的;

这个不是ADS的错ARM7的毛病很多,估计是为了跑操作系统而特殊设置的结构;但是,这么烦人的反复切换让不搞操作系统的人很烦;
搞操作系统的人也不领情,因为过程复杂,非常浪费时间;

使用特权

评论回复
26
香如故| | 2013-1-2 18:56 | 只看该作者
ALIGN=3是8字节对齐吧,2的3次方
不是ads的几种模式,是arm7,arm9的很多种模式
cortex-m3和arm不一样的吧

使用特权

评论回复
27
江陵龙少| | 2013-1-2 19:39 | 只看该作者
明月小厨 发表于 2013-1-2 14:44
这部分代码是说堆栈;
堆栈大小400;还声明了一个堆栈段,不用初始化,可读写;
ALIGN=3?什么意思?

align=2是4字节对齐;=3是8字节对齐,=n表示以2的n次方对齐,
据我所知,ARM7的堆栈要求4字节对齐,Cortex-M3的要求8字节对齐。

使用特权

评论回复
28
明月小厨|  楼主 | 2013-1-2 21:51 | 只看该作者
本帖最后由 明月小厨 于 2013-1-3 11:59 编辑

上面二位兄弟说的对,M3的向量表是8字节对齐的;2字对齐模式;:victory:
以后再查看生成的向量表,本来4字节就可以表示地址了;为什么要多出来4个字节?不是很浪费空间?
//以后大家看看0x8000000这段都是什么;是不是填的比较满;有没有发现什么中断向量;
//复位后的入口在哪里?

使用特权

评论回复
29
sgj245609615| | 2013-1-2 22:36 | 只看该作者
学习下

使用特权

评论回复
30
明月小厨|  楼主 | 2013-1-3 00:53 | 只看该作者
用寄存器直接操作法;仅4行小代码就实现PA8端口LED的亮和灭;简洁而且简单!~~~~~~~~~
唯一感觉不爽的是寄存器的名称不能直接用,要搞个->符号;
:(看起来不习惯;估计IAR处理的更好些;
本来想找一个寄存器列表出来把这些不习惯全部处理掉,可上网没找到;自己整理又烦,300多个寄存器;

使用特权

评论回复
31
明月小厨|  楼主 | 2013-1-3 00:54 | 只看该作者
明月小厨 发表于 2013-1-3 00:53
用寄存器直接操作法;仅4行小代码就实现PA8端口LED的亮和灭;简洁而且简单!~~~~~~~~~
唯一感觉不爽 ...

我可是自己直接看寄存器手册搞出来的;原汁原味的纯寄存器操作;

使用特权

评论回复
32
明月小厨|  楼主 | 2013-1-3 01:03 | 只看该作者

明天开始操作定时器,玩玩中断;
后天开始弄SPI操作W25X16;
再往后解决24C02;
再往后休息一段时间准备过年;
:@

使用特权

评论回复
33
明月小厨|  楼主 | 2013-1-3 09:52 | 只看该作者
从零开始建立工程,然后导入一个.S启动文件;
再然后就是写自己的main.c;这个过程总结一下::P

使用特权

评论回复
34
jobszheng| | 2013-1-3 09:56 | 只看该作者
楼主奉献的很详细。楼主把自己的成长轨迹都呈现出来了。先谢谢了

使用特权

评论回复
35
明月小厨|  楼主 | 2013-1-3 10:00 | 只看该作者
1.MDK自动配置出来的启动文件最好添加上,它虽然没有做什么,但它完成了三个工作;
1)堆栈的确是有了,而且是二个堆;长度是0X400和0X200;
2)中断向量表也有了,后面的C程序可以直接使用相关的标号,定义自己的中断服务程序;甚至你用不到的部分也被"B   ."填上了;
3)回到main主函数开始运行;
4)在回到main前还给大家一个机会,Systeminit();
如果没有这个启动文件,堆栈的问题自己设当然是可以的;
向量表也可以自己硬上;
既然人家都帮你搞好了,你直接用应该更省事;不必有顾虑.

使用特权

评论回复
36
明月小厨|  楼主 | 2013-1-3 10:06 | 只看该作者
.S启动文件有三个,分别对应ld,md,hd;不解释了,有何区别,上网搜搜;如果你的芯片是RB,而使用了HD.S;估计内存的容量需要手动改一下;
.S文件有了,直接写一个C程序,并添加到项目中来;
包含头文件;
#include "stm32f10x.h"
很多声明是在这个头文件中的,必须有它;
试试编译一下看看结果;

使用特权

评论回复
37
明月小厨|  楼主 | 2013-1-3 10:07 | 只看该作者
出错了!
不用紧张看看错了什么,一个一个排除;

使用特权

评论回复
38
明月小厨|  楼主 | 2013-1-3 10:10 | 只看该作者
本帖最后由 明月小厨 于 2013-1-4 20:28 编辑

第一个错误是说没有说明ld.md.hd;这个不是自动添加时已经选择了?迁就一下吧,既然它说你再说明一次,你说再说明它;
添加这一句到编译器
stm32编译时出现 error: #35: #error directive: "Please select first the target STM32F10x device used
C/C++编译器中指定类型
USE_STDPERIPH_DRIVER,STM32F10X_MD
上网自己找找,添加在什么位置都有说明;
预编译宏定义.zip (68.91 KB)

使用特权

评论回复
39
明月小厨|  楼主 | 2013-1-3 10:13 | 只看该作者
第二个错误:
系统提示SystemInit有错误;没有具体内容,不知道是什么;(注:这是它自己写的代码,竟然自己都不知道)
找到出错的地方,直接把这几个注释掉;
我的办法是在自己的C程序里写了一个很空的SystemInit();
:

void SystemInit(void)
{}
说一定以后心血来潮自己添加点什么;

使用特权

评论回复
40
明月小厨|  楼主 | 2013-1-3 10:16 | 只看该作者
第三个错误;
这次是一系列的错误;提示 XXXXX.h文件找不到;

直接在windows下全盘搜索;找到后就复制过来;
一个接一个的xxxxxx.h文件提示找不到;就这样搜索出来再复制过来;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则