学习精英版的学习笔记

2019-07-21 02:25发布

本帖最后由 xiatianyun 于 2018-6-4 09:42 编辑

刚看到有前人发布自己学习中的持续更新贴作为鞭策自己不断学习的方法,我也做个学习笔记,把过程中的点点滴滴写下来。
其实写笔记我一直使用复制粘贴保存在电脑里,但最近我喜欢上了用笔写在笔记本上,觉得更有价值更有效率。
--------------------------
先来谈谈STM32的常识。
ARM公司其实不生产芯片,靠什么赚钱呢?靠授权。ARM研发内核然后授权给各个芯片厂家,靠授权费用赚钱,这个是个好注意。毕竟研发和生产在环节上很不同,一家科技公司很难占据产品的各个环节,占据了也就作茧自缚了,就像昔日的诺基亚。
但毕竟内核只是芯片的一部分,内核之外叫做片上外设,意思就是芯片上的相对于内核而言的外部设备,比如GPIO。
芯片厂家根据内核自己设计相关的片上外设成为单片机,如果没有统一的标准那么各个厂家的芯片就不能通用。
意法半导体公司就是其中一家授权生产ARM的公司,当然意法的产品不只ARM芯片。
芯片内核也是升级换代的,我以前知道的ARM其实是比较早的内核产品。精英版的STM32是比较新的内核,叫Cortex-M3,手机上的叫Core-A,A7、A8之类,是很先进的东西。
微控制器芯片Cortex-M3、M4、M7,一个比一个先进。
-------------------------------
事实上使用汇编编写程序已经变得很难了,51时代就有使用C来设计51程序了。学校里面曾看到高年级同学使用手操器来下载程序,那种是在纸上写好汇编程序然后自己手动通过手操器(不知道叫什么合适)一条条下载到试验机里面的,连个电脑软件都没有。想来那种手操器兼具汇编和烧制的功能。我是学PLC的,我以前也是这么学习PLC的。C语言是比较底层的语言,用来编写单片机程序就理所当然了。单片机的C语言采用的编译器和普通的C语言不同,可以把单片机的C语言看作是C的一个子集,并不是所有C的特性均支持。
要想用C来写单片机程序当然要做些底层封装,可以自己封装,事实上芯片公司提供了标准封装,ST公司提供的STM32库函数就是这样的封装。
------------------------------
Keil公司是另外一家公司,是软件公司,提供开发单片机的工具,从51到ARM均有。
ST公司也有自己的开发工具,为什么我们都用Keil呢?业有所专嘛。
Keil 提供的STM32开发工具似乎换了个名字,叫MDK,不过装好后还是叫Keil。
Keil不是免费的,以前很难找到破解的Keil,现在我们使用Keil,所以我们都懂了。
Keil是个IDE工具,除了编辑程序外还提供编译器,并且通过简单选择就配置好了开发链路,不用自己配置,类似与其他专有语言开发工具,比如微软的VS。
换句话说如果开发者要自己配置开发链路的话也是可以的,只要够专业。通过查看,安装好的Keil在目录下的ARMARMCCin里就是编译工具,其他 目录里面提供单片机的include、lib。
为什么还要从ST官网下载库呢?官网的比较新嘛。Keil提供的库我想也是ST提供的,不过可能不会同步更新。
Keil的编辑器不好用,不过keil提供从其他编辑器来操作的可定制菜单,看来Keil还是知道自己的短板的。
现在比较不错的编辑器有gvim/sublime text/vs code,不过这些都是普通编辑器,如果要在开发中实现跳转、自动完成的话需要插件,这些都是学习成本,就看值不值了。
补充:
其实开发STM32除了在windows平台外还有Linux平台和Mac平台也可以,这对于极客来说是个好消息。具体看ST公司提供的开发套件,从我了解的信息看是集成在Eclipse的开发环境。
----------------------------------
学习STM32除了软件外其实很重要的还有硬件,电子工程这类。我学习STM32纯属偶然,我在PLC设计中需要使用一块带Modbus RTU通讯的中继板来做扩展,这块中继板设置通讯奇偶校验时只能使用固定的无校验,这让我很郁闷,系统中其他站都要设置成无校验才行。所以有了我是不是可以修改下的冲动。电子工程没弄过,这个是个拦路虎,我想我以后如果中断学习了可能是因为这个。









友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
50条回答
xiatianyun
1楼-- · 2019-07-22 01:55
本帖最后由 xiatianyun 于 2018-6-21 14:30 编辑

