(从?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控制功能
//具体实现思想,参考<
//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的其他芯片同理可以的到正确移植。只是启动文件不同而已。
推荐阅读
- STM32定时器自动重装载寄存器和预加载寄存器的区别与联系
- UCOS与LWIP使用过程中遇到的进入HardFault_Handler的问题
- Keil使用malloc异常进入hardfault调试故障手记