历史上的今天
返回首页

历史上的今天

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

正在发生

2019年08月26日 | STM32——串口通信升级版(队列方式)

2019-08-26 来源:eefocus


#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_ */

推荐阅读

史海拾趣

Anderson Power公司的发展小趣事

Anderson Power是一家专注于电源连接器和配件制造的公司,以下是该公司发展的相关故事:

  1. 公司成立与初期阶段:Anderson Power成立于1953年,总部位于美国马萨诸塞州斯特林。最初,公司主要从事电源连接器的制造和销售。公司的创始人是William E. Anderson,他在创立公司之初便致力于提供高质量、可靠的连接器产品,满足不断增长的市场需求。

  2. 技术创新与产品发展:随着市场的需求不断增长,Anderson Power不断进行技术创新和产品开发,推出了一系列新型的电源连接器和配件产品。公司在连接器设计和制造方面拥有丰富的经验和专业知识,能够根据客户的需求定制各种类型的连接器产品。

  3. 客户合作与市场拓展:Anderson Power与全球各个行业的客户建立了长期稳定的合作关系。公司的客户群涵盖了汽车、航空航天、工业、能源等多个领域。通过与客户的紧密合作,Anderson Power不断拓展市场份额,提升品牌知名度,成为电源连接器领域的领先供应商之一。

  4. 全球布局与生产基地:为了更好地服务全球客户,Anderson Power在全球建立了多个生产基地和销售办事处。除了在美国的总部外,公司还在欧洲、亚洲等地区设立了生产工厂和销售办事处,以满足不同地区客户的需求。这些生产基地拥有先进的设备和技术,能够为客户提供高质量的连接器产品。

  5. 持续发展与未来展望:作为一家专注于电源连接器的公司,Anderson Power将继续致力于技术创新和产品发展。公司将不断推出适应市场需求的新产品,提升生产效率和产品质量,以满足客户不断变化的需求。同时,Anderson Power也将继续关注行业的发展趋势和技术变革,不断调整战略,保持在行业内的竞争优势。

Blue Sky Research公司的发展小趣事

作为一家有社会责任感的企业,Blue Sky Research始终关注环境保护和可持续发展。公司在生产过程中采用环保材料和工艺,减少对环境的影响。同时,公司还积极参与公益事业,为社会做出贡献。通过践行社会责任,Blue Sky Research不仅赢得了社会的尊重和认可,也为企业的可持续发展注入了新的动力。

这些故事虽然基于假设和一般情况构建,但它们反映了Blue Sky Research在电子行业里可能的发展路径和战略选择。当然,实际的发展过程可能更加复杂和多元,需要更多的数据和细节来揭示。

API Delevan公司的发展小趣事

1947年,API Delevan公司在电子行业的浪潮中应运而生。创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,凭借创始团队对电感技术的深刻理解和坚定信念,API Delevan迎难而上,积极研发新产品,逐步在市场中站稳脚跟。初创期的奋斗历程为公司的长远发展奠定了坚实的基础。

Eaton公司的发展小趣事

在伊顿的发展历程中,合作伙伴起到了至关重要的作用。伊顿一直秉持开放合作的态度,与全球各地的企业和机构建立了广泛的合作关系。通过与合作伙伴的共同努力,伊顿不仅在技术和产品上取得了突破和创新,还实现了市场份额的快速增长和业务的全球化拓展。例如,伊顿与天合智慧达成的战略合作伙伴关系,就是双方共同推动分布式光伏产业发展的有力证明。这一合作不仅为双方带来了共赢的机会,也为全球能源结构的转型和升级做出了积极贡献。

以上五个故事涵盖了伊顿公司在电子行业中的发展历程、在中国市场的拓展、与绿色能源的结合、在商用车领域的发展以及与合作伙伴的共赢等多个方面。这些故事不仅展示了伊顿公司的实力和成就,也体现了其不断创新和追求卓越的精神。

Dynawave Incorporated公司的发展小趣事

在快速发展的过程中,Dynawave意识到企业文化的重要性。他们注重培养员工的团队合作精神和创新能力,鼓励员工积极参与公司的各项活动。同时,公司还建立了完善的激励机制和福利制度,为员工提供了良好的工作环境和发展空间。这些举措增强了员工的归属感和忠诚度,为公司的长期发展奠定了坚实的基础。

Electroswitch公司的发展小趣事

随着市场竞争的加剧,Electroswitch意识到仅仅依靠产品质量已经不足以赢得市场。因此,公司开始注重提升服务质量,为客户提供更加全面和专业的支持。通过加强售前咨询、售后服务以及技术支持等方面的投入,Electroswitch成功赢得了客户的信任和忠诚。这也使得公司在电子行业中的地位得到了进一步提升。

问答坊 | AI 解惑

智能无线通信瞄准汽车安全应用

目前,安全和保密在多个市场领域中都成为差异化应用解决方案的重要部分。汽车行业也不例外。消费者的快速接受进一步促进了汽车行业中许多新兴热点应用的发展。安全和保密解决方案在消费市场和汽车市场之间提供了一个协作的桥梁。许多分析师都预测到 ...…

查看全部问答>

与初学者谈电子制作

您一定玩过电子游戏机;使用过手电筒。如果让您亲手制作这些电子作品,您一定会感到很兴奋,很有趣。其实您只要花上几元钱,买几个电子元件,就可以通过自己的努力在几个小时内创造出自己的电子作品。通过一个小小电子产品的制作,不仅证明了您的智慧 ...…

查看全部问答>

基于AT89C51的两个设计

大家看看吧,不知到对大家有没有帮助!…

查看全部问答>

请教nand flash 设置问题

在s3c2410板上学着移植2.6内核, 首先设置nand flash支持, 修改devs.c: 1: 建立flash 分区: static struct mtd_partiton partition_info={....};  分为4个区: bootloader, kernel, root, user 2: 加入分区信息: struct s3c2410_nan ...…

查看全部问答>

几个常用标准

1) IPC-ESD-2020: 静电放电控制程序开发的联合标准。包括静电放电控制程序所必须的设计、建立、实现和维护。根据某些军事组织和商业组织的历史经验,为静电放电敏感时期进行处理和保护提供指导。 2) IPC-SA-61 A: 焊接后半水成清洗手册。包括半水 ...…

查看全部问答>

请教,usb转串口的问题

我现在的单片机需要连接到主机上,和主机之间进行通信,但没有串口,所以想通过usb转串口来实现,我需要写一个上位机程序,来完成主机和单片机之间的通信功能,首先我不确定上位机应该用usb通信协议吧?那usb通信协议和串口是不同的,usb当usb设备 ...…

查看全部问答>

用VC编译驱动程序提示 "fatal error LNK1146: 没有用选项“/SECTION:”指定参数"该怎么解决?

用VC编译驱动程序提示 \"fatal error LNK1146: 没有用选项“/SECTION:”指定参数\"该怎么解决?我是新手,谁能帮帮我,急啊…

查看全部问答>

中断问题(AT91 A3)高手求救!

  (灯)LED 与PA相连   按钮(SW,一共四个按钮)与PB 相连 #define LED_MASK        (LED1|LED2|LED3|LED4) #define SW_MASK         (SW1_MASK|SW2_MASK|SW ...…

查看全部问答>

关于现代nand flash的cache read操作的问题

请教大家一个关于现代nand flash的cache read操作的问题:资料中介绍说,采用cache read操作时可一次完成flash多块数据读取,而我在操作过程中(USB的DMA方式),出现了漏页数据现象,这是怎么回事?现代nand flash的cache read操作究竟是怎么一回 ...…

查看全部问答>