STM32F4XX高效驱动篇1-UART
之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下。并奉驱动程序,本程序覆盖uart1-8。
串口驱动,这是在每个单片机中可以说是必备接口。可以说大部分产品中都会使用,更有甚者一个产品中用到8个串口。这样一个高效的驱动是决定您产品优劣的关键因素。本文主要针对STM32F4XX系列芯片做的一个驱动接口层。以减少您在开发项目时驱动方面所花费时间,以及为程序达到高效的处理为目的。
从51,pic到现在的STM32,个人感觉STM32这方面做的非常突出,丰富的使用模式,强大的引脚映射功能,强大的处理能力等,给我留下的深刻的印象。
关于串口的使用方式,个人总结出以下三种:
1) 中断接收,状态查询发送:这种方式在单片机时代用的比较多,那时候大部分芯片的处理速度不够快,工业控制接口中大部分使用的是9600波特率,程序简单也就对串口发送数据所用时间要求不高。
2) 中断接收,中断发送:这种方式一般会在对高效性要求较高,或软件实时性高的产品中使用。这种方式的好外在于完全释放了CPU在发送开始到结束这一时间CPU控制权。
3) 中断接口,DMA发送:这种方式的使用场合和模式2相同,效率也相差不多。但这种方式确实比模式2CPU的占用时间会更少。
举个例子来说明以上三种模式。假如要把一堆物品从A点运到B点通过传送带,在这个传送过程中传送带上一次只能运一个物品,模式一:把物品放到传送带A点上,然后等待物品由A点被传到B点,这时再放一个物品到传送带上,以此往复所有物品传送过去。模式二:把物品放到A点的传送带上然后就去忙别的事情,看到物品快被传到B点,马上回来再放一个物品到传送带上。很明显这种方式比模式一多了很多空余时间。模式三:这种模式就牛了,在把物品放到A点之前,直接去找了一个“闲杂人等”过来,把物品交给他由他去发,我们需要再发送时,先问下她是否以发完,如果发完了就把新的物品交给他,如果没发完就等一小回再来找他。哈哈,这样咱们就有更多的时间去忙更多的事情了,也不用一回跑来一回跑去。把跑路的时间给节约出来了。
以上三种模式,很明显得出那种模式发送数据效率最高。我们下面说提供的程序就是使用模式三。
说完发送,再说说接收方式。大家一定发现数据接收都是采用中断方式,是的 本人使用过DMA方式进行过多次测试,在使用方面确实没有中断接收灵活。主要有以下两种情况,1,DMA接收数据的主要判断依据1是接收器满中断,这种情况在实际中很少用,除非您的数据是定长。这种方式同时还会存在一些安全隐患,假如噪声原因多接收到一个字节,那之后数据时序就会错位。2,DMA总线空闲中断,这种方式除非是半双工情况下使用。在全双工时被受到发送完成总线空闲的干扰。所以在数据接收方式上主要使用中断。
在数据接收中断方面还分二种方式,
方式1:顺序接收,在接收到第一个数据时就触发超时定时器,每接收到一个字节时就清一次定时器,都到一组数据接收完毕,定时器会因为触发超时中断。在超时中断中来判断一组数据被接收。这种方式一般会用到实时性的一些协议中,比如MODBUS。
方式2:队列接收,申请一个缓冲区收尾相接,接收到数据时载入队列之中,用户只要定时的去队列中读数据,来使用这些数据。这种方式是window,linux的驱动主要接收方式。他的优点就在于在使用数据时无需关闭中断。也就不用怛心在处理上一组数据时了来新的数据会破坏上组数据内容。在方式1中需要考虑在处理数据时暂时性的关下中断。
以下程序则主要是使用到接收使用方式2,发送数据使用模式3的DMA发送,本驱动程序为可裁切,覆盖串口1-8,通过宏裁切。下面提供了一些接口,这里对接口做一个大概的说明。
打开串口
void BSP_UartOpen(uint8_t COM, uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity);
关闭串口
void BSP_UartClose(uint8_t COM);
向串口中写数据
uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len);
从串口中读数据
uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len);
查询串口发送忙碌状态
uint32_t BSP_UartTxIdleState(uint8_t COM);
这个接口主要用在,向串口写数据后,在进行下一次写数据之前需要进行查询。
具体接口的使用方法,函数都有详细的说明。
/*
********************************************************************************
*
* BSP_Uart.c
*
* File : BSP_Uart.c
* Version : V1.0
* Author : whq
* Mode : Thumb2
* Toolchain :
* Description : 串口驱动程序
*
* History :
* Date : 2013.08.12
*******************************************************************************/
#include <string.h> #include "misc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_dma.h" #include "Queue.h"
#include "BSP_Uart.h" #if COM1_EN
static uint8_t COM1_TX_BUFF[BSP_COM1_Tx_BUFF_SIZE] = {};
static uint8_t COM1_RX_BUFF[BSP_COM1_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM1_RX_QUEUE = {};
#endif #if COM2_EN
static uint8_t COM2_TX_BUFF[BSP_COM2_Tx_BUFF_SIZE] = {};
static uint8_t COM2_RX_BUFF[BSP_COM2_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM2_RX_QUEUE = {};
#endif #if COM3_EN
static uint8_t COM3_TX_BUFF[BSP_COM3_Tx_BUFF_SIZE] = {};
static uint8_t COM3_RX_BUFF[BSP_COM3_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM3_RX_QUEUE = {};
#endif #if COM4_EN
static uint8_t COM4_TX_BUFF[BSP_COM4_Tx_BUFF_SIZE] = {};
static uint8_t COM4_RX_BUFF[BSP_COM4_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM4_RX_QUEUE = {};
#endif #if COM5_EN
static uint8_t COM5_TX_BUFF[BSP_COM5_Tx_BUFF_SIZE] = {};
static uint8_t COM5_RX_BUFF[BSP_COM5_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM5_RX_QUEUE = {};
#endif #if COM6_EN
static uint8_t COM6_TX_BUFF[BSP_COM6_Tx_BUFF_SIZE] = {};
static uint8_t COM6_RX_BUFF[BSP_COM6_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM6_RX_QUEUE = {};
#endif #if COM7_EN
static uint8_t COM7_TX_BUFF[BSP_COM7_Tx_BUFF_SIZE] = {};
static uint8_t COM7_RX_BUFF[BSP_COM7_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM7_RX_QUEUE = {};
#endif #if COM8_EN
static uint8_t COM8_TX_BUFF[BSP_COM8_Tx_BUFF_SIZE] = {};
static uint8_t COM8_RX_BUFF[BSP_COM8_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM8_RX_QUEUE = {};
#endif static USART_TypeDef* const COM_USART[COMn] = {
#if COM1_EN
BSP_COM1,
#endif
#if COM2_EN
BSP_COM2,
#endif
#if COM3_EN
BSP_COM3,
#endif
#if COM4_EN
BSP_COM4,
#endif
#if COM5_EN
BSP_COM5,
#endif
#if COM6_EN
BSP_COM6,
#endif
#if COM7_EN
BSP_COM7,
#endif
#if COM8_EN
BSP_COM8,
#endif
}; static const uint8_t COM_AF[COMn] = {
#if COM1_EN
BSP_COM1_AF,
#endif
#if COM2_EN
BSP_COM2_AF,
#endif
#if COM3_EN
BSP_COM3_AF,
#endif
#if COM4_EN
BSP_COM4_AF,
#endif
#if COM5_EN
BSP_COM5_AF,
#endif
#if COM6_EN
BSP_COM6_AF,
#endif
#if COM7_EN
BSP_COM7_AF,
#endif
#if COM8_EN
BSP_COM8_AF,
#endif
}; static const uint8_t COM_TX_AF_PIN[COMn] = {
#if COM1_EN
BSP_COM1_TX_AF_PIN,
#endif
#if COM2_EN
BSP_COM2_TX_AF_PIN,
#endif
#if COM3_EN
BSP_COM3_TX_AF_PIN,
#endif
#if COM4_EN
BSP_COM4_TX_AF_PIN,
#endif
#if COM5_EN
BSP_COM5_TX_AF_PIN,
#endif
#if COM6_EN
BSP_COM6_TX_AF_PIN,
#endif
#if COM7_EN
BSP_COM7_TX_AF_PIN,
#endif
#if COM8_EN
BSP_COM8_TX_AF_PIN,
#endif
}; static const uint8_t COM_RX_AF_PIN[COMn] = {
#if COM1_EN
BSP_COM1_RX_AF_PIN,
#endif
#if COM2_EN
BSP_COM2_RX_AF_PIN,
#endif
#if COM3_EN
BSP_COM3_RX_AF_PIN,
#endif
#if COM4_EN
BSP_COM4_RX_AF_PIN,
#endif
#if COM5_EN
BSP_COM5_RX_AF_PIN,
#endif
#if COM6_EN
BSP_COM6_RX_AF_PIN,
#endif
#if COM7_EN
BSP_COM7_RX_AF_PIN,
#endif
#if COM8_EN
BSP_COM8_RX_AF_PIN,
#endif
}; static GPIO_TypeDef* const COM_TX_PORT[COMn] = {
#if COM1_EN
BSP_COM1_TX_GPIO_PORT,
#endif
#if COM2_EN
BSP_COM2_TX_GPIO_PORT,
#endif
#if COM3_EN
BSP_COM3_TX_GPIO_PORT,
#endif
#if COM4_EN
BSP_COM4_TX_GPIO_PORT,
#endif
#if COM5_EN
BSP_COM5_TX_GPIO_PORT,
#endif
#if COM6_EN
BSP_COM6_TX_GPIO_PORT,
#endif
#if COM7_EN
BSP_COM7_TX_GPIO_PORT,
#endif
#if COM8_EN
BSP_COM8_TX_GPIO_PORT,
#endif
}; static GPIO_TypeDef* const COM_RX_PORT[COMn] = {
#if COM1_EN
BSP_COM1_RX_GPIO_PORT,
#endif
#if COM2_EN
BSP_COM2_RX_GPIO_PORT,
#endif
#if COM3_EN
BSP_COM3_RX_GPIO_PORT,
#endif
#if COM4_EN
BSP_COM4_RX_GPIO_PORT,
#endif
#if COM5_EN
BSP_COM5_RX_GPIO_PORT,
#endif
#if COM6_EN
BSP_COM6_RX_GPIO_PORT,
#endif
#if COM7_EN
BSP_COM7_RX_GPIO_PORT,
#endif
#if COM8_EN
BSP_COM8_RX_GPIO_PORT,
#endif
}; static const uint32_t COM_USART_CLK[COMn] = {
#if COM1_EN
BSP_COM1_CLK,
#endif
#if COM2_EN
BSP_COM2_CLK,
#endif
#if COM3_EN
BSP_COM3_CLK,
#endif
#if COM4_EN
BSP_COM4_CLK,
#endif
#if COM5_EN
BSP_COM5_CLK,
#endif
#if COM6_EN
BSP_COM6_CLK,
#endif
#if COM7_EN
BSP_COM7_CLK,
#endif
#if COM8_EN
BSP_COM8_CLK,
#endif
}; static const uint32_t COM_TX_PORT_CLK[COMn] = {
#if COM1_EN
BSP_COM1_TX_GPIO_CLK,
#endif
#if COM2_EN
BSP_COM2_TX_GPIO_CLK,
#endif
#if COM3_EN
BSP_COM3_TX_GPIO_CLK,
#endif
#if COM4_EN
BSP_COM4_TX_GPIO_CLK,
#endif
#if COM5_EN
BSP_COM5_TX_GPIO_CLK,
#endif
#if COM6_EN
BSP_COM6_TX_GPIO_CLK,
#endif
#if COM7_EN
BSP_COM7_TX_GPIO_CLK,
#endif
#if COM8_EN
BSP_COM8_TX_GPIO_CLK,
#endif
}; static const uint32_t COM_RX_PORT_CLK[COMn] = {
#if COM1_EN
BSP_COM1_RX_GPIO_CLK,
#endif
#if COM2_EN
BSP_COM2_RX_GPIO_CLK,
#endif
#if COM3_EN
BSP_COM3_RX_GPIO_CLK,
#endif
#if COM4_EN
BSP_COM4_RX_GPIO_CLK,
#endif
#if COM5_EN
BSP_COM5_RX_GPIO_CLK,
#endif
#if COM6_EN
BSP_COM6_RX_GPIO_CLK,
#endif
#if COM7_EN
BSP_COM7_RX_GPIO_CLK,
#endif
#if COM8_EN
BSP_COM8_RX_GPIO_CLK,
#endif
}; static const uint16_t COM_TX_PIN[COMn] = {
#if COM1_EN
BSP_COM1_TX_PIN,
#endif
#if COM2_EN
BSP_COM2_TX_PIN,
#endif
#if COM3_EN
BSP_COM3_TX_PIN,
#endif
#if COM4_EN
BSP_COM4_TX_PIN,
#endif
#if COM5_EN
BSP_COM5_TX_PIN,
#endif
#if COM6_EN
BSP_COM6_TX_PIN,
#endif
#if COM7_EN
BSP_COM7_TX_PIN,
#endif
#if COM8_EN
BSP_COM8_TX_PIN,
#endif
}; static const uint16_t COM_RX_PIN[COMn] = {
#if COM1_EN
BSP_COM1_RX_PIN,
#endif
#if COM2_EN
BSP_COM2_RX_PIN,
#endif
#if COM3_EN
BSP_COM3_RX_PIN,
#endif
#if COM4_EN
BSP_COM4_RX_PIN,
#endif
#if COM5_EN
BSP_COM5_RX_PIN,
#endif
#if COM6_EN
BSP_COM6_RX_PIN,
#endif
#if COM7_EN
BSP_COM7_RX_PIN,
#endif
#if COM8_EN
BSP_COM8_RX_PIN,
#endif
}; static const uint32_t COM_DMA_DR_BASE[COMn] = {
#if COM1_EN
BSP_COM1_DMA_DR_BASE,
#endif
#if COM2_EN
BSP_COM2_DMA_DR_BASE,
#endif
#if COM3_EN
BSP_COM3_DMA_DR_BASE,
#endif
#if COM4_EN
BSP_COM4_DMA_DR_BASE,
#endif
#if COM5_EN
BSP_COM5_DMA_DR_BASE,
#endif
#if COM6_EN
BSP_COM6_DMA_DR_BASE,
#endif
#if COM7_EN
BSP_COM7_DMA_DR_BASE,
#endif
#if COM8_EN
BSP_COM8_DMA_DR_BASE,
#endif
}; static const uint32_t COM_DMA_CLK[COMn] = {
#if COM1_EN
BSP_COM1_DMA_CLK,
#endif
#if COM2_EN
BSP_COM2_DMA_CLK,
#endif
#if COM3_EN
BSP_COM3_DMA_CLK,
#endif
#if COM4_EN
BSP_COM4_DMA_CLK,
#endif
#if COM5_EN
BSP_COM5_DMA_CLK,
#endif
#if COM6_EN
BSP_COM6_DMA_CLK,
#endif
#if COM7_EN
BSP_COM7_DMA_CLK,
#endif
#if COM8_EN
BSP_COM8_DMA_CLK,
#endif
}; static const uint32_t COM_DMA_TX_FLAG[COMn] = {
#if COM1_EN
BSP_COM1_Tx_DMA_FLAG,
#endif
#if COM2_EN
BSP_COM2_Tx_DMA_FLAG,
#endif
#if COM3_EN
BSP_COM3_Tx_DMA_FLAG,
#endif
#if COM4_EN
BSP_COM4_Tx_DMA_FLAG,
#endif
#if COM5_EN
BSP_COM5_Tx_DMA_FLAG,
#endif
#if COM6_EN
BSP_COM6_Tx_DMA_FLAG,
#endif
#if COM7_EN
BSP_COM7_Tx_DMA_FLAG,
#endif
#if COM8_EN
BSP_COM8_Tx_DMA_FLAG,
#endif
}; static const uint32_t COM_DMA_TX_CHANNEL[COMn] = {
#if COM1_EN
BSP_COM1_Tx_DMA_Channel,
#endif
#if COM2_EN
BSP_COM2_Tx_DMA_Channel,
#endif
#if COM3_EN
BSP_COM3_Tx_DMA_Channel,
#endif
#if COM4_EN
BSP_COM4_Tx_DMA_Channel,
#endif
#if COM5_EN
BSP_COM5_Tx_DMA_Channel,
#endif
#if COM6_EN
BSP_COM6_Tx_DMA_Channel,
#endif
#if COM7_EN
BSP_COM7_Tx_DMA_Channel,
#endif
#if COM8_EN
BSP_COM8_Tx_DMA_Channel,
#endif
}; static DMA_Stream_TypeDef * const COM_DMA_TX_STREAM[COMn] = {
#if COM1_EN
BSP_COM1_Tx_DMA_Stream,
#endif
#if COM2_EN
BSP_COM2_Tx_DMA_Stream,
#endif
#if COM3_EN
BSP_COM3_Tx_DMA_Stream,
#endif
#if COM4_EN
BSP_COM4_Tx_DMA_Stream,
#endif
#if COM5_EN
BSP_COM5_Tx_DMA_Stream,
#endif
#if COM6_EN
BSP_COM6_Tx_DMA_Stream,
#endif
#if COM7_EN
BSP_COM7_Tx_DMA_Stream,
#endif
#if COM8_EN
BSP_COM8_Tx_DMA_Stream,
#endif
}; static const uint32_t COM_RX_IRQn[COMn] = {
#if COM1_EN
BSP_COM1_IRQn,
#endif
#if COM2_EN
BSP_COM2_IRQn,
#endif
#if COM3_EN
BSP_COM3_IRQn,
#endif
#if COM4_EN
BSP_COM4_IRQn,
#endif
#if COM5_EN
BSP_COM5_IRQn,
#endif
#if COM6_EN
BSP_COM6_IRQn,
#endif
#if COM7_EN
BSP_COM7_IRQn,
#endif
#if COM8_EN
BSP_COM8_IRQn,
#endif
}; static uint8_t * const COM_TX_BUFF[COMn] = {
#if COM1_EN
COM1_TX_BUFF,
#endif
#if COM2_EN
COM2_TX_BUFF,
#endif
#if COM3_EN
COM3_TX_BUFF,
#endif
#if COM4_EN
COM4_TX_BUFF,
#endif
#if COM5_EN
COM5_TX_BUFF,
#endif
#if COM6_EN
COM6_TX_BUFF,
#endif
#if COM7_EN
COM7_TX_BUFF,
#endif
#if COM8_EN
COM8_TX_BUFF,
#endif
}; static const uint32_t COM_TX_BUFF_SIZE[COMn] = {
#if COM1_EN
BSP_COM1_Tx_BUFF_SIZE,
#endif
#if COM2_EN
BSP_COM2_Tx_BUFF_SIZE,
#endif
#if COM3_EN
BSP_COM3_Tx_BUFF_SIZE,
#endif
#if COM4_EN
BSP_COM4_Tx_BUFF_SIZE,
#endif
#if COM5_EN
BSP_COM5_Tx_BUFF_SIZE,
#endif
#if COM6_EN
BSP_COM6_Tx_BUFF_SIZE,
#endif
#if COM7_EN
BSP_COM7_Tx_BUFF_SIZE,
#endif
#if COM8_EN
BSP_COM8_Tx_BUFF_SIZE,
#endif
}; static uint8_t * const COM_RX_BUFF[COMn] = {
#if COM1_EN
COM1_RX_BUFF,
#endif
#if COM2_EN
COM2_RX_BUFF,
#endif
#if COM3_EN
COM3_RX_BUFF,
#endif
#if COM4_EN
COM4_RX_BUFF,
#endif
#if COM5_EN
COM5_RX_BUFF,
#endif
#if COM6_EN
COM6_RX_BUFF,
#endif
#if COM7_EN
COM7_RX_BUFF,
#endif
#if COM8_EN
COM8_RX_BUFF,
#endif
}; static const uint32_t COM_RX_BUFF_SIZE[COMn] = {
#if COM1_EN
BSP_COM1_Rx_BUFF_SIZE,
#endif
#if COM2_EN
BSP_COM2_Rx_BUFF_SIZE,
#endif
#if COM3_EN
BSP_COM3_Rx_BUFF_SIZE,
#endif
#if COM4_EN
BSP_COM4_Rx_BUFF_SIZE,
#endif
#if COM5_EN
BSP_COM5_Rx_BUFF_SIZE,
#endif
#if COM6_EN
BSP_COM6_Rx_BUFF_SIZE,
#endif
#if COM7_EN
BSP_COM7_Rx_BUFF_SIZE,
#endif
#if COM8_EN
BSP_COM8_Rx_BUFF_SIZE,
#endif
}; static QUEUE8_TYPE * const COM_RX_QUEUE[COMn] = {
#if COM1_EN
&COM1_RX_QUEUE,
#endif
#if COM2_EN
&COM2_RX_QUEUE,
#endif
#if COM3_EN
&COM3_RX_QUEUE,
#endif
#if COM4_EN
&COM4_RX_QUEUE,
#endif
#if COM5_EN
&COM5_RX_QUEUE,
#endif
#if COM6_EN
&COM6_RX_QUEUE,
#endif
#if COM7_EN
&COM7_RX_QUEUE,
#endif
#if COM8_EN
&COM8_RX_QUEUE,
#endif
}; static const uint16_t parityArr[] = {USART_Parity_No, USART_Parity_Odd, USART_Parity_Even}; /*******************************************************************************
* Function Name :BSP_Uart1Open
* Description :串口及引脚初始化
* Input : uartx: COM1,COM2,COM3....
baud: 2400,4800,9600,19200,38400,57600,115200
data: 数据位数 8,9,
stop:停止位数 1,2
parity:效验 0: 无效验,1:奇效验,2:偶效验
* Output :
* Other :
* Date :2013.08.12
*******************************************************************************/
void BSP_UartOpen(uint8_t COM, uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NvicInitdef;
DMA_InitTypeDef DMA_InitStructure; /* DMA clock enable */
RCC_AHB1PeriphClockCmd(COM_DMA_CLK[COM], ENABLE); /* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM], ENABLE); /* Enable UART clock */
if ((COM_USART[COM] == USART1) || (COM_USART[COM] == USART6))
{
RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
}
else
{
RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
}
USART_DeInit(COM_USART[COM]); /* Connect PXx to USARTx_Tx*/
GPIO_PinAFConfig(COM_TX_PORT[COM], COM_TX_AF_PIN[COM], COM_AF[COM]);
/* Connect PXx to USARTx_Rx*/
GPIO_PinAFConfig(COM_RX_PORT[COM], COM_RX_AF_PIN[COM], COM_AF[COM]); /* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure); /* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure); /* USART configuration */
USART_StructInit(&USART_InitStructure);
USART_InitStructure.USART_BaudRate = baud;
USART_InitStructure.USART_StopBits = (stop == )? USART_StopBits_2 : USART_StopBits_1;
USART_InitStructure.USART_WordLength = (data == )? USART_WordLength_9b : USART_WordLength_8b;
USART_InitStructure.USART_Parity = (parity < )? parityArr[parity] : USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(COM_USART[COM], &USART_InitStructure); /* Enable USART DMA_TX*/
USART_DMACmd(COM_USART[COM], USART_DMAReq_Tx, ENABLE); USART_ITConfig(COM_USART[COM], USART_IT_RXNE, ENABLE); /* Enable USART */
USART_Cmd(COM_USART[COM], ENABLE); NvicInitdef.NVIC_IRQChannel = COM_RX_IRQn[COM];
NvicInitdef.NVIC_IRQChannelPreemptionPriority = ;
NvicInitdef.NVIC_IRQChannelSubPriority = ;
NvicInitdef.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NvicInitdef ); QUEUE_PacketCreate(COM_RX_QUEUE[COM], COM_RX_BUFF[COM], COM_RX_BUFF_SIZE[COM]);
/* -------------------------------DMA发送------------------------------ */
/* DMA StreamX Config */
DMA_DeInit(COM_DMA_TX_STREAM[COM]); /* DMA StreamX disable */
DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE); DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.DMA_Channel = COM_DMA_TX_CHANNEL[COM];
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)COM_DMA_DR_BASE[COM];
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)COM_TX_BUFF[COM];
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize = ;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_Init(COM_DMA_TX_STREAM[COM], &DMA_InitStructure); DMA_FlowControllerConfig(COM_DMA_TX_STREAM[COM], DMA_FlowCtrl_Memory); //控制流 取决于缓存大小
} /*******************************************************************************
* Function Name : void BSP_UartClose(uint8_t COMx)
* Description : 串口关闭
* Input : COMx:通道x
* Output :
* Other :
* Date : 2013.08.12
*******************************************************************************/
void BSP_UartClose(uint8_t COM)
{
if ((COM_USART[COM] == USART1) || (COM_USART[COM] == USART6))
{
RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], DISABLE);
}
else
{
RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], DISABLE);
} RCC_AHB1PeriphClockCmd(COM_DMA_CLK[COM], ENABLE);
DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);
USART_DMACmd(COM_USART[COM], USART_DMAReq_Tx, DISABLE);
USART_ITConfig(COM_USART[COM], USART_IT_RXNE, DISABLE);
USART_Cmd(COM_USART[COM], DISABLE);
} /*******************************************************************************
* Function Name : uint32_t BSP_UartWrite(uint8_t COMx, uint8_t *buffter, uint32_t len)
* Description : 串口发送数据
* Input : COMx:通道x
* Output :
* Other :
* Date : 2013.08.12
*******************************************************************************/
uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len)
{
if (COM >= COMn)
return ; if ( == len)
return ; if ((DMA_GetCurrDataCounter(COM_DMA_TX_STREAM[COM]) == )
&& (DMA_FIFOStatus_Empty == DMA_GetFIFOStatus(COM_DMA_TX_STREAM[COM])))
{
uint32_t resLen = ; USART_ClearFlag(COM_USART[COM], USART_FLAG_TC);
resLen = (COM_TX_BUFF_SIZE[COM] > len)? len : COM_TX_BUFF_SIZE[COM];
memcpy((void *)(COM_TX_BUFF[COM]), buffter, resLen);
DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);
DMA_ClearFlag(COM_DMA_TX_STREAM[COM], COM_DMA_TX_FLAG[COM]);
DMA_SetCurrDataCounter(COM_DMA_TX_STREAM[COM], resLen);
DMA_Cmd(COM_DMA_TX_STREAM[COM], ENABLE); return resLen;
}
return ;
} /*******************************************************************************
* Function Name : uint32_t BSP_UartRead(uint8_t COMx, uint8_t *buffter, uint32_t len)
* Description : 串口读回数据
* Input : COMx:通道x
* Output :
* Other :
* Date : 2013.08.12
*******************************************************************************/
uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len)
{
return QUEUE_PacketOut(COM_RX_QUEUE[COM], buffter, len);
} /*******************************************************************************
* Function Name : uint32_t BSP_UartTxIdleState(uint8_t COM)
* Description : 查询 发送是否 发送完成
* Input :
* Output : 1)忙碌 0)空闲
* Other :
* Date : 2013.08.12
*******************************************************************************/
uint32_t BSP_UartTxIdleState(uint8_t COM)
{
return (DMA_GetCurrDataCounter(COM_DMA_TX_STREAM[COM])
|| (USART_GetFlagStatus(COM_USART[COM], USART_FLAG_TC) != SET));
} /*******************************************************************************
* Function Name : void _IRQHandler(uint8_t COM)
* Description : 中断函数
* Input :
* Output :
* Other :
* Date : 2013.08.12
*******************************************************************************/
void _IRQHandler(uint8_t COM)
{
if (USART_GetITStatus(COM_USART[COM], USART_IT_RXNE) != RESET)
{
u8 ch = USART_ReceiveData(COM_USART[COM]); //读数据后 会自动清空标志
QUEUE_PacketIn(COM_RX_QUEUE[COM], &ch, );
}
} #if COM1_EN > 0
/*******************************************************************************
* Function Name : USART1_IRQHandler
* Description : This function handles USART1 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
_IRQHandler(COM1);
}
#endif //COM1_EN > 0 #if COM2_EN > 0
/*******************************************************************************
* Function Name : USART2_IRQHandler
* Description : This function handles USART2 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART2_IRQHandler(void)
{
_IRQHandler(COM2);
}
#endif //COM2_EN > 0 #if COM3_EN > 0
/*******************************************************************************
* Function Name : USART3_IRQHandler
* Description : This function handles USART3 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART3_IRQHandler(void)
{
_IRQHandler(COM3);
}
#endif //COM3_EN > 0 #if COM4_EN > 0
/*******************************************************************************
* Function Name : USART4_IRQHandler
* Description : This function handles USART4 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void UART4_IRQHandler(void)
{
_IRQHandler(COM4);
}
#endif //COM4_EN > 0 #if COM5_EN > 0
/*******************************************************************************
* Function Name : USART5_IRQHandler
* Description : This function handles USART5 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void UART5_IRQHandler(void)
{
_IRQHandler(COM5);
}
#endif //COM5_EN > 0 #if COM6_EN > 0
/*******************************************************************************
* Function Name : USART6_IRQHandler
* Description : This function handles USART6 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART6_IRQHandler(void)
{
_IRQHandler(COM6);
}
#endif //COM6_EN > 0 #if COM7_EN > 0
/*******************************************************************************
* Function Name : USART7_IRQHandler
* Description : This function handles USART7 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void UART7_IRQHandler(void)
{
_IRQHandler(COM7);
}
#endif //COM7_EN > 0 #if COM8_EN > 0
/*******************************************************************************
* Function Name : USART8_IRQHandler
* Description : This function handles USART8 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void UART8_IRQHandler(void)
{
_IRQHandler(COM8);
}
#endif //COM8_EN > 0
BSP_Uart.c
/*
2 ********************************************************************************
3 *
4 * BSP_Uart.h
5 *
6 * File : BSP_Uart.h
7 * Version : V1.0
8 * Author : whq
9 * Mode : Thumb2
10 * Toolchain :
11 * Description : 串口驱动头文件
12 *
13 * History :
14 * Date : 2013.08.12
15 *******************************************************************************/ #ifndef _BSP_UART_H_
#define _BSP_UART_H_ #include <stdint.h> #define COM1_EN 1
#define COM2_EN 1
#define COM3_EN 1
#define COM4_EN 1
#define COM5_EN 1
#define COM6_EN 1
#define COM7_EN 0
#define COM8_EN 0 #define COM_1_0 //映射:COM_1_0,映射1:COM_1_1
#define COM_2_0 //映射:COM_2_0,映射1:COM_2_1
#define COM_3_2 //映射:COM_3_2,
#define COM_4_0
#define COM_5_0
#define COM_6_0
#define COM_7_0
#define COM_8_0 #if !(COM1_EN || COM2_EN || COM3_EN || COM4_EN || COM5_EN || COM6_EN || COM7_EN || COM8_EN)
#error "请至少使能一路串口!"
#endif typedef enum {
#if COM1_EN
COM1,
#endif
#if COM2_EN
COM2,
#endif
#if COM3_EN
COM3,
#endif
#if COM4_EN
COM4,
#endif
#if COM5_EN
COM5,
#endif
#if COM6_EN
COM6,
#endif
#if COM7_EN
COM7,
#endif
#if COM8_EN
COM8,
#endif
COM_MAX
}COM_PORT; /** @addtogroup STM3210E_BSP_LOW_LEVEL_COM
79 * @{
80 */
#define COMn COM_MAX /**
86 * @brief Definition for COM port1, connected to USART1
87 */
#define BSP_COM1 USART1
#define BSP_COM1_CLK RCC_APB2Periph_USART1
#define BSP_COM1_AF GPIO_AF_USART1
#ifdef COM_1_3
#define BSP_COM1_TX_AF_PIN GPIO_PinSource6
#define BSP_COM1_TX_PIN GPIO_Pin_6
#define BSP_COM1_TX_GPIO_PORT GPIOB
#define BSP_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOB
#define BSP_COM1_RX_AF_PIN GPIO_PinSource10
#define BSP_COM1_RX_PIN GPIO_Pin_10
#define BSP_COM1_RX_GPIO_PORT GPIOA
#define BSP_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#elif defined(COM_1_2)
#define BSP_COM1_TX_AF_PIN GPIO_PinSource9
#define BSP_COM1_TX_PIN GPIO_Pin_9
#define BSP_COM1_TX_GPIO_PORT GPIOA
#define BSP_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM1_RX_AF_PIN GPIO_PinSource7
#define BSP_COM1_RX_PIN GPIO_Pin_7
#define BSP_COM1_RX_GPIO_PORT GPIOB
#define BSP_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOB
#elif defined(COM_1_1)
#define BSP_COM1_TX_AF_PIN GPIO_PinSource6
#define BSP_COM1_TX_PIN GPIO_Pin_6
#define BSP_COM1_TX_GPIO_PORT GPIOB
#define BSP_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOB
#define BSP_COM1_RX_AF_PIN GPIO_PinSource7
#define BSP_COM1_RX_PIN GPIO_Pin_7
#define BSP_COM1_RX_GPIO_PORT GPIOB
#define BSP_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOB
#else
#define BSP_COM1_TX_AF_PIN GPIO_PinSource9
#define BSP_COM1_TX_PIN GPIO_Pin_9
#define BSP_COM1_TX_GPIO_PORT GPIOA
#define BSP_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM1_RX_AF_PIN GPIO_PinSource10
#define BSP_COM1_RX_PIN GPIO_Pin_10
#define BSP_COM1_RX_GPIO_PORT GPIOA
#define BSP_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#endif #define BSP_COM1_IRQn USART1_IRQn #define BSP_COM1_DMA_DR_BASE 0x40011004
#define BSP_COM1_DMA_CLK RCC_AHB1Periph_DMA2
#define BSP_COM1_Tx_DMA_FLAG DMA_FLAG_TCIF7
#define BSP_COM1_Tx_DMA_Stream DMA2_Stream7
#define BSP_COM1_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM1_Tx_BUFF_SIZE 0x600 //发送缓冲区大小
#define BSP_COM1_Rx_BUFF_SIZE 0x600 //接收缓冲区大小 /**
142 * @brief Definition for COM port2, connected to USART2
143 */
#define BSP_COM2 USART2
#define BSP_COM2_CLK RCC_APB1Periph_USART2
#define BSP_COM2_AF GPIO_AF_USART2 #ifdef COM_2_3
#define BSP_COM2_TX_AF_PIN GPIO_PinSource2
#define BSP_COM2_TX_PIN GPIO_Pin_2
#define BSP_COM2_TX_GPIO_PORT GPIOA
#define BSP_COM2_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM2_RX_AF_PIN GPIO_PinSource6
#define BSP_COM2_RX_PIN GPIO_Pin_6
#define BSP_COM2_RX_GPIO_PORT GPIOD
#define BSP_COM2_RX_GPIO_CLK RCC_AHB1Periph_GPIOD
#elif defined(COM_2_2)
#define BSP_COM2_TX_AF_PIN GPIO_PinSource5
#define BSP_COM2_TX_PIN GPIO_Pin_5
#define BSP_COM2_TX_GPIO_PORT GPIOD
#define BSP_COM2_TX_GPIO_CLK RCC_AHB1Periph_GPIOD
#define BSP_COM2_RX_AF_PIN GPIO_PinSource3
#define BSP_COM2_RX_PIN GPIO_Pin_3
#define BSP_COM2_RX_GPIO_PORT GPIOA
#define BSP_COM2_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#elif defined(COM_2_1)
#define BSP_COM2_TX_AF_PIN GPIO_PinSource5
#define BSP_COM2_TX_PIN GPIO_Pin_5
#define BSP_COM2_TX_GPIO_PORT GPIOD
#define BSP_COM2_TX_GPIO_CLK RCC_AHB1Periph_GPIOD
#define BSP_COM2_RX_AF_PIN GPIO_PinSource6
#define BSP_COM2_RX_PIN GPIO_Pin_6
#define BSP_COM2_RX_GPIO_PORT GPIOD
#define BSP_COM2_RX_GPIO_CLK RCC_AHB1Periph_GPIOD
#else
#define BSP_COM2_TX_AF_PIN GPIO_PinSource2
#define BSP_COM2_TX_PIN GPIO_Pin_2
#define BSP_COM2_TX_GPIO_PORT GPIOA
#define BSP_COM2_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM2_RX_AF_PIN GPIO_PinSource3
#define BSP_COM2_RX_PIN GPIO_Pin_3
#define BSP_COM2_RX_GPIO_PORT GPIOA
#define BSP_COM2_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#endif #define BSP_COM2_IRQn USART2_IRQn #define BSP_COM2_DMA_DR_BASE 0x40004404
#define BSP_COM2_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM2_Tx_DMA_FLAG DMA_FLAG_TCIF6
#define BSP_COM2_Tx_DMA_Stream DMA1_Stream6
#define BSP_COM2_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM2_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM2_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
200 * @brief Definition for COM port3, connected to USART3
201 */
#define BSP_COM3 USART3
#define BSP_COM3_CLK RCC_APB1Periph_USART3
#define BSP_COM3_AF GPIO_AF_USART3
#ifdef COM_3_3 //自由组合部分
#define BSP_COM3_TX_AF_PIN GPIO_PinSource8
#define BSP_COM3_TX_PIN GPIO_Pin_8
#define BSP_COM3_TX_GPIO_PORT GPIOD
#define BSP_COM3_TX_GPIO_CLK RCC_AHB1Periph_GPIOD
#define BSP_COM3_RX_AF_PIN GPIO_PinSource11
#define BSP_COM3_RX_PIN GPIO_Pin_11
#define BSP_COM3_RX_GPIO_PORT GPIOC
#define BSP_COM3_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#elif defined(COM_3_2)
#define BSP_COM3_TX_AF_PIN GPIO_PinSource8
#define BSP_COM3_TX_PIN GPIO_Pin_8
#define BSP_COM3_TX_GPIO_PORT GPIOD
#define BSP_COM3_TX_GPIO_CLK RCC_AHB1Periph_GPIOD
#define BSP_COM3_RX_AF_PIN GPIO_PinSource9
#define BSP_COM3_RX_PIN GPIO_Pin_9
#define BSP_COM3_RX_GPIO_PORT GPIOD
#define BSP_COM3_RX_GPIO_CLK RCC_AHB1Periph_GPIOD
#elif defined(COM_3_1)
#define BSP_COM3_TX_AF_PIN GPIO_PinSource10
#define BSP_COM3_TX_PIN GPIO_Pin_10
#define BSP_COM3_TX_GPIO_PORT GPIOC
#define BSP_COM3_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM3_RX_AF_PIN GPIO_PinSource11
#define BSP_COM3_RX_PIN GPIO_Pin_11
#define BSP_COM3_RX_GPIO_PORT GPIOC
#define BSP_COM3_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#else
#define BSP_COM3_TX_AF_PIN GPIO_PinSource10
#define BSP_COM3_TX_PIN GPIO_Pin_10
#define BSP_COM3_TX_GPIO_PORT GPIOB
#define BSP_COM3_TX_GPIO_CLK RCC_AHB1Periph_GPIOB
#define BSP_COM3_RX_AF_PIN GPIO_PinSource11
#define BSP_COM3_RX_PIN GPIO_Pin_11
#define BSP_COM3_RX_GPIO_PORT GPIOB
#define BSP_COM3_RX_GPIO_CLK RCC_AHB1Periph_GPIOB
#endif #define BSP_COM3_IRQn USART3_IRQn #define BSP_COM3_DMA_DR_BASE 0x40004804
#define BSP_COM3_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM3_Tx_DMA_FLAG DMA_FLAG_TCIF3
#define BSP_COM3_Tx_DMA_Stream DMA1_Stream3
#define BSP_COM3_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM3_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM3_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
256 * @brief Definition for COM port4, connected to USART4
257 */
#define BSP_COM4 UART4
#define BSP_COM4_CLK RCC_APB1Periph_UART4
#define BSP_COM4_AF GPIO_AF_UART4
#ifdef COM_4_3
#define BSP_COM4_TX_AF_PIN GPIO_PinSource10
#define BSP_COM4_TX_PIN GPIO_Pin_10
#define BSP_COM4_TX_GPIO_PORT GPIOC
#define BSP_COM4_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM4_RX_AF_PIN GPIO_PinSource1
#define BSP_COM4_RX_PIN GPIO_Pin_1
#define BSP_COM4_RX_GPIO_PORT GPIOA
#define BSP_COM4_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#elif defined(COM_4_2)
#define BSP_COM4_TX_AF_PIN GPIO_PinSource0
#define BSP_COM4_TX_PIN GPIO_Pin_0
#define BSP_COM4_TX_GPIO_PORT GPIOA
#define BSP_COM4_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM4_RX_AF_PIN GPIO_PinSource11
#define BSP_COM4_RX_PIN GPIO_Pin_11
#define BSP_COM4_RX_GPIO_PORT GPIOC
#define BSP_COM4_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#elif defined(COM_4_1)
#define BSP_COM4_TX_AF_PIN GPIO_PinSource10
#define BSP_COM4_TX_PIN GPIO_Pin_10
#define BSP_COM4_TX_GPIO_PORT GPIOC
#define BSP_COM4_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM4_RX_AF_PIN GPIO_PinSource11
#define BSP_COM4_RX_PIN GPIO_Pin_11
#define BSP_COM4_RX_GPIO_PORT GPIOC
#define BSP_COM4_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#else
#define BSP_COM4_TX_AF_PIN GPIO_PinSource0
#define BSP_COM4_TX_PIN GPIO_Pin_0
#define BSP_COM4_TX_GPIO_PORT GPIOA
#define BSP_COM4_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM4_RX_AF_PIN GPIO_PinSource1
#define BSP_COM4_RX_PIN GPIO_Pin_1
#define BSP_COM4_RX_GPIO_PORT GPIOA
#define BSP_COM4_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#endif #define BSP_COM4_IRQn UART4_IRQn #define BSP_COM4_DMA_DR_BASE 0x40004C04
#define BSP_COM4_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM4_Tx_DMA_FLAG DMA_FLAG_TCIF4
#define BSP_COM4_Tx_DMA_Stream DMA1_Stream4
#define BSP_COM4_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM4_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM4_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
312 * @brief Definition for COM port5, connected to USART5
313 */
#define BSP_COM5 UART5
#define BSP_COM5_CLK RCC_APB1Periph_UART5
#define BSP_COM5_AF GPIO_AF_UART5 #define BSP_COM5_TX_AF_PIN GPIO_PinSource12
#define BSP_COM5_TX_PIN GPIO_Pin_12
#define BSP_COM5_TX_GPIO_PORT GPIOC
#define BSP_COM5_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM5_RX_AF_PIN GPIO_PinSource2
#define BSP_COM5_RX_PIN GPIO_Pin_2
#define BSP_COM5_RX_GPIO_PORT GPIOD
#define BSP_COM5_RX_GPIO_CLK RCC_AHB1Periph_GPIOD #define BSP_COM5_IRQn UART5_IRQn #define BSP_COM5_DMA_DR_BASE 0x40005004
#define BSP_COM5_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM5_Tx_DMA_FLAG DMA_FLAG_TCIF7
#define BSP_COM5_Tx_DMA_Stream DMA1_Stream7
#define BSP_COM5_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM5_Tx_BUFF_SIZE 125 //发送缓冲区大小
#define BSP_COM5_Rx_BUFF_SIZE 125 //接收缓冲区大小 /**
340 * @brief Definition for COM port6, connected to USART6
341 */
#define BSP_COM6 USART6
#define BSP_COM6_CLK RCC_APB2Periph_USART6
#define BSP_COM6_AF GPIO_AF_USART6
#ifdef COM_6_3
#define BSP_COM6_TX_AF_PIN GPIO_PinSource6
#define BSP_COM6_TX_PIN GPIO_Pin_6
#define BSP_COM6_TX_GPIO_PORT GPIOC
#define BSP_COM6_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM6_RX_AF_PIN GPIO_PinSource9
#define BSP_COM6_RX_PIN GPIO_Pin_9
#define BSP_COM6_RX_GPIO_PORT GPIOG
#define BSP_COM6_RX_GPIO_CLK RCC_AHB1Periph_GPIOG
#elif defined(COM_6_2)
#define BSP_COM6_TX_AF_PIN GPIO_PinSource14
#define BSP_COM6_TX_PIN GPIO_Pin_14
#define BSP_COM6_TX_GPIO_PORT GPIOG
#define BSP_COM6_TX_GPIO_CLK RCC_AHB1Periph_GPIOG
#define BSP_COM6_RX_AF_PIN GPIO_PinSource7
#define BSP_COM6_RX_PIN GPIO_Pin_7
#define BSP_COM6_RX_GPIO_PORT GPIOC
#define BSP_COM6_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#elif defined(COM_6_1)
#define BSP_COM6_TX_AF_PIN GPIO_PinSource14
#define BSP_COM6_TX_PIN GPIO_Pin_14
#define BSP_COM6_TX_GPIO_PORT GPIOG
#define BSP_COM6_TX_GPIO_CLK RCC_AHB1Periph_GPIOG
#define BSP_COM6_RX_AF_PIN GPIO_PinSource9
#define BSP_COM6_RX_PIN GPIO_Pin_9
#define BSP_COM6_RX_GPIO_PORT GPIOG
#define BSP_COM6_RX_GPIO_CLK RCC_AHB1Periph_GPIOG
#else
#define BSP_COM6_TX_AF_PIN GPIO_PinSource6
#define BSP_COM6_TX_PIN GPIO_Pin_6
#define BSP_COM6_TX_GPIO_PORT GPIOC
#define BSP_COM6_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM6_RX_AF_PIN GPIO_PinSource7
#define BSP_COM6_RX_PIN GPIO_Pin_7
#define BSP_COM6_RX_GPIO_PORT GPIOC
#define BSP_COM6_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#endif #define BSP_COM6_IRQn USART6_IRQn #define BSP_COM6_DMA_DR_BASE 0x40011404
#define BSP_COM6_DMA_CLK RCC_AHB1Periph_DMA2
#define BSP_COM6_Tx_DMA_FLAG DMA_FLAG_TCIF6
#define BSP_COM6_Tx_DMA_Stream DMA2_Stream6
#define BSP_COM6_Tx_DMA_Channel DMA_Channel_5 #define BSP_COM6_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM6_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
396 * @brief Definition for COM port7, connected to USART7
397 */
#define BSP_COM7 UART7
#define BSP_COM7_CLK RCC_APB1Periph_UART7
#define BSP_COM7_AF GPIO_AF_UART7
#ifdef COM_7_3
#define BSP_COM7_TX_AF_PIN GPIO_PinSource8
#define BSP_COM7_TX_PIN GPIO_Pin_8
#define BSP_COM7_TX_GPIO_PORT GPIOE
#define BSP_COM7_TX_GPIO_CLK RCC_AHB1Periph_GPIOE
#define BSP_COM7_RX_AF_PIN GPIO_PinSource6
#define BSP_COM7_RX_PIN GPIO_Pin_6
#define BSP_COM7_RX_GPIO_PORT GPIOF
#define BSP_COM7_RX_GPIO_CLK RCC_AHB1Periph_GPIOF
#elif defined(COM_7_2)
#define BSP_COM7_TX_AF_PIN GPIO_PinSource7
#define BSP_COM7_TX_PIN GPIO_Pin_7
#define BSP_COM7_TX_GPIO_PORT GPIOF
#define BSP_COM7_TX_GPIO_CLK RCC_AHB1Periph_GPIOF
#define BSP_COM7_RX_AF_PIN GPIO_PinSource7
#define BSP_COM7_RX_PIN GPIO_Pin_7
#define BSP_COM7_RX_GPIO_PORT GPIOE
#define BSP_COM7_RX_GPIO_CLK RCC_AHB1Periph_GPIOE
#elif defined(COM_7_1)
#define BSP_COM7_TX_AF_PIN GPIO_PinSource7
#define BSP_COM7_TX_PIN GPIO_Pin_7
#define BSP_COM7_TX_GPIO_PORT GPIOF
#define BSP_COM7_TX_GPIO_CLK RCC_AHB1Periph_GPIOF
#define BSP_COM7_RX_AF_PIN GPIO_PinSource6
#define BSP_COM7_RX_PIN GPIO_Pin_6
#define BSP_COM7_RX_GPIO_PORT GPIOF
#define BSP_COM7_RX_GPIO_CLK RCC_AHB1Periph_GPIOF
#else
#define BSP_COM7_TX_AF_PIN GPIO_PinSource8
#define BSP_COM7_TX_PIN GPIO_Pin_8
#define BSP_COM7_TX_GPIO_PORT GPIOE
#define BSP_COM7_TX_GPIO_CLK RCC_AHB1Periph_GPIOE
#define BSP_COM7_RX_AF_PIN GPIO_PinSource7
#define BSP_COM7_RX_PIN GPIO_Pin_7
#define BSP_COM7_RX_GPIO_PORT GPIOE
#define BSP_COM7_RX_GPIO_CLK RCC_AHB1Periph_GPIOE
#endif #define BSP_COM7_IRQn UART7_IRQn #define BSP_COM7_DMA_DR_BASE 0x40007804
#define BSP_COM7_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM7_Tx_DMA_FLAG DMA_FLAG_TCIF1
#define BSP_COM7_Tx_DMA_Stream DMA1_Stream1
#define BSP_COM7_Tx_DMA_Channel DMA_Channel_5 #define BSP_COM7_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM7_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
451 * @brief Definition for COM port8, connected to USART8
452 */
#define BSP_COM8 UART8
#define BSP_COM8_CLK RCC_APB1Periph_UART8
#define BSP_COM8_AF GPIO_AF_UART8 #define BSP_COM8_TX_AF_PIN GPIO_PinSource1
#define BSP_COM8_TX_PIN GPIO_Pin_1
#define BSP_COM8_TX_GPIO_PORT GPIOE
#define BSP_COM8_TX_GPIO_CLK RCC_AHB1Periph_GPIOE
#define BSP_COM8_RX_AF_PIN GPIO_PinSource0
#define BSP_COM8_RX_PIN GPIO_Pin_0
#define BSP_COM8_RX_GPIO_PORT GPIOE
#define BSP_COM8_RX_GPIO_CLK RCC_AHB1Periph_GPIOE #define BSP_COM8_IRQn UART8_IRQn #define BSP_COM8_DMA_DR_BASE 0x40007C04
#define BSP_COM8_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM8_Tx_DMA_FLAG DMA_FLAG_TCIF0
#define BSP_COM8_Tx_DMA_Stream DMA1_Stream0
#define BSP_COM8_Tx_DMA_Channel DMA_Channel_5 #define BSP_COM8_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM8_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /******************************函数声明****************************************/
void BSP_UartOpen(uint8_t COM, uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity);
void BSP_UartClose(uint8_t COM);
uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len);
uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len);
uint32_t BSP_UartTxIdleState(uint8_t COM); #endif
BSP_Uart.h
/*
2 ********************************************************************************
3 *
4 * Queue.c
5 *
6 * File : Queue.c
7 * Version : V1.0
8 * Author : whq
9 * Mode : Thumb2
10 * Toolchain :
11 * Description : 队列操作
12 *
13 * History :
14 * Date : 2013.07.22
15 *******************************************************************************/ #include <string.h> #include "Queue.h"
/*******************************************************************************
21 * Function Name : uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t lenSize)
22 * Description : 队列建立
23 * Input : pQ8: 队列
24 pBuf: 队列缓冲区地址
25 bufSize:队列缓冲区大小
26 * Output :
27 * Other :
28 * Date : 2013.08.29
29 *******************************************************************************/
uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t bufSize)
{
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pBuf);
ASSERT_PARAM(bufSize); pQ8->bufSize = bufSize;
pQ8->pBuf = pBuf;
pQ8->pStart = pBuf;
pQ8->pEnd = pBuf; return ;
} /*******************************************************************************
45 * Function Name : uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len)
46 * Description : 数据载入队列
47 * Input : pQ8: 队列
48 pData: 要进队列的数据
49 len: 数据长度
50 * Output :
51 * Other :
52 * Date : 2013.08.29
53 *******************************************************************************/
uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len)
{
uint32_t dataLen = len; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); while (dataLen--)
{
*pQ8->pEnd++ = *pData++; if (pQ8->pEnd >= pQ8->pBuf + pQ8->bufSize) //指针指向栈尾
{
pQ8->pEnd = pQ8->pBuf;
} if (pQ8->pEnd == pQ8->pStart) //缓冲区填满 覆盖最早的数据
{
pQ8->pStart++;
if (pQ8->pStart >= pQ8->pBuf + pQ8->bufSize)
{
pQ8->pStart = pQ8->pBuf;
}
}
} return len;
} /*******************************************************************************
86 * Function Name : uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen)
87 * Description : 队列中取数据
88 * Input : pQ8: 队列
89 pData: 缓冲区
90 dataLen:缓冲区大小
91 * Output :
92 * Other :
93 * Date : 2013.08.29
94 *******************************************************************************/
uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen)
{
uint32_t index = ; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); while ((pQ8->pStart != pQ8->pEnd) && (index < dataLen) && (index < pQ8->bufSize))
{
pData[index++] = *pQ8->pStart++;
if (pQ8->pStart >= pQ8->pBuf + pQ8->bufSize)
{
pQ8->pStart = pQ8->pBuf;
}
} return index;
} /*******************************************************************************
117 * Function Name : uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen)
118 * Description : 以起始符和结束符取队列中的数据 (取出的数据 包括起始符 和分隔符)
119 * Input : pQ8: 队列
120 startChar: 起始符
121 endChar: 结束符
122 pData: 缓冲区
123 dataLen: 缓冲区大小
124 * Output :
125 * Other :
126 * Date : 2013.08.29
127 *******************************************************************************/
uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen)
{
int32_t count;
int32_t index;
volatile uint8_t *pStart;
volatile uint8_t *pEnd; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); pStart = pQ8->pStart;
count = pQ8->bufSize; while ((pStart != pQ8->pEnd) && count--) //查找起始字符
{
if (startChar == *pStart) break;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} if (pStart == pQ8->pEnd) return ; //未找到起始符
if (count == -) return ;
pEnd = pStart;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; while ((pEnd != pQ8->pEnd) && count--) //查找结束字符
{
if (endChar == *pEnd) break;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
} if (pEnd == pQ8->pEnd) return ; //未找结束符
if (count == -) return ;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; count = pQ8->bufSize - count;
index = ;
//获取从起始字符到结束字符的数据
while ((pStart != pEnd) && (index < dataLen) && (index < pQ8->bufSize) && count--)
{
pData[index++] = *pStart++;
if (pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} pQ8->pStart = pEnd;
return index;
} /*******************************************************************************
178 * Function Name : uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
179 * Description : 提取首尾双分隔符内的数据(包括分隔符)
180 * Input : pQ8: 队列
181 startChar: 起始符
182 endChar: 结束符
183 pData: 缓冲区
184 dataLen: 缓冲区大小
185 * Output :
186 * Other :
187 * Date : 2013.08.30
188 *******************************************************************************/
uint32_t QUEUE_PacketDoubleByteSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
{
int32_t count;
int32_t index;
volatile uint8_t *pStart;
volatile uint8_t *pEnd; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); pStart = pQ8->pStart;
count = pQ8->bufSize; while ((pStart != pQ8->pEnd) && count--) //查找起始字符
{
if (splitChar == *pStart) break;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} if (pStart == pQ8->pEnd) return ; //未找到起始符
if (count == -) return ;
pEnd = pStart;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; while ((pEnd != pQ8->pEnd) && count--) //查找结束字符
{
if (splitChar == *pEnd) break;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
} if (pEnd == pQ8->pEnd) return ; //未找结束符
if (count == -) return ;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; count = pQ8->bufSize - count;
index = ;
//获取从起始字符到结束字符的数据
while ((pStart != pEnd) && (index < dataLen) && (index < pQ8->bufSize) && count--)
{
pData[index++] = *pStart++;
if (pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} //如果取出的数据只包括分隔符,有可能是上次结束符和下次起始符,因此放弃上次结束符。
if (index <= )
{
index = ;
if (--pStart < pQ8->pBuf) pStart = pQ8->pBuf + pQ8->bufSize - ;
} pQ8->pStart = pStart;
return index;
} /*******************************************************************************
246 * Function Name : uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
247 * Description : 提取单结束分隔符的数据 (包括分隔符)
248 * Input :
249 * Output :
250 * Other :
251 * Date : 2013.10.20
252 *******************************************************************************/
uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
{
int32_t count;
int32_t index;
volatile uint8_t *pStart;
volatile uint8_t *pEnd; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); pStart = pQ8->pStart;
count = pQ8->bufSize; while ((pStart != pQ8->pEnd) && count--) //查找起始字符
{
if (splitChar == *pStart) break;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} if (pStart == pQ8->pEnd) return ; //未找到起始符
if (count == -) return ;
pEnd = pStart;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; pStart = pQ8->pStart;
count = pQ8->bufSize;
index = ;
while ((pStart != pEnd) && (index < dataLen) && count--) //查找起始字符
{
pData[index++] = *pStart;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} pQ8->pStart = pStart;
return index;
} /*******************************************************************************
293 * Function Name :QUEUE_PacketDoubleCharSplit
294 * Description :提取双结束分隔符的数据 (包括分隔符)
295 * Input :QUEUE8_TYPE * pQ8
296 * Input :uint8_t splitChar1
297 * Input :uint8_t splitChar2
298 * Input :uint8_t * pData
299 * Input :uint32_t dataLen
300 * Output :uint32_t
301 * Other :
302 * Date :2014/03/27
303 *******************************************************************************/
uint32_t QUEUE_PacketDoubleCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar1, uint8_t splitChar2, uint8_t *pData, uint32_t dataLen)
{
int32_t count;
int32_t index;
volatile uint8_t *pStart;
volatile uint8_t *pEnd;
uint8_t lastChar = ; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); pStart = pQ8->pStart;
count = pQ8->bufSize; while ((pStart != pQ8->pEnd) && count--) //查找起始字符
{
if ((splitChar1 == lastChar) && (splitChar2 == *pStart)) break; lastChar = *pStart; if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} if (pStart == pQ8->pEnd) return ; //未找到起始符
if (count == -) return ;
pEnd = pStart;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; pStart = pQ8->pStart;
count = pQ8->bufSize;
index = ;
while ((pStart != pEnd) && (index < dataLen) && count--) //查找起始字符
{
pData[index++] = *pStart;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} pQ8->pStart = pStart;
return index;
} /*******************************************************************************
349 * Function Name : void ASSERT_FAILED(uint8_t* file, uint32_t line)
350 * Description : 异常
351 * Input :
352 * Output :
353 * Other :
354 * Date : 2013.08.29
355 *******************************************************************************/
void ASSERT_FAILED(uint8_t* file, uint32_t line)
{
uint8_t flg = ; while (flg);
}
Queue.c
/*
2 ********************************************************************************
3 *
4 * Queue.h
5 *
6 * File : Queue.h
7 * Version : V1.0
8 * Author : whq
9 * Mode : Thumb2
10 * Toolchain :
11 * Description : 队列操作头文件
12 *
13 * History :
14 * Date : 2013.07.22
15 *******************************************************************************/ #ifndef _QUEUE_H_
#define _QUEUE_H_ #ifdef __cplusplus
extern "C"
{
#endif #include "stdint.h" #define DEBUG_FULL_ASSERT 0 #ifdef DEBUG_FULL_ASSERT
#define ASSERT_PARAM(a) ((a) ? (void)0 : ASSERT_FAILED((uint8_t *)__FILE__, __LINE__))
void ASSERT_FAILED(uint8_t* file, uint32_t line);
#else
#define ASSERT_PARAM(a) if (a == NULL) return 0;
#endif typedef struct {
volatile uint32_t bufSize;
volatile uint8_t *pStart;
volatile uint8_t *pEnd;
volatile uint8_t *pBuf;
}QUEUE8_TYPE; uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t bufSize);
uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len);
uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen);
uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen);
uint32_t QUEUE_PacketDoubleByteSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen);
uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen);
uint32_t QUEUE_PacketDoubleCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar1, uint8_t splitChar2, uint8_t *pData, uint32_t dataLen); #ifdef __cplusplus
}
#endif #endif
Queue.h
STM32F4XX高效驱动篇1-UART的更多相关文章
- STM32F4XX高效驱动篇2 I2C
说到I2C很多用过STMF10X硬件I2C方式的工程师,都感觉有点头痛.大部分还是使用软件模拟的方式,I2C由于一般的工作频率是400,100KHz.所以在平凡读取,或所读数据量大时,使用这模拟的方式 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】连载导读
前言: 无数昼夜的来回轮替以后,这本<驱动篇I>终于编辑完毕了,笔者真的感动到连鼻涕也流下来.所谓驱动就是认识硬件,还有前期建模.虽然<驱动篇I>的硬件都是我们熟悉的老友记,例 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】原创教程连载导读【连载完成,共二十九章】
前言: 无数昼夜的来回轮替以后,这本<驱动篇I>终于编辑完毕了,笔者真的感动到连鼻涕也流下来.所谓驱动就是认识硬件,还有前期建模.虽然<驱动篇I>的硬件都是我们熟悉的老友记,例 ...
- ARM Linux驱动篇 学习温度传感器ds18b20的驱动编写过程
ARM Linux驱动篇 学习温度传感器ds18b20的驱动编写过程 原文地址:http://www.cnblogs.com/NickQ/p/9026545.html 一.开发板与ds18b20的入门 ...
- 羽夏看Win系统内核——驱动篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- 驱动之SPI,UART,I2C的介绍与应用20170118
这篇文章主要介绍基本的驱动也是用的最多的协议类驱动中的SPI,I2C和UART.首先从最简单的UART也就是串口讲起: 1.UART UART由两根线也就是TX,RX以及波特率产生器组成,操作比较简单 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】【实验一】流水灯模块
实验一:流水灯模块 对于发展商而言,动土仪式无疑是最重要的任务.为此,流水灯实验作为低级建模II的动土仪式再适合不过了.废话少说,我们还是开始实验吧. 图1.1 实验一建模图. 如图1.1 所示,实验 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二:按键模块① - 消抖
实验二:按键模块① - 消抖 按键消抖实验可谓是经典中的经典,按键消抖实验虽曾在<建模篇>出现过,而且还惹来一堆麻烦.事实上,笔者这是在刁难各位同学,好让对方的惯性思维短路一下,但是惨遭口 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验七:PS/2模块① — 键盘
实验七:PS/2模块① — 键盘 实验七依然也是熟烂的PS/2键盘.相较<建模篇>的PS/2键盘实验,实验七实除了实现基本的驱动以外,我们还要深入解PS/2时序,还有PS/2键盘的行为.不 ...
随机推荐
- IDEA报compilation failed:internal java compiler error解决方法
java complier 设置的问题 ,项目中有的配jdk1.6,有的配jdk1.7,版本不一样,导致这样的错误,提示这样的报错时,从file-Settings进入
- SQL 根据表获取字段字符串
SQLSERVER查询单个数据表所有字段名组合成的字符串脚本 --SQLSERVER查询单个数据表所有字段名组合成的字符串脚本 --应用场合: 用于生成SQL查询字符串中select 字段名列表1 f ...
- org.springframework.beans.factory.UnsatisfiedDependencyException
© 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: 搭建SSH框架,启动时报错如下: 严重: Context initialization failed org.springframew ...
- Memcahed服务异常监控脚本
#!/bin/sh # filename: mon_mc.sh export MemcahedIp=$1export MemcahedPort=$2export NcCmd="nc $Mem ...
- lua学习笔记(十三)
math库 定义在math中 所有三角函数都使用弧度 指数和对数函数 取整函数 伪随机数math.random 调用时没有参数返回0~1之间的随 ...
- 使用WebStorm将项目部署到IIS
在WebStorm中打开项目,通常WS会启动一个虚拟服务器并使用如下地址访问 但这样会有一个问题,在局域网内的其他设备,比如手机和其他电脑是不能访问这个地址的,这样就给开发和调试带来了不便.本人也是惭 ...
- Gmail收不到邮件咋办?
http://www.ipip.net/ping.php 分别输入 imap.gmail.com pop.gmail.com smtp.gmail.com 选择 国外 , 然后点ping,找到对应的 ...
- EXTjs+SpringMVC+Mybatis实现照片的上传,下载,查看关键技术整理
第一个问题:如何通过Extjs4实现照片上传的布局展示以及本地照片选择后的在一个区域内进行图片预览 实现照片上传的布局展示: items : [ { xtype : 'box', itemId : ' ...
- 编写一个基于HBase的MR程序,结果遇到一个错:ERROR security.UserGroupInformation - PriviledgedActionException as ,求帮助
环境说明:Ubuntu12.04,使用CDH4.5,伪分布式环境 Hadoop配置如下: core-site.xml: <configuration><property> ...
- eclipse 连接 hadoop集群
1 网上找插件 或者 自己编译 放到eclipse plugin里面 2 重启eclipse 配置MapReduceLocation 通吃端口为9001 9000 看你自己的配置 3 新建mapRed ...