STM32F103ZE FreeRTOS移植、测试

发布者:Jikai最新更新时间:2019-05-08 来源: eefocus关键字:STM32F103ZE  FreeRTOS  移植  测试 手机看文章 扫描二维码
随时随地手机看文章

一、前期准备 

单片机:STM32F103ZET6 

开发环境:MDK5.14 

库函数:标准库V3.5 

FreeRTOS:V9.0.0(网上下载,官网上目前是V10.0.1)


二、实验效果 

总共6个任务,串口1、串口2、4个RGB小灯以不同频率闪烁。5050 RGB LED驱动请参考RGB驱动,串口1、2同时打印测试信息。 


这里写图片描述

三、移植准备 

下载好的FreeRTOS源码中,只需要把Source文件夹加入工程。 

1.FreeRTOS内核文件,如下图所示,里面所有C文件加入到工程里面 

 这里写图片描述 

2.将portable中无关文件夹删除掉,只留下如图所示的三个文件夹。Keil文件夹不用管,MemMang里面是heap1.c~heap5.c文件,这个是内存管源码,这里移植将heap4.c加入工程。RVDS中ARM_M3的C文件加入工程 

这里写图片描述 
这里写图片描述 
这里写图片描述 
这里写图片描述 

3.Keil工程 

 这里写图片描述 

4.修改stm32启动文件 


这里写图片描述

四、测试代码 

完整工程请加QQ:1002521871,验证:呵呵 

uart.h


#ifndef __UART_H__

#define __UART_H__


#include "stm32f10x.h"

#include

#include

#include

#include "message.h"


/*  UART IOpin definirion   */

#define     TX1         GPIO_Pin_9

#define     RX1         GPIO_Pin_10

#define     TX2         GPIO_Pin_2

#define     RX2         GPIO_Pin_3

#define     TX3         GPIO_Pin_10

#define     RX3         GPIO_Pin_11


#define     RecDataLen      128

extern char RecData[RecDataLen];

extern char *pIndex;

extern char *pWrite;

extern char *pRead;


extern int USART_PRINTF_FLAG;

extern void USARTConfiguration(int Baudrate);

extern void USART_Send(USART_TypeDef* USARTx, char c);

extern char USART_Received(USART_TypeDef* USARTx);


#endif



uart.c,多串口通用printf程序请参考多串口共用printf讲解


#include "uart.h"


char RecData[RecDataLen] = {0};

char *pIndex = RecData;

char *pWrite = RecData;

char *pRead = RecData;


int USART_PRINTF_FLAG = 0;


void USARTConfiguration(int Baudrate)

