STM32循环队列串口通信
包含内容:
typedef struct
{
uint16_t Head;
uint16_t Tail;
uint16_t Lenght;
uint8_t Ring_Buff[200];
}RingBuff_t;
extern RingBuff_t ringBuff;
void RingBuff_Init();缓冲区初始化
uint8_t Write_RingBuff(uint8_t data);
uint8_t Read_RingBuff(uint8_t *rData);
void RingBuff_Init(void)
{
ringBuff.Head=0;
ringBuff.Tail=0;
ringBuff.Lenght=0;
}
5.入队代码
uint8_t Write_RingBuff(uint8_t data)
{
if(ringBuff.Lenght>=200)
{
return 1;
}
ringBuff.Ring_Buff[ringBuff.Tail]=data;
ringBuff.Tail=(ringBuff.Tail+1)%200;
ringBuff.Lenght++;
return 0;
}
6.出队代码
uint8_t Read_RingBuff(uint8_t *rData)
{
if(ringBuff.Lenght==0)
{
return 1;
}
*rData=ringBuff.Ring_Buff[ringBuff.Head];
ringBuff.Head=(ringBuff.Head+1)%200;
ringBuff.Lenght--;
return 0;
}
本代码多有参考 在基础上加入了自身的理解和注释 记录学习过程中的一些细节 参考博客在下方链接 对接串口通信的详细后续补充
参考博客-图片
参考博客—代码
补充串口部分
uint16_t uart_puts(uint8_t *src, uint16_t len);
uint16_t uart_read(uint8_t* buf, uint16_t read_len);
uint8_t *pDataByte;
uint8_t Data = 0;
uint8_t Flag = 0;
uint16_t Len = 0;
uint8_t Data_BUF[200];
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);
LED_Init();
memset(Data_BUF,'1',200);
RingBuff_Init();
while(1)
{
uart_puts(Data_BUF,10);
delay_ms(4);
}
}
uint16_t uart_puts(uint8_t *src, uint16_t len)
{
pDataByte = src;
Len=len;
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
return 0;
}
uint16_t uart_read(uint8_t* buf, uint16_t read_len)
{
static uint8_t n = 0;
if(n > read_len)
{
n = 0;
buf = Data_BUF;
Flag = 1;
}
if(0 == Read_RingBuff(&Data) && Flag == 0)
{
*buf++ = Data;
n++;
}
return 0;
}
串口初始化及接收部分
#include "sys.h"
#include "usart.h"
#if SYSTEM_SUPPORT_OS
#include "includes.h"
#endif
extern uint8_t Flag;
extern uint16_t Len;
extern uint8_t* pDataByte;
typedef struct
{
uint16_t Head;
uint16_t Tail;
uint16_t Lenght;
uint8_t Ring_Buff[200];
}RingBuff_t;
RingBuff_t ringBuff;
extern RingBuff_t ringBuff;
void RingBuff_Init(void)
{
ringBuff.Head=0;
ringBuff.Tail=0;
ringBuff.Lenght=0;
}
uint8_t Write_RingBuff(uint8_t data)
{
if(ringBuff.Lenght>=200)
{
return 1;
}
ringBuff.Ring_Buff[ringBuff.Tail]=data;
ringBuff.Tail=(ringBuff.Tail+1)%200;
ringBuff.Lenght++;
return 0;
}
uint8_t Read_RingBuff(uint8_t *rData)
{
if(ringBuff.Lenght==0)
{
return 1;
}
*rData=ringBuff.Ring_Buff[ringBuff.Head];
ringBuff.Ring_Buff[ringBuff.Head]=0;
ringBuff.Head=(ringBuff.Head+1)%200;
ringBuff.Lenght--;
return 0;
}
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);
USART1->DR = (u8) ch;
return ch;
}
#endif
#if EN_USART1_RX
u8 USART_RX_BUF[USART_REC_LEN];
u16 USART_RX_STA=0;
void uart_init(u32 bound){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
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_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
#if EN_USART1_RX
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
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);
#endif
}
void USART1_IRQHandler(void)
{
#if SYSTEM_SUPPORT_OS
OSIntEnter();
#endif
static uint16_t x = 1;
if( USART_GetITStatus(USART1, USART_IT_TXE) == SET )
{
if( *pDataByte == '\0' || x == Len)
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
x=1;
Flag = 0;
}
else
{
USART_SendData(USART1, *pDataByte );
pDataByte++;
x++;
}
}
#if SYSTEM_SUPPORT_OS
OSIntExit();
#endif
}
#endif
[完整工程代码](https:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)