用CubeMX做开发,感觉程序框架被限制的死死的
刚上手几天,说一下感受:1. CubeMX的配置文件,在生成代码后,会自动保存在工程里。
如果外设初始设置需要更改,那么就直接去CubeMX上修改,然后重新生成代码。而不建议手动去修改已经自动生成的代码。
2. 生成的工程和代码,只有在注释的用户代码区域里面添加自己的代码,在再次从CubeMX重新生成代码后,才不会被删除。
也就是说,如果需要反复调整CubeMX中的配置,那么添加的用户代码必须严格放在规定的区域上。
3. 从标准库时代养成的模块化初始化外设的习惯,在HAL库时代似乎已经不被允许了。
换句话说,之前的编程习惯完全被颠覆了。要重新适应CubeMX规定的编程习惯。
4. 自动生成代码的注释,不能随便删了。也不能去调整程序换行,或是把tab改成四个空格,或者对齐等等。
5. CubeMX的配置,和生成的代码是完全必须同步的。
6. 脱离CubeMX来使用HAL库,强行用之前标准库时代养成的编程风格去改,感觉会让程序的各种调用变的更乱。
可能很多人会说,使用CubeMX来做STM32开发,是未来的大势所趋,就像是汇编向C的转换,C寄存器向库函数的转换,如今到了库函数向图形化编程的转换。
作为用户,不管它用起来舒服不舒服吧,都只能被迫接受了。
20多年前学习VC++ 6.0 MFC编程时,诸如生成代码框架、填空式编程等特点就和现在的CUBE MX一样了。加上因为我学习STM32直接接触的就是HAL,所以我个人就很习惯。
主要还是习惯问题。
另外,cube MX里有配置选项可以对某些外设选择使用LL库的。 毁誉参半的一款软件
喜欢的说是有史以来最佳初始化软件。
不喜欢的视为垃圾
不过,lz提出一些问题可以灵活应变,人家没有这么生硬。
要考虑是:重新生成初始化函数之前 自己的代码要注意保持,否则操作不当一下子消失无影无踪。 我接触喜欢的人都是搞软件的,但我这种没什么基础的就不会去用。单片机是一种基于中断的顺序体系,最核心的是处理中断。而算法在单片机里面占比不会太大cubemx的根本用途还是配置,是为了他们的芯片家族能更容易的被配置。而单片机的使用者有很多是我这种不太懂又不得不去干的人。一般来说,中断发生时,单片机会根据向量表找到对应的中断服务程序地址,并执行,用了mx我发现自己去规划中断挺费劲的,那东西就像是给一个想赶快配置好赶快可以写代码但又不知道写什么的人准备的。 这个都出了很多年了,习惯就好了,点点菜单就不把代码生成了,不挺好么 自己的代码放在单独的 c 文件里面就还好 在MFC里,必要时我选择直接改写框架;
在嵌入C里,有时直接内联汇编解决奇怪的问题。
按着经验,但凡是傻瓜式上手的框架,后期全是坑,框架自己没法解决的坑。 用了十几年标准库,一直很抵触HAL库,但是去年不得已用了cubemx之后,感觉就挺好的。
普通应用没那么高要求,不像一些大神,一言不合就飙寄存器,自己写库,大神能力强无所谓,我等普通打工仔学不来。{:lol:} 别那么抵触寄存器啊,到最后不也是读写寄存器吗 本帖最后由 hecat 于 2024-8-22 08:24 编辑
用CubeMX生成框架,在main函数里加入自己的初始化函数调用和循环函数调用,在中断或回调函数里加入自己的函数调用。
自己所有的代码都写到另外的c文件里,仅仅用CubeMX框架调用自己的代码,把耦合降到最低。
这样做的好处是CubeMX生成框架过程中发生的意外,对你的私有代码没有影响,也方便移植。
然后你上面的问题基本都没有了或者达到可以接受的程度。 这跟企业路由器一样,最早期是只能终端敲命令的,现在都是图形界面上点点就配置好了。 本帖最后由 redworlf007 于 2024-8-22 08:54 编辑
我只用cube生成初始化程序,然后复制到自己框架的工程里面,没啥难度啊。即便是以前标准库做的程序,只是初始化程序文件不一样,应用程序根本不用咋改。 我还是用寄存器或低级驱动库,对着官方例程、手册,修改寄存器等移植底层也用不了多少时间啊。用HAL那种除非是不差钱的项目。像前年那样芯片紧缺的时候,我们可能一个订单就得更换一个芯片,哪家有货换哪家,用HAL库还怎么方便切换。 令狐冲 发表于 2024-8-22 09:01
我还是用寄存器或低级驱动库,对着官方例程、手册,修改寄存器等移植底层也用不了多少时间啊。用HAL那种除 ...
(引用自13楼)
这个方法好,有备就少患,真保不齐哪天ST的芯片又来一波涨价。猪有周期,这芯片也会有周期 Cubemx只是配置初始化,pcb画完了,各外设的配置也就定了,基本不需要再改,小改动用不上cubemx,像定时器参数需要改的,在cubemx参数里直接填宏,要自己写的初始化函数和中断函数,可以设置cubemx不生成默认函数,main函数也可以选择不生成,全自己写,cubemx只是个图形化配置工具,可以防止出错和提高效率,问题是在HAL库,不是配置工具。 cube我用来生成初始化中断改写 最近用了ESP32,BL618,发现他们这种组件+example的SDK才是最好的。
矩阵时间 发表于 2024-8-22 10:07
这个方法好,有备就少患,真保不齐哪天ST的芯片又来一波涨价。猪有周期,这芯片也会有周期 ...
(引用自14楼)
他们敢再玩一次,就彻底失去市场了。当然了,如果他们觉得无所谓也有可能。但国产芯片厂家都在等他们涨价和断货。说白了arm核是能花钱买的到的不是他家发明的他们能在前些年一统江山也是arm的主要功劳和ide的贡献。 标准库都不更新了 cubemx生成的代码作为msp层,在上面构建自己的bsp层就好了,直接使用各种库、RTOS、GUI等还是省很多时间的 我的感觉是,相对C寄存器方式,cubeMX生成代码比较庞大。不过现在芯片便宜,也不在乎这点代码。
我一般是,cubeMX生成一个基础框架,保存为基础工程, 再手动改成C寄存器方式,节省代码空间,如果要另外再做调整,就在基础工程上调整。
这样以往模块化的代码还能借用。比如滤波,pid,CRC等等。 jingwaner 发表于 2024-8-22 10:29
最近用了ESP32,BL618,发现他们这种组件+example的SDK才是最好的。
(引用自17楼)
bl618能和esp32那样随意更改引脚功能吗? d__xin 发表于 2024-8-22 17:29
bl618能和esp32那样随意更改引脚功能吗?
(引用自22楼)
不行,只是特定映射,没有像esp32那样全映射随便配置,但是比一般MCU灵活,每个gpio都能成为某种外设的某个管脚。 楼主只列了缺点,优点也说一下?或者是还没感觉到? kitten 发表于 2024-8-22 22:59
楼主只列了缺点,优点也说一下?或者是还没感觉到?
(引用自24楼)
上面说的是特点,不能说是缺点。
所谓优点,就是如果你严格按照生成后的代码的指定位置去往里面添加自己的代码,在工程做完之后如果打算换一个单片机,比如F1换到F3,F4或者G4等等。
直接CubeMX原模原样配置完后,可以做到一行代码都不手动改,一键生成代码就可以在原工程上直接编译通过并且能用。这个是以前标准库时代无法做到的。
也就是说,掌握了CubeMX之后,就掌握了STM32全家族的所有单片机的快速使用。
我觉得优点只是配置各部分时钟的时候比较清晰 这玩意必须开一个定时器吧?所有定时器关闭不支持? jingwaner 发表于 2024-8-22 18:48
不行,只是特定映射,没有像esp32那样全映射随便配置,但是比一般MCU灵活,每个gpio都能成为某种外设的某 ...
(引用自23楼)
哦,那还可以,用ESP32最爽的地方就是布板的时候随意画,程序里改一下引脚就成了。
抽空玩玩618,
大概看了一下BL618外设上比ESP32多一些,价格上好一些,就是生态比ESP32差得比较多。 86180A 发表于 2024-8-23 01:18
上面说的是特点,不能说是缺点。
所谓优点,就是如果你严格按照生成后的代码的指定位置去往里面添加自己 ...
(引用自25楼)
高情商:掌握了st家族
低情商:成为了st奴隶 jingwaner 发表于 2024-8-23 08:59
高情商:掌握了st家族
低情商:成为了st奴隶
(引用自29楼)
会颠覆以前的传统编程方式,包括后续人工智能,技术是需要不断迭代更新的,注定是时代的一颗沙子,沉淀下去就好。 jingwaner 发表于 2024-8-23 08:59
高情商:掌握了st家族
低情商:成为了st奴隶
(引用自29楼)
电工搬砖的工具而已{:lol:} zhanyanqiang 发表于 2024-8-23 08:10
这玩意必须开一个定时器吧?所有定时器关闭不支持?
(引用自27楼)
比如STM32G431,中断服务函数统一被放在stm32g4xx_it.c
只能往指定区域添加用户代码,不能删它的注释。否则更新CubeMX的配置后,用户代码会被删掉。
jingwaner 发表于 2024-8-23 08:59
高情商:掌握了st家族
低情商:成为了st奴隶
(引用自29楼)
也没有这么惨。
我可以选择用ST,也可以选择不用ST。区别是切换ST同厂家的芯片会比较方便而已,降低了学习成本。
86180A 发表于 2024-8-23 15:16
比如STM32G431,中断服务函数统一被放在stm32g4xx_it.c
只能往指定区域添加用户代码,不能删它的注释 ...
(引用自32楼)
可以选择不生成IRQHandler函数,新建个文件自己写,如果用hal的函数,默认的中断函数一般够用了,实现回调函数,这个it.c文件不需要改。
我用cubemx生成初始化程序后,只需要在main.c的while前加一个函数调用,执行自己的程序,其他文件不用改。 86180A 发表于 2024-8-23 15:16
比如STM32G431,中断服务函数统一被放在stm32g4xx_it.c
只能往指定区域添加用户代码,不能删它的注释 ...
(引用自32楼)
然而不用,它会先在中断调用相关库函数,然后库函数会调用用户定义的函数,譬如:用户定义的函数会自动覆盖库里面通过 weak 方式定义的空函数。 有回调函数的,cube的hal风格不鼓励你直接在中断IRQ服务函数里写,更推荐你在用户代码区域自己实现回调函数的形式 86180A 发表于 2024-8-23 15:16
比如STM32G431,中断服务函数统一被放在stm32g4xx_it.c
只能往指定区域添加用户代码,不能删它的注释 ...
(引用自32楼)
你为啥要改他的注释呢?有任何帮助么?另外他给定的用户代码位置都是够用的,最次也是楼上大哥说的那样自己定义函数,取代HAL自带的weak 弱定义的函数。 前两年用的esp32后,之后就不想用stm32了 kitten 发表于 2024-8-23 23:19
你为啥要改他的注释呢?有任何帮助么?另外他给定的用户代码位置都是够用的,最次也是楼上大哥说的那样自 ...
(引用自37楼)
刚用,不熟。
HAL库上有很多东西我目前还不了解。
刚开始看的时候,觉得满屏的注释感觉很乱,就想整理一下代码,甚至想把MSP文件和IT文件给删掉,把东一块西一块的初始化代码整合封装一下。
后来才知道这些东西有各种调用关系,不能乱动。
86180A 发表于 2024-8-24 03:18
刚用,不熟。
HAL库上有很多东西我目前还不了解。
(引用自39楼)
{:lol:} 看到注释就想删掉 屏幕都给注释占了 做好代码隔离,将自己写的代码文件与生成的代码文件分开。
生成的代码需要修改时严格按照规则,填写在user code注释之间。
层次分明,结构清晰,基本上只会在官方代码api有更改时才会出问题。 坑挺多,不想踩,不到万不得已就先不碰了。就算是51不是现在还有人用吗 ibmx311 发表于 2024-8-25 08:42
坑挺多,不想踩,不到万不得已就先不碰了。就算是51不是现在还有人用吗
(引用自42楼)
我之所以要去碰,是因为STM32F405的封装安排太操蛋了。
最小号的那个是0.4mm间距的BGA,PCB工艺难度极高。再大一号,就直接去到了LQFP64
中间居然没有安排QFN封装的过渡一下,比如QFN48 QFN64
板子面积限制下,不得不使用同级别的G4了,而G4已经没有标准库可用了,LL库又不全。
CubeMX用来初始化挺好的,初始化完后就没他啥事 86180A 发表于 2024-8-25 12:50
我之所以要去碰,是因为STM32F405的封装安排太操蛋了。
最小号的那个是0.4mm间距的BGA,PCB工艺难度极高 ...
(引用自43楼)
这个我完全理解,对所有人来说,早晚会碰
页:
[1]