keil5 仿真usart窗口没有限制_STM32F103移植RTOS的Proteus仿真

从Proteus8.7开始,Labcenter Electronics公司在CPU仿真中加入了对CortexM3内核的支持,STM32F103系列单片机的大部分基础功能都可以在新版本的Proteus中仿真实现,经过多次调试,终于在8.7版本的proteus中实现了RTOS的移植,下面记录下移植过程。

项目仿真使用的CPU型号是STM32F103R6,截止RTOS移植前,项目已经实现了GPIO控制、SPI输出(管脚模拟的方式)、数码管显示(使用串口同步功能)、以及串口(异步)通信功能。电路如图 1所示。其中黄色的LED灯模拟GPIO输出功能;APA102真彩RGB灯来仿真SPI接口;串口通信用Proteus自带的终端测试,用到了USART1;数码管驱动使用的是74HC595,应用了USART2的同步功能。按键功能使用了74ls148芯片来实现,但是这次测试并没有添加到RTOS任务中。

b784a7af3bd8a7ed1d02512502e4bde9.png

图 1 硬件电路

STM32f103的开发环境使用的是Keil MKD5,资源库是使用的STM32F10x_AN2824_FW_V4.0.0官方库。RTOS移植前的代码已经实现了stm32的GPIO控制、EXTI中断、定时器中断、spi接口、串口等功能。RTOS移植前的项目代码结构如图 2所示。

cd0029637f181584d8a09e063748fc1e.png

图 2 代码结构

STM32项目模板就不做详细的介绍了,跟普通的硬件开发流程一样。下面详细说下RTOS移植过程。RTOS的下载地址是https://freertos.org/index.html,下载到本地的文件内容如图 3所示:FreeRTOS文件夹包含了RTOS基础代码,FreeRTOS-Plus文件夹里面的代码是RTOS增强功能,如tcp、fat等,这个项目主要使用基础功能。

0bd389f9c0bd1dd5d103baaaac993a6e.png

图 3 RTOS代码包

打开FreeRTOSSource文件夹,这里面包含了需要移植的大部分代码。如图 4所示,需要移植的源文件有:include里面的所有文件,portable里面两个源文件一个头文件,以及图 4里面标红的list.c、queue.c、task.c。由于在这个项目里没有使用诸如任务间消息传递、动态增删任务等功能,所以在Source根目录下的其他源文件不需要移植,如果有需要,的自行添加到项目中。

6fdcfe5a61206316f8e722db1d3c1030.png

图 4 Source文件夹

FreeRTOSv10.1.1FreeRTOSSourceportable文件夹中包含了编译器相关的接口和内存管理代码,由于本项目使用的是MDK5,所以只保留Keil跟RVDS,再加一个内存管理接口代码的文件夹MemMang,其他的内容删掉,并且将RVDS中的源文件复制到Keil中,如图 5。Portable中需要添加到项目中的两个源文件及一个头文件分别是MemMang文件夹中的heap_3.c以及portableKeilARM_CM3中的portmacro.h和port.c。

0955d23ee65f4f562910cb58da0f9964.png

图 5 Portable

最后,复制一个FreeRTOSConfig.h头文件到FreeRTOSSourceinclude目录中。FreeRTOSConfig.h的原始路径是

这样,freeRTOS文件夹中就包含了移植所需要的所有源文件,然后把freeRTOS文件夹复制到项目目录中。移植完毕后,我的项目目录结构如图 6所示。

a6a6466f419005720b0fa126c2518607.png

图 6 项目目录结构

代码复制完毕,下一步,将复制的文件添加到项目中,具体步骤就不啰嗦了,添加完毕后的项目结构如图 7。

b863919769fdbe3df93a10042ef7d49a.png

图 7 rtos代码结构

文件添加以后,不要忘记重新指定下MDK项目的编译器include路径,将rtos头文件的路径添加进项目,要不然会出编译错误,如图 8。

