历史上的今天
今天是: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_ */
史海拾趣
|
目前,安全和保密在多个市场领域中都成为差异化应用解决方案的重要部分。汽车行业也不例外。消费者的快速接受进一步促进了汽车行业中许多新兴热点应用的发展。安全和保密解决方案在消费市场和汽车市场之间提供了一个协作的桥梁。许多分析师都预测到 ...… 查看全部问答> |
|
在s3c2410板上学着移植2.6内核, 首先设置nand flash支持, 修改devs.c: 1: 建立flash 分区: static struct mtd_partiton partition_info={....}; 分为4个区: bootloader, kernel, root, user 2: 加入分区信息: struct s3c2410_nan ...… 查看全部问答> |
|
我现在的单片机需要连接到主机上,和主机之间进行通信,但没有串口,所以想通过usb转串口来实现,我需要写一个上位机程序,来完成主机和单片机之间的通信功能,首先我不确定上位机应该用usb通信协议吧?那usb通信协议和串口是不同的,usb当usb设备 ...… 查看全部问答> |
|
用VC编译驱动程序提示 "fatal error LNK1146: 没有用选项“/SECTION:”指定参数"该怎么解决? 用VC编译驱动程序提示 \"fatal error LNK1146: 没有用选项“/SECTION:”指定参数\"该怎么解决?我是新手,谁能帮帮我,急啊… 查看全部问答> |
|
(灯)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操作究竟是怎么一回 ...… 查看全部问答> |




