GD32 USART 高级编程 让你的串口不在阻塞发送
来源:互联网 发布:卡乐光电 led 软件 编辑:程序博客网 时间:2024/06/11 16:43
#ifndef __USART_H__#define __USART_H__#include "stdio.h"//#define infoprintf printf("[%d-%s()] : ",__LINE__, __FUNCTION__);printf#define infoprintf(...)int usart_init(int usart_num, int baud_rate);int usart_send(int usart_num, const void *_send_buf, const int send_count);int usart_send_it(int usart_num, const void *_send_buf, const int send_count);int usart_receive_read(int usart_num, void *_receive_buf, const int receive_count);void usart_rbne_it(int usart_num);void usart_tbe_it(int usart_num);#endif
/*******************************************************************************file : platform_uasrt.cauthor : huohongpeng date : 2017-01-25description : advance application for usart, base on gd lib*******************************************************************************/#include "platform_usart.h"#include "gd32f1x0.h"#define TX_BUF_SIZE 128#define RX_BUF_SIZE 128struct usart_dev{ unsigned char tx_buf[TX_BUF_SIZE]; unsigned short tx_rd; unsigned short tx_wr; unsigned char rx_buf[RX_BUF_SIZE]; unsigned short rx_rd; unsigned short rx_wr;};static struct usart_dev usart1_dev, usart2_dev;/**description : init uasrt1 and set baud rateparam : usart_num - 1,2 baud_rate - 4800,9600,14400, ...retval : 0 - successauthor : huohongpengdate : 2017-01-25*/int usart_init(int usart_num, int baud_rate){ GPIO_InitPara GPIO_InitParaStruct; USART_InitPara USART_InitParaStruct; USART_TypeDef * usart_index[] = {0, USART1, USART2}; if(usart_num == 1) { RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1, ENABLE); RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA, ENABLE); /*usart1 Rx*/ GPIO_InitParaStruct.GPIO_Mode = GPIO_MODE_AF; GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_10; GPIO_InitParaStruct.GPIO_PuPd = GPIO_PUPD_PULLUP; GPIO_InitParaStruct.GPIO_Speed = GPIO_SPEED_2MHZ; GPIO_Init(GPIOA, &GPIO_InitParaStruct); /*usart1 Tx*/ GPIO_InitParaStruct.GPIO_Mode = GPIO_MODE_AF; GPIO_InitParaStruct.GPIO_OType = GPIO_OTYPE_PP; GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_9; GPIO_InitParaStruct.GPIO_Speed = GPIO_SPEED_2MHZ; GPIO_Init(GPIOA, &GPIO_InitParaStruct); GPIO_PinAFConfig(GPIOA, GPIO_PINSOURCE10, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PINSOURCE9, GPIO_AF_1); } else if(usart_num == 2) { RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_USART2, ENABLE); RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA, ENABLE); /*usart2 Rx*/ GPIO_InitParaStruct.GPIO_Mode = GPIO_MODE_AF; GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_15; GPIO_InitParaStruct.GPIO_PuPd = GPIO_PUPD_PULLUP; GPIO_InitParaStruct.GPIO_Speed = GPIO_SPEED_2MHZ; GPIO_Init(GPIOA, &GPIO_InitParaStruct); /*usart2 Tx*/ GPIO_InitParaStruct.GPIO_Mode = GPIO_MODE_AF; GPIO_InitParaStruct.GPIO_OType = GPIO_OTYPE_PP; GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_14; GPIO_InitParaStruct.GPIO_Speed = GPIO_SPEED_2MHZ; GPIO_Init(GPIOA, &GPIO_InitParaStruct); GPIO_PinAFConfig(GPIOA, GPIO_PINSOURCE14, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PINSOURCE15, GPIO_AF_1); } else { return -1; } /*usartx attribute config*/ USART_InitParaStruct.USART_BRR = baud_rate; USART_InitParaStruct.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE; USART_InitParaStruct.USART_Parity = USART_PARITY_RESET; USART_InitParaStruct.USART_RxorTx = USART_RXORTX_RX |USART_RXORTX_TX; USART_InitParaStruct.USART_STBits = USART_STBITS_1; USART_InitParaStruct.USART_WL = USART_WL_8B; USART_Init(usart_index[usart_num], &USART_InitParaStruct); USART_Enable(usart_index[usart_num], ENABLE); USART_INT_Set(usart_index[usart_num], USART_INT_RBNE, ENABLE); return 0;}/**description : usart send send_count charactersparam : usart_num - 1, 2 _send_buf - send buffer send_count - number of sendretval : 0 - success author : huohongpengdate : 2017-01-25*/int usart_send(int usart_num, const void *_send_buf, const int send_count){ const char *send_buf = (const char *)_send_buf; USART_TypeDef * usart_index[] = {0, USART1, USART2}; int i; if(usart_num < 1 || usart_num > 2) { return -1; } USART_INT_Set(usart_index[usart_num], USART_INT_RBNE, DISABLE); for(i = 0; i < send_count; i++) { while(USART_GetBitState(usart_index[usart_num], USART_FLAG_TBE) == RESET); USART_DataSend(usart_index[usart_num], send_buf[i]); } USART_INT_Set(usart_index[usart_num], USART_INT_RBNE, ENABLE); return 0;}/**description : rewrite fputc for printf param : ...retval : 0 - success author : huohongpengdate : 2017-01-25other : options->C/C++ compiler->preprocessor add symbal _DLIB_FILE_DESCRIPTOR*/int fputc(int ch, FILE *f){ usart_send_it(1, &ch, 1); return ch;}/**description : usart send base on usart send interrupt param : usart_num - 1, 2 _send_buf - send buffer send_count - number of sendretval : 0 - success author : huohongpengdate : 2017-01-26*/int usart_send_it(int usart_num, const void *_send_buf, const int send_count){ struct usart_dev *usart_dev; struct usart_dev *usart_dev_index[] = {0, &usart1_dev, &usart2_dev}; USART_TypeDef* usart_index[] = {0, USART1, USART2}; const char *send_buf = (const char *)_send_buf; int i; if(usart_num < 1 || usart_num > 2) { return -1; } usart_dev = usart_dev_index[usart_num]; /* Write send data to send buffer and use interrupt send data. Wait buffer effective when send buffer is full. */ for(i = 0; i < send_count; i++) { while((usart_dev->tx_wr+1) % TX_BUF_SIZE == usart_dev->tx_rd); usart_dev->tx_buf[usart_dev->tx_wr++] = send_buf[i]; usart_dev->tx_wr %= TX_BUF_SIZE; USART_INT_Set(usart_index[usart_num], USART_INT_TBE, ENABLE); } return 0;}/**description : read data from receive bufferparam : usart_num - 1, 2 _receive_buf - receive buffer receive_count - number of receiveretval : -1 - success other - real read countauthor : huohongpengdate : 2017-01-26*/int usart_receive_read(int usart_num, void *_receive_buf, const int receive_count){ struct usart_dev *usart_dev; struct usart_dev *usart_dev_index[] = {0, &usart1_dev, &usart2_dev}; char *receive_buf = (char *)_receive_buf; int i, receive_count_real; if(usart_num < 1 || usart_num > 2) { return -1; } usart_dev = usart_dev_index[usart_num]; /* Read data from receive buffer. The buffer have data that received from usart. */ for(i = 0, receive_count_real = 0; i < receive_count; i++) { if(usart_dev->rx_rd == usart_dev->rx_wr) { return receive_count_real; } else { receive_buf[i] = usart_dev->rx_buf[usart_dev->rx_rd++]; usart_dev->rx_rd %= RX_BUF_SIZE; receive_count_real++; } } return receive_count_real;}/**description : usart receive not empty interrupt hander, call in intterrupt functionparam : usart_num - 1, 2retval : Noneauthor : huohongpengdate : 2017-01-26*/void usart_rbne_it(int usart_num){ struct usart_dev *usart_dev; struct usart_dev *usart_dev_index[] = {0, &usart1_dev, &usart2_dev}; USART_TypeDef* usart_index[] = {0, USART1, USART2}; if(usart_num < 1 || usart_num > 2) { return; } usart_dev = usart_dev_index[usart_num]; usart_dev->rx_buf[usart_dev->rx_wr++] = USART_DataReceive(usart_index[usart_num]); usart_dev->rx_wr %= RX_BUF_SIZE; /* overflow handle */ if(usart_dev->rx_wr == usart_dev->rx_rd) { usart_dev->rx_rd++; usart_dev->rx_rd %= RX_BUF_SIZE; }}/**description : usart transport empty interrupt hander, call in intterrupt functionparam : usart_num - 1, 2retval : Noneauthor : huohongpengdate : 2017-01-26*/void usart_tbe_it(int usart_num){ struct usart_dev *usart_dev; struct usart_dev *usart_dev_index[] = {0, &usart1_dev, &usart2_dev}; USART_TypeDef* usart_index[] = {0, USART1, USART2}; if(usart_num < 1 || usart_num > 2) { return; } usart_dev = usart_dev_index[usart_num]; if(usart_dev->tx_rd != usart_dev->tx_wr) { USART_DataSend(usart_index[usart_num], usart_dev->tx_buf[usart_dev->tx_rd++]); usart_dev->tx_rd %= TX_BUF_SIZE; } else { USART_INT_Set(usart_index[usart_num], USART_INT_TBE, DISABLE); }}
0 0
- GD32 USART 高级编程 让你的串口不在阻塞发送
- USART---串口发送数据
- USART---串口发送数据
- 串口通信Usart发送程序
- 基于GD32写的串口应用程序
- STM32 USART 串口 DMA 接收和发送的源码详解!
- usart 串口的发送-接收数据(正点改编)
- STM32 USART 串口 DMA 接收和发送的源码详解!
- STM32 USART 串口 DMA 接收和发送的源码详解!
- USART串口的使用
- USART 串口 DMA 发送和接收
- USART串口发送0X00问题解决
- STM32 USART串口发送软件调试
- STM32F3使用USART串口DMA发送数据,使用蓝牙发送
- STM32 C++编程 003 USART(串口)类
- 让你不在害怕指针
- 让你不在害怕指针
- 让你的Mac不在依赖于ssh软件
- 又见Bug
- JS 导出Table为excel
- 使用spring jdbcTemplate 批量查询校验【支持50万数据】使用JDBC不会造成内存溢出
- SpringBoot之Mybatis连接MySQL进行CRUD(注解&配置文件)(简测试版)
- left join on 和 where
- GD32 USART 高级编程 让你的串口不在阻塞发送
- linux压缩命令
- USACO 2.3
- 老司机教你如何正确地在大陆安装 BlackArch
- PHP常用类函数(3)时间格式转换
- vlc精简之编译选项
- 未名湖边的烦恼
- tess4j识别图片中的文字
- centos安装php-ldap扩展,总结