【.Net Micro Framework PortingKit - 03】调试初步:点亮LED灯

在上一篇文章《STM3210E平台构建》中,我们已经构建好了STM3210的基本平台,并且已经编译通过,所以我们下一步就要考虑用MDK进行下载调试了。

由于我们用到了片外SRAM,所以我们还得写一个MDK 脚本,实现三点功能,一是SRAM初始化,二是下载镜像文件,三是设置PC指针。

EM-STM3210E随机光盘中有一些开发板的测试工程,所以我们没必要先查看手册,我们先在代码中看看有没有收获,在测试工程的启动代码stm32f10x_vector.s中,我们可以找到了片外SRAM初始化代码,具体内容如下:

 
 
  1. ; FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is   
  2.  
  3. ; required, then adjust the Register Addresses  
  4.  
  5.    
  6.  
  7. ; Enable FSMC clock  
  8.  
  9.                                             LDR R0,= 0x00000114   
  10.  
  11.                                             LDR R1,= 0x40021014  
  12.  
  13.                                             STR R0,[R1]                       
  14.  
  15.                
  16.  
  17. ; Enable GPIOD, GPIOE, GPIOF and GPIOG clocks  
  18.  
  19.                                             LDR R0,= 0x000001E0  
  20.  
  21.                                             LDR R1,= 0x40021018  
  22.  
  23.                                             STR R0,[R1]         
  24.  
  25.    
  26.  
  27. ; SRAM Data lines, NOE and NWE configuration   
  28.  
  29. ; SRAM Address lines configuration   
  30.  
  31. ; NOE and NWE configuration     
  32.  
  33. ; NE3 configuration   
  34.  
  35. ; NBL0, NBL1 configuration   
  36.  
  37.    
  38.  
  39.                                             LDR R0,= 0x44BB44BB   
  40.  
  41.                                             LDR R1,= 0x40011400  
  42.  
  43.                                             STR R0,[R1]               
  44.  
  45.                                       
  46.  
  47.                                             LDR R0,= 0xBBBBBBBB   
  48.  
  49.                                             LDR R1,= 0x40011404  
  50.  
  51.                                             STR R0,[R1]               
  52.  
  53.                                       
  54.  
  55.                                             LDR R0,= 0xB44444BB   
  56.  
  57.                                             LDR R1,= 0x40011800  
  58.  
  59.                                             STR R0,[R1]               
  60.  
  61.                                       
  62.  
  63.                                             LDR R0,= 0xBBBBBBBB   
  64.  
  65.                                             LDR R1,= 0x40011804  
  66.  
  67.                                             STR R0,[R1]               
  68.  
  69.                                       
  70.  
  71.                                             LDR R0,= 0x44BBBBBB   
  72.  
  73.                                             LDR R1,= 0x40011C00  
  74.  
  75.                                             STR R0,[R1]          
  76.  
  77.    
  78.  
  79.                                             LDR R0,= 0xBBBB4444   
  80.  
  81.                                             LDR R1,= 0x40011C04  
  82.  
  83.                                             STR R0,[R1]          
  84.  
  85.    
  86.  
  87.                                             LDR R0,= 0x44BBBBBB  
  88.  
  89.                                             LDR R1,= 0x40012000  
  90.  
  91.                                             STR R0,[R1]               
  92.  
  93.    
  94.  
  95.                                             LDR R0,= 0x44444B44  
  96.  
  97.                                             LDR R1,= 0x40012004  
  98.  
  99.                                             STR R0,[R1]        
  100.  
  101.                                               
  102.  
  103. ; FSMC Configuration     
  104.  
  105. ; Enable FSMC Bank1_SRAM Bank   
  106.  
  107.    
  108.  
  109.                                             ;LDR R0,= 0x00001011  
  110.  
  111.                                            ;LDR R1,= 0xA0000010  
  112.  
  113.                                            ;STR R0,[R1]       
  114.  
  115.    
  116.  
  117.                                            ;LDR R0,= 0x00000200   
  118.  
  119.                                            ;LDR R1,= 0xA0000014  
  120.  
  121.                                            ;STR R0,[R1]  
  122.  
  123.                                                         
  124.  
  125.                                             LDR R0,= 0x00001000  
  126.  
  127.                                            LDR R1,= 0xA0000010  
  128.  
  129.                                            STR R0,[R1]        
  130.  
  131.    
  132.  
  133.                                            LDR R0,= 0x00000200   
  134.  
  135.                                            LDR R1,= 0xA0000014  
  136.  
  137.                                            STR R0,[R1]        
  138.  
  139.                                                         
  140.  
  141.                                             LDR R0,= 0x0FFFFFFF  
  142.  
  143.                                            LDR R1,= 0xA0000114  
  144.  
  145.                                            STR R0,[R1]        
  146.  
  147.                                                         
  148.  
  149.                                             LDR R0,= 0x00001001  
  150.  
  151.                                            LDR R1,= 0xA0000010  
  152.  
  153.                                            STR R0,[R1]          
  154.  
  155.    
  156.  

好了,我们以此为样本,编写我们的脚本文件Config.ini,最终的内容如下:

 
 
  1. //初始化SRAM3 0x68000000 - 0x68020000      
  2.  
  3. FUNC void InitSRAM3(void)  
  4.  
  5. {  
  6.  
  7.    //使能FSMC时钟  
  8.  
  9.    _WDWORD(0x40021014,0x00000114);  
  10.  
  11.    //使能FSMC相关的GPIO的时钟  
  12.  
  13.    _WDWORD(0x40021018,0x000001E0);  
  14.  
  15.    
  16.  
  17.    //配置SRAM数据线,NOE和NWE配置  
  18.  
  19.    //SRAM地址线配置  
  20.  
  21.    //NOE和NWE配置  
  22.  
  23.    //NE3配置  
  24.  
  25.    //NBL0,NBL1配置  
  26.  
  27.    _WDWORD(0x40011400,0x44BB44BB);  
  28.  
  29.    _WDWORD(0x40011404,0xBBBBBBBB);  
  30.  
  31.    _WDWORD(0x40011800,0xB44444BB);  
  32.  
  33.    _WDWORD(0x40011804,0xBBBBBBBB);     
  34.  
  35.    _WDWORD(0x40011C00,0x44BBBBBB);  
  36.  
  37.    _WDWORD(0x40011C04,0xBBBB4444);  
  38.  
  39.    _WDWORD(0x40012000,0x44BBBBBB);  
  40.  
  41.    _WDWORD(0x40012004,0x44444B44);  
  42.  
  43.    
  44.  
  45.    //FSMC配置  
  46.  
  47.    //使能 FSMC Bank1_SRAM Bank  
  48.  
  49.    _WDWORD(0xA0000010,0x00001000);  
  50.  
  51.    _WDWORD(0xA0000014,0x00000200);  
  52.  
  53.    _WDWORD(0xA0000114,0x0FFFFFFF);  
  54.  
  55.    _WDWORD(0xA0000010,0x00001001);  
  56.  
  57. }  
  58.  
  59.    
  60.  
  61. InitSRAM3();  
  62.  
  63. exec("LOAD C:\\MicroFramework_CortexM3\\BuildOutput\\THUMB2\\MDK3.1\\le\\RAM\\debug\\STM3210E\\bin\\NativeSample.axf INCREMENTAL");  
  64.  
  65. PC = 0x20001000;  
  66.  

 

先不要忙下载,我们还要编写一个LED灯闪烁的代码。

