分享战舰院子开发板中遇到的疑难点的理解(每隔2天更新)

2019-07-21 02:15发布

    原子哥的战舰板子买来有1年多了,刚买时仅仅是看实验例程走一遍,很多东西都是似是而非,很多程序不是彻底明白。
如今毕业工作了,走的硬件研发工程师这条路,工作需要用到32,实习培训三个月后需要用32做个小项目考核,而我把当初32的内容都忘记了
只好重新学习,这次学习我要深刻理解每个教程的语句,理解后自己独立按照理解的内容重新编写.

计划是 把教程走一遍后,用32做各种小设计,由浅入深研究,研究后学做系统。都掌握后经常逛论坛和大家讨论

   以前的我只是享受论坛老人的恩惠,如今虽然我明白的不是很多,可是我能知道新人哪里容易不太懂,把自己对教程中的看法写出来供大家参考,
同时也希望各位前辈指导不足之处。

   念书时 发问题,有时候没有人回答,心里很不好受,如今工作了发现,事情好多呀,没有那么多的时间经常逛论坛,所以那,
对于很多人发的问题没有解决,请你不要生气,因为上班的人真的很忙。
   工作这10多天,培训外,自己把C语言重头系统的看了看,做好笔记,除了结构体那里不是太懂外,其余的可以说了解了。
建议各位亲,磨刀不误砍柴工,系统看看C语言,如果说你是学生,我更是希望你能仔细认真看看研究。
  
  昨天开会,经理说一个经验,就是在工作中遇到的问题和解决的办法用word记录好,以后需要用时查找搜索关键字就行,听了他的话
我有感而发 想把自己遇到的疑难点以及理解记录下来。同时给大家分享

言归正传
1、关于引脚宏定义中库函数和位操作两种方法
 #define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//库函数的宏定义  #define KEY0 Ein(4)               //位操作的宏定义     玩32都是从51等低端单片机过来的,对于这些库操作用的不是很方便熟练,此时由宏定义可知有如上两种简单操作,
通过这两种宏定义后,在主函数中我们就可以向
51那种编程思路了,更容易理解。     考虑到在不同32上的移植性,最好最好用库函数的宏定义


2、按键处理函数 //按键处理函数 //返回按键值 //mode:0,不支持连续按;1,支持连续按; //0,没有任何按键按下 //1KEY0按下 //2KEY1按下 //3KEY2按下  //4KEY3按下 WK_UP //注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!! u8 KEY_Scan(u8 mode)  //里的u8是返回值 {   static u8 key_up=1;//static是静态变量只会程序运行第一次时执行一次 //保证在按键全松开的情况下才开始检测
if(mode)key_up=1;  //支持连按 /*如果keyup1,同时key0123中有一个按键被按下,那么if为真,执行取值操作,作为返回值付给主函数的t
(t是主函数内一个负责取KEY_Scan(u8 mode)得变量)  */ if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1)) { delay_ms(10); key_up=0; if(KEY0==0)return KEY_RIGHT; else if(KEY1==0)return KEY_DOWN; else if(KEY2==0)return KEY_LEFT; else if(KEY3==1)return KEY_UP; }else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;    //如果上面的if为假,那么如果key0123没有一个被按下,那么keyup1   return 0;// 无按键按下 }   来说说mode0,不支持连按的情况     第一次没有按键按下时,static u8 key_up=1;(此语句仅仅是第一次执行时有用) 那么if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))中(KEY0==0||KEY1==0||KEY2==0||KEY3==1)为假不执行内部的语句,
执行下句elseif,表达式(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)的值为1,执行内部的语句,keyup为1,所以没什么用。
(程序执行速度很快,肯定远远大于按键按下速度,这里的第一次,第二次是为了方便理解)  第二次,假设按的是key0,那么if中的表达式为真,执行后面的语句,把keyup0后,取出按键值,作为函数返回值送会给t(记住此刻keyup的值是0)   第三次,mode又为0,那么keyup还是0
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))中的表达式是假&&后的语句(KEY0==0||KEY1==0||KEY2==0||KEY3==1)不去判断
(不懂请看
C语言)),则执行elseif,它的表达式中若果没有按键按下则keyup=1
如果此时有一个按键是被按下的状态,所以elseif里的keyup=1也不会被执行,因为elseif也是假的。
然后返回值还是
0,这就达到了不支持连按的目的 如果此时一个按键是松开,即按下后松手,那么再看,if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这条语句为假应,执行elseif,此时由于没有按按钮,所以会执行keyup=1这条语句,当下次扫描按钮来临时又恢复到了最初的情况。   mode1时的支持连按的情况 static u8 key_up=1;if(mode)key_up=1;两个语句表明无论何时,key_up的值都是1
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))的表达式仅仅需要判断(KEY0==0||KEY1==0||KEY2==0||KEY3==1)的值是不是1
是的话执行内部函数,不是的话执行
else if后的语句,key_up1,也可以说else if这个语句在此种形式下没有用处。 由此看出在这种情况下仅仅是不断扫描是否有按键按下,有的话就是把返回值送给t,如果是按下没有松手,不断检测到按下状态
,就是一直执行
if内的语句,即支持连按。


如果哪里有问题 恳请各位指导








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
逍遥居士_888
2019-07-22 10:38










3、外部中断

3.1  NVIC的优先级分组

STM32中指定优先级的寄存器为4位,其定义如下:

第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位(2^3=8级)用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位(2^2=4级)用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级

以上定义也称作中断优先级分组,相关内容在STM32固件库的misc.h文件中有

    举个例子,比如火车站买票,那些火车站的规章制度就是NVIC,规定学生和军人有比一般人更高优先级,它们则给你单独安排个窗口,同学与同学之间也有区别,那就是你也得排队,也就是你的组别(抢断优先级)和你的排队序号(响应优先级)决定你何时能买到票。


   抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌套。

 

具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 

 

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。


3.2中断通道如何查找?类似于EXTI2_IRQn?


NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;


 我是没有找到快速查找外部中断的方法。。。。如果有的话请各位告之我

我只有这样记住  stm32f10x.h  第167行是中断IRQn  全部在这里(论坛中 原子哥告诉我记住这个就行)

一周热门 更多>