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-17 18:57

中芯国际携手Cadence,共谋中国射频电路设计发展
Cadence和中芯国际日前共同宣布将Cadence的射频设计方案(Radio Frequency Design Methodology Kit)推向中国射频电路设计市场,中芯国际将发展支持Cadence射频方案的工艺设计套件(process-design kit)并于2006年底前完成测试芯片。 客户可于2006年底得到0.18微米的CMOS射频工艺设计套件(process-design kit)。Cadence和中芯国际将共同合作推出射频电路的培训课程,并向中国射频设计者们提供射频工艺设计套件(process-design kit)的适用性咨询。 随着此项合作,国内的无线芯片设计人员将可得到必要的工具,以达到确保符合设计意
[焦点新闻]
光纤测试仪CFP2-100-Q如何测量SFP/SFP+/QSFP
SFP模块是指众多可用的各种类型光模块(比如SFP+、QSFP等等),针对这种模块,该如何确定SFP模块是否正常工作呢?我们可以用福禄克光纤测试仪测量SFP发出的光功率以及SFP本身。 在这里,我们以新款基于Versiv2平台的 CertiFiber Pro光纤损耗认证分析仪CFP2-100-Q 为例(CFP-100-Q,此为单多模一体测试仪,CFP-100-M此为多模光纤测试仪,CFP-100-S此为单模光纤测试仪)。首先,将CertiFiber Pro测试仪CFP2-100-Q(设置为“功率计”模式。在主屏幕上选择TOOLS(工具)菜单,然后选择第二个选项,如果连接有CertiFiber Pro模块,该选项则为POWER
[测试测量]
光纤<font color='red'>测试</font>仪CFP2-100-Q如何测量SFP/SFP+/QSFP
整车静电测试方法及要求
  本文介绍了整车部分ESD 抗扰度测试。   测试方法:   按照放电方式分类可以分为直接接触放电和空气放电。   1、 放电试验点至少应包括乘客车厢内的成员能触及的全部电源开关和控制器件,欢迎包括车辆正常操作使用的按键、拉杆、手柄。   2、 直接接触放电是按照规定的测试限值对可触及的放电点进行直接接触放电,放电次数一般为每个点正负至少3 次,放电间隔时间至少5S,具体放电次数根据客户测试计划规定。   3、 空气放电是按照规定的测试限值对产品进行空中耦合的方式进行放电,测试时空气放电端要距离被试设备至少15mm,放电端垂直( 15℃)对准放电位置,以速度不大于5mm/s 缓慢靠近,直至放电。如无放电产生,则继续移动放电
[测试测量]
整车静电<font color='red'>测试</font>方法及要求
u-boot移植(九)---代码修改---NAND
一、NAND原理      NAND 无地址空间,地址和数据的发送都依赖于LDATA 这一串数据总线。      不看随机页编程,看到从高位到低位的页,总共分为64个页面,每个页的组成是2K + 64 个byte,一个块的大小是(128K + 4K)byte,64页组成一块。 1.1 NAND Flash的编址   nand flash的的页的大小是(2048 + 64)byte,64这个数据是不参与编址的。   访问 nand flash: 发出命令:读、写、擦除 发出地址 传输数据   命令设置如下:    1.2 nand flash的访问      可以看看上面的模式选择,然后对应引脚进行操作,就
[单片机]
u-boot<font color='red'>移植</font>(九)---代码修改---NAND
智能双显绝缘电阻测试仪的功能都有哪些
BC20系列型智能双显绝缘电阻测试仪采用嵌入式工业单片机实时操作系统,超薄形张丝表头与图形点阵液晶显示器完美结合,该系列表具有多种电压输出 等级(500V、1000V、2500V、5000V)、容量大、抗干扰强、指针与数字同步显示、交直流两用、操作简单、自动计算各种绝缘指标(吸收比、极化指数)、各种测量结果具有防掉电功能等特点。BC系列型智能双显绝缘电阻测试仪是测量大容量变压器、互感器、发电机、高压电动机、电力电容、电力电缆、避雷器等绝缘电阻的理想测试仪器。 BC系列型智能双显绝缘电阻测试仪有BC20系列、BC23系列、BC25系列、BY26系列。 智能双显兆欧表功能 此为BC20系列具体参数(其他系列具体参数请向客服索要
[测试测量]
智能土壤养分测试仪的使用方法
智能土壤养分测试仪怎么使用。智能土壤土壤养分测试仪【恒美 HM-GT2】是一款快检仪器,用于检测土壤环境状况,改善土壤肥力。仪器的使用一方面可检测土壤及肥料的养分成分情况,另一方面可根据检测的数据结果给出施肥建议,实现科学合理施肥。土壤养分是质土壤提供给作物生长的必需营养元素,智能土壤土壤养分测试仪可直接检测土壤养分含量的情况。通过对照土壤养分丰缺指标,判断土地养分含量的盈亏情况,从而更好的利用土壤的养分,及时补充含量不足的元素,提升作物的产量。智能土壤土壤养分测试仪本身是在实验室方法上发展而来的,仪器的研发服务于广大用户,操作简便,无需专业技能即可操作。 智能土壤养分测试仪【恒美 HM-GT2】怎么使用:以土壤速效钾的测定为
[测试测量]
基于GB3442-82的集成运放参数测试仪设计
        1 引言   集成运放以其价格低廉、性能优越等特点在个人数据助理、通信、汽车电子、音响产品、仪器仪表、传感器等领域得到广泛应用。随着数字技术的不断进步和集成电路市场的发展.兼有模拟和数字集成电路的SOC或混合集成电路将越来越受重视。与此同时,集成运放参数的测定也将对研发人员和技术仪器提出更高的要求,传统的运放测试仪校准方案已不能满足市场特别是国防军工的要求.运放测试仪的校准面临严峻挑战。因此,提高运放测试仪的测试精度,保证运放器件的准确性是目前应解决的关键问题。    2 系统方案论证    2.1 信号发生器方案论证   考虑到单片函数发生器的外接电阻电容对参数影响很大,因而产生的频率稳定度较差、
[电源管理]
基于GB3442-82的集成运放参数<font color='red'>测试</font>仪设计
IR新一任总裁兼CEO 3月1日上任
   IR总裁兼CEO Oleg Khaykin   IR宣布委任Oleg Khaykin为新一任总裁兼CEO。Khaykin将于2008年3月1日正式上任,并接替由2007年8月30日起出任代理CEO的Donald Dancer。Dancer将继续服务公司,支持Khaykin担任新职,也会积极确保公司相关工作的顺利过渡。   现年43岁的Khaykin在就任此职前他担任Amkor Technology的首席运营官。该公司是领先的半导体组装及测试服务供货商,旗下12间高产量厂房分布于韩国、菲律宾、大陆、日本、台湾和新加坡,在全球各地共拥有22,000名员工。他在Amkor公司主要负责管理销售、市场推广、研发及生产营运等领域
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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