STM32F103 ucosii移植记录

1.下载ucosii源码
https://www.micrium.com/ 注册后选择芯片对应版本下载,手上的芯片为stm32F103ZET6 故下载了对应的IAR版本

2.基于stm32 标准库3.5建立工程
第一步:下载官方3.5的标准库STM32F10x_StdPeriph_Lib_V3.5.0
第二步:使用keil建立工程
a.Project –>New Uvision Project后选择自己所用的CPU后点Cancel
b.进入所建工程目录,删除Listings 和 Objects目录
c.新建目录:STM32F10x_FWLib,STM32F10xCore,OBJS,Function
d.复制文件:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 下文件—->STM32F10x_FWLib
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 下文件 —->STM32F10xCore
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下文件
startup_stm32f10x_hd.s —->STM32F10xCore

startup_stm32f10x_ld.s: 适用于小容量 FLASH≤32K产品
startup_stm32f10x_md.s : 适用于中等容量 64K≤FLASH≤128K产品
startup_stm32f10x_hd.s: 适用于大容量 256K≤FLASH产品

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 下文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h —->STM32F10xCore
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 下文件 stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h —->STM32F10xCore
Function目录下新建main.c文件
e.工程配置
右键Manage Project将文件添加进去
工程配置C/C++中Define配置STM32F10X_HD,USE_STDPERIPH_DRIVER(大容量STM32F10X_HD,中容量STM32F10X_MD,小容量STM32F10X_LD)
includePaths 指定头文件路径

3.在工程目录下新建UCOSII目录
复制Micrium\Software\uCOS-II\Source下.c文件到UCOSII\src目录下
复制Micrium\Software\uCOS-II\Source下.h文件到UCOSII\inc目录下
复制Micrium\Software\uCOS-II\Ports\arm-cortex-m3\Generic\IAR下文件到UCOSII\inc目录下
将文件分别添加到工程中编译,一堆错误,开始改错。
4.修改提示错误

  • os_cpu_a.asm:
    PUBLIC修改为EXPORT /PUBLIC适用IAR中导出到外部/
    RSEG CODE:CODE:NOROOT(2) 修改为
    PRESERVE8 /保持堆栈8字节对齐/
    AREA |.text|, CODE, READONLY /指定text代码段只读/
    THUMB

  • os_dbg.c
    修改#define OS_COMPILER_OPT //__root

  • os_cfg.h

    修改#define OS_APP_HOOKS_EN 0

  • os_cpu_c.c
    添加extern INT32U SystemCoreClock;
    修改cnts = OS_CPU_SysTickClkFreq() / OS_TICKS_PER_SEC; 为 cnts = SystemCoreClock / OS_TICKS_PER_SEC;

  • os_cpu_a.asm
    修改 PendSV_Handler 与 SysTickHandler为
    DCD OS_CPU_PendSVHandler ; PendSV Handler
    DCD OS_CPU_SysTickHandler ; SysTick Handler
    OS_CPU_PendSVHandler\
    PROC
    EXPORT OS_CPU_PendSVHandler [WEAK]
    B .
    ENDP
    OS_CPU_SysTickHandler\
    PROC
    EXPORT OS_CPU_SysTickHandler [WEAK]
    B .
    ENDP

至此编译已不报错

5.编写代码测试

#include "stm32f10x.h"                  
#include "ucos_ii.h"

#define START_TASK_PRIO                 10 //开始任务的优先级设置为最低
#define TASK_STK_SIZE                   64  //任务堆栈大小
#define LED1_TASK_PRIO                  7   //测试任务1优先级
#define LED2_TASK_PRIO                  6   //测试任务2优先级

OS_STK START_TASK_STK[TASK_STK_SIZE];
OS_STK LED1_TASK_STK[TASK_STK_SIZE];
OS_STK LED2_TASK_STK[TASK_STK_SIZE];

/*LED类型*/
typedef enum{
    F103_LED1=1,    //LED1
    F103_LED2,      //LED2
}LedType;


void startTask(void *pdata);
void LED1Task1(void *pdata);
void LED2Task2(void *pdata);
void InitLED(void);
void LEDOn(LedType led_type);
void LEDOff(LedType led_type);

int main(void)
{   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); 
    OS_CPU_SysTickInit();       // 系统时钟初始化
    InitLED();
    OSInit();                   //系统初始化
    OSTaskCreate(startTask,(void *)0,(OS_STK *)&START_TASK_STK[TASK_STK_SIZE-1],START_TASK_PRIO );//创建起始任务  
    OSStart();                  //开启系统
}

void startTask(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
    pdata = pdata; 
    OS_ENTER_CRITICAL();            //进入临界区(无法被中断打断)    
    OSTaskCreate(LED1Task1,(void *)0,(OS_STK*)&LED1_TASK_STK[TASK_STK_SIZE-1],LED1_TASK_PRIO);                         
    OSTaskCreate(LED2Task2,(void *)0,(OS_STK*)&LED2_TASK_STK[TASK_STK_SIZE-1],LED2_TASK_PRIO);             
    OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
    OS_EXIT_CRITICAL();             //退出临界区(可以被中断打断)
}

void LED1Task1(void * pdata)
{
    while (1)
    {
        LEDOn(F103_LED1);
        OSTimeDly(500);
        LEDOff(F103_LED1);
        OSTimeDly(500);
    }
}

void LED2Task2(void * pdata)
{
    while (1)
    {
        LEDOff(F103_LED2);
        OSTimeDly(500);
        LEDOn(F103_LED2);
        OSTimeDly(500);
    }   
}

void InitLED(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PE端口时钟
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    GPIO_Init(GPIOE,&GPIO_InitStructure);

    GPIO_SetBits(GPIOB, GPIO_Pin_5); //初始化为高
    GPIO_SetBits(GPIOE, GPIO_Pin_5); //初始化为高
}

void LEDOn(LedType led_type)
{
    switch (led_type)
    {
        case F103_LED1: GPIO_ResetBits(GPIOB,GPIO_Pin_5);break;
        case F103_LED2: GPIO_ResetBits(GPIOE,GPIO_Pin_5);break;
        default:
            break;
    }
}
void LEDOff(LedType led_type)
{
    switch (led_type)
    {
        case F103_LED1: GPIO_SetBits(GPIOB,GPIO_Pin_5);break;
        case F103_LED2: GPIO_SetBits(GPIOE,GPIO_Pin_5);break;
        default:
            break;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值