移植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

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

#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_ClocksTypeDef  rcc_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_InitTypeDef  GPIO_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的其他芯片同理可以的到正确移植。只是启动文件不同而已。





你可能感兴趣的:(硬件开发)