首先我们要熟悉整个工程架构。
这是裸机下的工程结构主要有STARTCODE ,USER,FWLib,CMSIS 四个文件夹。
STARTCODE: 启动代码,这是一段用汇编编写的系统启动文件,我们需要将他们包含在我们的工程中取。
启动文件的作用是:1 初始化堆栈指 针 SP 2初始化程序计数器指针PC,3 设置异常向量表的入口地址
4配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板可没有SRAM),
5.设置C库的分支入口——main(最终用来调用mai函数n。)
USER:USER用来存放工程文件和用户代码,包括主函数main.c, stm32f10x_it.h、和
stm32f10x_it.c这两个文件里面是中断函数,里面为空,并没有写任何的中断
服务程序。stm32f10x_conf.h是用户需要配置的头文件,当我们需要用到芯片
中的某部分外设的驱动时,我们只需要在该文件下将该驱动的头文件包含
进来即可
FWLib:由两部分组成src和inc。。。。。。片上外设的驱动在src文件夹中,inc文件夹里面是它们的头文件
src里面是每个片上外设的驱动程序,这些外设当中是芯片制造商在Cortex——M3核上加进去的,Cortex-M3核自带的外设是通用的,放在
CMSIS文件下。
CMSIS : CMSIS用来存放库为我们自带的启动文件和一些M3系列的通用文件。CMSIS里面存放的文件适合任何M3内核的单片机。CMSIS的
缩写为: Cortex Microcontroller Software Interface Standard,是ARM Cortex微控制器
软件接口标准,是ARM公司为芯片厂商提供的一套通用的且独立于芯片厂商
的处理器软件接口。system_stm32f10x.c是ARM公司提供的符合CMSIS标准的库文件,主要是系统时钟的配置,有72M,36M,20M,48M等,
system_stm32f10x.c功能是根据HSE或者HSI设置系统时钟和总线时钟(AHB、APB1、APB2总线)。系统时钟可以由HSI单独提供,也可以让HSI二分频之后经过PLL(锁相环)提供,也可以由HSE经过PLL之后获得。具体可参考STM32的时钟树:
system_stm32f10x.c在实现系统时钟的时候要用到PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了stm32f10x.h 这个头文件。
stm32f10x.h 这个文件非常重要,是一个非常底层的文件,在这里我们可以学习到寄存器,也就是内存,我们访问寄存器也就是在访问内存。它先把内存地址先强制类型转换为指针,再把该指针实现为一个宏。
假如我们在操作寄存器的时候都是在用这种方法的话会有什么缺点没。当然有:
1.地址容易写错
2我们需要查大量的手册来确定那个地址对应那个寄存器
3看起来还不好看,且容易造成编程的错误,效率低,影响开发进度
所以处理器厂商将会对内存的操作封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的开发环境中。这样,我们在开发自己的应用程序的时候将这个文件包含进来就可以了。
具体的话可以参考 野火stm32-详解如何用STM32官方库来开发自己的程序。。
聪明的工程师都会善于利用别人搭好的舞台来唱自个的戏。不要任何事情还是劈头盖脸的从最基础的部分做起,这在开发
中是要不得的,但是学习的话,一定要搞清楚因过。
core_cm3.c是CMSIS Cortex-M3核外设接入层的源文
件,它的作用是为那些采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口
同时那core_cm3.c 里面包含了一些跟编译器相关的信息,如:RealView Compiler,ICC Compiler,GNU Compiler。
core_cm3.h 这个文件实现了CM3内核里面的NVIC和SysTick这两个资源的所有功能,NVIC是嵌套向量中断控制器,SysTick是CM3内核里面的一个简单的定时器,其时钟由外部时钟源(STCLK)或内核时钟(FCLK)来提供,一般我们在编程的时候选择FCLK作为它的运行时钟,FCLK由SYSCLK 八分频得到。NVIC的寄存器是以存储器映射的方式来访问的,所以core_cm3.h 头文件中也包含了寄存器的存储映射和一些宏声明
core_cm3.c是CMSIS Cortex-M3核外设接入层的源文
件,它的作用是为那些采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口
同时那core_cm3.c 里面包含了一些跟编译器相关的信息,如:RealView Compiler,ICC Compiler,GNU Compiler。
core_cm3.h 这个文件实现了CM3内核里面的NVIC和SysTick这两个资源的所有功能,NVIC是嵌套向量中断控制器,SysTick是CM3内核里面的一个简单的定时器,其时钟由外部时钟源(STCLK)或内核时钟(FCLK)来提供,一般我们在编程的时候选择FCLK作为它的运行时钟,FCLK由SYSCLK 八分频得到。NVIC的寄存器是以存储器映射的方式来访问的,所以core_cm3.h 头文件中也包含了寄存器的存储映射和一些宏声明。
假如我们在操作寄存器的时候都是用这种方法的话会有什么缺点没。当然有
总结:stdint.h是ANSIC.c头文件,位于RVMDK这个开发环境的安装目录,是开发环境自带的其功能是提供一些数据类型的定义、
core_cm.h syetem_stm32f10x.h是由ARM公司为SOC厂商提供的基于Cortex-M3核的外设接口层。这两个头文件分别对用一个C
文件 ,还要将启动文件也加进来。
stm32f10x.h实现了存储器映射和寄存器的声明,是一个非常重要的头文件。同时我们可以通过stm32f10x_conf.h这个头文件方便的选择某些外设的驱动程序
ANSIC.c 1983 美国国家标准协会(ANSI)根据C语音问世以来各种版本对C的发展和扩充,制定的新的标准。
下面是有操作系统的工程架构。
USER 中的main
int main(void)
{
/* 设置系统时钟为72M */
BSP_Init();
OSInit();
OSTaskCreate(Task_LED,(void*)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);
OSStart();
return 0;
}
bsp.c
#include "includes.h"
void BSP_Init(void)
{
SystemInit();
SysTick_init();
LED_GPIO_Config();
}
void SysTick_init(void)
{
SysTick_Config(SystemFrequency/OS_TICKS_PER_SEC);
}
bsp.h
#ifndef __BSP_H
#define __BSP_H
void SysTick_init(void);
void BSP_Init(void);
#endif //__BSP_H
stm32f10x_it.c 主要写各种各样的中断,这里指的是SysTick中断的代码
void SysTick_Handler(void)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
includes.h主要写
#ifndef _INCLUDES_H__
#define _INCLUDES_H__
#include "stm32f10x.h" //实现了存储器和寄存器的声明,这是芯片公司写的所有外设驱动程序
#include "stm32f10x_rcc.h" // 是英文RESET and clock control是复位和时钟控制,STM32片上的一个外设。
#include "ucos_ii.h" //uc/COS2 系统函数头文件
#include "BSP.h" //与开发板相关的函数,系统初始化,滴答滴时钟,外设等。
#include "app.h" // 用户任务函数,就是利用操作系统下的函数写的
#include "led.h" // LED驱动函数,即裸机下面的
#endif //_INCLUDES_H__
APP下面的
app.c 写成
#include "includes.h"
void Task_LED (void *p_arg)
{
(void)p_arg;
while(1)
{
LED1(ON);
OSTimeDlyHMSM(0, 0, 0,500);
LED1(OFF);
LED2(ON);
OSTimeDlyHMSM(0, 0, 0,500);
LED2(OFF);
LED3(ON);
OSTimeDlyHMSM(0, 0, 0,500);
LED3(OFF);
}
}
app.h
#ifndef _APP_H_
#define _APP_H_
void Task_LED(void *p_arg);
#endif //_APP_H_
app.cfg.h
#ifndef __APP_CFG_H__
#define __APP_CFG_H__
/*******************设置任务优先级*******************/
#define STARTUP_TASK_PRIO 4
/************设置栈大小(单位为 OS_STK )************/
#define STARTUP_TASK_STK_SIZE 80
#endif
#############这是ports下面的几个程序改的地方。
os-cfg.h是用来配置系统功能的,我们通过修改它达到剪裁系统功能的目的。
os-cpu.h注释掉
void OS_CPU_SysTickHandler(void);
void OS_CPU_SysTickInit(void);
INT32U OS_CPU_SysTickClkFreq(void);
修改os_CPU_C.c
所有关于系统时钟的都注释掉。
修改os_CPU_a.asm:编译器的原因
1.将PUPLIC改成EXPORT.
2.将RESG CODE:CODE:NOROOT(2)
改成
AREA |.text|,CODE ,READONLY,ALIGN=2
THUMB
REQUIRE8
PRESERVE8
修改os_dbg.c原因:编译器的原因。因为我复制的代码是从IAR里面的,现在是MDK的。
#define OS_COMPILER_OPT __root改成
#define OS_COMPILER_OPT
修改startup_stm32f10x_hd.s 将所有出现的PendSV_Handler改成 OS_CPU_PendSVHandler 。
APP文件主要是创建任务,利用ucos2提供的API,而BSP文件则是屏蔽 了所有的硬件驱动(不同的板子不一样哦),ucos2主要是与编译器的不一样,,系统时钟的改变。主函数,则是非常简单的几句话,
/* 设置系统时钟为72M */
BSP_Init();
OSInit();
OSTaskCreate(Task_LED,(void*)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);
OSStart();
return 0;
硬件初始化,操作系统初始化,创建任务,开始任务。结束
这就是计算机最重要的思想-------分层。和数学中的等价代换非常的相似!
core_cm3.c是CMSIS Cortex-M3核外设接入层的源文
件,它的作用是为那些采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口
同时那core_cm3.c 里面包含了一些跟编译器相关的信息,如:RealView Compiler,ICC Compiler,GNU Compiler。
core_cm3.h 这个文件实现了CM3内核里面的NVIC和SysTick这两个资源的所有功能,NVIC是嵌套向量中断控制器,SysTick是CM3内核里面的一个简单的定时器,其时钟由外部时钟源(STCLK)或内核时钟(FCLK)来提供,一般我们在编程的时候选择FCLK作为它的运行时钟,FCLK由SYSCLK 八分频得到。NVIC的寄存器是以存储器映射的方式来访问的,所以core_cm3.h 头文件中也包含了寄存器的存储映射和一些宏声明。