DIY
用一种魔性的方法学STM32
0x00000000 2017-7-18
学习STM32有一段时间了,不得不说STM32真的很强大,无论是内核还是外设。
当然我现在只是皮毛罢了,也就是点点流水灯这种样子。
对于STM32,一般人是这样写的:
pic

而我使用了不正常的写法:
pic

能写出来还真是不可思议呢,反正说难不难,说简单不见得。写了两个实验工程,尝试了GPIO,USART,ADC,DAC。
STM32.7z97.7k3次

其中那个DAC实验我是想用STM32接收串口数据流放音乐来着,可是现成串口助手不支持那么做,但是想自己编程操作串口有很大困难,所以暂时没办法测试了。
2楼
引用 la45088d1:
学习STM32有一段时间了,不得不说STM32真的很强大,无论是内核还是外设。
当然我现在只是皮毛罢了,也就是点点流水灯这种样子。
对于STM32,一般人是这样写的:
pic

而我使用……
用ARM汇编操作寄存器偏移地址能写出来,似乎并没有什么不可思议的地方?
ST的官库只是用struct指针的方式写了而已。
折叠评论
加载评论中,请稍候...
折叠评论
3楼
高等语言的最重要的意义就是提高代码的可读性。
折叠评论
加载评论中,请稍候...
折叠评论
4楼
建议不要装这种B……
点开人家C例程的反汇编窗口,你会发现一点便宜都没占到
折叠评论
1
加载评论中,请稍候...
折叠评论
5楼
楼主的意思是 汇编操作寄存器更加简洁明了吧,对于不懂汇编的人来说,直接用C语言缺失了一点透明感,对于懂汇编的人来说,能直接看透 C语言 库函数的封装直接看到内存操作
折叠评论
加载评论中,请稍候...
折叠评论
2017-7-19 07:25:34
0x00000000(作者)
6楼
引用 张静茹:
楼主的意思是 汇编操作寄存器更加简洁明了吧,对于不懂汇编的人来说,直接用C语言缺失了一点透明感,对于懂汇编的人来说,能直接看透 C语言 库函数的封装直接看到内存操作
其实就是这个意思,同时,在某些地方汇编是有用的。比如某些算法的优化。
折叠评论
加载评论中,请稍候...
折叠评论
0x00000000(作者)
7楼
引用 amo:
建议不要装这种B……
点开人家C例程的反汇编窗口,你会发现一点便宜都没占到
其实是占到了,那库编写有多大,用汇编又有多大?我这些文件只有1KB多一点的指令大小,其中中断向量表就占了不小的空间。
而且如果汇编没有用,为什么ST官方的编程指南是讲解汇编指令为主的?为什么编译器有内嵌汇编功能?为什么某些Cortex-M3的开发书籍用了不小的篇章讲解汇编编程方法?
也许你会说开优化可以提高代码密度和效率,不过编译器不是人,只会按照相对固定的方式汇编高级语句,而自己可以根据程序的实际要求组织指令达到目的。而且有的代码开了优化就不能正常工作了。
折叠评论
加载评论中,请稍候...
折叠评论
0x00000000(作者)
8楼
引用 rb-sama:
用ARM汇编操作寄存器偏移地址能写出来,似乎并没有什么不可思议的地方?
ST的官库只是用struct指针的方式写了而已。
你会错意了,我的意思是原来我觉得汇编很难,对我来说基本不可能,不过现在我感觉其实也没有那么难。
其实要不是正好有《微机原理》这门课,我说不定还在玩MCS-51,就算是用,也会直接用C。
折叠评论
加载评论中,请稍候...
折叠评论
9楼
引用 la45088d1:
你会错意了,我的意思是原来我觉得汇编很难,对我来说基本不可能,不过现在我感觉其实也没有那么难。
其实要不是正好有《微机原理》这门课,我说不定还在玩MCS-51,就算是用,也会直接用C。
原来如此
折叠评论
加载评论中,请稍候...
折叠评论
10楼
引用 la45088d1:
其实是占到了,那库编写有多大,用汇编又有多大?我这些文件只有1KB多一点的指令大小,其中中断向量表就占了不小的空间。
而且如果汇编没有用,为什么ST官方的编程指南是讲解汇编指令为主的?为什么编译器有内……
参考你的程序,找了个库函数例程里类似的点灯例程,编译结果如下图所示,看你占了什么便宜:
pic
折叠评论
加载评论中,请稍候...
折叠评论
2017-7-20 08:40:41
0x00000000(作者)
11楼
引用 amo:
参考你的程序,找了个库函数例程里类似的点灯例程,编译结果如下图所示,看你占了什么便宜:
pic
呵呵,你那只是简单的GPIO操作,就占了那么多东西。我的一个工程,里面有GPIO,AFIO,USART,ADC的使能和调用,还有简单的低通滤波算法,才比你这个多了100多bytes,而且我要是愿意,完全可以再牺牲可读性再优化掉50bytes没问题。
折叠评论
加载评论中,请稍候...
折叠评论
0x00000000(作者)
12楼
引用 amo:
参考你的程序,找了个库函数例程里类似的点灯例程,编译结果如下图所示,看你占了什么便宜:
pic
而且那么简单的一点东西,看不出什么的。以后程序大了,操作复杂了,差距就有了。而且不见得一定就在空间取胜,有时候是速度快了。
不然怎么都说ASM效率高,或是体积小呢。
反正既然存在,既然还有被提起,肯定还有很重要的用处,你就算在怎么斗嘴都改变不了事实。
折叠评论
加载评论中,请稍候...
折叠评论
13楼
asm神教..
折叠评论
加载评论中,请稍候...
折叠评论
14楼
引用 la45088d1:
而且那么简单的一点东西,看不出什么的。以后程序大了,操作复杂了,差距就有了。而且不见得一定就在空间取胜,有时候是速度快了。
不然怎么都说ASM效率高,或是体积小呢。
反正既然存在,既然还有被提起,肯定……
从前面没看出你的程序哪里带了“GPIO,AFIO,USART,ADC的使能和调用,还有简单的低通滤波算法”等“高级技术”……从主贴的:

