《Cortex-M0权威指南》之Cortex-M0编程入门

转载请注明来源:cuixiaolei的技术博客


嵌入式系统编程入门 

微控制器是如何启动的

  为了保存编译号的二进制程序代码,大多数的现代微控制器都会包含片上flash存储器。有些微控制器还可能有一个独立的启动ROM,里面装有Bootloader程序。微控制器启动后,再执行flash的用户程序前,Bootloader会首先运行。编程

  在复位流程中,处理器会取出MSP的初始化值和复位向量,而后开始执行复位处理,这些信息都放在一个叫作启动代码的程序文件中。启动代码中的复位处理可能还会旅行初始化的职责,好比时钟控制电路和锁相环PLL的初始化。有些状况下,系统初始化的工做是放在C程序的main()函数中进行的。并发

  对于用C开发的应用程序,在进入主流程以前,启动代码已经开始执行,而且对应用程序用到的变量和内存等进行初始化。启动代码无需编程者担忧,C开发工具会将其自动插入程序映像中。函数

  执行完C启动代码后,应用程序就开始执行了,应用程序一般包含下面几个部分:工具

  • 硬件初始化(如时钟,PLL和外设)
  • 应用程序的处理部分
  • 中断服务程序

  另外,应用程序可能会用到C语言库,此时,C编译器/连接器会将所须要的库函数加入编译好的程序映像中。开发工具

  硬件初始化可能会涉及到一系列的外设、系统控制寄存器和中断控制器。若是在复位处理时没有进行处理,系统时钟控制和PLL此时也须要进行初始化。外设初始化完成后,程序就能够继续执行应用程序部分了。ui

 

嵌入式程序设计

  应用程序处理流程的实现方式以下:操作系统

  • 轮询,如图4-4
  • 中断驱动,如图4-5
  • 轮询和中断组合使用,如图4-6
  • 处理并发任务(操做系统),如图4-7

 

 

  对于复杂的应用程序,可使用实时操做系统(RTOS)。RTOS将处理器时间划分为多个时间片,在有多个应用进程运行时,只有一个进程会得到时间片。使用RTOS,须要有定时器产生周期性的中断请求,当一个时间片的时间到时,RTOS的任务调度器会由定时器中断触发,调度器判断是否须要执行上下文切换。若是须要进行上下文切换,调度器会暂停当前执行的任务,并切换到下一个准备就绪的任务。设计

 


 

输入和输出

  在许多嵌入式系统中,输入或输出可能会局限与简单的电子接口,如uart、IO、LCD、SD卡等,这些接口由微控制器的外设控制。blog

  Cortex-M0的寄存器映射到了系统空间,而且它们还控制这外设,外设的典型初始化步骤以下:接口

  1. 配置时钟控制回路,使能外设的时钟信号,若是有必要的话,初始化相应的引脚。在许多低功耗控制器中,时钟信号被分为了多路,并且为了下降功耗,它们能够单独开关。大多数时钟信号默认都是关闭的,配置外设前须要使能相应的时钟。有些状况下,还可能须要使能外设总线系统的时钟。
  2. 配置IO口。大多数控制器的引脚都是复用的,须要对IO引脚进行相应的功能配置。
  3. 配置外设。大多数外设有本身的控制寄存器,为了确保外设工做正常,须要对寄存器进行配置。
  4. 配置中断。若是外设操做须要中断处理,须要配置中断控制器(NVIC)。

 


 

开发流程

   在嵌入式开发中,可使用C、汇编、C和汇编混合编程。程序代码的生成流程以下图所示。

  C/汇编经过对应的编译器生成相应的目标文件,连接器脚本加载分散的目标文件生成可执行映像。

  混合编程的实现是由于C编译器提供了内联汇编器,以便在C程序文件中内联汇编代码。

 


C和汇编的选择


程序映像详解

  Cortex-M0的程序映像通常包括如下几部分:

  • 向量表
  • C启动代码
  • 程序代码(应用程序代码和数据)
  • C库代码(C库函数的程序代码,连接时插入)

 向量表

相关文章
相关标签/搜索