stm32心得体会

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

stm32心得体会
谈谈怎么学习stm32的感受
1,首先对32要有一个大概的认识,了解它的引脚,最小系统,封装。

2,下载到官方库,对官方库的架构有一个大致的认识。

3,仔细阅读官方库里的外设函数的功能和使用。

(对时钟树一定要理解,其实也不复杂)
4,然后我感觉,到这个地步后,就不需要人引导了,自己已经能够明白32是什么了。

补充
1,网上视频多的是,多下载一些视频看看,知名的有野火正点原子,视频都可以免费下载,还有例程
2,官方手册要多读,这是32一切资料的源头。

希望能帮到你
我刚学STM32不久,总觉得STM32的固件库很繁琐,想自己定义库,
不知道可行吗?
刚学STM32不久的话,无论是学库函数还是直接操作寄存器都很难的,建议你还是先脚踏实地地去阅读STM32参考手册和Cortex-M3权威指南,然后慢慢地从点亮LED开始学起,可以分别用库函数和直接操作寄存器的写法来学习,看看有什么不同,然后再自己做自己的库函数。

个人建议,希望对你有帮助。

关于STM32学习的问题
我也学习过mini stm32,大概说一下我对你的问题的看法
如果你把《不完全手册》和相应的实验认真完成,做一些简单的小项目是不成问题的
学习过程中的巧门算不上,就说是我的心得吧,那就是勤于思考,善于实践,如果把这两者和好的结合,学好它不成问题,祝你学习旅途愉快
初学STM32的问题
我也学习过mini stm32,大概说一下我对你的问题的看法
如果你把《不完全手册》和相应的实验认真完成,做一些简单的小项目是不成问题的
学习过程中的巧门算不上,就说是我的心得吧,那就是勤于思考,善于实践,如果把这两者和好的结合,学好它不成问题,祝你学习旅途愉快
如何学习STM32。

我只买了最小系统。

买个仿真器。

自己试着做些 GPIO TIMER 等的例子,先从这些简单的例子入手。

然后逐步深入
一个基于STM32的普通课程设计
这个课题可不是一个简单的小课题,在这里讲讲就可以讲清楚的,具体要看你的这个PLC实现那些功能了哦。

放弃51单片机,直接学STM32的开发会有什么严重的问题么给你一篇文章看一下。

最近论坛上发了一个连载帖子—吴鉴鹰单片机实战项目精讲,因此受到不少网友的关注,在这里吴鉴谢谢各位网友的支持、关心和信任。

在帖子中留了几个群号,有两千多读者加了群,通过QQ向我询问了很多问题,如果在工作不是太忙的时候我看到了就会回答,但是有时候做项目太忙就没时间解答。

为此,在这里应群内成员以及一些网友的要求,专门写一篇文章来针对这些问题做一个总结。

希望能为大家的疑惑有一点点帮助就足以。

不足之处,也希望大家客观指出,君子和而不同。

1、学习单片机有用吗
有很多初学者有这样的困惑,单片机初学者感觉入门很难,学着
学着,就会产生这样的疑问—自己辛辛苦苦学习单片机,将来有用吗单片机只是一个工具,重要的还是思想,有了自己的想法,电子行业地域辽阔,随便你闯。

单片机这个切入点入手还是不错的,可以让你尽快进入电子殿堂的大门,如果你还在上学,不要眼睛里面只盯着暂时的薪水,哪怕是毕业两三年的也一样。

重要的是掌握程度和对技术的理解程度,有句话叫“水到渠成”,到时候再去研究工资的事情也不晚。

2、学习嵌入式编程有必要从51单片机开始吗
我原本来在读大学的时候,有很多同学听说学习ARM很牛逼,于是就跑到图书馆借了一两本关于ARM的书,学一两天后发现跟自己想的不太像,于是学着学着就慢慢放弃了。

所以我总结一下,与其迈很大的步子,不如放慢脚步一步步走。

从最基本的做起,一步步走,等单片机学会之后再进行像ARM,DSP之类高端处理器的运用,也就能得心应手了,如果想一口吃成一个胖子,只怕最后没胖起来,倒把自己给噎死了
3、会用高端处理器就牛了吗
不少网友问我:是不是学会了ARM、嵌入式操作系统就会很牛
是不是单片机就是运用在低档产品上,ARM做出来的产品就高端了。

