9966|38

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

所有的努力,不过是为了“定位BUG更容易,构建编码更快速”? [复制链接]

 
本帖最后由 辛昕 于 2017-11-18 13:56 编辑

      已完成部分:
      01.寄存器映射、外设驱动:BSP一包到底,提供读写总线足以,不配置,不通用。            

      前阵子,我花了好几个小时,终于把(王宜怀)基于飞思卡尔K60系列 这本书里关于 (单片机)软件代码模块化 这部分的内容看完,并写了一个很粗糙的笔记。作为我想解决 关于自己此前纠结,反复了很久的 诸如 :如何写一个“通用的单片机编程框架” 之类的问题的起点。但这本书看完后,包括我花了大量时间重新浏览了一下我在eeworld这几年的所有帖子之后,我竟然惊讶的发现——我所纠结的,没想到竟是出奇的简单,三句话足以说完:
       说到底,就是为了BUG容易改,代码写的快......
       然后该怎么办呢?
       良好架构!优秀框架!分层!重构!代码风格!加强测试!全局变量函数@#%#&$^&%$^.......
      回想过去五六年我在这上面是摸爬滚打,盖世神功没学会,反惹一身骚,疲惫不堪。


      因此,我当时有点失望,也没有太大动力继续去正式地写这个帖子,直到最近挖板块的老帖,挖到16年@zmsxhy 的一个帖子,刚刚我在写这个贴的草稿之前,我看了一下他的个人资料,发现他不是我想象的学生党毕业党,只是他似乎是硬件为主,但对软件似乎也很好奇很用功,让我有点扶额的是,从他发的帖子标题来看,以及他看到我的回复后留下的热切回复来看,我断定:
      他一定,也在纠结我曾经纠结了四五年的事情,于是,我突然决定,正儿八经开始写这个帖子。
      我只希望:少一次类似的,其实很无谓的折腾。

此内容由EEWORLD论坛网友辛昕原创,如需转载或用于商业用途需征得作者同意并注明出处




最新回复

看了你的帖子真的能学到不少东西 可能我现在关注的都是一些教学 科研项目 自己已经很少写具体代码了,很怀念当时自己写代码憋程序的时光。 感谢还记得我   详情 回复 发表于 2017-11-20 17:42
点赞 关注
个人签名

强者为尊,弱者,死无葬身之地


回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
本帖最后由 辛昕 于 2017-11-16 18:18 编辑

      闲话少说,为了避免以往的没边没际的废话。我先简单说自己的结论:
      1. 所谓的 良好结构,优秀框架,或者什么什么风格,思想,真的可以有助于 定位BUG,快速编码,然后......
        说实话,我觉得这话听着特别不靠谱,跟大街上说 报考学车,30天拿证 什么的差不多。
        ——最后你要是真的30天拿证,那你一定度过了生不如死的30天或者天生骨骼精奇,而和这个驾校其实没什么关系,还不是一样被骂的狗血淋头,一样怀疑人生。
      2.单片机程序,或者说我们碰到的、我们自己的写出来的,通常,都不会太大的程序而言(自己编码的行数,通常在10K到20K以内)。所以什么设计模式什么框架,可能根本毫无用武之地,你每次折腾来折腾去,玩得最多的可能还是变量数组,函数。听着最高大上的可能也只是 所谓模块而已。
   
      而我发的那么多帖子,说来说去,讨论的只不过是很小的一个层面的模块封装:单片机底层寄存器映射。            另外就是,对于单片机应用,经常是驱动和应用都不大,基本没有分开讨论的价值,所以,单片机程序往往有代码规模类似的驱动和“上层应用”组合,所以我也考虑这个层面的功能模块的封装。

 
个人签名

强者为尊,弱者,死无葬身之地

 

回复

6040

帖子

205

TA的资源

版主

板凳
 
本帖最后由 lcofjp 于 2017-11-16 18:32 编辑

教主继续,搬小板凳听课。
 
 
 

回复

419

帖子

1

TA的资源

一粒金砂(中级)

4
 
都是干货,期待继续;其实我也很好奇,高手都是如何写代码的,首先就是如何减少全局变量的使用。哎吆,我去,我的代码,全局编量就是我的屠龙宝刀,真想自废武功啊!
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

5
 
有时感觉减少全局变量和模块化就是鸡和鸡蛋的关系。共同的目的就是减少耦合,减少犯错误的几率。
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

6
 
lcofjp 发表于 2017-11-16 18:23
教主继续,搬小板凳听课。

这个可能会写的有点慢。
慢慢期待吧。
可以提出你们感兴趣的问题,这个事情涉及很多东西,我有时也不知道从何说起,要慢慢写草稿慢慢整理。
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

6423

帖子

16

TA的资源

版主

7
 
搬个小板凳学习
 
个人签名training
 
 

回复

1461

帖子

1

TA的资源

纯净的硅(中级)

8
 
搬小板凳,等待上课
 
 
 

回复

1027

帖子

0

TA的资源

五彩晶圆(中级)

9
 
写的多了 自然就成了。这些都是表象,重要的是解决问题的思想,比如用面向对象的思想去封装去实现。
玩植物大战僵尸、梦想小镇等游戏的时候,就想想如果自己写的话 该用什么样的方法来实现...
 
 
 

