STM32F10x 利用环形缓冲区的串口驱动程序

发布者:荒火最新更新时间:2020-01-19 来源: eefocus关键字:STM32F10x  环形缓冲区  串口驱动程序 手机看文章 扫描二维码
随时随地手机看文章

这次讲讲利用串口收发中断来进行串口通讯。STM32 上为每个串口分配了一个中断。也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断。程序需在中断处理函数中读取状态寄存器(USART_SR)来判断当前的是什么中断。下面的中断映像图给出了这些中断源是如何汇合成最终的中断信号的。图中也给出了如何控制每一个单独的中断源是否起作用。

另外,Cortex-M3 内核中还有个NVIC,可以控制这里的中断信号是否触发中断处理函数的执行,还有这些外部中断的级别。关于NVIC 可以参考《ARM CortexM3 权威指南》,里面讲解的非常详细。


简单的说,为了开启中断,我们需要如下的代码:


NVIC_InitTypeDef NVIC_InitStructure;  

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

NVIC_Init(&NVIC_InitStructure);  

  

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启接收中断  

USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // 开启发送中断  

这里多说一句,串口的发送中断有两个,分别是:


l发送数据寄存器空中断(TXE)

l发送完成中断(TC)

一般来说我们会使用发送数据寄存器空中断,用这个中断发送的效率会高一些。


中断处理函数的框架如下,如果检测到错误就清除错误,收到数了就处理。发完当前数据了就发下一个。


void USART1_IRQHandler(void)  

{  

    unsigned int data;  

  

    if(USART1->SR & 0x0F)   

    {  

        // See if we have some kind of error, Clear interrupt     

        data = USART1->DR;  

    }  

    else if(USART1->SR & USART_FLAG_RXNE) //Receive Data Reg Full Flag  

    {    

        data = USART1->DR;  

        // 对收到的数据进行处理,或者干些其他的事    

    }  

    else if(USART1->SR & USART_FLAG_TXE)   

    {  

        { // 可以发送数据了,如果没有数据需要发送,就在这里关闭发送中断  

            USART1->DR =  something;        // Yes, Send character                        

        }                                             

    }    

}      


下面给一个利用环形缓冲区的串口驱动程序。


#ifndef _COM_BUFFERED_H_  

#define _COM_BUFFERED_H_  

  

#define  COM1                   0  

#define  COM2                   1  

  

#define  COM_RX_BUF_SIZE        64                /* Number of characters in Rx ring buffer             */  

#define  COM_TX_BUF_SIZE        64                /* Number of characters in Tx ring buffer             */  

  

#define  COM_NO_ERR             0                /* Function call was successful                       */  

#define  COM_BAD_CH             1                /* Invalid communications port channel                */  

#define  COM_RX_EMPTY           2                /* Rx buffer is empty, no character available         */  

#define  COM_TX_FULL            3                /* Tx buffer is full, could not deposit character     */  

#define  COM_TX_EMPTY           4                /* If the Tx buffer is empty.                         */  

  

  

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

 * function : COMGetCharB  

 * parameter: char port, port can be COM1 / COM2 

 * parameter: char* err   is a pointer to where an error code will be placed: 

 *                   *err is set to COM_NO_ERR   if a character is available 

 *                   *err is set to COM_RX_EMPTY if the Rx buffer is empty 

 *                   *err is set to COM_BAD_CH   if you have specified an invalid channel 

 * return   : char 

 * usage    : This function is called by your application to obtain a character from the communications 

 *               channel. 

 * changelog:  

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

unsigned char  COMGetCharB (unsigned char ch, unsigned char *err);  

  

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

 * function : COMPutCharB  

 * parameter: char port, port can be COM1 / COM2 

 * return   :    COMM_NO_ERR   if the function was successful (the buffer was not full) 

 *               COMM_TX_FULL  if the buffer was full 

 *               COMM_BAD_CH   if you have specified an incorrect channel 

 

 * usage    : This function is called by your application to send a character on the communications 

 *               channel.  The character to send is first inserted into the Tx buffer and will be sent by 

 *               the Tx ISR.  If this is the first character placed into the buffer, the Tx ISR will be 

 *               enabled.  If the Tx buffer is full, the character will not be sent (i.e. it will be lost) 

 * changelog:  

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

unsigned char COMPutCharB (unsigned char port, unsigned char c);  

  

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

 * function : COMBufferInit  

 * parameter:  

 * return   :     

 * usage    : This function is called by your application to initialize the communications module.  You 

 *             must call this function before calling any other functions. 

 * changelog:  

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

