OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8429|回复: 12

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

[复制链接]

22

主题

109

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2015-5-28
在线时间
0 小时
发表于 2015-7-22 19:20:16 | 显示全部楼层 |阅读模式
    原子哥的战舰板子买来有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内的语句,即支持连按。


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









再不玩命努力,你就老了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-7-16
在线时间
3 小时
发表于 2015-7-23 10:36:16 | 显示全部楼层
顶LZ,更正一个小问题: 
//static是静态变量只会程序运行第一次时执行一次 
=>准确地说,static静态变量只初始化一次,程序编译时就已经分配好,而非程序运行时执行一次
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-7-22 21:59:39 | 显示全部楼层
不错,希望楼主多发这种帖子啊,呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

139

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2014-10-29
在线时间
228 小时
发表于 2015-7-23 20:33:15 | 显示全部楼层
顶LZ!我也是断断续续过了一半战舰的教程,好多都没有深入,还有很多东西没法理解
回复 支持 反对

使用道具 举报

22

主题

109

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2015-5-28
在线时间
0 小时
 楼主| 发表于 2015-7-23 20:48:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
嘿嘿  会的   原子哥
再不玩命努力,你就老了
回复 支持 反对

使用道具 举报

22

主题

109

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2015-5-28
在线时间
0 小时
 楼主| 发表于 2015-7-23 20:48:26 | 显示全部楼层
回复【3楼】joe_knight:
---------------------------------
谢谢 收到 嘿嘿
再不玩命努力,你就老了
回复 支持 反对

使用道具 举报

22

主题

109

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2015-5-28
在线时间
0 小时
 楼主| 发表于 2015-7-23 20:48:50 | 显示全部楼层
回复【4楼】persevere:
---------------------------------
想精通 必须教程都理解后 做东西
再不玩命努力,你就老了
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-7-23 22:26:32 | 显示全部楼层
手动帮顶,建议楼主有意识增大一号字体,整体看起来就会舒服一些

分析的很细致,赞
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

26

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2015-7-24
在线时间
0 小时
发表于 2015-7-24 15:08:16 | 显示全部楼层
我觉得单纯的key_up是按键松开标志位,key_up=1则代表按键松开,key_up=0则代表按键按下;而(mode)key_up的组合才是是否支持连按标志位,
(mode)key_up=1支持连按,(mode)key_up=0则不支持。本人新手,对探索者里的按键例程暂时是这么理解,求指教。
M4小白菜,求各位大牛多多指导
回复 支持 反对

使用道具 举报

22

主题

109

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2015-5-28
在线时间
0 小时
 楼主| 发表于 2015-7-26 21:18:11 | 显示全部楼层
回复【8楼】龙之谷:
---------------------------------
哦了
再不玩命努力,你就老了
回复 支持 反对

使用道具 举报

22

主题

109

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2015-5-28
在线时间
0 小时
 楼主| 发表于 2015-7-26 21:21:22 | 显示全部楼层
回复【9楼】我就知道我的会员名已被使用:
---------------------------------
你仔细解读  深入研究程序 会发现 我写出来的 就是你说的深入。你说的仅仅是针对这个函数用法。没有细致讲解怎么来的。。
粗俗来讲 打个比喻。生孩子,都知道 发生关系 有可能生宝宝。   你说的仅仅是这个意思(类比)。
我讲解的是    精子如何进入卵细胞 并且受精卵如何成长的。。。。。
不知道 你懂没?
再不玩命努力,你就老了
回复 支持 反对

使用道具 举报

22

主题

109

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2015-5-28
在线时间
0 小时
 楼主| 发表于 2015-7-26 22:25:04 | 显示全部楼层










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  全部在这里(论坛中 原子哥告诉我记住这个就行)

再不玩命努力,你就老了
回复 支持 反对

使用道具 举报

26

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2015-7-24
在线时间
0 小时
发表于 2015-7-27 00:04:20 | 显示全部楼层
回复【11楼】逍遥居士_888:
---------------------------------
略懂略懂
M4小白菜,求各位大牛多多指导
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 09:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表