首先,从本质上说,是同一类东西,都是嵌入式应用方面的主力。

十八般兵器,没有优劣之分,只是在乎持兵器的人修为高低,当年 -凭借小米加步枪不也取得了抗战胜利。

微处理器,单片机、DSP、FPGA、ARM,每一种都有自己的侧重点,都具备自己的优势和劣势。

单片机:技术比较成熟,运用在工控领域比较多,但进行嵌入式应用显得太庞大,因而派生出ARM单片机进行高端应用,可以进行操作系统的移植,但是现在一些高端单片机也可以移植操作系统,单片机跟ARM并没有什么本质的区别。

DSP:是数据处理的缩写。

也可以做控制运用,它的优势是运算,主要用在运算量大的领域,如数字信号处理,图像处理,视屏处理,导弹雷达上也等等。

如果要用的好,需要学会很多高深的算法,需要有较强的数学功底。

FPGA:可编程逻辑阵列的缩写。

实际上就是做一个芯片,用软件实现它的内部连接,达到用软件的方法实现硬件的目标。

是用硬件实现的一种方法。

是早期单片机(功能简单的逻辑应用)的现代实现方法。

总结:一个嵌入式软件工程师,其实核心竞争力不是你会运用什么芯片,当你会了一两种以后,再学其他的,就会觉得很容易了。

一个真正的有竞争力的工程师,应该是具备良好的编程习惯,编程思路,还应该具备扎实的数学功底。

只有把握核心的东西,才能走的更远。

4、单片机行业技术研发有前途吗
这也是初学者最为关心的一个话题,单片机行业的技术研发将来前途如何
著名的高尔夫球手,老虎伍兹说过一句话:我只需成为高尔夫数一数二的高手,钱自然会追着我来。

单片机技术研发,也就是一个类型的职业岗位,同样叫做“单片机工程师”,能力、经验、学历,参差不齐,因此待遇肯定也不尽相同。

高待遇者,年薪数百万也有,低收入者,养家糊口都难。

只有倒闭的企业,没有倒闭的行业
不是行业没有前景,只能反思自己为何没有足够的优秀。

5、单片机技术研发太苦太累,值得去坚持吗
在论坛里看到很多人在抱怨:现在电子行业的研发做起来太累,待遇又不是很好,感觉没什么出路。

既然我们选择了单片机行业,就坚持做下去,不要轻信别人讲的:单片机研发工程师没有前途,太苦太累。

学好单片机你至少可以找一份技术性的工作,就算目前累一点,至少你可以看到希望,随着自己经验的积累,未来的路会越走越宽至少可以坐在办公室里面,有自由的时间可以支配。

你知道那种专业课没学好,只能去车间做一线工人的感觉吗
坐在车间里像一个机器人一样每天重复同样的工作吗
你喜欢过那种一点自由都没有,在流水线上忙碌着,连上厕所时间都没有的工作吗
我相信没有人喜欢
所有不要被一些工作了几年的工程师的话语所迷惑,说做技术很苦,拿的钱又少,当你真正有一天想去做技术,发现原来因为自己缺少知识的积累,没有公司愿意要你。

简单地分享了自己对单片机领域一些问题的看法,欢迎同行积极分享自己的心得,能让更多初学者少走弯路,摆正心态进行单片机的学习。

STM32中断函数
以上是个人的实践心得,回答完毕
STM32里面EXTI0 – EXTI4这5个外部中断有着自己的单独的中断就表示哪个中断被触发。

