用一种魔性的方法学STM32
0x000000002017/07/18极客DIY IP:陕西
学习STM32有一段时间了,不得不说STM32真的很强大,无论是内核还是外设。
当然我现在只是皮毛罢了,也就是点点流水灯这种样子。
对于STM32,一般人是这样写的:
1.png
而我使用了不正常的写法:
Capture1.png
能写出来还真是不可思议呢,反正说难不难,说简单不见得。写了两个实验工程,尝试了GPIO,USART,ADC,DAC。

attachment icon STM32.7z 97.69KB 7Z 40次下载
其中那个DAC实验我是想用STM32接收串口数据流放音乐来着,可是现成串口助手不支持那么做,但是想自己编程操作串口有很大困难,所以暂时没办法测试了。
来自:综合交流区 / 极客DIY
23
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
rb-sama
7年6个月前 IP:湖北
836667
引用 la45088d1:
学习STM32有一段时间了,不得不说STM32真的很强大,无论是内核还是外设。
当然我现在只是皮毛罢了,也就是点点流水灯这种样子。
对于STM32,一般人是这样写的:
1.png
而我使用……
用ARM汇编操作寄存器偏移地址能写出来,似乎并没有什么不可思议的地方?
ST的官库只是用struct指针的方式写了而已。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ry7740kptv
7年6个月前 IP:江苏
836668
高等语言的最重要的意义就是提高代码的可读性。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
7年6个月前 IP:广东
836672
建议不要装这种B……
点开人家C例程的反汇编窗口,你会发现一点便宜都没占到
引用
评论
2
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹
7年6个月前 IP:江苏
836674
楼主的意思是 汇编操作寄存器更加简洁明了吧,对于不懂汇编的人来说,直接用C语言缺失了一点透明感,对于懂汇编的人来说,能直接看透 C语言 库函数的封装直接看到内存操作
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
0x00000000作者
7年6个月前 IP:海南
836701
引用 张静茹:
楼主的意思是 汇编操作寄存器更加简洁明了吧,对于不懂汇编的人来说,直接用C语言缺失了一点透明感,对于懂汇编的人来说,能直接看透 C语言 库函数的封装直接看到内存操作
其实就是这个意思,同时,在某些地方汇编是有用的。比如某些算法的优化。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
0x00000000作者
7年6个月前 IP:海南
836702
引用 amo:
建议不要装这种B……
点开人家C例程的反汇编窗口,你会发现一点便宜都没占到
其实是占到了,那库编写有多大,用汇编又有多大?我这些文件只有1KB多一点的指令大小,其中中断向量表就占了不小的空间。
而且如果汇编没有用,为什么ST官方的编程指南是讲解汇编指令为主的?为什么编译器有内嵌汇编功能?为什么某些Cortex-M3的开发书籍用了不小的篇章讲解汇编编程方法?
也许你会说开优化可以提高代码密度和效率,不过编译器不是人,只会按照相对固定的方式汇编高级语句,而自己可以根据程序的实际要求组织指令达到目的。而且有的代码开了优化就不能正常工作了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
0x00000000作者
7年6个月前 IP:海南
836703
引用 rb-sama:
用ARM汇编操作寄存器偏移地址能写出来,似乎并没有什么不可思议的地方?
ST的官库只是用struct指针的方式写了而已。
你会错意了,我的意思是原来我觉得汇编很难,对我来说基本不可能,不过现在我感觉其实也没有那么难。
其实要不是正好有《微机原理》这门课,我说不定还在玩MCS-51,就算是用,也会直接用C。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
rb-sama
7年6个月前 IP:湖北
836704
引用 la45088d1:
你会错意了,我的意思是原来我觉得汇编很难,对我来说基本不可能,不过现在我感觉其实也没有那么难。
其实要不是正好有《微机原理》这门课,我说不定还在玩MCS-51,就算是用,也会直接用C。
原来如此
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
7年6个月前 IP:广东
836709
引用 la45088d1:
其实是占到了,那库编写有多大,用汇编又有多大?我这些文件只有1KB多一点的指令大小,其中中断向量表就占了不小的空间。
而且如果汇编没有用,为什么ST官方的编程指南是讲解汇编指令为主的?为什么编译器有内……
参考你的程序,找了个库函数例程里类似的点灯例程,编译结果如下图所示,看你占了什么便宜:
使用库函数的点灯例程.png
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
0x00000000作者
7年6个月前 IP:海南
836761
引用 amo:
参考你的程序,找了个库函数例程里类似的点灯例程,编译结果如下图所示,看你占了什么便宜:
使用库函数的点灯例程.png
呵呵,你那只是简单的GPIO操作,就占了那么多东西。我的一个工程,里面有GPIO,AFIO,USART,ADC的使能和调用,还有简单的低通滤波算法,才比你这个多了100多bytes,而且我要是愿意,完全可以再牺牲可读性再优化掉50bytes没问题。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
0x00000000作者
7年6个月前 IP:海南
836762
引用 amo:
参考你的程序,找了个库函数例程里类似的点灯例程,编译结果如下图所示,看你占了什么便宜:
使用库函数的点灯例程.png
而且那么简单的一点东西,看不出什么的。以后程序大了,操作复杂了,差距就有了。而且不见得一定就在空间取胜,有时候是速度快了。
不然怎么都说ASM效率高,或是体积小呢。
反正既然存在,既然还有被提起,肯定还有很重要的用处,你就算在怎么斗嘴都改变不了事实。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zx-16533
7年6个月前 IP:广东
836764
asm神教..
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
7年6个月前 IP:广东
836785
引用 la45088d1:
而且那么简单的一点东西,看不出什么的。以后程序大了,操作复杂了,差距就有了。而且不见得一定就在空间取胜,有时候是速度快了。
不然怎么都说ASM效率高,或是体积小呢。
反正既然存在,既然还有被提起,肯定……
从前面没看出你的程序哪里带了“GPIO,AFIO,USART,ADC的使能和调用,还有简单的低通滤波算法”等“高级技术”……从主贴的:

学习STM32有一段时间了,不得不说STM32真的很强大,无论是内核还是外设。
当然我现在只是皮毛罢了,也就是点点流水灯这种样子。
更是坐实了装B……呵呵
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
single2339
7年6个月前 IP:四川
836810
不知道楼主是否是学生,学生就无所谓了。
鄙人搞了十多年软件工程相关工作,坦率讲所有工作里面最头痛的就是阅读别人写的阅读性差的代码。

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

高级语言的发展目的就是让人能够更好地阅读代码,提高生产效率,单纯的……
我只是为了娱乐而汇编,深层次了解原理罢了。汇编对我不是负担,就像那些《英雄联盟》之类的游戏对于普通人怎么玩都不累那样,对于我就是玩,就是消遣好吗。要是写代码为了工作,我当然会用库函数了。但自己私底下的娱乐,没有人管得着吧?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ncy
7年6个月前 IP:湖北
836950
这玩意用汇编会死人的
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
阮洪文
6年8个月前 IP:加拿大
845901
不到万不得已尽量不要用汇编
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金坷居士
6年8个月前 修改于 6年8个月前 IP:澳大利亚
845961
最近沉迷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适合开局,但是不要完全依赖这个,个人感觉里面也就是看引脚的映射和初始化时钟配置坠有用
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

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

所属专业
上级专业
同级专业
0x00000000
进士 学者 机友 笔友
文章
75
回复
758
学术分
1
2013/07/27注册,3个月13天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}