void  COMBufferInit (void);  

  

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

 * function : COMBufferIsEmpty  

 * parameter: char port, port can be COM1 / COM2 

 * return   : char 

 * usage    : This function is called by your application to see  

 *            if any character is available from the communications channel. 

 *            If at least one character is available, the function returns 

 *            FALSE(0) otherwise, the function returns TRUE(1). 

 * changelog:  

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

unsigned char  COMBufferIsEmpty (unsigned char port);  

  

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

 * function : COMBufferIsFull  

 * parameter: char port, port can be COM1 / COM2 

 * return   : char 

 * usage    : This function is called by your application to see if any more characters can be placed 

 *             in the Tx buffer.  In other words, this function check to see if the Tx buffer is full. 

 *             If the buffer is full, the function returns TRUE otherwise, the function returns FALSE. 

 * changelog:  

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

unsigned char COMBufferIsFull (unsigned char port);  

  

#endif  


[cpp] view plain copy

/* 

 * file: com_buffered.c 

 * author: Li Yuan 

 * platform: STM32F107 

 * date: 2013-5-5 

 * version: 0.0.1 

 * description: UART Ring Buffer                             

**/  

  

#include "stm32f10x_usart.h"  

#include "com_buffered.h"  

  

#define OS_ENTER_CRITICAL()     __set_PRIMASK(1)  

#define OS_EXIT_CRITICAL()      __set_PRIMASK(0)     

      

/** 

 *  Enables Transmiter interrupt. 

**/  

static void COMEnableTxInt(unsigned char port)  

{  

    static USART_TypeDef* map[2] = {USART1, USART2};  

    USART_ITConfig(map[port], USART_IT_TXE, ENABLE);      

}  

/* 

********************************************************************************************************* 

[1] [2] [3] [4] [5]
关键字:STM32F10x  环形缓冲区  串口驱动程序 引用地址:STM32F10x 利用环形缓冲区的串口驱动程序

上一篇:stm32 TIM8和TIM3初始化相互有影响
下一篇:STM32 下载程序时,往flash固定位置写数据配置

推荐阅读最新更新时间:2024-11-17 15:35

STM32F10X系列微控制器标准外设库的应用
Stm32f10x系列微控制器具有Cortex-M3内核结构,它集成了CM3core的中心处理器内核和先进的系统外设,实现了内置的中断控制、存储器保护,以及系统的调试和跟踪功能。在进行嵌入式系统设计时,控制软件首先需要对微控制器的启动、系统时钟、存储器映射、中断向量、异常处理等进行设置,增加了控制软件的前期开发时间,更加造成了初学者的难度。为了缩短开发时间、提高软件的可移植性,同时降低开发成本,ST公司提供了标准外设驱动库,该库集成了CMSIS文件及微控制器所有外设驱动函数,由于屏蔽了不同型号微控制器之间的差异,用户文件仅需调用相应的库函数便可完成系统配置,简化了开发流程,降低了开发难度。 1 CMSIS文件结构 CMS
[单片机]
<font color='red'>STM32F10X</font>系列微控制器标准外设库的应用
STM32F10x 学习笔记之SysTick 定时器
SysTick 定时器被集成在NVIC中。因此,只要是Cortex-M3 内核的单片机,就都有它。这个学习笔记就用SysTick 定时器来实现走马灯的功能。 SysTick 定时器非常简答,只有四个寄存器。这四个寄存器的含义在《Cortex-M3权威指南》那本书中讲的非常的清楚,这里不复述了,下面只讲讲在STM32上SysTick有什么特殊之处。按照CMSIS 标准,用C语言访问这四个寄存器时使用的寄存器名称分别如下: SysTick- CTRL SysTick- LOAD SysTick- VAL SysTick- CALIB SysTick- CALIB 的值固定为9000,因此,只有当系统嘀嗒时钟设定为9MHz(HC
[单片机]
STM32头文件STM32F10x.h和STM32F10x_lib.h区别
#include stm32f10x_lib.h 是ST公司V2.0的库函数使用的头文件,用MDK3.80A打开。但是,如果你用MDK4.7/MDK5打开,就没法找到了,这也就是为什么,我们老版本的例程,存在高版本的MDK编译的时候,报找不到stm32f10x_lib.h的错误的原因了。而stm32f10x_lib.h里面,经过分析,实际可以用:stm32f10x_map.h和stm32f10x_nvic.h来替代。 #include stm32f10x.h 是ST公司V3.5及以后版本统一使用的库函数头文件了,说白了就是把原来的stm32f10x_lib.h,换成了#include stm32f10x.h ,规范了代码,不需
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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