oDwezQ
STM8单片机如何使用
我前段时间刚搞过STM8,现在在搞STM32,如果你有51的基础STM8应该是很容易的,STM8跟AVR是很象的,同样要用IO口的是候要先初始化IO口,建议看一下《STM8S技术参考手册V4.pdf》主要了解个寄存器的作用
然后看一下STM8的库函数,了解一下就可以开始编程了
我这里给一个点亮一个灯的程序给你参考:
define LEDS_PORT(GPIOH)
define LED1_PIN(GPIO_PIN_3)
void main(void)
{
GPIO_Init(LEDS_PORT,LED1_PIN,GPIO_MODE_OUT_PP_LOW_ FAST);while(1)
{
GPIO_WriteHigh(LEDS_PORT,Leds);}
}
这里利用了STM8库函数,记得把STM8的库包含进工程
STM32中断实验了该怎么办
具体情况具体对待,你可以看我下面的实验对号入座来分析你的问题:
实验目的:
当按键按下时,让PF10引脚的LED灯亮,
当按键再次按下时,让PF10引脚的LED灯灭;无论按下与否,PF9引脚的LED灯循环闪烁;实验步骤:
实验程序:
[cpp]view plain copy
led.c*\/
include\"stm32f4xx.h\"\/在SYSTEM目录下可以找到
include\"sys.h
void LED_Init(void){
RCC->AHB1ENR=1;使能GPIO端口的F时钟
GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE _PP,GPIO_SPEED_25M,GPIO_PUPD_PU);PFout(9)=1;PFout(10)=1;} [cpp]view plain copy
led.h*\/
ifndef_LED_H
define_LED_H
void LED_Init(void);endif
[cpp]view plain copy
key.c*\/
include\"sys.h
void Key_Init(void){
RCC->AHB1ENR|=1;使能PORTE时钟
void GPIO_Set(GPIO_TypeDef*GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);GPIO设置函数GPIO_Set(GPIOE,PIN3,GPIO_MODE_IN,0,0,GPIO_PUPD_PU);P E3设置上拉输入,这样的话,
当按键没有按下时,默认电平为高;}
[cpp]view plain copy
key.h*\/
ifndef_KEY_H
define_KEY_H
void Key_Init(void);endif
[cpp]view plain copy
exti.c*\/
include\"sys.h
include\"delay.h
include\"stm32f4xx.h
本示例的作用就是,
当按键按下时,蜂鸣器发出声音,
当按键再次按下时,蜂鸣器静音;中断初始化函数:
主要是关于寄存器的相关配置
void EXTI3_Init(void){
方法一:
RCC->APB2ENR|=1;开启SYSCFG时钟
SYSCFG->EXTICR[0]|=0x4;设置IO口与中断线的映射关系;EXTI->IMR|=1;开启对应中断线上的中断
EXTI->FTSR|=1;设置中断触发条件
SCB和NVIC,可参考STM32F3与STM32F4系列Cortex M4内核编程手册.pdf
SCB->AIRCR|=0x5;设置分组
NVIC->IP[9]|=0;设置优先级,具体可分析MY_NVIC_Init()函数;NVIC->ISER[0]|=1;使能中断;方法二:
使用SYSTEM目录下提供的API来实现,
具体可参考正点原子示例
}
void EXTI3_IRQHandler(void){
此按键,在按键按下时,处理不是很到位,
有待进一步改进,主要是在连按那一个环节。

delay_ms(20);消抖
if(PEin(3)=0){
PFout(10)=!PFout(10);}
在中断里边最后记得清中断:
EXTI->PR|=1;}
[cpp]view plain copy
exti.h*\/
ifndef_EXTI_H
define_EXTI_H
void EXTI3_Init(void);endif
[cpp]view plain copy
test.c*\/
include\"sys.h
include\"delay.h
include\"key.h
include\"beep.h
include\"exti.h
include\"led.h
int i=0;int main(void){Stm32_Clock_Init(336,8,2,7);设置时钟,168Mhz
delay_init(168);初始化延时函数
Beep_Init();Key_Init();EXTI3_Init();LED_Init();while(1){
PFout(9)=0;delay_ms(500);PFout(9)=1;delay_ms(500);}
}
实验分析:
我们主要分析一下exti.c中的寄存器设置的这几个步骤:
1.RCC->APB2ENR|=1;这一步的作用就是使能SYSCFG时钟,
在使用外部中断的时候一定要先使能SYSCFG时钟;
2.SYSCFG->EXTICR[0]|=0x4;这一步的作用就是设置IO口与中断线的映射关系;那么问题来了,我如何知道的我的IO口与哪根中断线是关联起来的呢
而我们是通过KEY1按键,对应的IO口就是PE3,所以由上图的映射关系,我们知道,我们应该选择中断线3与之对应;在官方提供的头文件stm32f4xx.h中,我们可以看到:
[cpp]view plain copy
typedef struct
{
IO uint32_t MEMRMP;Address offset:0x00*\/
IO uint32_t PMC;Address offset:0x04*\/
IO uint32_t EXTICR[4];Address offset:0x08-0x14*\/
uint32_t RESERVED[2];0x18-0x1C*\/
[cpp]view plain copy
IO uint32_t CMPCR;Address offset:0x20*\/
SYSCFG_TypeDef;结合上述三幅图,我们可以得知:
由于PE3对应的中断线为EXTI3,所以,我们我们这里仅需配置EXTI3,而EXTI3是在SYSCFG_EXTICR1中的;所以我们仅需配置SYSCFG_EXTICR1寄存器的12位-15位为0100,而SYSCFG_EXTICR1寄存器在配置文件中,
对应的是SYSCFG->EXTICR[0],所以我们就写成了SYSCFG->EXTICR[0]|=0x4;3.EXTI->IMR|=1;这条语句的作用就是:开启对应中断线上的中断
由于我们操作的中断线是EXTI3,而IMR寄存器各位解释如下:
所以对应的,我们操作EXTI_IMR寄存器的第3位MR3即可;所以这条语句就写成了:EXTI->IMR|=1
4.EXTI->FTSR|=1;这条语句的作用就是设置中断触发条件;在我的开发板中,当按键按下时,其端口就会变成低电平,在没有按下时,其是为高电平的;因为我们key.c中,将按键的引脚设置成了上拉;所以在这里,我得将其设置成下降沿触发;与此同时,查看EXTI_FTSR 寄存器,可以看到:
又由于我们这条中断线是中断线3,所以这条语句就写成了:EXTI->FTSR|=1
5.SCB->AIRCR|=0x5;这条语句的作用就是:设置分组;所以,在这里我们只需设置SCB的AIRCR的bit10-8即可;查看SCB的结构体,得知:
[cpp]view plain copy
typedef struct
{
I uint32_t CPUID;(R\/)CPUID Base Register*\/
IO uint32_t ICSR;(R\/W)Interrupt Control and State Register*\/
IO uint32_t VTOR;(R\/W)Vector Table Offset Register*\/
IO uint32_t AIRCR;(R\/W)Application Interrupt and Reset Control Register*\/
IO uint32_t SCR;(R\/W)System Control Register*\/
IO uint32_t CCR;(R\/W)Configuration Control Register*\/
IO uint8_t SHP[12];(R\/W)System Handlers Priority Registers(4-7,8-11,12-15)*\/
IO uint32_t SHCSR;(R\/W)System Handler Control and State Register*\/
IO uint32_t CFSR;(R\/W)Configurable Fault Status Register*\/ IO uint32_t HFSR;(R\/W)HardFault Status Register*\/
IO uint32_t DFSR;(R\/W)Debug Fault Status Register*\/
IO uint32_t MMFAR;(R\/W)MemManage Fault Address Register*\/
IO uint32_t BFAR;(R\/W)BusFault Address Register*\/
IO uint32_t AFSR;(R\/W)Auxiliary Fault Status Register*\/
I uint32_t PFR[2];(R\/)Processor Feature Register*\/
I uint32_t DFR;(R\/)Debug Feature Register*\/
I uint32_t ADR;(R\/)Auxiliary Feature Register*\/
I uint32_t MMFR[4];(R\/)Memory Model Feature Register*\/
I uint32_t ISAR[5];(R\/)Instruction Set Attributes Register*\/
uint32_t RESERVED0[5];IO uint32_t CPACR;(R\/W)Coprocessor Access Control Register*\/ } SCB_Type;所以,在这里,我们把这条语句写成了SCB->AIRCR|=0x5;亦即设置成了101,也就是抢占优先级占2位,响应优先级占2位;注:抢占优先级和响应优先级一样,其值越低则表示其优先级越高;上述说的子优先级也就是我们说的响应优先级;
6.NVIC->IP[9]|=0;有上条语句,我们可以得知:IP寄存器由240个8bit的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示240个可屏蔽中断,
而STM32F4只用到了其中的82个。

IP[81]~IP[0]分别对应中断81~0.而每个可屏蔽中断占用的8bit并没有全部使用,而是只用了高4位;这4位,又分为抢占优先级和响应优先级;抢占优先级在前,响应优先级在后;也就是说,抢占优先级在高位,响应优先级在低位;而我们又知道:我们这个中断是外部中断3,所以查看中断向量表可知:
由此可知,EXTI3在中断的位置为9,所以我们只需要设置NVIC->IP[9]即可;在这里我们把NVIC->IP[9]|=0;则表示,我们设置外部中断3的抢占优先级为0,响应优先级也为0,其各占2位;
7.NVIC->ISER[0]|=1;这一步的作用就是使能中断;ISER...。

相关文档
最新文档