{

    USART_InitTypeDef   MyUSART;

    GPIO_InitTypeDef    GPIO;

    NVIC_InitTypeDef    MyNVIC;


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | 

                           RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);


    /* Configure USART1 Tx (PA.09) as alternate function push-pull */

    GPIO.GPIO_Pin = TX1;

    GPIO.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO);


     /* Configure USART1 Rx (PA.10) as input floating */

    GPIO.GPIO_Pin = RX1;

    GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO);


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

    MyNVIC.NVIC_IRQChannel = USART1_IRQn;

    MyNVIC.NVIC_IRQChannelSubPriority = 0;

    MyNVIC.NVIC_IRQChannelPreemptionPriority = 0;

    MyNVIC.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&MyNVIC);  


    MyUSART.USART_BaudRate = Baudrate;

    MyUSART.USART_WordLength = USART_WordLength_8b;

    MyUSART.USART_StopBits = USART_StopBits_1;

    MyUSART.USART_Parity = USART_Parity_No;

    MyUSART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    MyUSART.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

    USART_Init(USART1, &MyUSART);

    USART_Cmd(USART1, ENABLE);


    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 

    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);


    /* Configure USART2 Tx (PA.02) as alternate function push-pull */

    GPIO.GPIO_Pin = TX2;

    GPIO.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO);


     /* Configure USART2 Rx (PA.3) as input floating */

    GPIO.GPIO_Pin = RX2;

    GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO);


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

    MyNVIC.NVIC_IRQChannel = USART2_IRQn;

    MyNVIC.NVIC_IRQChannelSubPriority = 0;

    MyNVIC.NVIC_IRQChannelPreemptionPriority = 1;

    MyNVIC.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&MyNVIC);  


    MyUSART.USART_BaudRate = Baudrate;

    MyUSART.USART_WordLength = USART_WordLength_8b;

    MyUSART.USART_StopBits = USART_StopBits_1;

    MyUSART.USART_Parity = USART_Parity_No;

    MyUSART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    MyUSART.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

    USART_Init(USART2, &MyUSART);

    USART_Cmd(USART2, ENABLE);


    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); 

    USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);


    /* Configure USART3 Tx (PB.10) as alternate function push-pull */

    GPIO.GPIO_Pin = TX3;

    GPIO.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO);


     /* Configure USART3 Rx (PB.11) as input floating */

    GPIO.GPIO_Pin = RX3;

    GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOB, &GPIO);


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

    MyNVIC.NVIC_IRQChannel = USART3_IRQn;

    MyNVIC.NVIC_IRQChannelSubPriority = 0;

    MyNVIC.NVIC_IRQChannelPreemptionPriority = 2;

    MyNVIC.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&MyNVIC);  


    MyUSART.USART_BaudRate = Baudrate;

    MyUSART.USART_WordLength = USART_WordLength_8b;

    MyUSART.USART_StopBits = USART_StopBits_1;

    MyUSART.USART_Parity = USART_Parity_No;

    MyUSART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    MyUSART.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

    USART_Init(USART3, &MyUSART);

    USART_Cmd(USART3, ENABLE);


    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); 

    USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);

}


void USART_Send(USART_TypeDef* USARTx, char c)

{

    USART_SendData(USARTx, c);

    /* loop until the end of transmission */

    while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);    

}


char USART_Received(USART_TypeDef* USARTx)

{

    char dat;

    //while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

    dat = (char)(USART_ReceiveData(USARTx)&0xff);

    return dat;

}


void USART1_IRQHandler(void)

{

    uint8_t clear = clear;

    USART_PRINTF_FLAG = 1;

    if(USART_GetFlagStatus(USART1,USART_IT_RXNE) != RESET )

    {

        if ( (*(pWrite-1) != 0x0A) && ((pWrite - pIndex) < RecDataLen) )

        {

            *pWrite = USART_Received(USART1);

            pWrite ++;

        }

        else

        {

            USART_Received(USART1);

        }

    }

    else if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)

    {

        if ( *(pWrite - 1) == 0x0A && *(pWrite - 2) == 0x0D)

        {

            cmdDealFlag = 1;

        }

        else 

        {

            printf("%s", RecFlowMess);

        }


        pWrite = pIndex;

        clear = USART1->SR;

        clear = USART1->DR;

    }

}


void USART2_IRQHandler(void)

{

    uint8_t clear = clear;

    USART_PRINTF_FLAG = 2;

    if(USART_GetFlagStatus(USART2,USART_IT_RXNE) != RESET )

    {

        if ( (*(pWrite-1) != 0x0A) && ((pWrite - pIndex) < RecDataLen) )

        {

            *pWrite = USART_Received(USART2);

            pWrite ++;

        }

        else

        {

            USART_Received(USART2);

        }

    }

    else if (USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)

    {

        if ( *(pWrite - 1) == 0x0A && *(pWrite - 2) == 0x0D)

        {

            cmdDealFlag = 1;

        }

        else 

        {

            printf("%s", RecFlowMess);

        }


        pWrite = pIndex;

        clear = USART2->SR;

        clear = USART2->DR;

    }

}


void USART3_IRQHandler(void)

