历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2019年08月26日 | 环形缓冲区stm32例程

2019-08-26 来源:eefocus

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


主函数实现:


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

* 文件名          : 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);

    }

}


推荐阅读

史海拾趣

AVG [AVG Semiconductors(HITEK)]公司的发展小趣事

AVG深知在竞争激烈的电子行业中,单打独斗难以取得长远的发展。因此,公司积极寻求与行业内外的合作伙伴建立紧密的合作关系。通过与上下游企业建立供应链合作关系,AVG确保了原材料的稳定供应和产品质量的可靠性;通过与高校和研究机构合作开展技术研发,AVG不断引入新的技术和创新思路。这些合作伙伴关系的建立,为AVG的发展提供了有力支持,也促进了整个电子行业的共赢发展。

Adaptive Networks Inc公司的发展小趣事

随着技术的不断进步和产品的日益成熟,AVG开始积极寻求市场扩张的机会。公司先后进入多个国家和地区,通过设立分支机构和与当地企业建立合作关系,逐步扩大了市场份额。同时,AVG还注重品牌建设和提升,通过参加国际电子展会、举办技术研讨会等活动,提高了品牌知名度和影响力。这些举措使得AVG在全球电子行业中的地位逐渐提升。

Eurohm Resistors公司的发展小趣事

在电子行业的早期,Eurohm Resistors公司就以其独特的技术创新能力崭露头角。公司创始人敏锐地察觉到了半导体技术在电子行业中的重要地位,于是投入大量资源研发高精度、高稳定性的电阻器。通过不断的技术迭代和创新,Eurohm Resistors成功推出了一系列性能卓越的电阻器产品,赢得了市场的广泛认可。

Centellax Inc公司的发展小趣事

Centellax深知人才是公司发展的核心动力。因此,公司一直致力于打造一支高素质、专业化的团队。通过招聘优秀的研发、销售、管理等人才,为公司的长期发展提供有力的人才保障。

在团队建设方面,Centellax注重培养员工的团队协作精神和创新能力。通过定期举办团队建设活动、培训课程等,提升员工的凝聚力和归属感。同时,公司还鼓励员工积极参与创新项目,为公司的技术进步和业务发展贡献智慧和力量。

光磊(GL)公司的发展小趣事

Centellax Inc公司自成立以来,一直致力于电子通信技术的研发与创新。在成立初期,公司凭借其独特的测试测量技术,在光通信行业中崭露头角。随着技术的不断迭代和市场的扩大,Centellax逐渐积累了大量的专利和知识产权,为公司的长期发展奠定了坚实的基础。

在技术创新方面,Centellax不断投入研发资源,推出了一系列高性能的测试测量设备。这些设备不仅满足了客户对高速器件深入分析的需求,还提升了公司在行业内的竞争力。同时,Centellax还积极与高校、研究机构等合作,共同推动电子通信技术的进步。

Gem Asia Enterprise Co Ltd公司的发展小趣事

随着业务的不断扩展,Gem Asia意识到全球化布局的重要性。公司开始在全球范围内寻找合适的生产基地和市场机会。通过并购海外优质资产、建立海外研发中心和销售网络,Gem Asia成功实现了从本土企业向跨国公司的转变。特别是在亚洲和欧美市场,Gem Asia凭借其高质量的产品和灵活的市场策略,赢得了广泛的客户认可和市场份额。

问答坊 | AI 解惑

下载的时候金币不够了怎么办

今天下载DXP的教程资料,下了前三部分没有金币了,回复了一下,发现赠送了2枚金币,又下载了第四部分;又回复了一下发现金币未增…

查看全部问答>

S3C6410的DRAM控制器

我们在项目中更换了DRAM,所以需要重新配置S3C6410的DRAM控制器,结果发现S3C6410中的DRAM控制器还是挺复杂的。   S3C6410支持两个DRAM片选,可以分别接最大256MB的内存,该处理器用的DRAM控制器是来自ARM的PrimeCell Dynamic Memory Contro ...…

查看全部问答>

代码阅读器第一个版本, 请大家试试

代码阅读器第一个版本,   请大家试试 http://code-search.kingofcoder.com/…

查看全部问答>

求书!定散分~~~~~~~

求以下二本书: 书名:嵌入式实时操作系统μC/OSII (第2版) (美) Jean J.Labrosse著 邵贝贝等译 责任编辑 王瑛 ISBN 7-81077-290-2 开本:787×1092 1/16 字数: 979千字 定价:79.00元 2003年5月第1版 2003年5月第1次印刷 购买 ...…

查看全部问答>

TSP实现问题?

现要作一个TSP包,但是再win ce下导不进去了 那位高人知道作TSP包的过程,有代码更好了…

查看全部问答>

问MTK标准开发包内MMI_TEXT.h文件问题

此文件内的_MMI_TEXT_ID_E枚举变量内, 定义的ID顺序改变会影响最终编译结果。 但是,我没有发现特殊用法,都是当作标准枚举变量使用的。。 有做过MTK的高手解答下吗…

查看全部问答>

关于DIY数控电源的键盘(包括编码器)程序接口 讨论

原理图感觉有点不对啊 ENTER按键怎么和编码器的5脚连起来了??   显示部分已经有框架了,就等测试了   现在考虑一下输入部分的软件接口问题 是用一个函数来取得输入呢还是使用一个全局变量来取得 1.函数方式 Uint6 getInpu ...…

查看全部问答>

学习易电源心得 悲剧了

悲剧了~只有80分~ SIMPLE SWITCHER易电源电源模块不仅可提供强劲的系统性能,而且EMI低和高度可靠,适用于现今尖端的3G/HD/SD广播视频设备。该电源模块将控制电路,屏蔽式电感器,MOSFET和细小的无源组件集成到一个简单易用的封装内,以便简化设计 ...…

查看全部问答>

Mbed开始支持美信的MAXWSNENV

Mbed开始支持美信的MAXWSNENV,主要特点有: 提供方便的BLE平台板载温度、湿度、光照、气压传感器低功率可以延长电池使用时间mbed 中间层接口提供快速开发板载按钮开关和三彩色LED https://developer.mbed.org/platforms/MAXWSNENV/ …

查看全部问答>