1、 习. .6 3.2 30天上手stm32计 划. .7 1 第1步:熟悉调试软 件. .8 1 第2步:gpio编 程. .8 2 开始全新的stm32深入研 究.9福州芯达工作室简 介. .9 第一章笔者的入门总结 每当我们在入门之前(arm是这样,dsp也一样),总会会有很多疑问,会有很多顾虑。我们渴望知道学习stm32前景如何?需要啥基础?难不难?适不适合我?但是什么时候能心潮澎湃地、相当着急地开始学stm32?日子在一天一天过去!你开始行动了吗?没有行动的思索,永远都不可能入门!把这些时间用来看书吧,效果能好一万倍。 大家一般都是从51单片机过来的,回想一下,我们之前学单片机时如何入
2、门呢?实际上都是先看书(理论),再玩板子(实践)。严格地说,应该是 模仿实验。熟悉之后才会自己写程序代码实现某个功能。因此,如果你正在咨询stm32;如果你正对stm32心潮澎湃;如果你想入门stm32;那么,从现在开始,不要犹豫了,不要想再详细地了解stm32的前景了。做一个可能影 响你一生的决定吧!不用咨询,不用兴奋,开始看书籍(文档)吧 人都是这么走过来的。 这里所谓的“资料”包括stm32书籍、文档。因为stm32有个特点,datasheet很多都是中文的,有些同学就没有去买书籍,直接看stm32的用户手册,也是可以的。但是不管看书籍还是文档,我们是需要计划的。不是今天看3页,明天看5
3、页。一本书看了两个月,还在磨蹭。请记住,你学的不是寂寞,是stm32!看书或文档不是用来消遣时间的。背水一战吧,给自己规定一个底线:两周内把一定粗略地过一遍!不要求都看懂,事实上,不可能都看懂。但我们必须理解基本知识,对难度高的知识有一个印象,至少以后碰到问题的时候,我们会似曾相识,感觉在哪里见到过,于是翻资料上网找答案带着问题的时候,效率才是超高的。 两周过去了,stm32的知识你过一遍了吗?没看完?那么,你应该考虑这些天中,你是否尽力了?是否真的想学stm32?或者还是看到stm32人气很高,也想跟下时髦?是不是碰到问题没法解决就想放弃了?现在是你做第二个决定的时候了,请决定你是否继续攻读
4、stm32。如果是一时冲动想跟时髦,请马上放弃你已经浪费两周时间了,你还想再浪费14天吗?如果想吃得苦中苦,方为人上人,ok,请继续往下看:) 每个 稍微了解一些理论知识后,现在摆在你面前,有两条路: 第一,自己画pcb制板、焊接、调试。 第二,购买一套性价比高的开发板。 笔者之前做过几次pcb设计,而且当时在实验室可以报销所有费用,就自己做了一个pcb板。建议有报销条件的同学自己设计一块板子学习。毕竟2层pcb的设计不是很难。 无法报销的同学,可以选购一款开发板学习。因为自己出钱制板,至少需要150元,加上芯片元件费用、液晶屏费用,可能制作最小系统也要约250元。所以购买开发板还是比较合算的
5、。毕竟现在市场上的stm32开发板已经白菜价了。这里不方便进行各个品牌stm32开发板的比较。 总之一句话,选购的开发板一定要性价比最高的,最实惠的,而不是最贵的。实际上,大多数同学选购的开发板是用来学习的,不是用来项目开发的。因此,能让你上手stm32,目的已经达到了。 这时的你,不能再停留在理论上了。你现在的心情,应当是:看到开发板,马上就有一种说不出的兴奋!但是,心急吃不了热豆腐!请耐心把厂家配套的开发板使用手册浏览一遍,熟悉你买的开发板。按照使用手册,把开发板上的相关测试、操作步骤,都动手做一遍,你会发现,原来开发stm32是如此简单!那么就让我们开始stm32的开发之路吧! 如何进行
6、真正入门stm32,请看第二章stm32入门方法谈。 篇二:stm32固件库学习方法 stm32学习教程 教程一 1、一共24个库,不可能都学,都学也没用。主要学习来源是各种例程代码,固件库函数用户手册和参考手册。 具体学习方法是通读不同来源的程序,在程序中找到相关的函数库的应用,然后再阅读相关文档,有条件的实验。对于内容的选择方面,根据入门内容和未来应用,将所涉及的范围精简到最低,但是对选择的部分的学习则力求明确。,以下是按照自己的需求对程序库函数排列的学习顺序: a、 绝大部分程序都要涉及到的库flash、lib、nvic、rcc,学习基础的跟简单应用相关比 用的部分,其它部分后期再返回头
7、学。 b、各种通用但不必用的库exit、mda、systic,通读理解其作用。 c、demo板拥有的外设库gpio、usart,编写代码实验。 d、未来需要用到的外设库tim、tim1、adc、i2c,spi,先理解待有条件后实验。 e、开发可靠性相关库bkp、iwdg、wwdg、pwr f、其它,根据兴趣来学。 2、阅读flash 芯片内部存储器flash操作函数:对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。 基础应用1 flash时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0-24mhz时,取latency=
8、0;24-48mhz时,取latency=1;4872mhz时,取latency=2所有程序中必须的.用法:flash_setlatency(falsh_latency_2); 位置:rcc初始化子函数里面,时钟起振之后。 基础引用2 开启flash预读缓冲功能,加速flash的读取。所有程序中必须的。 用法:falsh_prefetchbuffercmd(falsh_prefetchbuffer_enable); 3、阅读lib 调试所有外设初始化的函数。 只需要知道外设在调试的时候,ewram需要从这个函数里面获得调试所需信息的地址或指针之类的信息。 只有一个函数debug。 #ifdef
9、 debug debug(); #endif main函数开头,申明变量之后。 4、阅读nvic,系统中断管理 管理系统内部的中断,负责打开和关闭中断。 基础应用1,中断的初始化函数 包括设置中断向量表位置,开启所需的中断两部分。如果定义了vect_tab_ram,则在ram中调试,没定义,在flash中调试。 void nvic_configuration(void) nvic_inittypedef nvic_initstructure; /中断管理恢复默认参数 #ifdef vect_tab_ram nvic_setvectortable(nvic_vectab_ram,0x0); #e
10、lse nvic_setvectortable(nvic_vectab_flash,0x0); #endif /下面为中断的开启过程,不是所有程序必须的 /nvic_prioritygroupconfig(nvic_prioritygroup_2); /设置nvic优先级分组方式 /一共有16个优先级,分为抢占式和响应式。两种优先级所占有的数量由此代码确定。/nvic_prioritygroup_x可以是0、1、2、3、4,分别代表抢占优先级有1、2、4、8、16个/和响应优先级有16、8、4、2、1个。规定两种优先级的数量后,所有的中断级别必须在/其中选择,抢占级别高的会打断其它中断优先执行
11、,而响应级别高的会在其它中断执行完/优先执行。 /nvic_initstructure.nvic_irqchannel=中断通道名; /nvic_initstructure.nvic_irqchannelpreemptionpriorit=0; /抢占优先级 /nvic_initstructure.nvic_irqchannelsubpriorit=0; /响应优先级 /nvic_initstructure.nvic_irqchannelcmd=enable; /启动此通道的中断 /nvic_init(&nvic_initstructure); /中断初始化 5、阅读rcc:时钟管理
12、管理外部、内部和外设的时钟,设置、打开和关闭这些时钟。 基础应用1: 时钟的初始化函数过程: void rcc_configuration(void) errorstatus hsestartupstatus; /等待时钟的稳定 rcc_deinit(); /将时钟重置为缺省值 rcc_hseconfig(rcc_hse_on); /设置外部晶振 hsestartupstatus=rcc_waitforhsestartup(); /等待外部晶振就绪 if(hsestartupstatus=success) falsh_prefetchbuffercmd(falsh_prefetchbuffer
13、_enable); /使能预取缓存 flash_setlatency(flash_latency_2); /falsh操作的延时 rcc_hclkconfig(rcc_sysclk_div1); /ahb使用系统时钟 rcc_pclk2config(rcc_hclk_div2); /apb2为hclk的一半 rcc_pclk1config(rcc_hclk_div2); /apb1为hclk的一半 rcc_pllconfig(rcc_pllsaource_hse_div1,rcc_pllmul_9);/pllclk=8mhz*9=72mhz rcc_pllcmd(enable); /启动pll
14、 while(rcc_getflagstatus(rcc_flag_pllrdy)=reset) /等待pll启动 rcc_sysclkconfig(rcc_sysclksource_pllclk); /将pll设置为系统时钟源 while(rcc_sysclksource()!=0x80) /将pll返回,并作为系统时钟源 /rcc_ahbperiphclockcmd(ahb2设备1|ahb2设备2,enable); /启动ahp设备 /rcc_apb2periphclockcmd(abp2设备1|abp2设备2,enable); /启动abp2设备 /rcc_apb1periphclock
15、cmd(abp1设备1|abp1设备2,enable); /启动abp1设备 6阅读exti:外部设备中断函数 外部设备通过引脚给出的硬件中断,也可以产生软件中断,19个上升、下降或都触发。exti0exti15连接到管脚,exti线16连接到pvd(vdd监视),exti线17连接到rtc(闹钟),exti线18连接到usb(唤醒)。设定外部中断初始化函数。按需求,不是必须代码。 void exti_configuration(void) exti_inittypedef exti_initstructure; /外部设备中断恢复默认参数 exti_initstructure.exti_li
16、ne = exti_line12 | exti_line14; /设定所需产生中断的通道,共19个 exti_initstructure.exti_mode = exti_mode_interrupt; /设置中断模式 exti_initstructure.exti_trigger = exti_trigger_falling; /下降沿触发 exti_initstructure.exti_linecmd = enable; /启动中断的接收 exti_init(&exti_initstructure); /外部设备中断启动 图中在第4步根据中断屏蔽寄存器中的设定判别发生了哪一个中断,然后将该
17、信号发送给nvic(增强型可屏蔽中断控制器),nvic根据信号将相应的中断函数的地址赋予pc要调用的寄存器,这样cortex-m3将执行对应的中断函数。 用户在使用中无需通过头文件定义,在软件库3.1.2中的startup_stm32f10x_?.s文件中对中断函数的地址进行了宏定义,用户只需根据startup_stm32f10x_?.s中的ppp_irqhandler,在stm32f10x_it.c和stm32f10x_it.h中添加相应的void ppp_irqhandler(void) 函数,并在.c中添加中断处理代码即可。 对于exti9_5_irqhandler和exti15_10_
18、irqhandler中断用户需要在处理函数中通过itstatus exti_getitstatus(uint32_t exti_line)来判别发生了哪一个中断,再进行相应的处理。 7、阅读dma 通过总线而越过cpu读取外设数据 通过dma应用可以加速单片机外设、存储器之间的数据传输,并在传输期间不影响cpu进行其他事情。这对于入门卡法基本功来说,没有太大必要,这个内容先行跳过。 8、阅读systic:系统定时器 可以输出和利用系统时钟的计数、状态 基础应用一,精确计时的延时子函数。推荐使用的代码。 static vu32 timingdelay; /全局变量申明 void systick_
19、configuration(void) systick_countercmd(systick_counter_disable); /停止系统定时器 systick_itconfig(disable); /停止systick中断 systick_clksourceconfig(systick_clksource_hclk_div8); /hclk作为时钟源,频率值/8 systick_setreload(9000); /重置时间1毫秒,以72mhz为基础计算 systick_itconfig(enable); /开启systic中断 void delay(u32 ntime) /延迟一毫秒的函数
20、 systick_countercmd(systick_counter_enable); /systic开始计时 timingdelay=ntime; /计时长度赋值给递减变量 while(timingdelay!=0); /检测是否计时完成 systick_countercmd(systick_counter_disable); /关闭计数器 systick_countercmd(systick_counter_clear); /清楚计数值 void timingdelay_decrement(void) /递减变量函数,函数名由“stm32f10x_it.c”中的中断 /相应函数定义好了
21、if(timingdelay!=0x00) timingdelay-; 新手可用简化的延时函数代替: void delay(vu32 ncount) 篇三:stm32学习笔记 stm32学前班教程之四:打好基础建立模板 1、 新建目录project_iar4,按照自己的顺序重新组织dll(驱动);inc、src函数库;settings,其他所有文件全部放这个新建的目录下。 2、 双击打开project.eww,继续更改内部设置。 3、 需更改的内容列表: 位置和项目 目标 说明 projectedir confignations 新建基于stm3210b的配置 编译目标和过程文件存放 proj
22、ectoptiongeneral optiontarget st stm32f10x 选择芯片类型 $proj_dir$inc 头文件相对位置,需要包括“map/lib/type”的位置 调试可选none none,low,medium,high是不同的代码优化等级 projectoption linkeroutput 去掉overrride default 输出格式使用默认 projectoption linkerextra output 打开general extra output去掉overrride default 厂家要求 projectoption linkerconfig 打开o
23、verrride default $proj_dir$lnkarm_flash.xcl 使用flash调试程序,如果需要使用ram调试则改为lnkarm_ram.xcl projectoption debuggersetupdriver third-party driver 使用第三方驱动连接单片机 projectoption debugger download use flash loader 下载到flash所需的设置 projectoption debugger third-party driver third-party driveriar debugger driver $proj_
24、dir$ddlstm32driver.dll 驱动文件路径 注1:所有跟路径相关的设置需要根据实际情况编写,相对路径的编写“$proj_dir$”代表eww文件所在文件夹,“.”代表向上一层。 注2:其他设置使用库函数里面的工程文件的默认选项即可,初学不用了解太多。 4、 需要重新删除并重新添加project下“fwlib”和“user”的所有文件,为了删减外设模块方便需要在“user”额外添加“stm32f10x_conf.h”(不添加也可以,需要展开main.c找到它)。然后执行projectrebuid all,通过则设置完毕。 5、 完成以上步骤,第一个自己习惯的程序库就建立完毕了,以
25、后可以从“stm32f10x_conf.h”中删减各种库文件,从“stm32f10x_it.c”编辑中断,从“main.c”编写得到自己的程序。最后需要将这个库打包封存,每次解压缩并修改主目录名称即可。 6、 我的程序库特点: a) 默认兼容st-link-ii,iar ewarm 4.42a,flash调试,其他有可能需要更改设置 b) 为操作方便减少了目录的层次 c) 为学习方便使用网友汉化版2.0.2固件,主要是库函数中c代码的注释。 后面随着学习深入将在我的模板里面加入如下内容: d) 加入必用的flash(读取优化),lib(debug),nvic(中断位置判断、开中断模板),rcc(时钟管理模板,开启外设时钟模板),gpio(管脚定义模板)的初始化代码,所有模板代码用到的时候只要去掉前面的注释“/”,根据需求填入相应值就可以了。 e) 因为自己记性不好,所以m
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1