回复

407

帖子

3

TA的资源

纯净的硅(初级)

10
 
一直在等这个东西啊
 
个人签名我在想
我知道什么
 
 

回复

750

帖子

3

TA的资源

版主

11
 
面向对象没问题,但是代价比linux/windows代价高。比如下面这个按键扫描程序,利用中断回调驱动,可以监测单击事件、双击事件、长击事件。但是代码是要与底层中断模块相配合使用的,在A单片机能用,换用B单片机后,由于外部中断模块不同,可能就不是最佳设计了。
  1. #ifndef __VSF_KEY_H_INCLUDED__
  2. #define __VSF_KEY_H_INCLUDED__

  3. #define VSF_KEY_SCANF_INTERVAL                5                // ms
  4. #define VSF_KEY_SCANF_VALID_CNT                5                // max 8
  5. #define VSF_KEY_DCLICK_INTERVAL                300
  6. #define VSF_KEY_SCANF_VALID_MASK        ((uint8_t)(~(0xff << VSF_KEY_SCANF_VALID_CNT)))

  7. struct vsf_key_t
  8. {
  9.         struct vsfsm_t *report_sm;
  10.         uint32_t single_click_event;
  11.         uint32_t long_click_event;
  12.         uint32_t double_click_event;
  13.         uint16_t long_click_threshold_ms; // min: (VSF_KEY_SCANF_VALID_CNT + 1) * VSF_KEY_SCANF_INTERVAL
  14.         uint16_t pull_up_en : 1;
  15.         uint16_t pull_down_en : 1;
  16.         uint16_t valid_level : 1;
  17.         uint16_t key_port : 5;
  18.         uint16_t key_pin : 8;

  19.         // private
  20.         uint8_t value : 1;
  21.         uint8_t : 7;
  22.         uint8_t scanf_code;
  23.         uint16_t scanf_cnt;

  24.         struct vsfsm_t sm;
  25.         uint32_t last_realease_tick;
  26. };

  27. void vsf_key_init(struct vsf_key_t *key);
  28. void vsf_key_fini(struct vsf_key_t *key);
  29. #define vsf_key_get(key)        (key->value)

  30. #endif        // __VSF_KEY_H_INCLUDED__