{

    uint8_t clear = clear;

    USART_PRINTF_FLAG = 3;

    if(USART_GetFlagStatus(USART3,USART_IT_RXNE) != RESET )

    {

        if ( (*(pWrite-1) != 0x0A) && ((pWrite - pIndex) < RecDataLen) )

        {

            *pWrite = USART_Received(USART3);

            pWrite ++;

        }

        else

        {

            USART_Received(USART3);

        }

    }

    else if (USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)

[1] [2] [3]
关键字:STM32F103ZE  FreeRTOS  移植  测试 引用地址:STM32F103ZE FreeRTOS移植、测试

上一篇:STM32F103ZE FreeRTOS任务创建与删除
下一篇:LCD12864驱动(STM32)5V和3.3V

推荐阅读最新更新时间:2024-11-11 01:43

bootloader的移植
jz2440开发板 在介绍bootloader里边的内容的时候,需要知道的是: bootloader的引入的目的就是启动linux内核,一个简单的bootloader编写需要以下的步骤: ①初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH ②把内核从NAND FLASH独到SDRAM ③保存要传给内核的参数到指定的位置 ④跳转执行内核 有的时候,会遇到bootloader很大的情况,那么就会有一步在①和②之间加一个重新定位在SDRAM中地址。 新建start.S文件, 其中“.text”表示下边是代码段 “.global _start”表示_start是全局标号 “ldr r0, =0x53000
[单片机]
2024 MWC上海,罗德与施瓦茨联合联发科技共同演示Sub-6GHz下行三载波聚合测试
在2024世界移动大会·上海,罗德与施瓦茨(以下简称“R&S”)和联发科技(MediaTek)合作展示基于FR1下行三载波聚合的最大吞吐量测试。 这一技术使用最先进的 R&S CMX500 一体式信令测试仪(OBT) 和联发科技天玑旗舰5G移动芯片。 2024年是5G-Advanced商用元年,年初中国运营商就宣布了其5G-A部署计划,而2024年到2026年也成为部署5G-A网络的关键时间窗口。谈到5G-Advanced,大家津津乐道的特性有通感一体化、空天地一体化、无源物联网、智能网络以及XR增强等,但是载波聚合作为传统的eMBB特性的增强,能够为用户提供更高的下行速率以及更好的用户体验。 此次测试基于两种不同的频率以
[测试测量]
2024 MWC上海,罗德与施瓦茨联合联发科技共同演示Sub-6GHz下行三载波聚合<font color='red'>测试</font>
氧化锌避雷器测试仪的特性以及参数的介绍
TKBLQ-I氧化锌避雷器测试仪是用于检测避雷器电气性能的专用仪器,该仪器适用于各种电压等级的避雷器的带电或停电检测,从而及时发现设备内部绝缘受潮及阀片老化等危险缺陷。 TKBLQ-I氧化锌避雷器测试仪器操作简单、使用方便,测量全过程由微机控制,可测量避雷器的全电流、阻性电流及其谐波、工频参考电压及其谐波、有功功率和相位差,大屏幕可显示电压和电流的真实波形。仪器运用数字波形分析技术,采用谐波分析和数字滤波等软件抗干扰方法使测量结果准确、稳定,可准确分析出基波和3~7次谐波的含量,并能克服相间干扰影响,正确测量边相避雷器的阻性电流。 产品特性: 1、5.7寸320×240液晶显示器高速热敏打印机;图文显示,界面直观,便于现场人员
[测试测量]
如何使用AFG31000测试电源的负载瞬态响应
负载瞬变测试是检查功率转换器表现的一种快速方法,它可以反映出转换器的调整速度,能将转换器的稳定性问题凸显出来。转换器的负载调整特性、占空比极限、PCB布局问题和输入电压的稳定性也可经此测试快速显现出来。 许多电子设备都包含了计算和无线连接功能,这些功能电路常常表现出很重的脉冲负载特性。面对快速变化的脉冲负载,全新的DC/DC转换器需要具有快速的环路响应特性来维持输出电压的稳定。为了测试这种类型的转换器,拥有能够生成与最终应用类似的快速变化的负载工具是很重要的。 对于具有比较稳定的负载的通用型DC/DC转换器来说,快速的回路响应特性是不需要的,因而也不必进行负载瞬态响应特性的测试。但在把快速阶跃变化的负载施加到一个稳压器上时
[测试测量]
如何使用AFG31000<font color='red'>测试</font>电源的负载瞬态响应
基于TMSF240芯片的内部FLASH自测试方法
  飞控计算机CPU模块的处理器通常选用PowerPC或X86系列,CPU模块设计有专门的FLASH芯片,为保证飞控程序存放的正确无误,FLASH测试必不可少。而智能接口模块的处理器通常选用TMSF240、TMSF2812等,采用片内FLASH存放自己的程序。这部分FLASH的自测试常常被忽视,而这是飞控系统不能容忍的。本文介绍了一种基于TMSF240芯片内部FLASH的自测试方法。   1 问题描述   在CPU处理器无自带FLASH空间的情况下,我们选用市场上专用的FLASH芯片,通过硬件设计该FLASH芯片的每一个地址空间都是可以访问的,我们可以指定不同的区域存放不同的内容。FLASH芯片的自测试也有很多种方法,目前较普遍
[测试测量]
基于TMSF240芯片的内部FLASH自<font color='red'>测试</font>方法
如何测试光耦合器(查找不良光耦合器)
光耦合器: 光耦合器、光电耦合器或光隔离器是一种利用光在两个隔离电路之间传输电信号的元件。光隔离器可防止高电压影响接收信号的系统。光耦合器有四种常见类型,每种类型都具有红外 LED 光源,但具有不同的光敏器件。这四种光耦合器分别称为:光电晶体管、光电达林顿、光电SCR 和光电双向可控硅,如下所示。 方法#1: 1.所需零件:万用表或欧姆表、光耦合器、100欧姆电阻、按钮、电池或电源。 2.打开万用表并选择电阻模式。 3.现在,将万用表(X1K欧姆或X10K欧姆)连接在发射极和集电极之间,如下所示:红色探针连接集电极,黑色探针连接发射极。 4.现在,在LED阳极串联一个几百欧姆(100欧姆)的电阻,打开电源后,按下按钮,开
[嵌入式]
如何<font color='red'>测试</font>光耦合器(查找不良光耦合器)
LitePoint推NFC测试仪,助力NFC设备生产
“目前消费者在使用手机NFC功能,会可能出现糟糕的用户体验,例如在地铁闸口支付不成功而造成后面排队的人的抱怨,而感到非常的尴尬。消费者会因此感到使用了‘愚蠢的手机’而丢脸。这些用户的口碑无疑会进一步影响到这个手机品牌的销售。” LitePoint全球高级销售副总裁Dana McCarty分析认为NFC如果出了问题,对手机品牌厂商会带来伤害。   目前市场上拥有这么多的NFC手机,即使是2%的NFC故障率,总数算起来也会达到1千7百多万用户会因此生气抱怨,这对于智能手机的品牌来说,潜在的影响很严重。 前面提到的业界采用的NFC测试只有“合格/不合格”显然不够,更不要说这种测试在产测中的效率不高的缺点。(莱特波特)LitePoint日前
[测试测量]
利用SIGLENT可编程线性直流电源完成多种测试解决方案
直流电源,特别是可编程高功率直流电源的选择上,其实里面的选择考虑因素很多,所涉及的参数也非常多,正是这些参数很多,也经常让人无所适从。其实,现在想来,就像买东西一样,你不可能兼顾所有方面——所有的指标都领先,同时价格还要低。 笔者在众多电源产品中选择,最终敲定SIGLENT/鼎阳SPD3303D,该款完全针对传统电源的不足而设计,一台电源能够替代多台不同型号的传统电源使用,覆盖了各个不同行业不同规格产品的测试需求,同时可在测试中提供线性电源的高精度。 1. 宽范围输出和多种输出模式 现有两个待测的电源产品,第一个待测电源的规格为60V/3A;第二个待测电源的规格为30V/6A,这样可能需要两台不同规格的180W电源或者一台成
[测试测量]
利用SIGLENT可编程线性直流电源完成多种<font color='red'>测试</font>解决方案
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved