博客
关于我
【.Net Micro Framework PortingKit - 03】调试初步:点亮LED灯
阅读量:470 次
发布时间:2019-03-06

本文共 3849 字,大约阅读时间需要 12 分钟。

好的,我们已经构建好了STM3210的基本平台,并且已经编译通过,所以我们下一步就要考虑用MDK进行下载调试了。由于我们用到了片外SRAM,所以我们还得写一个MDK脚本,实现三点功能:一是SRAM初始化,二是下载镜像文件,三是设置PC指针。

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

; FSMC Bank1 NOR/SRAM3是用于STM3210E-EVAL的,如果需要其他银行,需要调整寄存器地址; 启用FSMC时钟LDR R0,= 0x00000114LDR R1,= 0x40021014STR R0,[R1]; 启用GPIOD、GPIOE、GPIOF和GPIOG时钟LDR R0,= 0x000001E0LDR R1,= 0x40021018STR R0,[R1]; SRAM数据线、NOE和NWE配置; SRAM地址线配置; NOE和NWE配置; NE3配置; NBL0、NBL1配置LDR R0,= 0x44BB44BBLDR R1,= 0x40011400STR R0,[R1]LDR R0,= 0xBBBBBBBBLDR R1,= 0x40011404STR R0,[R1]LDR R0,= 0x44BBBBBBLDR R1,= 0x40011C00STR R0,[R1]LDR R0,= 0xBBBB4444LDR R1,= 0x40011804STR R0,[R1]LDR R0,= 0x44BBBBBBLDR R1,= 0x40012000STR R0,[R1]LDR R0,= 0x44444B44LDR R1,= 0x40011C04STR R0,[R1]LDR R0,= 0x00001000LDR R1,= 0x40021014STR R0,[R1]; FSMC配置; 启用FSMC Bank1_SRAM BankLDR R0,= 0x00001000LDR R1,= 0xA0000010STR R0,[R1]LDR R0,= 0x00000200LDR R1,= 0xA0000014STR R0,[R1]LDR R0,= 0x0FFFFFFFLDR R1,= 0xA0000114STR R0,[R1]LDR R0,= 0x00001001LDR R1,= 0xA0000010STR R0,[R1]

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

//SRAM3 0x68000000 - 0x68020000FUNC void InitSRAM3(void){    //使能FSMC时钟    _WDWORD(0x40021014,0x00000114);    //使能FSMC相关的GPIO时钟    _WDWORD(0x40021018,0x000001E0);    //配置SRAM数据线、NOE和NWE配置    //SRAM地址线配置    //NOE和NWE配置    //NE3配置    //NBL0,NBL1配置    _WDWORD(0x40011400,0x44BB44BB);    _WDWORD(0x40011404,0xBBBBBBBB);    _WDWORD(0x40011800,0xB44444BB);    _WDWORD(0x40011804,0xBBBBBBBB);    _WDWORD(0x40011C00,0x44BBBBBB);    _WDWORD(0x40011C04,0xBBBB4444);    _WDWORD(0x40012000,0x44BBBBBB);    _WDWORD(0x40012004,0x44444B44);    //FSMC配置    //使能FSMC Bank1_SRAM Bank    _WDWORD(0xA0000010,0x00001000);    _WDWORD(0xA0000014,0x00000200);    _WDWORD(0xA0000114,0x0FFFFFFF);    _WDWORD(0xA0000010,0x00001001);}InitSRAM3();exec("LOAD C:\\MicroFramework_CortexM3\\BuildOutput\\THUMB2\\MDK3.1\\le\\RAM\\debug\\STM3210E\\bin\\NativeSample.axf INCREMENTAL");PC = 0x20001000;

先不要忙下载,我们还要编写一个LED灯闪烁的代码。我们在.\Solutions\STM3210E\NativeSample\NativeSample.cpp文件中添加如下代码:

typedef volatile unsigned long vu32;typedef unsigned long u32;typedef unsigned short u16;typedef struct{    vu32 CRL;    vu32 CRH;    vu32 IDR;    vu32 ODR;    vu32 BSRR;    vu32 BRR;    vu32 LCKR;} GPIO_TypeDef;#define PERIPH_BASE ((u32)0x40000000)#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)#define GPIO_Pin_6 ((u16)0x0040)#define GPIO_Pin_7 ((u16)0x0080)void ApplicationEntryPoint(){    //..................    u32 GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;    u32 pinpos = 0x00, pos = 0x00, pinmask = 0x00;    u32 tmpreg = GPIOF->CRL;    for (int pinpos = 0x00; pinpos < 0x08; pinpos++)    {        pos = ((u32)0x01) << pinpos;        if ((GPIO_Pin & pos) == pos)        {            pos = pinpos << 2;            pinmask = ((u32)0x0F) << pos;            tmpreg &= ~pinmask;            tmpreg |= ((u32)0x3) << pos;        }    }    GPIOF->CRL = tmpreg;    while(TRUE)    {        GPIOF->BSRR = GPIO_Pin_6;        GPIOF->BSRR = GPIO_Pin_7;        for(long i=0;i<1000000;i++)        {            GPIOF->BRR = GPIO_Pin_6;            GPIOF->BRR = GPIO_Pin_7;        }    }}

然后在MDK中新建一个基于Cortex-M3的工程,并选择我们编写好的ini文件,然后调试开始。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初始化、FSMC初始化、SRAM初始化、串口初始化、IO驱动开发、Nand Flash驱动开发、I2C驱动开发、SPI驱动开发、LED驱动开发、LCD驱动开发……路漫漫其修远兮,吾将上下而求索

其实嵌入式开发是一个充满挑战和乐趣的事!

转载地址:http://acxbz.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
查看>>