复制代码

  1. #include "vsf.h"
  2. #include "vsf_key.h"

  3. #define KEY_EINT_TRIGGER                (VSFSM_EVT_USER_LOCAL + 1)

  4. static void key_callback(void *param)
  5. {
  6.         struct vsf_key_t *key = param;

  7.         vsfhal_eint_disable(key->key_port | (key->key_pin << 4));
  8.         vsfsm_post_evt_pending(&key->sm, KEY_EINT_TRIGGER);
  9. }

  10. static struct vsfsm_state_t *key_handler(struct vsfsm_t *sm, vsfsm_evt_t evt)
  11. {
  12.         struct vsf_key_t *key = sm->user_data;
  13.         uint32_t tick;
  14.         uint8_t value;

  15.         switch (evt)
  16.         {
  17.         case VSFSM_EVT_INIT:
  18.                 vsfhal_gpio_init(key->key_port);
  19.                
  20.                 vsfhal_eint_init(key->key_port | (key->key_pin << 4));
  21.                 vsfhal_eint_config(key->key_port | (key->key_pin << 4),
  22.                                 EINT_ONFALL | EINT_ONRISE, 0, key, key_callback);

  23.                 if (key->pull_up_en)
  24.                 {
  25.                         vsfhal_gpio_config(key->key_port, 0x1 << key->key_pin, 0,
  26.                                         0x1 << key->key_pin, 0);
  27.                 }
  28.                 else if (key->pull_down_en)
  29.                 {
  30.                         vsfhal_gpio_config(key->key_port, 0x1 << key->key_pin, 0,
  31.                                         0x1 << key->key_pin, 0x1 << key->key_pin);
  32.                 }
  33.                 else
  34.                 {
  35.                         vsfhal_gpio_config(key->key_port, 0x1 << key->key_pin, 0, 0, 0);
  36.                 }

  37.                 if (vsfhal_gpio_get(key->key_port, 1 << key->key_pin))
  38.                 {
  39.                         key->value = 1;
  40.                 }
  41.                 else
  42.                 {
  43.                         key->value = 0;
  44.                 }
  45.                 vsfhal_eint_enable(key->key_port | (key->key_pin << 4));
  46.                 break;
  47.         case KEY_EINT_TRIGGER:
  48.                 key->scanf_code = vsfhal_gpio_get(key->key_port, 1 << key->key_pin) ? 1 : 0;
  49.                 key->scanf_cnt = 1;
  50.                 vsftimer_create(sm, VSF_KEY_SCANF_INTERVAL, 1, VSFSM_EVT_DELAY_DONE);
  51.                 break;
  52.         case VSFSM_EVT_DELAY_DONE:
  53.                 key->scanf_code <<= 1;
  54.                 key->scanf_code |= vsfhal_gpio_get(key->key_port, 1 << key->key_pin) ? 1 : 0;
  55.                 if (key->scanf_cnt < 0xffff)
  56.                         key->scanf_cnt++;
  57.                
  58.                 if (key->scanf_cnt == VSF_KEY_SCANF_VALID_CNT)
  59.                 {
  60.                         if (((key->scanf_code & VSF_KEY_SCANF_VALID_MASK) == 0) ||
  61.                                 ((key->scanf_code & VSF_KEY_SCANF_VALID_MASK) == VSF_KEY_SCANF_VALID_MASK))
  62.                         {
  63.                                 value = key->scanf_code & 0x1;
  64.                                
  65.                                 if (key->value == value)
  66.                                 {
  67.                                         goto stop_scan;
  68.                                 }

  69.                                 tick = vsfhal_tickclk_get_count();                               
  70.                                 key->value = value;
  71.                                
  72.                                 if (key->single_click_event != 0)
  73.                                 {
  74.                                         vsfsm_post_evt_pending(key->report_sm , key->single_click_event);
  75.                                 }
  76.                                
  77.                                 if ((key->double_click_event != 0) && (key->value != key->valid_level)) // double click check
  78.                                 {
  79.                                         if (key->last_realease_tick + VSF_KEY_DCLICK_INTERVAL >= tick)
  80.                                                 vsfsm_post_evt_pending(key->report_sm , key->double_click_event);

  81.                                         key->last_realease_tick = tick;
  82.                                 }
  83.                                 else if ((key->long_click_event != 0) && (key->value == key->valid_level)) // long click check
  84.                                 {
  85.                                         goto goon_scan;
  86.                                 }
  87.                                 goto stop_scan;
  88.                         }
  89.                         else
  90.                         {
  91.                                 key->scanf_cnt--;
  92.                         }
  93.                 }
  94.                 else if (key->scanf_cnt > VSF_KEY_SCANF_VALID_CNT)
  95.                 {
  96.                         if ((key->scanf_code & 0x1) != key->valid_level)
  97.                         {
  98.                                 vsfsm_post_evt_pending(sm, KEY_EINT_TRIGGER);
  99.                                 break;
  100.                         }
  101.                         else if (key->scanf_cnt == key->long_click_threshold_ms / VSF_KEY_SCANF_INTERVAL)
  102.                         {
  103.                                 vsfsm_post_evt_pending(key->report_sm, key->long_click_event);
  104.                                 goto stop_scan;
  105.                         }
  106.                 }
  107. goon_scan:
  108.                 vsftimer_create(sm, VSF_KEY_SCANF_INTERVAL, 1, VSFSM_EVT_DELAY_DONE);
  109.                 break;
  110. stop_scan:
  111.                 vsfhal_eint_enable(key->key_port | (key->key_pin << 4));
  112.                 break;
  113.         default:
  114.                 break;
  115.         }
  116.         return NULL;
  117. }

  118. void vsf_key_init(struct vsf_key_t *key)
  119. {
  120.         key->sm.init_state.evt_handler = key_handler;
  121.         key->sm.user_data = key;
  122.         vsfsm_init(&key->sm);
  123. }

  124. void vsf_key_fini(struct vsf_key_t *key)
  125. {
  126.         nuc505_eint_disable(key->key_port | (key->key_pin << 4));
  127.         vsfsm_fini(&key->sm);
  128. }
复制代码
 
个人签名

要666

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

12
 
le062 发表于 2017-11-17 09:28
面向对象没问题,但是代价比linux/windows代价高。比如下面这个按键扫描程序,利用中断回调驱动,可以监测 ...

所以,接下来你就会看到,我倾向BSP一包打到底。
管他中断还是按键,全在一起。换一个板子换一个MCU我换一套BSP
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

3238

帖子

5

TA的资源

五彩晶圆(中级)

13
 
看到这篇帖子,我也想说几句,(王宜怀)基于飞思卡尔K60系列这本书我记得12年左右一个论坛送了我一本(现在压箱底了),当时我正好在研究架构设计,希望将来做一名资深架构师(中间也买了几本架构设计的书),刚开始时觉得如获至宝,感觉自己学了后可以"纵横江湖",后面运用到实践项目上,真的感觉如鸡肋。工作这些年,对于楼主说的所有努力不过是为了更好的定位问题和解决问题,我是认可的。从过去在现在我一直觉得一个工程师最核心的杀手锏就是"一剑封喉"的定位和解决问题能力。所谓项目开发无非就是遇到bug时的压抑状态和解决bug后的狂喜状态反复切换的过程。
我一直很反感的就是那些以为上了什么RTOS或者什么架构就bug少很多的人,这个就有点类似我考过了驾照,就不可能成为马路杀手一样。我现在编程一直在锻炼我的逻辑思维能力,而不是什么架构牛逼,编程很漂亮什么的。

这些年走过来,我真的很庆幸自己坚持下来了,有时我回想过去,都很佩服自己,如果人生还可以在回转一次,我真的不一定能坚持下去,至少按照我现在的心态。