我们在.\Solutions\STM3210E\NativeSample\NativeSample.cpp文件中添加如下代码:

 
 
  1. typedef volatile unsigned long  vu32;  
  2.  
  3. typedef unsigned long  u32;  
  4.  
  5. typedef unsigned short  u16;  
  6.  
  7. typedef struct 
  8.  
  9. {  
  10.  
  11.   vu32 CRL;  
  12.  
  13.   vu32 CRH;  
  14.  
  15.   vu32 IDR;  
  16.  
  17.   vu32 ODR;  
  18.  
  19.   vu32 BSRR;  
  20.  
  21.   vu32 BRR;  
  22.  
  23.   vu32 LCKR;  
  24.  
  25. } GPIO_TypeDef;  
  26.  
  27.    
  28.  
  29. #define PERIPH_BASE           ((u32)0x40000000)  
  30.  
  31. #define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)  
  32.  
  33. #define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)  
  34.  
  35. #define GPIOF                 ((GPIO_TypeDef *) GPIOF_BASE)  
  36.  
  37. #define GPIO_Pin_6                 ((u16)0x0040)   
  38.  
  39. #define GPIO_Pin_7                 ((u16)0x0080)   
  40.  
  41.    
  42.  
  43. void ApplicationEntryPoint()  
  44.  
  45. {   
  46.  
  47.      //..................  
  48.  
  49.      
  50.  
  51.     //初始化  
  52.  
  53.     u32 GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;  
  54.  
  55.     u32 pinpos = 0x00,pos = 0x00,pinmask = 0x00;  
  56.  
  57.     u32 tmpreg = GPIOF->CRL;  
  58.  
  59.     for (int pinpos = 0x00; pinpos < 0x08; pinpos++)  
  60.  
  61.     {  
  62.  
  63.       pos = ((u32)0x01) << pinpos;  
  64.  
  65.       if ((GPIO_Pin & pos) == pos)  
  66.  
  67.       {  
  68.  
  69.         pos = pinpos << 2;  
  70.  
  71.         //Clear the corresponding low control register bits  
  72.  
  73.         pinmask = ((u32)0x0F) << pos;  
  74.  
  75.         tmpreg &= ~pinmask;       
  76.  
  77.                 //Write the mode configuration in the corresponding bits   
  78.  
  79.                 tmpreg |= ((u32)0x3) << pos;  
  80.  
  81.       }  
  82.  
  83.     }  
  84.  
  85.     GPIOF->CRL = tmpreg;  
  86.  
  87.    
  88.  
  89.     //设置  
  90.  
  91.     while(TRUE)  
  92.  
  93.     {  
  94.  
  95.        GPIOF->BSRR = GPIO_Pin_6;  
  96.  
  97.           GPIOF->BSRR = GPIO_Pin_7;  
  98.  
  99.        for(long i=0;i<1000000;i++);  
  100.  
  101.        GPIOF->BRR = GPIO_Pin_6;  
  102.  
  103.           GPIOF->BRR = GPIO_Pin_7;  
  104.  
  105.           for(long i=0;i<1000000;i++);  
  106.  
  107.     }  
  108.  
  109. }  
  110.  

好了,在MDK中新建一个基于Cortex-M3的工程,并选择我们编写好ini文件,然后调试开始(MDK 详细的调试方式,请参见相关文档,由于MDK本地化很出色,所以很容易上手)。下面是调试过程中的MDK界面:

 

 

然后在看一下EM-STM3210E开发板,哈!你会发现D1和D2 LED灯正在闪烁。

不过不要高兴太早,我们现在完成的工作,恰是万里长征的第一步,更烦琐复杂的工作在后面呢。因为我们选用的是Cortex-M3架构的芯片,目前.Net Micro Framework并不支持。关键问题在于Cortex-M3的中断架构和ARM7和ARM9有了很大的不同,并且中断向量表的位置也不一定放在0地址起始处,而是通过NVIC来进行配置,并且该开发板内存较小,所以相关代码要放到Nor Flash中进行启动,这和.Net Micro Framework惯常的方式不同,所以我们需要自行重建和修改很多代码,方能使我们的开发板正常工作(不过.Net Micro Framework的初学者也不要为此过多的担忧,如果你选用的是基于ARM7或ARM9架构的芯片,那么你的工作就会容易的多)。

下面我们要做的工作依次为:编写中断向量表、修改启动代码、调整和原先中断相关的代码、时钟初始化、NVIC初始化、FMSC初始化、SRAM初始化、串口初始化、IO驱动开发、Nand Flash驱动开发、I2C驱动开发、SPI驱动开发、LED驱动开发、LCD驱动开发… …

路漫漫其修远兮,吾将上下而求索 -- 其实嵌入式开发是一个充满挑战和乐趣的事!

 







本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/321238,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值