【.Net Micro Framework PortingKit - 06】设置芯片时钟

简介: 上两篇《修改启动代码&重写向量表》《SRAM初始化&设置NVIC中断表偏移》文章中,我们设置了中断向量表,初始化了RAM,并重设了向量表的地址,本篇文章是相对重要的一篇,我们将设置芯片时钟

上两篇《修改启动代码&重写向量表》《SRAM初始化&设置NVIC中断表偏移》文章中,我们设置了中断向量表,初始化了RAM,并重设了向量表的地址,本篇文章是相对重要的一篇,我们将设置芯片时钟。

1、新建CortexM3.h头文件

   在./DeviceCode/Targets/Native/CortexM3目录中新建 CortexM3.h文件,并编写如下代码:

#ifndef _CORTEXM3_H_

#define _CORTEXM3_H_1

 

#include <cores/arm/include/cpu.h>

 

typedef volatile unsigned long  VU32;

typedef volatile unsigned short VU16;

typedef volatile unsigned char  VU8;

 

extern "C"

{

    void BootstrapCode_Clocks();

}

 

/*------------------------ Reset and Clock Control ---------------------------*/

struct CortexM3_RCC

{

    static const UINT32 c_Base = 0x40021000;

   

    static const    UINT8 FLAG_HSIRDY = ((UINT8)0x20);

    static const    UINT8 FLAG_HSERDY = ((UINT8)0x31);

 

    /****/ volatile UINT32  CR;

    static const    UINT32  CR_HSEBYP_Reset = ((UINT32)0xFFFBFFFF);

    static const    UINT32  CR_HSEBYP_Set = ((UINT32)0x00040000);

    static const    UINT32  CR_HSEON_Reset = ((UINT32)0xFFFEFFFF);

    static const    UINT32  CR_HSEON_Set = ((UINT32)0x00010000);

    static const    UINT32  CR_HSITRIM_Mask = ((UINT32)0xFFFFFF07);

 

    /****/ volatile UINT32  CFGR;

    static const    UINT32  CFGR_SYSCLK_Div1 = ((UINT32)0x00000000);

    static const    UINT32  CFGR_SYSCLK_Div2 = ((UINT32)0x00000080);

    static const    UINT32  CFGR_SYSCLK_Div4 = ((UINT32)0x00000090);

    static const    UINT32  CFGR_SYSCLK_Div8 = ((UINT32)0x000000A0);

    static const    UINT32  CFGR_SYSCLK_Div16 = ((UINT32)0x000000B0);

    static const    UINT32  CFGR_HCLK_Div1 = ((UINT32)0x00000000);

    static const    UINT32  CFGR_HCLK_Div2 = ((UINT32)0x00000400);

    static const    UINT32  CFGR_HCLK_Div4 = ((UINT32)0x00000500);

    

    // 省略部分代码 .....

   

    /****/ volatile UINT32  APB1RSTR;

    /****/ volatile UINT32  AHBENR;

    /****/ volatile UINT32  BDCR;

    /****/ volatile UINT32  CSR;

 

    static void Initialize();

    static bool GetFlagStatus(UINT8 Flag);

};

 

struct CortexM3

{

    static CortexM3_RCC  & RCC()   { return *(CortexM3_RCC *)(size_t)(CortexM3_RCC::c_Base); }

};

 

#endif // _CORTEXM3_H_1

 

 

2、编写BootStrap代码

我们从./DeviceCode/Drivers/Stubs/Processor/stubs_bootstrap目录到./DeviceCode/Targets/Native/CortexM3/DeviceCode,并修改目录的名字为BootStrap,下一步我们在BootStrap.cpp文件编写如下代码:

   #include <tinyhal.h>

#include "../CortexM3.h"

 

//--//

 

#pragma arm section code = "SectionForBootstrapOperations"

 

void __section(SectionForBootstrapOperations) CortexM3_RCC::Initialize (void)

{

         CortexM3_RCC &RCC = CortexM3::RCC();

 

        // RCC system reset(for debug purpose)

         /* Set HSION bit */

         RCC.CR |= (UINT32)0x00000001;

 

         /* Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits */

         RCC.CFGR &= (UINT32)0xF8FF0000;

 

         /* Reset HSEON, CSSON and PLLON bits */

         RCC.CR &= (UINT32)0xFEF6FFFF;

 

         // 省略部分代码 .....

  

         /* Enable GPIOA, GPIOB, GPIOF, GPIOG and AFIO clocks */

         RCC.APB2ENR |= CortexM3_RCC::APB2RSTR_GPIOA | CortexM3_RCC::APB2RSTR_GPIOB | CortexM3_RCC::APB2RSTR_GPIOF |CortexM3_RCC::APB2RSTR_GPIOG |CortexM3_RCC::APB2RSTR_AFIO;

}

 

