stm32代码公共模板神舟王103zet开发板_第1页
stm32代码公共模板神舟王103zet开发板_第2页
stm32代码公共模板神舟王103zet开发板_第3页
stm32代码公共模板神舟王103zet开发板_第4页
stm32代码公共模板神舟王103zet开发板_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章STM32代码公共模 启动文件如何选择说 如何从零开始新建STM32工程模 如何去官 的STM32资料的方 获取ST库源 开始新建工 使用JLINK仿真器硬件调试配 本节参考例 COMMON文件夹介 用什么方式实现精准延 关于Systick定时器的特 Systick定时器如何设计精准的延 Delay_Init()函数(延时初始化函数 Delay_us()函数(延时多少微秒 Delay_ms()函数(延时多少毫秒 GPIO口的定义(自己设计操作某个GPIO管脚 NVIC_Configuration函 本节参考例 Hard_Driver文件夹介 第七章STM32代码公共模启动文件如何选择说明ST给我们提供了3个启动文件,分别适用于不同容量的STM32。他们是文件名适合容备小容量中容量md.s适用于中等容量产大容量hd适用于大容量产择startup_stm32f10x_hd.s即可。如何从零开始新建STM32工程模板如何去官 的STM32资料的方法1 打开网页,在搜索网页栏中搜索“ST”,如下2、点击st意法半导体进入ST官3、点击微控制器和4、点击微控制5、选择STM32-32位的微控制器中的F1系 STM32F103ZET6、STM32F107VCT6,STM32F207ZGT、等,这里我们用STM32F103RBT6做示范,如下图家看下图,这个库文件我找到了,提示说是3.5.0版本的库文件:获取ST库源码可以看到该库的版本为3.5.0版本,解压缩之后,真正的标准库函数就在Libraries文件夹开始新建工程①点击桌面文件,我们通过Project->CloseProject选项把它关掉。、mon、OBJ、User四个文件夹以及“删除MDK产生的过程文件.bat”文件、其中,“readme.txt”文件是关于本工程的一些说明,可以不添加。“删除MDK产生的过程文件.bat”文件,顾名思义作用是删除MDK产生的过程文件。这个文件也可以不添加,添加的话,在我们提供的光盘资料的源码工程下可以找到。③在MDK软件Project->NewuVision4Project…新建我们的工程文件,新建的工程文件保存在桌面的\STM32神舟开发板工程模板\UserProject,名字可以随便取,点击保存。④下面我们接下来的窗口是让我们选择公司跟的型号,我们STM32神舟王的板子用的是ST公司的STM32F103ZET6,有64KBSRAM,512KBFlash,属于高集成度⑤接下来的窗口问我们是否需要拷贝STM32的启动代码到工程文件中,这份启动代码在M3系列中都是适用的,一般情况下我们都点击是,但我们这里用的是ST的库,库文件里面也自带了这一份启动代码,所以为了保持库的完整性,我们就不需要开发环境为我们自带的启动代码了,稍后我们自己手动添加,这里我们点击否。⑦往模板里添加库文件。我们从ST官网获取ST的库后,解压缩后 \STM32F10x_StdPeriph_Lib_V3.5.0\Libraries下的CMSIS跟这两个文件夹拷贝到“Template工程模板\Libraries”文件夹中把标准 下的\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template文件夹下的main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h拷贝到“Template工程模板\Project”下。注:stm32f10x_it.h、和stm32f10x_it.c这两个文件里面是中断函数,里面为空,并没有写任何的中断服务程序stm32f10x_conf.h是用户需要配置的头文件,当我们需要用到将1下的子文件SourceGroup1删除。将1的名称,双击改为“Template”。往工程里添加4个组,分别命名为USER、CMSIS、S User用来存放用户自定义的应用程序,StdPeriph_Driver用来存放库文件,CMSIS用来存放M3系列内核文件和启动文件,COMMON存放公共文件。Usermain.cstm32f10x_it.c2在StdPeriph_Driver组里面添 “\STM32神舟开发板工程模\Libraries\STM32F10x_StdPeriph_Driver\src”里面的全部驱动文件当然,src里面的驱动文件也可以需要哪个就添加哪个,这里将它们全部添加进去是为了后续开发的方便,况且我们可以通过配置stm32f10x_conf.h这个头文件来选择性添加,只stm32f10x_conf.h文件中配置的文件才会被编译。在组CMSIS中添 “\STM32神舟开发板工程模\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”路径下添加再添加路径“\STM32神舟开发板工程模板\Libraries\CMSIS\CM3\CoreSupport”下system_stm32f10x.c是ARM公司提供的符合CMSIS标准的库文件);注意,这些组里面添加的都是汇编文件跟C文件,头文件是不需要添加的。在组MDK_start_code中添 “\STM32神舟开发板工程模文件名适合容备小容量中容量md.s适用于中等容量产大容量hd适用于大容量产⑨最后一步,配置MDK的配置选项。点击中的魔术棒按钮,即Option…选项。在弹出的框的选项卡中,把UseMicroLIB勾上。这是为后面串口可以使用Printf函数打印数据。配置Output选项卡步骤1:点击SelectFolderforObjects... 步骤2:把编译好的输出文件名定为”步骤3:CreateHEXFile这个选项框也选上,表示编译输出HEX2OneELFSectionperFunction选项勾上。步骤3:在IncludePaths栏中,添加库文件的搜索路径步骤1中,添加USE_STDPERIVPH_DRIVER是为了编译器的默认搜索路径,转而使用我们添加到工程中的ST加STM32F10X_CL是因为我们用的是中容量的,添加了STM32F10X_CL这个宏之后,库文件里面为互联型定义的寄存器我们就可以用了。非互联型的,是小或大容量的时候宏可以换成STM32F10X_LD或者STM32F10X_HD。2中OneELFSectionperFunction选项勾上的目的是,使用软件编译代码时,步骤3中,指定库文件的搜索路径,添加方式如下图:添加的内容如 ANSICC的库文件,如stdin.h、stdio.h将原来的 n.c函数中的代码删除,输入如下代码,并保存,然后编译代内容:STM32作者版本日期intmain(void){}编译结果如下图stm32的第一步。当然有一些工程,它包含的文件,搜索库的路径也会。大家对新建工程了解到一定程度之后,也就了解怎么新建更加复杂点的工程。使用JLINK仿真器硬件调试配置环境中做如下修改。实际上,我们开发程序的时候80%都是在硬件上调试的。具体配置如下图所示:点击,在Debug选项里板应该上电,并将JLINKV8与模板连接好,JLINKV8也需要上电)设置完点确编译全部代码,然后点LOAD程序到目标板到了这里就算是大功告成了。如果在新建工程中遇到什么问题,先不要急,可先参本节参考例程请参考源代码-----“第7章.实战篇\0.工程模板\1.Template空工程模COMMON文件夹介绍COMMON文件夹包含了common.c和common.h两个文件,这两个文件里面定义了一行介绍。用什么方式实现精准延时我们在这里是使用Systick定时器。要延时就必须有个类似手表或者时钟的东西来进行计时工作,CM3内核包含了一个Systick定时器,它是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中使能位清除,就永不停息的自动装载自动计数下去。利用STM32的来实现延时最大的好处是它既不占用中断,也不占用系统定时器。所以我们就使用Systck定时器来实现精准的延时。关于Systick定时器的特点特点1:可以为操作系统提供心脏的跳动。SysTick定时器被在NVIC中,用于产生SYSTICK异常(异常号:15;在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时的时钟:ucos运行需要一个系统时钟节拍,每次节拍相当于操作系统一次心跳,而这个节拍是固定的(在ucos中由OS_TICKS_PER_SEC设置1ms(设置:特点2:便于不同处理器(同为CM3内核)之间的程序移植Cortex-M3处理器包含的定时器,那么所有的CM3都带有这个定时器,软件在不CM3器件间的移植工作就可以得以化简。不过,该定制器的具体时钟源来源则由设计者决定,因此不同产品之间的时钟频率可能大不相同,所以需要查看器件手册来选择什么作为时钟源。例如,在某中,该定时器的时钟源可以是时钟(FCLK,CM3上的自由运行时钟,或者是外部时钟(CM3处理器STCLK信号。一席之地。它使操作系统和其他系统软件在CM3器件间的移植变得简单多了因为在所有CM3中处理都相同。Systick定时器如何设计精准的延时systick72MHZ1秒钟CPU72000000systck720000007200000态寄存器的HCLK时钟(72M)HCLK8分频9M,缺省是这个)SysTick的时钟源。SysTick的重装寄存器决定了定时器频率。若systick的时钟源是72M,查找应用手册可以知道这是把Systick的计时频率设定为CPU主频(SYSCLK)的1/8。假定我们板子默认的晶振频率是8Mhz,默认CPU工作频率(SYSCLK)9倍频,即72M,那Systick的频率72/8=9Mhz,9Mhz意味着systick计数器自减900万次1秒钟;那么就是systick每减1次,就等于是1/9us。那么要计时30us30*9systick自减,因为(30*9次*1/9us30us。Delay_Init()函数(延时初始化函数延时初始化函数,这个函数总共做了如下几步第一步:这里用到了条件编译#ifdefOS_CRITICAL_UCOS这个宏,如果使用等操作系统,就一定会定义这个 这个宏,如果没有就可以不管:SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8)SysTick的时钟源自HCLK8分频,至于HCLK是多少,后面再讲。:第三步:SystemCoreClockSysTick8分频,所以1秒钟运行多少SysTick呢?可以计算一下次SystemCoreClock/81毫秒种运行多少次SysTick呢?SystemCoreClock/8000000。=根据以上4条原理分析,得出下面初始化函数定义void {#ifdef //OS_CRITICAL_UCOS定义了,说明ucosII了 u32 此处为选择外部时钟HCLK/8 fac_us=SystemCoreClock/8000000; //SystemCoreClockfac_us1/8左右,因为systick是72M的8分之一即9M 那么16777216/9M=1.864s*/ #ifdef //OS_CRITICAL_UCOS定义了,说明ucosII了 reload= reload* //OS_TICKS_PER_SEC设定溢出时 fac_ms= //代表ucos可以延时的最少单 SysTick-SysTick- //1/OS_TICKS_PER_SECSysTick-SysTick- // }SysTcik是MDK定义的一个结构体(在stm32f10x_map.h里面里面包含CTRLLOAD、SysTick一个递减的计数器,当计数器递减到“0”时,重装寄存器中的值就会被重装。SysTick_LOAD重装值寄存器是一个24位宽的寄存器。选择外部时钟,这个函数是misc.c中来的,这里需要注意的是:SysTickHCLK89M72M,那时钟频率下延时1us需要多少个SysTick时钟周期。同理:us延时的基数,也就是延时1us,SysTick->LOAD所应设置的值。如果使得fac_ms为ms延时的基数,也就是延时1ms,那么SysTick->LOAD就要设置相应的值。值得注意的fac_us9位整形数据,fac_ms16位整形数据。正因为如此,系统时钟如果不是8的倍数,则会导致延时函数确,这也是外部时钟选择8M的原因。这一点关于ucos的时钟部分,我们后续再作详细的介绍,这里为了使得知识结构更加清晰,Delay_us()函数(延时多少微秒该函数用来延时指定的微秒,其参数xus为要延时的微秒数,函数实现如voiddelay_us(u32xusxus u32 SysTick-SysTick- SysTick-SysTick- //设置开始倒数计时的 temp=SysTick- //等待时间到 SysTick- //关闭计数SysTick->VALSysTick->VAL //清空计数}其实这个函数主要是实现1个微秒里有多少个SysTick的时钟数,然后写xusSysTickVALxus要次数,也就是说,xus这个值就是systick定时器所能计时的最大值范围。处于开启状态,可以防止systick被意外关闭导致的死循环。这里SysTick->CTRL|=SysTick_CTRL_ENABLE_MskSysTick->CTRL寄存器进行一次异或,这是操作寄存器的一种最常用的赋值语句。SysTick_CTRL_ENABLE_Msk是程序中的一个宏定义,在程序中,它的值就是0x01,这行代码的意思就是设置SysTick->CTRL的第一位为下面这个函数为ucos来设计的voiddelay_us(u32 // u32 u32reload=SysTick- //需要的节拍 T_old=SysTick- //刚进入时的计数器 T_now=SysTick- t+=T_old-T_now;//SYSTICK是一个递减的计数器 t+=reload- break;//时间超过/等于要延迟的时间,则退出 }A点开始计时,到BB-A得到这个中间的差额时间;那么此时已经B时间,当到C的时候,用C-B得到这个中间的差额时间。这2个差额时间相加就等于是从A点开始计时,到C点的时间。 t是经历的总时间。通过这样的差额法,可以灵活计算时间。在时间来进行累加,从而达到不修改SysTick实现xus的延时。当然如果是在操作系统中,还要加入上锁和这2个操作,防止中断的打扰影响我Delay_ms()函数(延时多少毫秒延时毫秒,之前在Delay_Init()函数中就已经定义了两个变量,一个是fac_us,一个是fac_ms变量fac_ms=(u16)fac_us*1000;//xmsxms的范围SysTick->LOAD24位寄存器,所以,最大延时 对72M条件下voiddelay_ms(u16 u32 SysTick->LOAD=(u32)xms*fac_ms;//时间加载(SysTick->LOAD为 SysTick->VAL //清空计数 SysTick- // temp=SysTick- while(temp&0x01&&!(temp&(1<<16)));//等待时间到 SysTick- //关闭计数 SysTick->VAL //清空计数 }这个代码与上面的delay_us非ucos版本大致是一样的,但要注SysTick会被舍去,导致延时。最大的ms数还是可以通过如下进行计算:SysTick->LOAD24位寄存器,最大值:2241024*1024*16=16777216,因为systick72M89M16777216/9M=1.864s=1864ms。下面谈一下ucos中延时函数的实现,函数实现如下voiddelay_ms(u16 // if(xms>=fac_ms)//延时的时间大于ucos的最少时间周 OSTimeDly(xms/fac_ms);//ucos延 //普通方式延时,此时ucos无法启动调度}Ucos运行的时候,1ucos1fac_ms,如果我们需要延时的时间大不足1ucos时钟节拍的时候,可以直接调用delay_us函数进行补充解决。深入的内容会在对应的ucos章节进行介绍。GPIO口的定义(自己设计操作某个GPIO管脚STM32IO口的具体的某个管脚的操作,也叫位操作,趣的朋友可以自己去比较一下这种设计与原厂ST软件库的设计理念有何不同之处。 #defineGPIOA_ODR_Addr #define (GPIOB_BASE+12)#defineGPIOC_ODR_Addr #defineGPIOD_ODR_Addr (

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论