STM32部分学习经验(待补充)

2016/2/28

1. 学习STM32时,我准备的学习方法是,将网上下载下来的例程和模板进行学习,并不看视频了,因为有51的基础,所以看视频的话会有一点浪费时间。而且是使用库函数开发,底层部分在学习库函数时带着看看,反正后续会有ARM9的课,应该会有详细的讲解。

2. 网上的模板是使用自己封装的函数和库函数.c文件,不使用keil提供的固件库,这样的好处是自己封装度较高,运用较为灵活,对各个stm32版本有良好的适应性。

3. 今天先进行stm32板子的点灯,我使用的是51开发板扩展的stm32开发板,就是换了芯片,但是外设还是可以使用的,这样的性价比比较高。

4. 点灯的过程中,仿照例程,自己进行修改,达到了流水等的目的。

5. :使用相应的功能的时候,需要必要的初始化函数,必须记得调用,因为stm32比51复杂,连延时函数都要初始化才能正常使用。

 

 

2016/3/1

1.      今天开始学习stm32的串口使用方法,我只想说,我就好像在开发安卓一样,一直在调用他们封装完的函数,比较傻呼呼的,但是转念一想,以后不可能允许你什么都从0开始的从头开始,我们讲究的是效益和效率,那么如何用好这些函数并且对他们的函数进行修改成为我学习stm32的关键。

2.      :使用串口时,普中开发板上两根下载线不能连着了,不然串口不能正常工作。

3.      盲点:NVIC内容关于中断方面(2016/3/4扫盲结束)

 

2016/3/2

1.      今天使用普中开发板,将几个基础的功能函数都修改成比较好用的方式,并且新建HARDWARE Gropu,可以将其他的功能函数都往这里面加,这样比较清楚。

2.      关于按键问题:由于网上使用的开发板有接在3.3V和GND上的按钮,所以存在按键的上拉输入和下拉输入问题,但是我的开发板,据我所知只有共同接地,所以只有接上拉输入才能正常工作,这需要我进一步验证。

3.      的确是我想的那样,都设为上拉输入可以正常工作。但是有疑问,为什么将他们都设为下拉输入还是能够工作,就是好像不太灵敏。

4.      使用网上模板中的函数有的地方需要自己修改,比如端口,我用的STM32C8T6是没有PE口什么的,只有PA和PB口。而且现在使用的按键扫描都是没有消抖的,非常粗糙,我现在需要做的是把当时51上的按键消抖移植到stm32代码中去。

5.      盲点:关于按钮输入端设为上拉还是下拉输入问题?为什么好像上下拉都没什么区别?(的确好像没有什么区别,都能够正常工作,,,有待补充)

 

2016/3/3

1.      今天准备先做按键消抖,但是碰到一个问题,并不是所有的引脚都能正常工作,不能使用的口有如下图。根据观察,这些引脚好像有什么特殊的用途,目测好像是JTAG调试使用的时候使用的引脚什么的,暂时不清楚。

 

2.      盲点:对于JTAG的使用

3.      GPIO初始化问题;在每次根据相应要求去做不同的引脚初始化时,有以下几步:(1)在GPIO头文件中定义好要使用的引脚号,如GPIO_Pin_7;(2)在GPIO_ini()函数中,针对相应的GPIOB或者GPIOA进程初始化GPIO_Init(GPIOB,&GPIO_InitStructure);                     //GPIO_Init(GPIOA,&GPIO_InitStructure);,这样对应的引脚才能正常的使用;(3)在具体使用的时候,可以使用PBout(7)对某一位引脚做置一清零操作。

4.      串口打印问题:在使用STM32向电脑的串口调试工具发送换行时,针对ATK XCOM而言,想要打出正确的换行,需要加两个\r\n,也就是printf(“\r\n\r\n”);才能正确的打出一个换行!

5.      独立按键的扫描可以正常进行,测试完成就可以使用了,不想做矩阵键盘的扫描了,也用不到那么多的功能按键。

 

 

2016/3/4

1.      STM32中有两个中断优先级:抢占式优先级(占先式优先级)和响应优先级(副优先级),也就是主优先级和副优先级。其中抢占式优先级决定是否有中断嵌套(高占先优先级的中断事件会打断当前的主程序或者是中断程序的运行,也就是抢断式优先响应)。http://www.docin.com/p-558193594.html

2.      在占先式优先级相同的情况下,高副优先级的中断优先被响应。

3.      在占先式优先级相同的情况下,如果有低副优先级中断正在执行,那么高副优先级中断要等待已经被响应的低副优先级中断执行结束后才能得到响应(非抢断式响应,不能够嵌套)。

4.      在占先式优先级相同的情况下,就没有嵌套关系了!如果占先式优先级和副优先级都相同的中断同时到达,那么就根据他们在中断表中的位置来确定到底先执行哪个中断。