bool __section(SectionForBootstrapOperations)  CortexM3_RCC::GetFlagStatus(UINT8 Flag)

{

         UINT32 tmp = 0;

         UINT32 statusreg = 0;

         CortexM3_RCC &RCC = CortexM3::RCC();

 

         /* Get the RCC register index */

         tmp = Flag >> 5;

         if (tmp == 1)               /* The flag to check is in CR register */

         {

                   statusreg = RCC.CR;

         }

         else if (tmp == 2)          /* The flag to check is in BDCR register */

         {

                   statusreg = RCC.BDCR;

         }

         else                       /* The flag to check is in CSR register */

         {

                   statusreg = RCC.CSR;

         }

 

         /* Get the flag position */

         tmp = Flag & ((UINT8)0x1F);

         return ((statusreg & ((UINT32)1 << tmp)) != 0);

}

 

 

void __section(SectionForBootstrapOperations) BootstrapCode_Clocks()

{

     CortexM3_RCC::Initialize();

}

 

extern "C"

{

 

void __section(SectionForBootstrapOperations) BootstrapCode()

{

          BootstrapCode_Clocks();

}

 

}

 

#pragma arm section code

 

  3、修改./Solutions/STM3210E/NativeSample/NativeSample.proj文件

   在NativeSample.proj文件中作如下修改: 

 

  <ItemGroup>

    <RequiredProjects Include="$(SPOCLIENT)/DeviceCode/Targets/Native/CortexM3/DeviceCode/stubs_bootstrap/dotNetMF.proj" />

    <DriverLibs Include="cpu_bootstrap_stubs.$(LIB_EXT)" />

  </ItemGroup>

  修改为:

  <ItemGroup>

    <RequiredProjects Include="$(SPOCLIENT)/DeviceCode/Targets/Native/CortexM3/DeviceCode/BootStrap/dotNetMF.proj" />

    <DriverLibs Include="BootStrap.$(LIB_EXT)" />

  </ItemGroup>

 

  4、编译修改并调试运行,我想这次会有很大的成就感,因为LED闪烁的节奏明显的加快了,我们的CPU在高速运行了!

 

即将过去的2010年的前三天,对我来说是辛苦的三天,平均每天工作16个小时以上,不仅编写了相关代码,还写了以上六篇文章。希望我的这些努力能点燃.Net Micro Framework爱好者心中的热情,动起手来一起移植.Net Micro Framework,其实这对自己的嵌入式开发功力的提高也大有裨益。明天就要上班了,我将又回到开发Wifi相关接口的工作上来,后续的文章我想只有到下周末才能相见了,到那时我们将编写串口驱动,系统的一些调试信息将可以通过串口传输给PC机上的串口调试程序,这一步将是关键的一步,非常值得的期待,希望我能顺利完成这步工作!

相关文章
|
1月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
499 2
|
4月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
343 3
|
1月前
|
开发框架 安全 .NET
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
.NET Framework是Windows平台的开发框架,包含CLR和FCL,支持多种语言开发桌面、Web应用。常用版本有3.5、4.5.2、4.8.1,系统可同时安装多个版本,确保软件兼容运行。
545 0
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
|
2月前
|
C++
提示缺少.NET Framework 3.5 安装错误:0x80070002、0x800F0950\0x80004002
.NET Framework常见问题及解决方法汇总,
454 0
|
3月前
.NET Framework 3.5离线安装包合集下载
本文介绍了如何获取和安装.NET Framework运行库离线合集包。用户可通过提供的链接下载安装包,安装过程简单,按提示逐步操作即可完成。安装时可选择所需版本,工具会自动适配架构,无需手动判断,方便高效。
1531 0
|
4月前
|
C++ Windows
WindowsDLL修复专家,MSVCP**、DLL修复vcruntime**、DLL修复、`.Net Framework`缺失、DirectX类DLL修复、VC运行库修复
Windows DLL修复专家是一款专为解决因DLL文件缺失、版本错误导致的软件或游戏无法运行问题的系统工具。它支持一键扫描和修复各类DLL异常,涵盖MSVCP、vcruntime、.NET Framework、DirectX等多种常见问题。具备自动检测、备份还原功能,确保修复过程安全可靠。适用于软件报错、系统异常及新系统适配场景,降低用户手动修复门槛,提升系统稳定性与兼容性。
196 3
NET Framework安装失败的麻烦
本人机子环境是安装了VS2012,即安装了 .NET Framework4.5,现在要安装AutoCAD2013,而安装CAD2013需要安装4.0的Framework,由于本机已有高版本的Framework,安装自然报错: 又不想来卸载4.5,觉得麻烦,但又想装上CAD2013,唯一的方法是修改Setup.ini初始化文件。
1212 0
|
11月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
331 5
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
228 7

热门文章

最新文章

下一篇
oss云网关配置