新手不用库函数也能玩STM32.doc_第1页
新手不用库函数也能玩STM32.doc_第2页
新手不用库函数也能玩STM32.doc_第3页
新手不用库函数也能玩STM32.doc_第4页
全文预览已结束

下载本文档

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

文档简介

新手不用库函数也能玩STM32话说意法的STM32的库函数功能很强大,易用,等等。对新手来说确实很值得一用,省去了很多麻烦,但是库函数的一个缺点导致我们最终是不得不放弃的,那就是库函数的效率问题,稍微研究一下就知道他的效率还是蛮低的,这是为什么呢,原来STM32为了函数的通用性,大家都知道,编程序的时候存在时间和空间的平衡,有两种说法: 第一,以时间换空间。这种情况通常是FLASH不够用(但又不想用大的FLASH)的情况下需要做的,典型的做法是多用函数的调用。 第二,以空间换时间。这时候通常是对速度要求比较高,实时性要求较高的场合。尽量减少函数的调用。 所以STM32的库函数是属于第一种情况,当然不是为了省FLASH,想想STM32的FLASH那么大,不用省的。当然学习的时候,还是得用库函数的,实际应用的时候可能要自己写各个驱动函数的,这篇文章就是一篇LED的驱动例程,所有RCC初始化部分和PORT初始化部分都没有使用库函数,效率提高上还是很可观的。下面两个图片是仿真下的system tick timer观察一个使用库函数,另个为自己编写的RCC初始化函数的运行情况,可以看出使用自己编写的程序,运行速度稍快,有人肯定会说,RCC初始化函数一般只会开机运行一次,后面就不会再调用了呀,何必在乎呢,确实,对于初始化函数可以使用库函数的,我只是以此例来明志而已,说明库函数确实是效率(运行效率不是开发效率)有点低。另一对图片是编译容量的对比,可以发现不调用库函数的程序,代码量减少很多,这是因为库函数中有很多不被用到的函数,但仍然被编译进了工程。 以上两幅图片是运行效率的比较,第一张图是使用了库函数,明显看出使用库函数的效率要低点(点击图片可以查看大图片)以上两幅图是编译时资源使用情况,因为使用库函数需要包含其他两个库文件,导致FLASH占用量比较大。(点击图片可以查看大图片)下面贴出我的RCC初始化代码,新建工程,不会的话请参照我的前一篇文章,讲的就是在MDK下建立自己的STM32工程。/RCC config function,use HSE clock/PLL is 16xvoid RccInit(void) u32 cnt = 0; /超时计数器/enable HSERCC-CR &= (RCC_CR_HSEON);RCC-CR &= (RCC_CR_HSEBYP);RCC-CR|= (RCC_CR_HSEON);/wait for HSE to setupDo cnt +; while (!(RCC-CR & (RCC_CR_HSERDY)&(cnt != (u32)0x500);/HSE is readyif (RCC-CR & RCC_CR_HSERDY) /flash prefech buffer enable FLASH-ACR &= (FLASH_ACR_PRFTBE); FLASH-ACR |= FLASH_ACR_PRFTBE; FLASH-ACR &= (FLASH_ACR_LATENCY); FLASH-ACR |= FLASH_ACR_LATENCY_2; /HCK is pll clock,AHB clock RCC-CFGR &= (RCC_CFGR_HPRE); RCC-CFGR |= RCC_CFGR_HPRE_DIV1; /config APB1 clock,低速外设时钟 RCC-CFGR &= (RCC_CFGR_PPRE1); RCC-CFGR |= RCC_CFGR_PPRE1_DIV2; /config APB2 clock,高速外设时钟 RCC-CFGR &= (RCC_CFGR_PPRE2); RCC-CFGR |= RCC_CFGR_PPRE2_DIV1; /config PLL x16,HSE is source of PLL, not divide RCC-CFGR&= (RCC_CFGR_PLLSRC|RCC_CFGR_PLLXTPRE|RCC_CFGR_PLLMULL); RCC-CFGR |= (RCC_CFGR_PLLSRC|RCC_CFGR_PLLMULL16); /enable PLL RCC-CR |= RCC_CR_PLLON; /wait for PLL ready while (!(RCC-CR & RCC_CR_PLLRDY); /select PLL as system clock RCC-CFGR &= RCC_CFGR_SW; RCC-CFGR |= RCC_CFGR_SW_PLL; /wait for PLL select as system clock while (RCC-CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); 下面是LED端口的初始化程序,火牛的开发板,开发板自带4个LED,位于PORTD的8,9,10,11端口上,将端口设置成推挽输出,IO的频率设置为2Mhz。void PortInit(void)/enable PORTD clockRCC-APB2ENR |= RCC_APB2ENR_IOPDEN;/gpio 8,9,10,11 as push pull outputGPIOD-CRH = (u32)0x0;GPIOD-CRH = (u32)0x2222);接着就是main函数了,本例程就是实现LED端口的一亮一灭,间隔500ms,使用system tick定时器来延时。int main(void)RccInit();/RCC_Configuration();delay_init(128);/led port initializePortInit();while (1)GPIOD-ODR|=GPIO_ODR_ODR8|GPIO_ODR_ODR9|GPIO_ODR_ODR10|GPIO_ODR_ODR11; delay_ms(500);GPIOD-ODR&=(GPIO_ODR_ODR8|GP

温馨提示

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

评论

0/150

提交评论