c6cdce45b5f47c37170e08f174e18ae5.png

图 8 编译路径指定

所有准备工作做完,就可以修改代码,代码修改共分为几个部分,包括:

添加头文件

在程序中,添加rtos需要的头文件

重新实现三个中断函数。

在FreeRTOSConfig.h头文件中,添加如下三行#define语句,用xPortPendSVHandler、SysTick_Handler、SVC_Handler重新实现PendSV_Handler、SysTick_Handler、SVC_Handler三个中断函数,由于原stm32f10x_it.c 源文件中已经有这三个中断函数的定义了,所以需要将原来的定义屏蔽掉,这里使用了__weak关键字。

添加任务代码

内存管理参数修改

由于freeRTOS的多任务调度,是占用了STM32内存系统的堆空间,所以需要对内存参数进行修改。如图 10,其中#define configTOTAL_HEAP_SIZE默认的是17K(17*1024),由于STM32F103R6总共才10K RAM,所以我这改成了8*1024。这是使用heap_1.c、heap_2.c、heap_4.c的情况,heap_5.c测试未成功,原因未知。如果跟前面移植步骤一样,使用的是heap_3.c的话,heap_3.c内存管理方式跟其它几种都不一样,堆空间是使用的startup_stm32f10x_ld.s中的配置,所以需要修改启动文件中关于堆设置的代码,我这里将原始的200改成了2000,如图 9。

a9d1790a834e80efc39599fc3a0afa38.png

图 9 启动文件中内存参数

15ec6d11a110e02d2eb7d49864bca1b6.png

图 10 rtos参数设置

代码修改完毕后,如果没有错误,就可以下载到电路中运行了,如图 11所示,这个电路里一共添加了四个任务,分别是LED、数码管、spi、串口任务,都已经正常的跑了起来。

7c04b3e18b2c972a853d8e477ebb4b5d.png

图 11 项目运行演示

最后一点要注意的是,由于RTOS的任务调度使用的是Systick定时器,所以在使用定时器的时候,要避开SYSTICK。我在这个项目里面是使用的TIME3作为自定义定时器。

附:项目运行的其它代码。

/***************const difinition****************/

int main(void)

{

u8 x=0;

int speed=10000;//电机速度

RCC_Configuration(); //SET RCC TO: HSI&56Mhz(8*7)

GPIOInit(); //GPIO初始化

seg7_init(); //同步串口初始化

NVIC_Configuration();

//设置systick时钟源

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);GPIO_ResetBits(GPIOD, GPIO_Pin_2);//PD2输出低电平,点亮ARMLED

Time3Init();

timer1PWM_Init();

Usart1_Init();

TIM_Cmd(TIM3, ENABLE);//启动定时器3

sSPI2_Init();

/******rtos task******/

xTaskCreate(led_task1,"LED_TASK1",40,NULL,3,NULL);

xTaskCreate(seg_task2,"seg_TASK2",40,NULL,2,NULL);

xTaskCreate(usart_task3,"usart_TASK3",40,NULL,2,NULL);

xTaskCreate(apa_task4,"apa_TASK4",40,NULL,2,NULL);

vTaskStartScheduler();

}

/**freeRTOS head**/

#include "FreeRtos.h"

#include "task.h"

#include "queue.h"

//FreeRTOSConfig.h

#define xPortPendSVHandler PendSV_Handler

#define xPortSysTickHandler SysTick_Handler

#define vPortSVCHandler SVC_Handler

....

//stm32f10x_it.c屏蔽库函数

void __weak SVC_Handler(void)

...

xTaskCreate(led_task1,"LED_TASK1",40,NULL,3,NULL);

xTaskCreate(seg_task2,"seg_TASK2",40,NULL,2,NULL);

xTaskCreate(usart_task3,"usart_TASK3",40,NULL,2,NULL);

xTaskCreate(apa_task4,"apa_TASK4",40,NULL,2,NULL);

