本帖最后由 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通讯的中继板来做扩展,这块中继板设置通讯奇偶校验时只能使用固定的无校验,这让我很郁闷,系统中其他站都要设置成无校验才行。所以有了我是不是可以修改下的冲动。电子工程没弄过,这个是个拦路虎,我想我以后如果中断学习了可能是因为这个。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
配置好SysTick的时钟源后来看看SysTick是如何工作的。
在CTRL寄存器第0位置1使能后SysTick开始工作。
从RELOAD寄存器转载计数值到VAL寄存器中,这是个24bit寄存器。每个时钟周期VAL值减一,当VAL值减到0时定时结束。
如果配置了CTRL的第1位为1则此时产生中断,如果没有配置则下个周期又会重转载RELOAD值到VAL中来继续。
周而复始,连绵不绝。
需要知道几个问题:
1、每周期是如何确定的?
2、RELOAD值是如何确定的?
3、如果中断,如何避免中断执行时间不会干扰定时时间?
------------------------
连看了两遍视频才看明白。执行延时其实有两种方法,一种是中断一种是查询。
中断看来是官方推荐的方法,因为在cor_cm3.h中有SysTick_Config()函数,该函数的功能是设置SysTick时钟源、设置中断间隔的时钟数、设置中断、使能SysTick。其后在中断函数SysTick_Handler()中执行中断。我注意到SysTick_Config设置RELOAD值时需要把需要定时的脉冲数-1,这是因为装载初值也是需要时间的,至于-1到底精确吗就是相对的了,这要看装载执行时间(装载是系统自动完成的,可以忽略时间,不过-1还是比较精确的。)
如果采用查询,就像原子官方提供的程序delay_ms()一样,在没有定时到时一直查询,直至定时到才能执行后面的程序。
采用中断似乎要耗费宝贵的中断资源,而采用查询又似乎全面等待。我还是认可采用中断。
中断还没有学呢。
如果系统中需要很多不同的定时器如何处理呢?这个比较容易,就像PLC中的一样,如果精度要求不高就固定一个单位SysTick,比如1ms或1us,这个已经比较高精度了。此后如果需要1s定时就在中断里面累积1000个1ms或1000*1000个1us。还是1ms吧,根据实际需求来。
如果需要另一个12s定时呢?不用在中断里面再另外累积12000个1ms了,直接采用刚才的1s定时再累积12次吧。记得在完成1s定时并又累积12s定时变量后初始化1s变量即可。以此类推其他定时器。
---------------------
如果系统不需要如此高频率的定时呢?比如我只需要1h定时,是否可以减少中断次数呢?这要看定时累积的时钟数量是否突破24bit的unsigned RELOAD值,如果没有突破自然直接设置RELOAD一个大的值减少中断次数,如果已经超过了还是需要二次累积的,这要增加中断次数。
SysClock经过AHB预分频后成为AHB总线时钟,外设大多由此引入时钟。如果AHB预分频为1,则AHB时钟等同于SysClock时钟。
在这里,SysTick不是外设但它的时钟源也由引入。可以是AHB的8分频也可以是AHB,其实是叫FCLK。
精英版的SysTick配置为HSE,即外部高速时钟,是72MHz。这个在进入main前就已经配好了。
所以SysTick时钟=AHB=SysClock=72MHz 或 SysTick时钟=AHB/8=SysClock/8=72MHz/8=9MHz.
精英提供的delay_Init()函数配置SysTick是用SysTick_CLKSource_HCLK_Div8,也即SysTikc时钟源配置为AHB的8分频,这样SysTick时钟频率为9MHz.
一个周期为:1/9MHz=1.111E-7s。换句话说,可能的误差是1.111...E-7s,大概0.1us.
如果是72MHz则更小。
显然不可能定时几个时钟周期,这也太小了,如果采用中断就不要做其他事情了。当然,STM32提供这样的功能。
来看看如果需要定时1ms需要经过多少时钟周期?十字相乘法。
1000ms--------------9E6 Hz (9MHz)
1 ms--------------9E6/1000 =9000次。
如果是AHB则72E6/1000 = 72000次。
---------------------------------------------------------
如果不考虑装载时间,在大时间尺度上会造成误差,所以还是-1次吧。
一周热门 更多>