学习STM32有一段时间了,不得不说STM32真的很强大,无论是内核还是外设。
当然我现在只是皮毛罢了,也就是点点流水灯这种样子。
更是坐实了装B……呵呵
折叠评论
加载评论中,请稍候...
折叠评论
15楼
不知道楼主是否是学生,学生就无所谓了。
鄙人搞了十多年软件工程相关工作,坦率讲所有工作里面最头痛的就是阅读别人写的阅读性差的代码。

高级语言的发展目的就是让人能够更好地阅读代码,提高生产效率,单纯的为了汇编而汇编本身没有什么特别意义。
折叠评论
加载评论中,请稍候...
折叠评论
2017-7-21 07:41:15
16楼
现在装B的成本越来越高了。。。
折叠评论
加载评论中,请稍候...
折叠评论
17楼
引用 la45088d1:
而且那么简单的一点东西,看不出什么的。以后程序大了,操作复杂了,差距就有了。而且不见得一定就在空间取胜,有时候是速度快了。
不然怎么都说ASM效率高,或是体积小呢。
反正既然存在,既然还有被提起,肯定……
想想如果以后上班了,你跳槽了,同事接手看不懂汇编肯定会说MMP~
为啥我会爆粗口?
因为前一阵帮忙填坑坑死了。
折叠评论
加载评论中,请稍候...
折叠评论
0x00000000(作者)
18楼
引用 牛逼大仙:
想想如果以后上班了,你跳槽了,同事接手看不懂汇编肯定会说MMP~
为啥我会爆粗口?
因为前一阵帮忙填坑坑死了。
我只是为了娱乐而汇编,深层次了解原理罢了。汇编对我不是负担,就像那些《英雄联盟》之类的游戏对于普通人怎么玩都不累那样,对于我就是玩,就是消遣好吗。要是写代码为了工作,我当然会用库函数了。但自己私底下的娱乐,没有人管得着吧?
折叠评论
加载评论中,请稍候...
折叠评论
0x00000000(作者)
19楼
引用 single2339:
不知道楼主是否是学生,学生就无所谓了。
鄙人搞了十多年软件工程相关工作,坦率讲所有工作里面最头痛的就是阅读别人写的阅读性差的代码。

高级语言的发展目的就是让人能够更好地阅读代码,提高生产效率,单纯的……
我只是为了娱乐而汇编,深层次了解原理罢了。汇编对我不是负担,就像那些《英雄联盟》之类的游戏对于普通人怎么玩都不累那样,对于我就是玩,就是消遣好吗。要是写代码为了工作,我当然会用库函数了。但自己私底下的娱乐,没有人管得着吧?
折叠评论
加载评论中,请稍候...
折叠评论
2017-7-24 15:16:38
2017-7-24 15:16:38
20楼
这玩意用汇编会死人的
折叠评论
加载评论中,请稍候...
折叠评论
2018-5-6 09:23:04
2018-5-6 09:23:04
21楼
不到万不得已尽量不要用汇编
折叠评论
加载评论中,请稍候...
折叠评论
2018-5-8 22:48:45
2018-5-8 22:48:45
22楼
最近沉迷STM32实现Type-C快充协议再加上学校的项目一直在鼓捣STM32,RM0091都快能背了(大雾

发表下感受:
1. 了解寄存器级别的操作还是很有必要的
比如说要把一个引脚从GPIO输出模式切换成定时器输出模式,就需要好好考虑下切换期间会发生什么。有时候直接用HAL_GPIO_Init会产生Glitch,假如驱动的是控制高压开关的MOS管啥的很容易爆炸
而且HAL_GPIO_Init很慢,本来几个位操作就能解决的非要弄个循环x

2. 抽象是要付出代价的
以STM32F030来说,官方最开始出的是标准库,然后是HAL+LL(硬件抽象层+底层库),LL和标准库基本是一个东西(很多函数and/or宏都能一一对应),HAL则是更高层次的封装,更有可移植性。
实验发现用了最简单的ADC功能,HAL比LL多用500字节RAM,2k的ROM,对于只有32k Rom 4k Ram的STM32F030K6还是很需要考虑的
分析了下HAL的实现, HAL要求使用者保存一个结构体,里面保存了初始化参数还有一些状态机的状态之类的。窝木有用ADC的DMA但是这个结构体里面还是有小一半的DMA相关...而且初始化参数还存着...大概率一直用不到的东西。

所以窝感觉HAL更适合USB SPI I2C这些定死的不需要频繁和硬件底层打交道的通信外设

题外话:
一行printf不开优化的情况下有24k rom,开了也好不到哪去,所以最好方法就是不用printf甚至不用任何stdlib里的东西

更新:
CubeMX适合开局,但是不要完全依赖这个,个人感觉里面也就是看引脚的映射和初始化时钟配置坠有用

[修改于 1 年前 - 2018-05-08 23:01:26]

折叠评论
加载评论中,请稍候...
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png