环形缓冲区stm32例程

发布者:CuriousObserver最新更新时间: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  主函数 引用地址:环形缓冲区stm32例程

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

推荐阅读最新更新时间:2024-11-12 02:02

STM32之AFIO
也许你以为IO和AFIO是很简单的,事实上有几个误区可能很多人都没注意过,当你只用现成的开发板来学习的时候,别人已经帮你做好了资源分配,所有的外设功能学习都是照着别人给你的例程去做的,这才没让你觉得奇怪。 先问自己一个问题:STM32中,USART2和TIM2是共用相同IO的,你如何决定这几个IO到底是做USART2还是做TIM2呢?如果你要同时使用USART2和TIM2,该怎么办? 1、不是说使用了IO的复用功能就一定要启动RCC_APB2Periph_AFIO的Clock的,参考下图 只有使用了AFIO的事件控制寄存器、AFIO的重映射功能以及外部中断(EXTI)控制寄存器才需要开启AFIO的时钟,STM32参考手册从来
[单片机]
<font color='red'>STM32</font>之AFIO
STM32单片机ADC库函数的定义和使用方法
ADC的基本概念希望各位网友查阅相应的手册,上面对ADC有比较详尽的介绍,包括误差的分析和消除。这里主要介绍ADC的基本库函数的定义和使用。 1.ADC_DeInit函数的功能是将外设ADCx的全部寄存器重设为默认值。 ADC_DeInit(ADC2); 2.ADC_Init函数的功能是根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器。其中ADC_InitTypeDef定义在stm32f10x_adc.h中。其结构体如下所示: typedef struct { u32 ADC_Mode;//可以设置ADC_Mode FunctionalState ADC_ScanConvMode;//规定了模数转换工
[单片机]
STM32中如何使用PC14和PC15
在STM32的数据手册的管脚分配图中可以看到:PC14与OSC32_IN公用一个引脚,PC15与OSC32_OUT公用一个引脚,它们的使用方法如下: 当LSE(低速外部时钟信号)开启时,这两个公用管脚的功能是OSC32_IN和OSC32_OUT。 当LSE(低速外部时钟信号)关闭时这两个公用管脚的功能是PC14和PC15。 备用区域控制寄存器(RCC_BDCR)的LSEON用于控制LSE的开启或关闭。关于这个寄存器的用法请参看《STM3210x技术参考手册》。 作为GPIO输出的配置过程: (1).使能GPIOC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,
[单片机]
STM32单片机(3) 串口中断通信
注:使用普中科技开发板测试时,需要拔掉Boot1短接帽 两根下载线也要拿掉,重启 /******************************************************************************* * * 软件功能: 串口实验(软件延时方式) * *******************************************************************************/ #include stm32f10x.h #include string.h #include delay.h u8 uart1_buf ; int count=0
[单片机]
UC_COS移植到STM32
1 在外设篇里面的点亮液晶屏(17)的基础上移植液晶屏 1 下载GUI解压放到工程的根目录下 图片1 2 将GUI里面的文件夹全部添加到工程文件里面。 图片2 3 把GUI里面每个文件夹里面的文件加入到工程。 1 在添加Config的时候,因为Config里面都是头文件所以需要选择Allfile文件类型然后在选择全部文件添加。 2 字体先不添加,以后编译的时候需要那个字体在添加那个字体。 3 添加不带操作系统的延时函数文件GUI_X.c 4 添加图片文件的时候JPGE文件夹下面还有两个文件夹DOC和Image不需要添加,只需要添加JPGE下面的点C文件。 5 液晶屏驱动文件LCDDriver下面的文件先不
[单片机]
UC_COS移植到<font color='red'>STM32</font>
J-Link烧写STM32失败的问题
使用F205芯片,烧写时,出现各种问题——大致如下: 1. stm32 programming failed @ address .... 2. stm32 erase failed 3. Could not power up debug port .... 4. PC ..... 经过各种尝试,解决后,记录下 1. 出现erase failed时,可能flash被写保护了,可通过Unsecure chip 解决;如果不行,先Secure chip,再Unsecure chip即可; 2. 其它各种错误,这次遇到的情况,主要是 1)JTAG脚焊接不好,虚焊造成; 2)J-LINK接线过长,可能线
[单片机]
STM32之知其然,知其所以然
/*the core document(.s)**/ ; Reset handler //复位处理 Reset_Handler PROC EXPORT Reset_Handler // IMPORT SystemInit // IMPORT __main //load and operate LDR R0, =SystemInit BLX R0 LDR R0, =__main BX
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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