环形缓冲区stm32例程

2019-08-26来源: eefocus关键字:环形缓冲区  stm32  主函数

总体分为中断函数和主函数,


主函数实现:


/******************************************************************************

* 文件名          : main.c

* 作者            : Losingamong

* 时间   : 08/08/2008

* 文件描述        : 主函数

******************************************************************************/

#include "stm32f10x_lib.h"

 

#define BUFFERMAX 256

 

static u8 UsartBuffer[BUFFERMAX];

static u8 BufferWptr = 0;

static u8 BufferRptr = 0;

 

static void RCC_Configuration(void);

static void USART1_Configuration(void);

static void USART2_Configuration(void);

static void NVIC_Configuration(void);

static u8 BufferRead(u8* data);

 

/*

* 函数名 : main

* 函数描述   : Main 函数

* 输入参数   : 无

* 输出结果   : 无

* 返回值     : 无

*/

int main(void)

{

    u8 data = 0;

    u8 i = 0;

    RCC_Configuration();

    USART1_Configuration();

    USART2_Configuration();

    NVIC_Configuration();

    while(1)

    {

        if(BufferRead(&data))

        {

            USART_SendData(USART2, data);

            for(i = 0; i < 10; i++); /* 加短延时降低数据处理速度 */

        }

    }

}

 

/*

* 函数名 : BufferWrite

* 函数描述  : 缓冲区写函数(由串口接收中断服务调用)

* 输入参数  : 无

* 输出结果  : 无

* 返回值    : 无

*/

void BufferWrite(void)

{

    if(BufferWptr == (BufferRptr - 1))

    {

        return;

    }

    UsartBuffer[BufferWptr] = USART_ReceiveData(USART1);

    BufferWptr++;

    BufferWptr = BufferWptr % BUFFERMAX;

}

 

/*

* 函数名 : BufferRead

* 函数描述  : 缓冲区读函

* 输入参数  : data,待存放读出数据的内存空间地址

* 输出结果  : 无

* 返回值    : 0:无数据

1:有数据

*/

u8 BufferRead(u8* data)

{

    if(BufferRptr == BufferWptr)

    {

        return 0;

    }

    *data =  UsartBuffer[BufferRptr];

    BufferRptr++;

    BufferRptr = BufferRptr % BUFFERMAX;

    return 1;

}

 

/* 函数名 :  RCC_Configuration

* 函数描述  : 设置系统各部分时钟

* 输入参数  : 无

* 输出结果  : 无

* 返回值    : 无

*/

void RCC_Configuration(void)

{

    /* 定义枚举类型变量 HSEStartUpStatus */

    ErrorStatus HSEStartUpStatus;

    

    /* 复位系统时钟设置*/

    RCC_DeInit();

    /* 开启HSE*/

    RCC_HSEConfig(RCC_HSE_ON);

    /* 等待HSE起振并稳定*/

    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    /* 判断HSE起是否振成功,是则进入if()内部 */

    if(HSEStartUpStatus == SUCCESS)

    {

    /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */

    RCC_HCLKConfig(RCC_SYSCLK_Div1); 

    /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */

    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */

    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* 设置FLASH延时周期数为2 */

    FLASH_SetLatency(FLASH_Latency_2);

    /* 使能FLASH预取缓存 */

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* 使能PLL */ 

    RCC_PLLCmd(ENABLE);

    /* 等待PLL输出稳定 */

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    /* 选择SYSCLK时钟源为PLL */

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* 等待PLL成为SYSCLK时钟源 */

    while(RCC_GetSYSCLKSource() != 0x08);

    }

}

/*

* 函数名  : USART1_Configuration

* 函数描述  : 设置USART1

* 输入参数  : None

* 输出结果  : None

* 返回值    : None

*/

void USART1_Configuration(void)

{

    USART_InitTypeDef USART_InitStructure;

    GPIO_InitTypeDef GPIO_InitStructure;

    

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); 

    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA , &GPIO_InitStructure);

    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA , &GPIO_InitStructure);

    

    USART_InitStructure.USART_BaudRate = 115200;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No ;

    USART_InitStructure.USART_HardwareFlowControl =  USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1 , &USART_InitStructure);

    

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    

    USART_Cmd(USART1 , ENABLE);

}

 

/*

* 函数名  : USART2_Configuration

* 函数描述  : 设置USART2

* 输入参数  : None

* 输出结果  : None

* 返回值    : None

*/

void USART2_Configuration(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    

    USART_InitStructure.USART_BaudRate = 115200;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART2, &USART_InitStructure);

    

    USART_Cmd(USART2, ENABLE);

}

 

/*

* 函数名  : NVIC_Configuration

* 函数描述    : 设置NVIC参数

* 输入参数      : 无

* 输出结果      : 无

* 返回值        : 无

*/

void NVIC_Configuration(void)

{

    NVIC_InitTypeDef NVIC_InitStructure;

    

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}