我实习时第一份工作去的小公司,第一天上午给我看的公司规章,还没看完,下午就让我画PCB改电路,我很多同学去的公司都还在打杂都不涉及研发类工作,去的大点的公司的直接去培训去了。没同事帮,我亚历山大。为了证明自己的价值,我每天最早到公司(五点多起,北京冬天天都是黑的,用手机当电筒照路),最晚出公司,每天晚上回去还自主干到两点多,最疯狂时,连续加班三个多月,每天睡几个小时,最后把自己加进了医院,连续打了三天点滴,发烧40度,这个应该是我工作中最激情四射的时光,每天都是神农尝百草一样反复验证分析解决问题,没经验就的从失败中反复建立起来。
后面几份工作也是救火,要不就是整个部门的核心人员都离职,不知情下,直接接手把整个项目抗下来,要不就是从没做过的项目,短期内,最快的一次是入职第二天就开始设计协议栈(从没做过的,跨行找的工作,三份协议文档,每份几千页,搞得每天晚上都加班看协议,第二天写代码,就是这样的极限工作,我第一次,真的感觉到了自己的后背汗是凉的,现在我不会去找这类工作了)。这些工作,如果按照一般人说去架构设计,老板早把你干掉了,很多工作说白了就是前人挖了很多坑,解决不了了走人了,你要背锅,老板要的就是立刻马上把bug都干掉,能把这条破船的漏洞全部给我补上,让船开到岸边,一船人不要淹死到大海中,到了岸边,你可以重新设计一条船。最近公司来了一个架构师,水平真的很水,听过他对他那个小组布置的任务就知道。破船不补,要搞新船,优化什么架构,之前mqtt服务器至少可以保证一个月挂一次,按照他的要求改,一天挂三次(幸亏我不是他那个组的,不然就得干上了)。可能最后也和之前一个架构师自己主动走人,又留下一个烂摊子,如果换作我来搞,根本就不会这样(分工问题,虽然都会,但是只做一小部分,得益于多年一个项目都自己干的好处),不过现在在一家国企,我已经不像从前那样喜欢出风头,给多少钱干多少活,也活得自在。~~~~~~~~~~~~


最后说了那么多废话,其实我就想说,不管你采用什么架构,什么编码规范,你的目的都是为了将来能快速定位问题和解决问题,如果不能达到这个目的,对于老板来说,就是垃圾,没任何价值,再说,现在的老板有多少真正懂技术,你说的他能真正懂?他要的就是快点立刻把Bug给解决,不然走人(我boss的口头禅)。






 
个人签名淘宝:https://viiot.taobao.com/Q群243090717
多年专业物联网行业经验,个人承接各类物联网外包项目
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

14
 
wateras1 发表于 2017-11-17 10:36
看到这篇帖子,我也想说几句,(王宜怀)基于飞思卡尔K60系列这本书我记得12年左右一个论坛送了我一本(现在 ...

说的非常好。
刚开始骑士君,大概是在一年多以前还是两年前,那时候就听说了他的思路,内心佩服之余,却也觉得,实在是太粗暴简单。
谁成想,搞了半天,今天我坚定地站到了他这一边。

当然——我真心不是让你不爱学习不爱看书不爱好好写代码,我没那个意思,如果有人误会了我真的无语。
我和骑士君的意思是一样的:不要以为漂亮代码可以拯救你,要记住那句话:软件的世界里没有银弹。
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

15
 
回到第一个问题:底层寄存器映射

简单地说,就是类似这种代码(以最简单的GPIO为例)
  1. long  ReadGPIO(unsigned long ulPort, unsigned char ucPins)
  2. {
  3.     switch(ulPort)
  4.         {
  5.       case(GPIOA0_BASE):Num_H = 0;break;
  6.       case(GPIOA1_BASE):Num_H = 1;break;
  7.       case(GPIOA2_BASE):Num_H = 2;break;
  8.       case(GPIOA3_BASE):Num_H = 3;break;
  9.       case(GPIOA4_BASE):Num_H = 4;break;
  10.     }
  11.        
  12.     Num_Pins = ucPins;
  13.     for(Num_L=0;;Num_L++)
  14.         {
  15.       Num_Pins = Num_Pins/2;
  16.       if(Num_Pins==0)
  17.         break;
  18.     }
  19.     Num = Num_H*8+Num_L;        // 相当于 gpiox * 8 + pinx                               
  20.     return (HWREG(ulPort + (GPIO_O_GPIO_DATA + (ucPins << 2)))&(1<< (Num % 8)))>>(Num % 8);
  21. }
复制代码
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7452

帖子

2

TA的资源

五彩晶圆(高级)

16
 
本帖最后由 freebsder 于 2017-11-17 19:37 编辑

一帮只听别人吹起过"设计"的人陷在自己的井里互相吹捧天不过如此点大,可笑至极。
私下乱扯本也所谓,也没闲情逸致狗拿耗子,可是放在公共区域里误导人,没见过世面挨怼了也就受着吧。
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

17
 
下午下班的时候,我想了很久,始终没想到关于这个话题,怎么切入,最后决定回到原点:
我当初都见过一些什么东西,这些东西让我觉得很震惊,或者很恶心。
于是,我想起了三个东西:
1.Arduino的底层配置文件;
2.以前MDK4的时候,有个引脚,外设配置文件(当时我还没想起叫什么,晚上我回家在自己老硬盘里翻到以前的项目,才找到,这个东西叫 Configuration Wizard)
3.我忘了是MSP430还是CC2530里看到的一套,和上述两种同出一辙的底层映射方法。

接下来,我会以截图,或者上代码的形式,实际把这些东西,先展示出来,再写我自己的看法。
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

18
 
首先是 MDK4的 Configuration Wizard
(MDK5以后我不知道还有没有,但反正我是没用过,也没见到一些 厂商的例程 有继续用这个东西。)

先上图,感受一下。

你最先看到的,是这么一个东西,是一个列表式的图表结构的 勾选的东西,看起来很美好的。


然后,以最简单的GPIO和相对复杂但大家都熟悉的SPI为例,看看它设置的细节。
看起来真得挺美好的。

GPIO


SPI
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

19
 
然而,它背后是个什么东西呢?
如果你注意到下方,它还有另一种格式,叫 Text Editor的话。

你大致上会看到这样的东西,我只截图一部分。
(随后,我会把上面对应的 GPIO IO1 和 SPI2 的 代码,简单发上来,不用在意,你过一眼就好。)

 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

20
 
下面上这部分代码

其实这是一种配置文本,我能联想到的最接近的东西,要么是 JSON要么是XML。

GPIO:
  1. // <e> IO 0
  2. //==============================
  3. // <i> Enable or disable GPIO0       
  4. #define ENABLE_IO_0                          1
  5. //==============================
  6. //   <s.20>昵称
  7. //   <i> Default: "IO"
  8. #define IO_NAME0     "Relay1"


  9. //   <i> Local GPIO define
  10. //     <o>Port <0=>        GPIOA        <1=> GPIOB        <2=> GPIOC
  11. //                           <3=>        GPIOD        <4=> GPIOE        <5=> GPIOF  <6=> GPIOG       
  12. //                                <7=>        GPIOH        <8=> GPIOI       
  13. //     <i> GPIO A,B,C,D...<->(0,1,2,3...)
  14. //     <i> 0=GPIOA,1=GPIOB,...
  15. //     <i> Default: GPIOA
  16. #define PORT_GPIO0          5

  17. //     <o>Pin <0=> PIN0  <1=> PIN1  <2=> PIN2  <3=> PIN3  <4=> PIN4
  18. //                          <5=> PIN5  <6=> PIN6  <7=> PIN7  <8=> PIN8  <9=> PIN9
  19. //                          <10=> PIN10  <11=> PIN11  <12=> PIN12  <13=> PIN13  
  20. //                          <14=> PIN14  <15=> PIN15
  21. //     <i> 0=PIN0,1=PIN1,...
  22. //     <i> Default: PIN0
  23. #define PIN_GPIO0          11

  24. //     <o>Mode <0x00=>  GPIO_Mode_IN             <0x01=> GPIO_Mode_Out
  25. //                           <0x02=> GPIO_Mode_AF             <0x03=> GPIO_Mode_AN

  26. //     <i> (输入)GPIO_Mode_IN = 0x00
  27. //     <i> (输出)GPIO_Mode_Out= 0x01
  28. //     <i> (第二功能)GPIO_Mode_AF = 0x02
  29. //     <i> (模拟)GPIO_Mode_AN = 0x03
  30. //     <i> Default: (输入)GPIO_Mode_IN
  31. #define MODE_GPIO0          0x01

  32. //     <o>Speed <0=> GPIO_Speed_2MHz
  33. //                                <1=> GPIO_Speed_25MHz
  34. //                                <2=> GPIO_Speed_50MHz
  35. //                                <3=> GPIO_Speed_100MHz
  36. //     <i> 0=GPIO_Speed_2MHz
  37. //     <i> 1=GPIO_Speed_25MHz
  38. //     <i> 2=GPIO_Speed_50MHz
  39. //     <i> 3=GPIO_Speed_100MHz
  40. //     <i> Default: GPIO_Speed_2MHz
  41. #define SPEED_GPIO0          2

  42. //     <o>OUT TYPE <0=> GPIO_Output push-pull  
  43. //                                <1=> GPIO_Output open-drain
  44. //     <i> 0=GPIO_Output push-pull
  45. //     <i> 1=GPIO_Output open-drain
  46. //     <i> Default: GPIO_Output push-pull
  47. #define OTYPE_GPIO0          0

  48. //     <o>PU/PD <0=> GPIO_PuPd_NOPULL
  49. //                                <1=> GPIO_PuPd_UP
  50. //                                <2=> GPIO_PuPd_DOWN
  51. //     <i> 0=GPIO_PuPd_NOPULL
  52. //     <i> 1=GPIO_PuPd_UP
  53. //     <i> 2=GPIO_PuPd_DOWN
  54. //     <i> Default:GPIO_PuPd_NOPULL  
  55. #define PUPD_GPIO0          0


  56. //                <o>Init_state <0=> LOW  <1=> HIGH
  57. //                <i> 0=LOW
  58. //                <i> 1=HIGH
  59. //                <i> Default: LOW
  60. #define STATE_GPIO0                        0  
  61. // </e>
复制代码


SPI2
  1. // <e> SPI2
  2. //==============================
  3. // <i> Enable or disable SPI2       
  4. #define ENABLE_SPI2                          1
  5. //==============================
  6. //     <o>SPI prescaler <0x0000=> Div 2 <0x0008=> Div 4  <0x0010=> Div 8  <0x0018=> Div 16
  7. //                                                <0x0020=> Div 32 <0x0028=> Div 64  <0x0030=> Div 128  <0x0038=> Div 256
  8. //     <i> 0x00000000 = Div 2, 0x00010000 = Div 4,...
  9. //     <i> Default: Div 2
  10. #define SPI2_PRESCALER          0x0038


  11. //     <o>Interrupt Priority <0=>        High        <1=> Middle        <2=> Low
  12. //           <i> Interrupt Priority
  13. //     <i> Default: Low
  14. #define SPI2_INT_PRIO          2

  15. //     <o>Clock Phase <0x0000=> 1Edge        <0x0001=>        2Edge         
  16. //           <i> SPI Clock Phase  1=2Edge, 0=1Edge
  17. //     <i> Default: 1Edge
  18. #define SPI2_CPHA                                                                0x0000

  19. //     <o>Clock Polarity <0x0002=> High         <0x0000=> Low       
  20. //           <i> SPI Clock Phase  2=High, 0=Low
  21. //     <i> Default: Low
  22. #define SPI2_CPOL                                                                0x0000

  23. //<h> MOSI
  24. //   <i> Local KEY define
  25. //     <o>Port <0=>        GPIOA        <1=> GPIOB        <2=> GPIOC
  26. //                           <3=>        GPIOD        <4=> GPIOE        <5=> GPIOF  <6=> GPIOG       
  27. //                                <7=>        GPIOH        <8=> GPIOI       
  28. //     <i> GPIO A,B,C,D...<->(0,1,2,3...)
  29. //     <i> 0=GPIOA,1=GPIOB,...
  30. //     <i> Default: GPIOA
  31. #define PORT_SO_SPI2          2

  32. //     <o>Pin <0=> PIN0  <1=> PIN1  <2=> PIN2  <3=> PIN3  <4=> PIN4
  33. //                          <5=> PIN5  <6=> PIN6  <7=> PIN7  <8=> PIN8  <9=> PIN9
  34. //                          <10=> PIN10  <11=> PIN11  <12=> PIN12  <13=> PIN13  
  35. //                          <14=> PIN14  <15=> PIN15
  36. //     <i> 0=PIN0,1=PIN1,...
  37. //     <i> Default: PIN0
  38. #define PIN_SO_SPI2          3

  39. //     <o>Mode <0x00=>  GPIO_Mode_IN             <0x01=> GPIO_Mode_Out
  40. //                           <0x02=> GPIO_Mode_AF             <0x03=> GPIO_Mode_AN

  41. //     <i> (输入)GPIO_Mode_IN = 0x00
  42. //     <i> (输出)GPIO_Mode_Out= 0x01
  43. //     <i> (第二功能)GPIO_Mode_AF = 0x02
  44. //     <i> (模拟)GPIO_Mode_AN = 0x03
  45. //     <i> Default: (输入)GPIO_Mode_IN
  46. #define MODE_SO_SPI2         0x02

  47. //     <o>Speed <0=> GPIO_Speed_2MHz
  48. //                                <1=> GPIO_Speed_25MHz
  49. //                                <2=> GPIO_Speed_50MHz
  50. //                                <3=> GPIO_Speed_100MHz
  51. //     <i> 0=GPIO_Speed_2MHz
  52. //     <i> 1=GPIO_Speed_25MHz
  53. //     <i> 2=GPIO_Speed_50MHz
  54. //     <i> 3=GPIO_Speed_100MHz
  55. //     <i> Default: GPIO_Speed_2MHz
  56. #define SPEED_SO_SPI2          2

  57. //     <o>OUT TYPE <0=> GPIO_Output push-pull  
  58. //                                <1=> GPIO_Output open-drain
  59. //     <i> 0=GPIO_Output push-pull
  60. //     <i> 1=GPIO_Output open-drain
  61. //     <i> Default: GPIO_Output push-pull
  62. #define OTYPE_SO_SPI2          0

  63. //     <o>PU/PD <0=> GPIO_PuPd_NOPULL
  64. //                                <1=> GPIO_PuPd_UP
  65. //                                <2=> GPIO_PuPd_DOWN
  66. //     <i> 0=GPIO_PuPd_NOPULL
  67. //     <i> 1=GPIO_PuPd_UP
  68. //     <i> 2=GPIO_PuPd_DOWN
  69. //     <i> Default:GPIO_PuPd_NOPULL  
  70. #define PUPD_SO_SPI2          0


  71. //                <o>Init_state <0=> LOW  <1=> HIGH
  72. //                <i> 0=LOW
  73. //                <i> 1=HIGH
  74. //                <i> Default: LOW
  75. #define STATE_SO_SPI2                        0
  76. //</h>

  77. //-----------------------------------------------

  78. //<h> MISO
  79. //   <i> Local KEY define
  80. //     <o>Port <0=>        GPIOA        <1=> GPIOB        <2=> GPIOC
  81. //                           <3=>        GPIOD        <4=> GPIOE        <5=> GPIOF  <6=> GPIOG       
  82. //                                <7=>        GPIOH        <8=> GPIOI       
  83. //     <i> GPIO A,B,C,D...<->(0,1,2,3...)
  84. //     <i> 0=GPIOA,1=GPIOB,...
  85. //     <i> Default: GPIOA
  86. #define PORT_SI_SPI2          2

  87. //     <o>Pin <0=> PIN0  <1=> PIN1  <2=> PIN2  <3=> PIN3  <4=> PIN4
  88. //                          <5=> PIN5  <6=> PIN6  <7=> PIN7  <8=> PIN8  <9=> PIN9
  89. //                          <10=> PIN10  <11=> PIN11  <12=> PIN12  <13=> PIN13  
  90. //                          <14=> PIN14  <15=> PIN15
  91. //     <i> 0=PIN0,1=PIN1,...
  92. //     <i> Default: PIN0
  93. #define PIN_SI_SPI2          2

  94. //     <o>Mode <0x00=>  GPIO_Mode_IN             <0x01=> GPIO_Mode_Out
  95. //                           <0x02=> GPIO_Mode_AF             <0x03=> GPIO_Mode_AN

  96. //     <i> (输入)GPIO_Mode_IN = 0x00
  97. //     <i> (输出)GPIO_Mode_Out= 0x01
  98. //     <i> (第二功能)GPIO_Mode_AF = 0x02
  99. //     <i> (模拟)GPIO_Mode_AN = 0x03
  100. //     <i> Default: (输入)GPIO_Mode_IN
  101. #define MODE_SI_SPI2         0x02

  102. //     <o>Speed <0=> GPIO_Speed_2MHz
  103. //                                <1=> GPIO_Speed_25MHz
  104. //                                <2=> GPIO_Speed_50MHz
  105. //                                <3=> GPIO_Speed_100MHz
  106. //     <i> 0=GPIO_Speed_2MHz
  107. //     <i> 1=GPIO_Speed_25MHz
  108. //     <i> 2=GPIO_Speed_50MHz
  109. //     <i> 3=GPIO_Speed_100MHz
  110. //     <i> Default: GPIO_Speed_2MHz
  111. #define SPEED_SI_SPI2          2

  112. //     <o>OUT TYPE <0=> GPIO_Output push-pull  
  113. //                                <1=> GPIO_Output open-drain
  114. //     <i> 0=GPIO_Output push-pull
  115. //     <i> 1=GPIO_Output open-drain
  116. //     <i> Default: GPIO_Output push-pull
  117. #define OTYPE_SI_SPI2          0

  118. //     <o>PU/PD <0=> GPIO_PuPd_NOPULL
  119. //                                <1=> GPIO_PuPd_UP
  120. //                                <2=> GPIO_PuPd_DOWN
  121. //     <i> 0=GPIO_PuPd_NOPULL
  122. //     <i> 1=GPIO_PuPd_UP
  123. //     <i> 2=GPIO_PuPd_DOWN
  124. //     <i> Default:GPIO_PuPd_NOPULL  
  125. #define PUPD_SI_SPI2          0


  126. //                <o>Init_state <0=> LOW  <1=> HIGH
  127. //                <i> 0=LOW
  128. //                <i> 1=HIGH
  129. //                <i> Default: LOW
  130. #define STATE_SI_SPI2                        0
  131. //</h>

  132. //-----------------------------------------


  133. //<h> SCK
  134. //   <i> Local KEY define
  135. //     <o>Port <0=>        GPIOA        <1=> GPIOB        <2=> GPIOC
  136. //                           <3=>        GPIOD        <4=> GPIOE        <5=> GPIOF  <6=> GPIOG       
  137. //                                <7=>        GPIOH        <8=> GPIOI       
  138. //     <i> GPIO A,B,C,D...<->(0,1,2,3...)
  139. //     <i> 0=GPIOA,1=GPIOB,...
  140. //     <i> Default: GPIOA
  141. #define PORT_SCK_SPI2          1

  142. //     <o>Pin <0=> PIN0  <1=> PIN1  <2=> PIN2  <3=> PIN3  <4=> PIN4
  143. //                          <5=> PIN5  <6=> PIN6  <7=> PIN7  <8=> PIN8  <9=> PIN9
  144. //                          <10=> PIN10  <11=> PIN11  <12=> PIN12  <13=> PIN13  
  145. //                          <14=> PIN14  <15=> PIN15
  146. //     <i> 0=PIN0,1=PIN1,...
  147. //     <i> Default: PIN0
  148. #define PIN_SCK_SPI2          10

  149. //     <o>Mode <0x00=>  GPIO_Mode_IN             <0x01=> GPIO_Mode_Out
  150. //                           <0x02=> GPIO_Mode_AF             <0x03=> GPIO_Mode_AN

  151. //     <i> (输入)GPIO_Mode_IN = 0x00
  152. //     <i> (输出)GPIO_Mode_Out= 0x01
  153. //     <i> (第二功能)GPIO_Mode_AF = 0x02
  154. //     <i> (模拟)GPIO_Mode_AN = 0x03
  155. //     <i> Default: (输入)GPIO_Mode_IN
  156. #define MODE_SCK_SPI2         0x02

  157. //     <o>Speed <0=> GPIO_Speed_2MHz
  158. //                                <1=> GPIO_Speed_25MHz
  159. //                                <2=> GPIO_Speed_50MHz
  160. //                                <3=> GPIO_Speed_100MHz
  161. //     <i> 0=GPIO_Speed_2MHz
  162. //     <i> 1=GPIO_Speed_25MHz
  163. //     <i> 2=GPIO_Speed_50MHz
  164. //     <i> 3=GPIO_Speed_100MHz
  165. //     <i> Default: GPIO_Speed_2MHz
  166. #define SPEED_SCK_SPI2          2

  167. //     <o>OUT TYPE <0=> GPIO_Output push-pull  
  168. //                                <1=> GPIO_Output open-drain
  169. //     <i> 0=GPIO_Output push-pull
  170. //     <i> 1=GPIO_Output open-drain
  171. //     <i> Default: GPIO_Output push-pull
  172. #define OTYPE_SCK_SPI2          0

  173. //     <o>PU/PD <0=> GPIO_PuPd_NOPULL
  174. //                                <1=> GPIO_PuPd_UP
  175. //                                <2=> GPIO_PuPd_DOWN
  176. //     <i> 0=GPIO_PuPd_NOPULL
  177. //     <i> 1=GPIO_PuPd_UP
  178. //     <i> 2=GPIO_PuPd_DOWN
  179. //     <i> Default:GPIO_PuPd_NOPULL  
  180. #define PUPD_SCK_SPI2          0


  181. //                <o>Init_state <0=> LOW  <1=> HIGH
  182. //                <i> 0=LOW
  183. //                <i> 1=HIGH
  184. //                <i> Default: LOW
  185. #define STATE_SCK_SPI2                        0
  186. //</h>

  187. //---------------------------------------

  188. //<h> CS
  189. //   <i> Local KEY define
  190. //     <o>Port <0=>        GPIOA        <1=> GPIOB        <2=> GPIOC
  191. //                           <3=>        GPIOD        <4=> GPIOE        <5=> GPIOF  <6=> GPIOG       
  192. //                                <7=>        GPIOH        <8=> GPIOI       
  193. //     <i> GPIO A,B,C,D...<->(0,1,2,3...)
  194. //     <i> 0=GPIOA,1=GPIOB,...
  195. //     <i> Default: GPIOA
  196. #define PORT_CS_SPI2          1

  197. //     <o>Pin <0=> PIN0  <1=> PIN1  <2=> PIN2  <3=> PIN3  <4=> PIN4
  198. //                          <5=> PIN5  <6=> PIN6  <7=> PIN7  <8=> PIN8  <9=> PIN9
  199. //                          <10=> PIN10  <11=> PIN11  <12=> PIN12  <13=> PIN13  
  200. //                          <14=> PIN14  <15=> PIN15
  201. //     <i> 0=PIN0,1=PIN1,...
  202. //     <i> Default: PIN0
  203. #define PIN_CS_SPI2          9

  204. //     <o>Mode <0x00=>  GPIO_Mode_IN             <0x01=> GPIO_Mode_Out
  205. //                           <0x02=> GPIO_Mode_AF             <0x03=> GPIO_Mode_AN

  206. //     <i> (输入)GPIO_Mode_IN = 0x00
  207. //     <i> (输出)GPIO_Mode_Out= 0x01
  208. //     <i> (第二功能)GPIO_Mode_AF = 0x02
  209. //     <i> (模拟)GPIO_Mode_AN = 0x03
  210. //     <i> Default: (输入)GPIO_Mode_IN
  211. #define MODE_CS_SPI2         0x01

  212. //     <o>Speed <0=> GPIO_Speed_2MHz
  213. //                                <1=> GPIO_Speed_25MHz
  214. //                                <2=> GPIO_Speed_50MHz
  215. //                                <3=> GPIO_Speed_100MHz
  216. //     <i> 0=GPIO_Speed_2MHz
  217. //     <i> 1=GPIO_Speed_25MHz
  218. //     <i> 2=GPIO_Speed_50MHz
  219. //     <i> 3=GPIO_Speed_100MHz
  220. //     <i> Default: GPIO_Speed_2MHz
  221. #define SPEED_CS_SPI2          2

  222. //     <o>OUT TYPE <0=> GPIO_Output push-pull  
  223. //                                <1=> GPIO_Output open-drain
  224. //     <i> 0=GPIO_Output push-pull
  225. //     <i> 1=GPIO_Output open-drain
  226. //     <i> Default: GPIO_Output push-pull
  227. #define OTYPE_CS_SPI2          0

  228. //     <o>PU/PD <0=> GPIO_PuPd_NOPULL
  229. //                                <1=> GPIO_PuPd_UP
  230. //                                <2=> GPIO_PuPd_DOWN
  231. //     <i> 0=GPIO_PuPd_NOPULL
  232. //     <i> 1=GPIO_PuPd_UP
  233. //     <i> 2=GPIO_PuPd_DOWN
  234. //     <i> Default:GPIO_PuPd_NOPULL  
  235. #define PUPD_CS_SPI2          0


  236. //                <o>Init_state <0=> LOW  <1=> HIGH
  237. //                <i> 0=LOW
  238. //                <i> 1=HIGH
  239. //                <i> Default: LOW
  240. #define STATE_CS_SPI2                        0
  241. //</h>

  242. // </e>
复制代码


如果你已经看到吐了,不用太震惊,因为我很早以前就吐过了。

 
个人签名

强者为尊,弱者,死无葬身之地

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表