最近在学习SysTick定时器,内容还是比较好理解的。
SysTick是内核定时器,有4个相关寄存器,LOAD和VAL是24位寄存器,一直认为STM32的寄存器都是32位的,这下毁三观了。
我在M3权威指南和中文参考里面都没有发现这四个寄存器中CTRL和CALIB的具体定义,只看到CTRL中16、2、1、0位的定义,其他位没有说明,怎么回事儿呀?
再看misc.c中的SysTick定时器初始化函数SysTick_CLKSourceConfig(),传入的是宏常量,关于是配置外部HCLK的还是内部HCLK作为SysTick时钟源,宏定义是:
[mw_shl_code=c,true]#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)[/mw_shl_code]
SysTick_CLKSourceConfig()里面直接用这个宏来赋值CTRL寄存器,其中如果是内部HCLK做源第2位为1,则使用“或”,这个好理解,就是把CTRL的第2位赋值为传入的参数。如果是外部HCLK则使用“与”:
[mw_shl_code=c,true]  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }[/mw_shl_code]
外部HCLK值做源为0xFFFFFFFB,低4位B是二进制1011,第2位是0,采用AHB的8分频。第2位&也容易理解。
第0位第1位是1,使能SysTick定时器和定时到产生中断。“与”1就是不用管,不产生影响了。
所以,如果以后要使某位置1则data中的某位为1其他位0,然后或。
如果要使某位置0则data中某位为0其他位为1,然后与。

warship
2楼-- · 2019-07-22 04:23
笔记记得不错,
注意保持,
我们会常来看看哦.
正点原子
3楼-- · 2019-07-22 05:05
 精彩回答 2  元偷偷看……
xiatianyun
4楼-- · 2019-07-22 09:00
 精彩回答 2  元偷偷看……
kvdong
5楼-- · 2019-07-22 13:05
支持,保持下去
xiatianyun
6楼-- · 2019-07-22 16:01
本帖最后由 xiatianyun 于 2018-6-5 21:26 编辑

Keil编译配置:
1、Output选项:选择Objects目录,定位在/Template/Output目录;
勾选Create HEX File,这个是下载到芯片中中的映像文件。
2、Listing选项:选择Listing目录,定位在/Template/Listing目录;
我想Listing中的文件关系到tag跳转定位,所以如果项目不进行一次编译是不能进行符号、函数的跳转的。
3、C/C++选项:这个比较关键。首先是需要预定义两个宏:STM32F10X_HD宏,关系到把项目编译成哪种内存容量的程序,如果是高容量就写这个。
USE_STDPERIPH_DRIVER宏,这个用在stm32f10x.h头文件中,如果定义了这个宏则会自动包含stm32f10x_conf.h这个头文件。这个头文件其实是关于外设头文件的总包含头文件,有了这个头文件就不用把外设头文件一个个include了。这个包含链是这样的:stm32f10x.h--->stm32f10x_conf.h--->很多个外设头文件,也就是外设目录/inc目录下的头文件。所以程序中只需要#include <stm32f10x.h>这一个头文件即可。
宏定义可以在C头文件中定义,这里改在Keil中定义,会自动在以后编译时被作为参数一起编译。好处当然是方便进行芯片更换。
之后是比较麻烦的IncludePath 设置了。
需要添加四个路径包含:Libraries/CMISIS/CM3/DeviceSupport/ST/STM32F10x  +  Libraries/CMISIS/CM3/CoreSupport    +    Libraries/STM32F10x_StdPeriph_Driver/inc  +   /User
这些全都是实体目录,和Group无关。第一个路径上有启动文件和stm32f10x.h头文件和system_stm32f10x.c文件和.h文件。
第二个路径上有2个内核文件core_cm3.c及.h文件。
第三个路径上有外设头文件。第四个路径上就是自己的程序文件。
如果不设置IncludePath或者设置不正确,那么编译时就不能正确找到项目中用到的所有文件导致编译出错。
其实这是因为所有文件中的#include 包含预处理这是写了简单的头文件名,不含路径,编译程序认为是在项目同一个目录里面,但实际上并不是所有文件都处于同一个目录,所以需要指明到哪里搜寻所需的文件。当然,如果不包含一些路径也可以编译,编译程序会自动到Keil安装目录下的include目录找,里面的文件可能不会是我们需要的或者说可能是旧的。


---------------------
如果不调试,差不多就可以了。

一周热门 更多>