中断函数

 

 

/*

* 函数名  : USART1_IRQHandler

* 函数描述    : USART1中断服务函数

* 输入参数      : 无

* 输出结果      : 无

* 返回值        : 无

*/

 

void USART1_IRQHandler(void)

{

    /* 判断ORE位是否为SET状态 */

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

    {

        /* 进行空读操作,目的是清除ORE位 */

        USART_ReceiveData(USART1);

    }

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

    {

        /* 将接收到的数据写入缓冲 */

        BufferWrite();

        USART_ClearITPendingBit(USART1, USART_IT_RXNE);

    }

}


关键字:环形缓冲区  stm32  主函数

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic472461.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32的Flash缓冲区
下一篇:5、STM32Cube的串口配置与使用

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32F4 串口DMA+环形缓冲区的实现

下面是串口DMA+环形缓冲区的实现,将读写接口抽象出来,实现不定长度的数据收发。关于环形缓冲区参考:http://blog.csdn.net/jieffantfyan/article/details/53572103/****************************************************************************** * Copyright (C) 2016, roger * All rights reserved. * * 文件名称: tty.h * 摘    要:控制台驱动 * 
发表于 2019-08-26

STM32进阶之串口环形缓冲区实现 FIFO

的数据,指向列队尾的指针(Tail)是缓冲区可写的数据,通过移动这两个指针(Head) &(Tail)即可对缓冲区的数据进行读写操作了,直到缓冲区已满(头尾相接),将数据处理完,可以释放掉数据,又可以进行存储新的数据了。实现的原理:初始化的时候,列队头与列队尾都指向0,当有数据存储的时候,数据存储在‘0’的地址空间,列队尾指向下一个可以存储数据的地方‘1’,再有数据来的时候,存储数据到地址‘1’,然后队列尾指向下一个地址‘2’。当数据要进行处理的时候,肯定是先处理‘0’空间的数据,也就是列队头的数据,处理完了数据,‘0’地址空间的数据进行释放掉,列队头指向下一个可以处理数据的地址‘1’。从而实现整个环形缓冲区的数据读写。看图
发表于 2019-08-26
STM32进阶之串口环形缓冲区实现 FIFO

STM32进阶之串口环形缓冲区实现

的数据,指向列队尾的指针(Tail)是缓冲区可写的数据,通过移动这两个指针(Head) &(Tail)即可对缓冲区的数据进行读写操作了,直到缓冲区已满(头尾相接),将数据处理完,可以释放掉数据,又可以进行存储新的数据了。实现的原理:初始化的时候,列队头与列队尾都指向0,当有数据存储的时候,数据存储在‘0’的地址空间,列队尾指向下一个可以存储数据的地方‘1’,再有数据来的时候,存储数据到地址‘1’,然后队列尾指向下一个地址‘2’。当数据要进行处理的时候,肯定是先处理‘0’空间的数据,也就是列队头的数据,处理完了数据,‘0’地址空间的数据进行释放掉,列队头指向下一个可以处理数据的地址‘1’。从而实现整个环形缓冲区的数据读写。看图
发表于 2019-08-26
STM32进阶之串口环形缓冲区实现

51内核UART串行总线环形缓冲区驱动实现

1:驱动简述;驱动实现串口中断接收和发送数据,缓冲区使用环形缓冲区。发送:手动置RI中断标志位为1,发生中断,在中断发送函数中将需要发送的数据一一发送出去,具体见示例;接收:在中断接收函数中保存接收到满足协议的数据,后置接收成功标志位,最终在main函数while循环中轮询接收成功标志位是否置1,如果置1,处理接收到的数据。2:代码示例;以下代码模仿modbus协议,贴串口发送函数和中断处理函数,适用于51系列单片机,具体的串口协议可参考modbus协议或者自己根据需求定义。uart.h文件#define COM_TX1_Lenth 20#define COM_RX1_Lenth 20 typedef struct
发表于 2019-04-09

STM32串口环形缓冲区

发送完成中断和接收完成中断 USART_Cmd(USART2, ENABLE);                                  //使能串口 } void Usart_Send_Byte(u8 data){ Usart_TX_Buff[CYCLE.TX_write] = data;      //装发送缓冲区 if(++CYCLE.TX_write == TX_RE_BUFF_LENGTH
发表于 2019-04-09

STM8S学习01——SPI&IIC

1、温习IIC总线协议1)I2C 总线的一些特征1> 只要求两条总线线路 一条串行数据线 SDA 一条串行时钟线 SCL2> 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机 从机关系软件设定地址 主机可以作为主机发送器或主机接收器3> 它是一个真正的多主机总线 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁,防止数据被破坏4> 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达 3.4Mbit/s5> 片上的滤波器可以滤去总线数据线上的毛刺波 保证数据完整6> 连接到相同总线的 IC 数量只受到总线的
发表于 2019-09-16

小广播

何立民专栏

单片机及嵌入式宝典

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

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