vTaskStartScheduler();

#include "stm32f10x_gpio.h"

/*user lib*/

#include "user_misc.h"

#include "7seg.h"

#include "motostep.h"

#include "user_uart.h"

#include "tc72.h"

/**freeRTOS head**/

#include "FreeRtos.h"

#include "task.h"

#include "queue.h"

/*public varble */

u16 keyPC=0xFF;//portPC status readin

u8 led1_onoff=0xff;

u16 publicTIMER=0;//全局定时器

u16 recvDATA[maxUARTData];

u8 recvNewFLAG=0; //1 means new frame received

//功能:LED闪烁

void led_task1(void *aa);

void seg_task2(void *aa);

void usart_task3(void *aa);

void apa_task4(void *aa);

void d_welcom(void);

void led_task1(void *aa)

{

while(1)

{

LED1^=1;

vTaskDelay(50);

}

}

void seg_task2(void *aa)

{

u8 x=0;

while(1)

{

seg7_put(x);

vTaskDelay(20);

x++;

if(x>999)

x=0;

}

}

void usart_task3(void *aa)

{

u8 x=0;

while(1)

{

apaDIS(x);

vTaskDelay(20);

x++;

if(x>8)

x=0;

}

}

void apa_task4(void *aa)

{

while(1)

{

printf("ho ho,usart ok"); ;

vTaskDelay(50);

}

}

void d_welcom(void)

{

printf(" ====STM32 Vsm DEMO====");

printf(" 1、USART TESTing");

printf(" 2、motoSTEP S/T");

printf(" 3、AD Sampling");

printf(" 4、KEY TESTing");

printf("e.g input func num ->#:");

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在Keil5中新建STM32F103C6项目并进行Proteus仿真的步骤: 1. 打开Keil5软件,在菜单栏点击“Project” -> “New µVision Project”(也可以直接使用快捷键“Ctrl+Shift+N”)。 2. 在弹出的“New Project”窗口中,选择“STMicroelectronics” -> “STM32F10x” -> “STM32F103C6”(如果没有该选项,需要先安装相应的支持包),然后输入项目名称和存储路径,最后点击“Save”按钮。 3. 在弹出的“Create Project”窗口中,选择“CMSIS”和“Device Startup”两个选项,并且可以根据需要勾选其他选项,然后点击“OK”按钮。 4. 在左侧的“Project”窗口中,展开“Source Group” -> “Source Files”节点,双击“startup_stm32f10x_hd.s”文件,将其添加到项目中。 5. 在左侧的“Project”窗口中,展开“Target 1” -> “Device”节点,双击“stm32f10x.h”文件,将其添加到项目中。 6. 在左侧的“Project”窗口中,展开“Target 1” -> “Source Group” -> “Source Files”节点,双击“main.c”文件,将其添加到项目中。 7. 编写程序代码,然后编译生成可执行文件。 8. 打开Proteus软件,在菜单栏点击“Library” -> “Library Manager” -> “Pick Devices” -> “Microcontroller” -> “STMicroelectronics” -> “STM32F10x” -> “STM32F103C6”(如果没有该选项,需要先安装相应的模型库),然后点击“Open”按钮。 9. 在Proteus中绘制电路图,并且添加STM32F103C6芯片模型和必要的外围电路。 10. 双击STM32F103C6芯片模型,弹出“Edit Component”窗口,在“Program File”选项中选择Keil5生成的可执行文件,然后点击“OK”按钮。 11. 在Proteus中运行仿真,验证程序逻辑和电路设计是否正确。 注意事项: 1. 在新建Keil5项目时,需要选择正确的芯片型号和支持包。 2. 在添加源文件和头文件时,需要注意文件路径和名称是否正确。 3. 在Proteus添加芯片模型时,需要选择正确的型号和模型库,并且与Keil5生成的可执行文件相对应。 4. 在运行仿真时,需要确保电路连接和程序逻辑正确无误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值