5.      优先级分组概念:Cortex-M3定义8个比特来设置中断源的优先级,那么如何分配这8个比特来设置占先式优先级和副优先级就是优先级分组的概念! 最高1位用于指定抢占式优先级,最低7位指定响应优先级;最高2位用于指定抢占式优先级,最低6位指定响应优先级….依次类推。 

6.      而在STM32中,使用4位设置中断优先级设置。

7.      第0组:所有4位都用于指定响应优先级;

8.      第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级;

9.      第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级;

10.  第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级;

11.  第4组:所有4位用于指定抢占式优先级。

12.  :(1)优先级分组只能设置一次,一般在主函数中设置,在各个功能函数中不再设置;(2)设置的优先级级数要在分组合理的取值范围;(3)优先级数字越小优先级越高;(4)判断优先级先看抢占式优先级,再看响应优先级。一般抢占优先级高的就是优先级先响应。

13.  中断部分明天再继续。

 

 

 

2016/3/5

1.      中断方面我还没有很好的掌握,今天继续。

2.      中断:(1)STM32中,每个GPIO都可以作为外部中断的中断输入端口。(2)共十九个中断请求,其中线0-15为外部中断输入中断,线16连接到PVD,线17连接到RTC闹钟事件,线18连接到USB唤醒事件。

3.      外部中断:折腾了一会终于有反应了,普中开发板上,有个下载时需要接上的跳帽在外部中断实验时需要拔下来,这样才能正常工作。还有就是,我发现相应的中断输入按钮对应的引脚必须设置为浮空输入才能正确触发!没改成浮空输入之前我一直失败。接下来就是初始化以及配置的过程。

4.      外部中断配置和初始化过程:(1)首先GPIO必须设置对,设置相应的外部中断触发引脚时,需要将该引脚的工作方式设置为浮空输入,不然不能正常触发外部中断。(2)然后,再使能复用功能时钟(这个不太明白是什么意思),接着就是将一组16个GPIO口与某个中断线设置映射关系,例如GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource2);,这样就把GPIOB口映射到中断线2上,而通过STM32的映射关系可以知道,这时GPIOB口有且只有一个PIN也就是GPIOB.2成为了与中断线2的映射线,此时只要对GPIOB.2做触发就可以。 (3)设置EXTI,也就是设置什么中断线,当然,在映射关系确定时,中断线也相应的确定了,再就是一些比较固定的配置,那么EXTI设置完毕。(4)下面设置NVIC,也就是这个外部中断的中断服务函数和抢占优先级以及响应优先级等,其中的NVIC_IRQChannel也就是设置外部中断服务函数的通道(个人认为是这样) (5)最后写中断服务函数,直接可以写服务函数所需动作(不同于51还要失能外部中断失能位EXn,做完后还要使能它),结束时需要清除中断线上的中断标志位,保证下一次的正常中断触发。

5.      盲点:(1)复用功能时钟是什么意思?(2)为什么要设置成浮空输入才能正确的触发?

 

 

2016/3/15

1.      时隔几日,将别人托我做的事做完了,在准备蓝桥杯的间隙,我准备将外部中断这部分学完整,并且封装成函数,待以后使用,然后再等待下个礼拜开始学习ARM9的同时,学习STM32,因为我还想做一个STM32的项目。

2.      实践发现,同一组的排扣可以设置多个引脚为中断触发引脚,之前的记忆是,每一组排口只能有一个引脚作为外部中断的触发引脚,看来是时间有点长或者理解错误吧。

3.      中断:外部中断0,1,2,3,4它们有独立的外部中断服务函数,而外部中断5-9都公用一个中断服务函数,这一点需要注意,如果有多个中断输入端,但是需要做的动作是相同或者类似的,那么可以设置使用中断5-9,实现功能。

4.      至此,外部中断基本学习完成!

5.      串口:今天发现,我能够使用的串口发送数据函数USART_SendData(USART1,num);不能使用了,就是在while中不能用,只能用printf,我也不知道什么原因,之前好像可以使用的!

 

 

2016/3/16

1.      串口补充:补充是因为昨天晚上发现,串口发送数据的函数USART_SendData(USART1,num);不能使用了,我也不懂这是为什么,上次自学的时候是可以用的,网上百度以后,好像说是这个库函数有缺陷,会出现覆盖什么的问题。

2.      解决串口发送数据被覆盖问题:如果在USART_SendData(USART1,num);下紧接着发送数据,有可能导致这个数据被覆盖,而不能正确的发送数据到电脑上,正确的做法是,在这一句下面紧接着写while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);,显而易见,这是判断发送标志位的,如果发送成功,才能做下一步,这样保证了发送数据的正确性。

3.      而打印数据到电脑上,STM32提供了使用printf方法,比较方便,但是还是需要封装一下自己的函数,这样比较灵活。封装了发送一个字符和一个字符串的库函数,这样和printf联合使用比较灵活好用。

 

你可能感兴趣的:(stm32)