完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文绍了基于STM32F107VC的金牛开发板的FreeRTOS v9.0.0的移植过程。IDE
环境为:MDK v5.23; 硬件环境:基于STM32F107VC的金牛开发板; 所用的详细库版本号是STM32F10X_StdPeriph_Lib_V3.5.0* * 下载工具用的是开发板自带的D版的Jlink。 一、工程模板的建立:( STM32工程模板用野火M3工程模板作为基础,在此之上做一些更改: 然后改一下文件名为STM32F107_FreeRTOS_v9.0.0: 进去之后看到: 其结构内容如下: CMSIS:微控制器软件接口标准库相关文件; FWlib:规范库(版本号为v3.5.0); 列表:编译链接信息列表; 输出:编译中间文件和bin档(或十六进制档)。 USER:工程模板和用户源代码。 下面对它的目录结构做如下修改: 1、把USER文件夹改为项目,意为已放置的工程文件,而不是放源代码; 2、增加BSP文件夹,作为板卡支持包目录,放置与开发板特定配置下的相关源代码; 3、增加APP文件夹,作为应用软件源代码目录; 4、增加第三方文件夹,作为库管理目录,放置第三方库源码。 改后目录结构为: 下边,相应文件做调整,并工名: 项目的main.c、stm32f10x_conf.h、stm32f10x_it.h、stm32f10x_it.h把文件目录下修改到BSP下: 项目目录下两个只范围目录然后名称为.uvopt和.ubproj的文件,其他的都删除: 两个把文件都改名为FreeRTOS_v9.0.0,下一个: 底部桌面FreeRTOS_v9.0.0 .uvproj文件,打开工程: 点击品字形图标: 看到如下图: 然后饮食 列表目标1,改名FreeRTOS_v9.0.0:中间的列表删除STARTUPCODE,双用户为BSP,并在右边的修改中的main.c和stm32f10x_it.c文件删除,重(两个文件已经由前面的步骤放置在电脑的BSP目录下): 然后,把金牛板的启动文件STM32F10x.s修改一下放置在BSP目录下,该文件内容如下: ;/*****************************************************************************/ ;/* STM32F10x.s: Startup file for ST STM32F10x device series */ ;/*****************************************************************************/ ;/* 《《《 Use Configuration Wizard in Context Menu 》》》 */ ;/*****************************************************************************/ ;/* This file is part of the uVision/ARM development tools. */ ;/* Copyright (c) 2005-2007 Keil Software. All rights reserved. */ ;/* This software may only be used under the terms of a valid, current, */ ;/* end user licence from KEIL for a compatible version of KEIL software */ ;/* development tools. Nothing else gives you the right to use this software. */ ;/*****************************************************************************/ ;// 《h》 Stack Configuration ;// 《o》 Stack Size (in Bytes) 《0x0-0xFFFFFFFF:8》 ;// 《/h》 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ;// 《h》 Heap Configuration ;// 《o》 Heap Size (in Bytes) 《0x0-0xFFFFFFFF:8》 ;// 《/h》 Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit ;IMPORT xPortPendSVHandler ;IMPORT xPortSysTickHandler ;IMPORT vPortSVCHandler ;IMPORT vUARTInterruptHandler ;IMPORT TIM4_IRQHandler ;IMPORT vTimer2IntHandler PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ;vPortSVCHandler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD 0 ;xPortPendSVHandler ; PendSV Handler DCD 0 ;xPortSysTickHandler ; SysTick Handler ; External Interrupts DCD WWDG_IRQHandler ; Window Watchdog DCD PVD_IRQHandler ; PVD through EXTI Line detect DCD TAMPER_IRQHandler ; Tamper DCD RTC_IRQHandler ; RTC DCD FLASH_IRQHandler ; Flash DCD RCC_IRQHandler ; RCC DCD EXTI0_IRQHandler ; EXTI Line 0 DCD EXTI1_IRQHandler ; EXTI Line 1 DCD EXTI2_IRQHandler ; EXTI Line 2 DCD EXTI3_IRQHandler ; EXTI Line 3 DCD EXTI4_IRQHandler ; EXTI Line 4 DCD DMAChannel1_IRQHandler ; DMA Channel 1 DCD DMAChannel2_IRQHandler ; DMA Channel 2 DCD DMAChannel3_IRQHandler ; DMA Channel 3 DCD DMAChannel4_IRQHandler ; DMA Channel 4 DCD DMAChannel5_IRQHandler ; DMA Channel 5 DCD DMAChannel6_IRQHandler ; DMA Channel 6 DCD DMAChannel7_IRQHandler ; DMA Channel 7 DCD ADC_IRQHandler ; ADC DCD USB_HP_CAN_TX_IRQHandler ; USB High Priority or CAN TX DCD USB_LP_CAN_RX0_IRQHandler ; USB Low Priority or CAN RX0 DCD CAN_RX1_IRQHandler ; CAN RX1 DCD CAN_SCE_IRQHandler ; CAN SCE DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 DCD TIM1_BRK_IRQHandler ; TIM1 Break DCD TIM1_UP_IRQHandler ; TIM1 Update DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare ; DCD 0 ;vTimer2IntHandler ; TIM2 DCD TIM3_IRQHandler ; TIM3 DCD 0 ;TIM4_IRQHandler ; TIM4 DCD I2C1_EV_IRQHandler ; I2C1 Event DCD I2C1_ER_IRQHandler ; I2C1 Error DCD I2C2_EV_IRQHandler ; I2C2 Event DCD I2C2_ER_IRQHandler ; I2C2 Error DCD SPI1_IRQHandler ; SPI1 DCD SPI2_IRQHandler ; SPI2 DCD 0 ;vUARTInterruptHandler ; USART1 DCD USART2_IRQHandler ; USART2 DCD USART3_IRQHandler ; USART3 DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend ;-------------------added @2017.08.1 DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD TIM5_IRQHandler ; TIM5 DCD SPI3_IRQHandler ; SPI3 DCD UART4_IRQHandler ; UART4 DCD UART5_IRQHandler ; UART5 DCD TIM6_IRQHandler ; TIM6 DCD TIM7_IRQHandler ; TIM7 DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 DCD DMA2_Channel4_IRQHandler ; DMA2 Channel4 DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5 DCD 0 ;ETH_IRQHandler ; Ethernet DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line DCD CAN2_TX_IRQHandler ; CAN2 TX DCD CAN2_RX0_IRQHandler ; CAN2 RX0 DCD CAN2_RX1_IRQHandler ; CAN2 RX1 DCD CAN2_SCE_IRQHandler ; CAN2 SCE DCD OTG_FS_IRQHandler ; USB OTG FS __Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors AREA |.text|, CODE, READONLY ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP ; Dummy Exception Handlers (infinite loops which can be modified) NMI_Handler PROC EXPORT NMI_Handler [WEAK] B 。 ENDP HardFault_Handler PROC EXPORT HardFault_Handler [WEAK] B 。 ENDP MemManage_Handler PROC EXPORT MemManage_Handler [WEAK] B 。 ENDP BusFault_Handler PROC EXPORT BusFault_Handler [WEAK] B 。 ENDP UsageFault_Handler PROC EXPORT UsageFault_Handler [WEAK] B 。 ENDP SVC_Handler PROC EXPORT SVC_Handler [WEAK] B 。 ENDP DebugMon_Handler PROC EXPORT DebugMon_Handler [WEAK] B 。 ENDP PendSV_Handler PROC EXPORT PendSV_Handler [WEAK] B 。 ENDP SysTick_Handler PROC EXPORT SysTick_Handler [WEAK] B 。 ENDP Default_Handler PROC EXPORT WWDG_IRQHandler [WEAK] EXPORT PVD_IRQHandler [WEAK] EXPORT TAMPER_IRQHandler [WEAK] EXPORT RTC_IRQHandler [WEAK] EXPORT FLASH_IRQHandler [WEAK] EXPORT RCC_IRQHandler [WEAK] EXPORT EXTI0_IRQHandler [WEAK] EXPORT EXTI1_IRQHandler [WEAK] EXPORT EXTI2_IRQHandler [WEAK] EXPORT EXTI3_IRQHandler [WEAK] EXPORT EXTI4_IRQHandler [WEAK] EXPORT DMAChannel1_IRQHandler [WEAK] EXPORT DMAChannel2_IRQHandler [WEAK] EXPORT DMAChannel3_IRQHandler [WEAK] EXPORT DMAChannel4_IRQHandler [WEAK] EXPORT DMAChannel5_IRQHandler [WEAK] EXPORT DMAChannel6_IRQHandler [WEAK] EXPORT DMAChannel7_IRQHandler [WEAK] EXPORT ADC_IRQHandler [WEAK] EXPORT USB_HP_CAN_TX_IRQHandler [WEAK] EXPORT USB_LP_CAN_RX0_IRQHandler [WEAK] EXPORT CAN_RX1_IRQHandler [WEAK] EXPORT CAN_SCE_IRQHandler [WEAK] EXPORT EXTI9_5_IRQHandler [WEAK] EXPORT TIM1_BRK_IRQHandler [WEAK] EXPORT TIM1_UP_IRQHandler [WEAK] EXPORT TIM1_TRG_COM_IRQHandler [WEAK] EXPORT TIM1_CC_IRQHandler [WEAK] EXPORT TIM2_IRQHandler [WEAK] EXPORT TIM3_IRQHandler [WEAK] ;EXPORT TIM4_IRQHandler [WEAK] EXPORT I2C1_EV_IRQHandler [WEAK] EXPORT I2C1_ER_IRQHandler [WEAK] EXPORT I2C2_EV_IRQHandler [WEAK] EXPORT I2C2_ER_IRQHandler [WEAK] EXPORT SPI1_IRQHandler [WEAK] EXPORT SPI2_IRQHandler [WEAK] EXPORT USART1_IRQHandler [WEAK] EXPORT USART2_IRQHandler [WEAK] EXPORT USART3_IRQHandler [WEAK] EXPORT EXTI15_10_IRQHandler [WEAK] EXPORT RTCAlarm_IRQHandler [WEAK] EXPORT USBWakeUp_IRQHandler [WEAK] ;-------------added @2017.08.13----------------------------- EXPORT TIM5_IRQHandler [WEAK] EXPORT SPI3_IRQHandler [WEAK] EXPORT UART4_IRQHandler [WEAK] EXPORT UART5_IRQHandler [WEAK] EXPORT TIM6_IRQHandler [WEAK] EXPORT TIM7_IRQHandler [WEAK] EXPORT DMA2_Channel1_IRQHandler [WEAK] EXPORT DMA2_Channel2_IRQHandler [WEAK] EXPORT DMA2_Channel3_IRQHandler [WEAK] EXPORT DMA2_Channel4_IRQHandler [WEAK] EXPORT DMA2_Channel5_IRQHandler [WEAK] EXPORT ETH_IRQHandler [WEAK] EXPORT ETH_WKUP_IRQHandler [WEAK] EXPORT CAN2_TX_IRQHandler [WEAK] EXPORT CAN2_RX0_IRQHandler [WEAK] EXPORT CAN2_RX1_IRQHandler [WEAK] EXPORT CAN2_SCE_IRQHandler [WEAK] EXPORT OTG_FS_IRQHandler [WEAK] WWDG_IRQHandler PVD_IRQHandler TAMPER_IRQHandler RTC_IRQHandler FLASH_IRQHandler RCC_IRQHandler EXTI0_IRQHandler EXTI1_IRQHandler EXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler DMAChannel1_IRQHandler DMAChannel2_IRQHandler DMAChannel3_IRQHandler DMAChannel4_IRQHandler DMAChannel5_IRQHandler DMAChannel6_IRQHandler DMAChannel7_IRQHandler ADC_IRQHandler USB_HP_CAN_TX_IRQHandler USB_LP_CAN_RX0_IRQHandler CAN_RX1_IRQHandler CAN_SCE_IRQHandler EXTI9_5_IRQHandler TIM1_BRK_IRQHandler TIM1_UP_IRQHandler TIM1_TRG_COM_IRQHandler TIM1_CC_IRQHandler TIM2_IRQHandler TIM3_IRQHandler ;TIM4_IRQHandler I2C1_EV_IRQHandler I2C1_ER_IRQHandler I2C2_EV_IRQHandler I2C2_ER_IRQHandler SPI1_IRQHandler SPI2_IRQHandler USART1_IRQHandler USART2_IRQHandler USART3_IRQHandler EXTI15_10_IRQHandler RTCAlarm_IRQHandler USBWakeUp_IRQHandler ;---------added @2017.08.13-------------------------- TIM5_IRQHandler SPI3_IRQHandler UART4_IRQHandler UART5_IRQHandler TIM6_IRQHandler TIM7_IRQHandler DMA2_Channel1_IRQHandler DMA2_Channel2_IRQHandler DMA2_Channel3_IRQHandler DMA2_Channel4_IRQHandler DMA2_Channel5_IRQHandler ETH_IRQHandler ETH_WKUP_IRQHandler CAN2_TX_IRQHandler CAN2_RX0_IRQHandler CAN2_RX1_IRQHandler CAN2_SCE_IRQHandler OTG_FS_IRQHandler B 。 ENDP ALIGN ; User Initial Stack & Heap IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF END 然后把该文件加入工程中,放置在BSP管理项中: 此文件代替了原野火模板中的startup_stm32f10x_hd.s文件启动 并且,查询资料可知STM32F107VC这款芯片属于CL版本,因此,需要CL版的启动文件。 金牛版的stm32F10x.s就是这个版本的。 并且,原野火模板目标芯片是STM32F103VE,相关的板子不匹配,需要修改。另外 ,在编译配置中需要修改整体定义以跟CL版本相匹配。 点击魔法棒的那个图标(目标选项),做如下修改: 在设备选项卡里面选STM32F107VC: 在目标选项卡中选择使用microlib中 在C / C ++选项卡里面的 Proprecessor符号设置项的定义栏,修改STM32F10X_HD为STM32F10X_CL: 然后就是修改包括搜索目录: 点击包括路径设置项右边的省略号按钮看到: 双击用户,修改为BSP。 然后修改一下编译输出文件名和相关设置,点击输出选项卡,设置如下: 修改完之后,编译一下,通过,OK。 接下来,用金牛版的跑马灯的代码验证一下能否正让开发板常工作。 修改整个的main.c文件如下: /******************** (C) COPYRIGHT 2012 WildFire Team ************************** * ÎļþÃû £ºmain.c * ÃèÊö £ºÓÃ3.5.0°æ±¾½¨µÄ¹¤³ÌÄ£°å¡£ * ʵÑéƽ̨£ºÒ°»ðSTM32¿ª·¢°å * ¿â°æ±¾ £ºST3.5.0 * * ×÷Õß £ºwildfire team * ÂÛ̳ £ºhttp://www.amobbs.com/forum-1008-1.html * ÌÔ±¦ £ºhttp://firestm32.taobao.com **********************************************************************************/ #include “stm32f10x.h” void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure IO connected to LD1, LD2, LD3 and LD4 leds *********************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); } //?????? void NVIC_Configuration(void) { /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif } void RCC_Configuration(void) { SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_SPI1, ENABLE ); // RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE ); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 |RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2 , ENABLE ); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); } void Init_All_Periph(void) { RCC_Configuration(); GPIO_Configuration(); NVIC_Configuration(); } void Delay(vu32 nCount) { for(; nCount != 0; nCount--); } int main(void) { Init_All_Periph(); while(1) { /* Turn on LD1 */ GPIO_SetBits(GPIOD, GPIO_Pin_2); /* Insert delay */ Delay(0xAFFFF); /* Turn on LD2 and LD3 */ GPIO_SetBits(GPIOD, GPIO_Pin_3 | GPIO_Pin_4); /* Turn off LD1 */ GPIO_ResetBits(GPIOD, GPIO_Pin_2); /* Insert delay */ Delay(0xAFFFF); /* Turn on LD4 */ GPIO_SetBits(GPIOD, GPIO_Pin_7); /* Turn off LD2 and LD3 */ GPIO_ResetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_3); /* Insert delay */ Delay(0xAFFFF); /* Turn off LD4 */ GPIO_ResetBits(GPIOD, GPIO_Pin_7); } } /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/ 用Jlink把十六进制档烧到开发板上,然后重新上电,跑马灯炮起来了! 为STM32F107芯片的金牛开发板建立了原始模板完成了! 二、移植FreeRTOS v9.0.0 1、操作系统基础性移植 FreeRTOS最新版本当前为v9.0.0,下载后,解压看到: 我们所需要的源码在FreeRTOS源下: 把整个文件夹复制到我们工程根目录下,并更名为 FreeRTOS: 在IDE工程里对FreeRTOS_v9.0.0右击添加两个组为FreeRTOS/Source,另一个为FreeRTOS/Ports 在FreeRTOS/Source组中添加刚复制过来的FreeRTOS源代码目录下的croutine.c、event_groups .c、list.c、queue.c、tasks.c 这五个文件: 在组中加入port.c和heap_4.c(为什么用heap_4.c可以参考本部分的第2篇参考文章)这两个文件文件,它们各自的路径为: port在FreeRTOSportableRVDSARM_CM3下; heap_4.c在FreeRTOSportableMemMang下。下 ,需要包含的路径: 如上述修改包含路径一样,点魔法棒,选择c/c++选项卡,加入 FreeRTOSinclude FreeRTOSportableRVDSARM_CM3 这两个目录: 至此,FreeRTOS主要部分已经完成,但此时编译的话,会出错,提示没有FreeRTOSConfig.h这个文件,这个文件在FreeRTOS官方源代码的各个Demo中。 由于本文使用的芯片是STM32F107VC,所以,它在官方源代码的FreeRTOSv9.0.0FreeRTOSDemoCORTEX_STM32F107_GCC_Rowley目录中: 跟FreeRTOS配置相关的文件还包括STM32F10x.s,timertest.c。 把这三个文件复制到我们BSP目录下: 再修改一下timertest.c里面的内容 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1767 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1069 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
727浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 20:40 , Processed in 1.171061 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号