STM32——串口通信升级版(队列方式)

发布者:bobojrt最新更新时间:2019-08-26 来源: eefocus关键字:STM32  串口通信  队列方式 手机看文章 扫描二维码
随时随地手机看文章


#ifndef _USART_QUEUE_H_

#define _USART_QUEUE_H_

 

#include "type.h"

 

typedef enum

{

  USART_QUEUE_EMPTY = 0,

  USART_QUEUE_FULL = 1,

  USART_QUEUE_OK = 2,

} usart_queue_status_t;

 

#define USART_QUEUE_SIZE  1024

 

typedef struct

{  

  uint16_t front;

  uint16_t rear;

  uint16_t size;

  char data[USART_QUEUE_SIZE];

} usart_queue_t;

 

extern usart_queue_t usart1_send, usart3_send;

 

void UsartQueueInit(usart_queue_t *q);

uint8_t UsartQueuePush(usart_queue_t *q, uint8_t data);

uint8_t UsartQueuePop(usart_queue_t *q, uint8_t *data);

 

#endif /* _USART_QUEUE_H_ */


#include "usart_queue.h"

 

usart_queue_t usart1_send, usart3_send;

 

void UsartQueueInit(usart_queue_t *q)

{

  q->size = 0;

  q->front = 0;

  q->rear = 0;

}

 

uint8_t UsartQueuePush(usart_queue_t *q, uint8_t data)

{

  if(((q->rear % USART_QUEUE_SIZE) == q->front) && (q->size == USART_QUEUE_SIZE))

  {

    return USART_QUEUE_FULL;

  }

 

  q->data[q->rear] = data;

  q->rear = (q->rear + 1) % USART_QUEUE_SIZE;

  q->size++;

 

  return USART_QUEUE_OK;

}

 

uint8_t UsartQueuePop(usart_queue_t *q, uint8_t *data)

{

  if((q->front == q->rear) && (q->size == 0))

  {

    return USART_QUEUE_EMPTY;

  }

  

  *data = q->data[q->front];

  q->front = (q->front + 1) % USART_QUEUE_SIZE;

  q->size--;

 

  return USART_QUEUE_OK;

}

#ifndef _USART_H_

#define _USART_H_

 

#include "stm32f10x.h"

#include "type.h"

 

void UsartInit(USART_TypeDef* usart, uint32_t bound);

void DiagDump(const void *data, uint32_t length);

 

#endif /* _USART_H_ */

#include "usart.h"

#include "usart_queue.h"

#include "target.h"

#include "stm32f10x_iwdg.h"

#include

#include

#include "debug.h"

 

int fputc(int ch, FILE *f)

{

  while (USART_GetFlagStatus(USART1_CHANNEL, USART_FLAG_TC) == RESET);

 

  USART_SendData(USART1_CHANNEL, (unsigned char)ch);

 

  return ch;

}

 

static void uart_gpio_init(USART_TypeDef *usart)

{

  if(USART1_CHANNEL == usart)

  {

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

 

    USART1_TX_CONFIG();

    USART1_RX_CONFIG();

  }

  if(USART3_CHANNEL == usart)

  {

    RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB2Periph_AFIO, ENABLE);

 

    USART3_TX_CONFIG();

    USART3_RX_CONFIG();

  }

}

 

static void uart_nvic_init(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

 

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

 

  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

 

//===================================================================================

void UsartInit(USART_TypeDef *usart, uint32_t bound)

{

  USART_InitTypeDef USART_InitStructure;

 

  uart_gpio_init(usart);

  uart_nvic_init();

 

  USART_InitStructure.USART_BaudRate   =  bound;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits   = USART_StopBits_1;

  USART_InitStructure.USART_Parity   = USART_Parity_No ;

  USART_InitStructure.USART_Mode     = USART_Mode_Rx | USART_Mode_Tx;

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

 

  USART_Init(usart, &USART_InitStructure);

  USART_ITConfig(usart, USART_IT_RXNE, ENABLE);

  USART_Cmd(usart, ENABLE);

}

 

void DiagDump(const void *data, uint32_t length)

{

  const uint8_t *buffer = data;

  uint32_t i;

 

  for(i = 0; i < length; ++i)

  {

    printf("%2x", buffer[i]);

    printf(" ");

  }

  printf("rn");

}

 

void USART1_IRQHandler(void)

{

//  static uint16_t usart_rx_status = 0;

  uint8_t ret;

 

  // receive interrupt, must be 0x0d 0x0a at the end;

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

  {

    ret = USART_ReceiveData(USART1_CHANNEL); // receive data (a byte)

    UsartQueuePush(&usart1_send, ret);

  }

}

 

void USART3_IRQHandler(void)

{

//  static uint16_t usart_rx_status = 0;

  uint8_t ret;

 

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

  {

    ret = USART_ReceiveData(USART3_CHANNEL);

    UsartQueuePush(&usart3_send, ret);

  }

}

#ifndef _DEBUG_H_

#define _DEBUG_H_

 

#include

#include "usart.h"

 

#define CONFIG_UART             

 

#ifndef CONFIG_UART

//#define CONFIG_LED    

//#define CONFIG_KEY            

//#define CONFIG_ADC

//#define CONFIG_CAN              

//#define CONFIG_WATCHDOG

#define CONFIG_W5500

#endif

 

#ifdef CONFIG_UART

#define debug(fmt, args...)     printf("[debug.h] "fmt, ##args)

#define debug_dump(buf, length) DiagDump(buf, length)

#else

#define debug(fmt, args...)

#define debug_dump(buf, length)

#endif /* CONFIG_DEBUG */

 

#endif /* _DEBUG_H_ */

关键字:STM32  串口通信  队列方式 引用地址:STM32——串口通信升级版(队列方式)

上一篇:STM32F10x 学习笔记之USART实现串口通讯
下一篇:STM32的Flash缓冲区

推荐阅读最新更新时间:2024-11-13 08:40

关于stm32的正交解码
关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧 看一下我用过的一种编码器 编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说明这个编码器转一圈对应的信号线会输出500个脉冲,,,,为什么说是对应的,,,对于上面的编码器而言是这样的,,,,但是有的编码器里面有好多线,,,有的信号线是转一圈就输出对应多少线的脉冲,,,有的信号线是转一圈就输出一个脉冲,,,,这就要看编码器的资料了...... 看我上面用过的这个编码器,,使用A,B,VCC,GND这四根线,, 编码器转一圈A信号线会输出500个脉冲,,,,B信号线也会输出500个脉冲,,不过 正转的时
[单片机]
关于<font color='red'>stm32</font>的正交解码
人员定位系统控制模块电路设计
定位卡的设计:定位模块以STM32为主控制核心。在该定位模块中使用的是ST(意法半导体)STM32WCBU6x芯片,该芯片采用32位ARMCortex-M3内核;STM32WCBU6x集成了2.4GHz IEEE8.2.15.4兼容的收发器,拥有128KB的Flash和8KB的RAM,是一款高性能的无线片上系统(SoC)。该主控制原理图如图1所示。 图1 主控制器原理图 电路分析:该系统需要外置MCU来控制模块的数据收发,因此外部MCU需要与模块进行通信,其连接方式为(USART)串口。模块提供一个符合标准的 USART接口,其IO电平限制为2.4~3.6V,标称使用3.3V逻辑电平。模块串口在不使用硬件流控制的情况
[单片机]
人员定位系统控制模块电路设计
位带操作在stm32中的C语言实现
首先: #define BITBAND(addr,bitnum) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) 5) + (bitnum 2)) 对上句程序的解释: 利用宏定义的方式将位带地址的映射表示出来,该函数有两个参数addr和bitnum,分别是原本的地址和在数据中的第几位。我们知道两个公式如下: 0x2000_0000‐0x200F_FFFF地址空间:AliasAddr = 0x22000000 + (A 0x20000000)*32 + n*4 0x4000_0000‐0x400F_FFFF地址空间:AliasAdd
[单片机]
STM32单片机的PSAM卡驱动模块设计
引言 刷卡消费随着人们生活水平的提高已经成为常用的支付方式之一。为了保证刷卡消费的安全性,将PSAM卡内嵌于各种终端刷卡设备中。PSAM(Purchase SecureAccess Module,销售点终端安全存取模块),由IC卡发行主管部门或者应用主管机构发行,是可以用于对IC卡进行脱机消费交易认证的安全认证卡,主要应用于商用POS、网点终端、直连终端等设备上,支持多级发卡机制,适用于多应用的环境,符合识别卡、带触点的集成电路卡标准、ISO/IEC 7816—1/2/3/4以及《中国人民银行PSAM卡规范》。 1 PSAM卡简介 PSAM卡是接触式CPU卡的一种。CPU卡也称智能卡,卡内集成电路带有微处理CPU,存储
[单片机]
<font color='red'>STM32</font>单片机的PSAM卡驱动模块设计
C语言基础知识科普
C语言是单片机开发中的必备基础知识,本文列举了部分STM32学习中比较常见的一些C语言基础知识。 1 位操作 下面我们先讲解几种位操作符,然后讲解位操作使用技巧。C语言支持以下六种位操作:79c55d0c-080b-11ed-ba43-dac502259ad0.png 下面,重点讲解一下位操作在单片机开发中的一些实用技巧。1.1 在不改变其他位的值的状况下,对某几个位进行设值 这个场景在单片机开发中经常使用,方法就是我们先对需要设置的位用&操作符进行清零操作,然后用 | 操作符设值。 比如,我要改变GPIOA的状态,可以先对寄存器的值进行&清零操作:79dc505c-080b-11ed-ba43-dac5
[单片机]
STM32驱动1602程序
标 注:用到了 PD_0—7,给PO口( 单片机 板液晶数据口),PA0_2; 已在函数中将他们以寄存器形式配置,注踏出再次配置PD时 不应在配置这些口; 在主函数中需将PD,PA使能。 头函数:#include 1602.h 函 数:在1602.h中有列举; 返回值:无; 用PD0_7给液晶数据,PA0_2位控制为依次rs,rw,en; #ifndef __1602_H #define __1602_H #include stm32f10x.h void write1602_com(u8 com); void write1602_dat(u8 dat); void LC
[单片机]
STM32 NVIC嵌套向量中断控制器函数分析
中断管理函数 CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。而我们常用的就是这60个可屏蔽中断,所以我们就只针对这60个可屏蔽中断进行介绍。 在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体: typedef struct { vu32 ISER ; u32 RESERVED0 ; vu32 ICER ; u32 RSERVED1 ; vu32 ISPR ; u32 RESERVE
[单片机]
<font color='red'>STM32</font> NVIC嵌套向量中断控制器函数分析
STM32的三种延时方法的代码实现_纯软件延时, 系统定时器延时, 定时器延时
/* 外部调用: delay_init(72); //系统主频, 单位为MHZ, 仅对 SYSTICK_DELAY 有效 delay_ms(1000); */ #include stm32f10x.h //#define SOFT_DELAY //纯软件延时 //#define SYSTICK_DELAY //系统定时器延时 #define TIMER_DELAY //定时器延时 #ifdef TIMER_DELAY #define TIMER_DELAY TIM4 #define TIMER_DELAY_PERIOD 1000 #de
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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