移植uC/OS-II到STM32F103C8T6上(参考了野火的移植手册)

(从?0?开?始?移?植?U?C?O?S? ?I?I?到?野?火?s?t?m?3?2?开?发?板)可直接从百度文库中找到


主要参考第三章,由于野火用的是STM32F103VET6,而我的是STM32F103C8T6,需要把启动文件“startup_stm32f10x_hd.s”换成“startup_stm32f10x_md.s”,
startup_stm32f10x_ld.s
startup_stm32f10x_md.s
startup_stm32f10x_hd.s
其中,ld.s适用于小容量 产品;md.s适用于中等容量产品;hd适用于大容量产品;
这里的容量是指FLASH的大小.判断方法如下:
小容量:FLASH≤32K
中容量:64K≤FLASH≤128K
大容量:256K≤FLASH



在3.8节中修改 startup_stm32f10x_hd.s,就换成修改 startup_stm32f10x_md.s


在3.10编写BSP中,用下面提供的BSP.c代替野火提供的BSP.c


BSP.c
【移植uC/OS-II到STM32F103C8T6上(参考了野火的移植手册)】/**************************************************************************************************************************/

#include "includes.h"

/*
* 函数名 : BSP_Init
* 描述: 时钟初始化、硬件初始化
* 输入: 无
* 输出: 无
*/
void BSP_Init(void)
{
SystemInit(); /* 配置系统时钟为72MHz */
SysTick_init(); /* 初始化并使能Systick定时器 */
LED_Init(); /* LED端口初始化 */
}


/*
* 函数名 : SysTick_init
* 描述: 配置 SysTick定时器
* 输入: 无
* 输出: 无
*/
void SysTick_init(void)
{
RCC_ClocksTypeDefrcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
SysTick_Config(rcc_clocks.HCLK_Frequency/OS_TICKS_PER_SEC); // 初始化并使能SysTick定时器
}

/**************************************************************************************************************************/

由于野火移植手册中没提供led.c和led.h,根据我自己的开发板我写的led.c和led.h如下:


led.c
/*************************************************************************************************************************/
#include "led.h"

//LED IO初始化
void LED_Init(void)
{

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE); //使能PB,PA端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PA.5 端口配置, 推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOA,GPIO_Pin_5); //PA.5 输出高
}


/*****************************************************************************************************************************/




led.h


/**************************************************************************************************************************/
#ifndef __LED_H
#define __LED_H
#include "sys.h"

#define LED0 PBout(5)// PB5
#define LED1 PAout(5)// PA5

void LED_Init(void); //初始化

#endif

/**************************************************************************************************************************/
我还用到了野火没有提到的两个文件sys.h和sys.c,分别如下所示:


sys.h
/**************************************************************************************************************************/

#ifndef __SYS_H
#define __SYS_H
#include "stm32f10x.h"

//0,不支持ucos
//1,支持ucos
#define SYSTEM_SUPPORT_UCOS 1//定义系统文件夹是否支持UCOS

//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)*((volatile unsigned long*)(addr))
#define BIT_ADDR(addr, bitnum)MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr(GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr(GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr(GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr(GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr(GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr(GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr(GPIOG_BASE+12) //0x40011E0C

#define GPIOA_IDR_Addr(GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr(GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr(GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr(GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr(GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr(GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr(GPIOG_BASE+8) //0x40011E08

//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)BIT_ADDR(GPIOA_ODR_Addr,n)//输出
#define PAin(n)BIT_ADDR(GPIOA_IDR_Addr,n)//输入

#define PBout(n)BIT_ADDR(GPIOB_ODR_Addr,n)//输出
#define PBin(n)BIT_ADDR(GPIOB_IDR_Addr,n)//输入

#define PCout(n)BIT_ADDR(GPIOC_ODR_Addr,n)//输出
#define PCin(n)BIT_ADDR(GPIOC_IDR_Addr,n)//输入

#define PDout(n)BIT_ADDR(GPIOD_ODR_Addr,n)//输出
#define PDin(n)BIT_ADDR(GPIOD_IDR_Addr,n)//输入

#define PEout(n)BIT_ADDR(GPIOE_ODR_Addr,n)//输出
#define PEin(n)BIT_ADDR(GPIOE_IDR_Addr,n)//输入

#define PFout(n)BIT_ADDR(GPIOF_ODR_Addr,n)//输出
#define PFin(n)BIT_ADDR(GPIOF_IDR_Addr,n)//输入

#define PGout(n)BIT_ADDR(GPIOG_ODR_Addr,n)//输出
#define PGin(n)BIT_ADDR(GPIOG_IDR_Addr,n)//输入

void NVIC_Configuration(void);

#endif



/**************************************************************************************************************************/


sys.c
/**************************************************************************************************************************/

#include "sys.h"

void NVIC_Configuration(void)
{


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级


}

/**************************************************************************************************************************/

sys.c和sys.h放在BSP文件下就行。其他部分只要按照野火移植手册的第三章做就行。编译,下载到开发板上能得到想要的效果。


stm32f10x的其他芯片同理可以的到正确移植。只是启动文件不同而已。








    推荐阅读