添加I2C
This commit is contained in:
+94
-25
@@ -94,13 +94,10 @@ void USART1_Init(uint32_t BaudRate,uint16_t WordLength,uint16_t StopBits,uint16_
|
||||
void usart_init(void)
|
||||
{
|
||||
usart_config(&uart1,USART1 ,GPIOA, GPIO_Pin_9, GPIOA, GPIO_Pin_10,115200, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No,128,128);
|
||||
|
||||
|
||||
usart_config(&uart3,USART3 ,GPIOC, GPIO_Pin_10, GPIOC, GPIO_Pin_11,19200, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No,128,128);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void usart_config(UART_ptr ptr,USART_TypeDef *UART, GPIO_TypeDef *GPIO_Tx, uint32_t Pin_Tx, GPIO_TypeDef *GPIO_Rx, uint32_t Pin_Rx,
|
||||
uint32_t BaudRate, uint16_t WordLength, uint16_t StopBits, uint16_t Parity,
|
||||
uint32_t buff_tx_len,uint32_t buff_rx_len)
|
||||
@@ -128,14 +125,12 @@ void usart_config(UART_ptr ptr,USART_TypeDef *UART, GPIO_TypeDef *GPIO_Tx, uint3
|
||||
ptr->buffer_tx_len = buff_tx_len;
|
||||
ptr->buffer_tx_len_2 = buff_tx_len / 2;
|
||||
|
||||
if(ptr->USART == USART1){RCC_Periph = RCC_APB2Periph_USART1;RCC_APB2PeriphClockCmd(RCC_Periph, ENABLE);}
|
||||
else if(ptr->USART == USART2){RCC_Periph = RCC_APB1Periph_USART2;RCC_APB1PeriphClockCmd(RCC_Periph, ENABLE);}
|
||||
else if(ptr->USART == USART3){RCC_Periph = RCC_APB1Periph_USART3;RCC_APB1PeriphClockCmd(RCC_Periph, ENABLE);}
|
||||
else if(ptr->USART == UART4){RCC_Periph = RCC_APB1Periph_UART4;RCC_APB1PeriphClockCmd(RCC_Periph, ENABLE);}
|
||||
|
||||
|
||||
if(ptr->USART == USART1)RCC_Periph = RCC_APB2Periph_USART1;
|
||||
else if(ptr->USART == USART2)RCC_Periph = RCC_APB1Periph_USART2;
|
||||
else if(ptr->USART == USART3)RCC_Periph = RCC_APB1Periph_USART3;
|
||||
else if(ptr->USART == UART4)RCC_Periph = RCC_APB1Periph_UART4;
|
||||
RCC_APB2PeriphClockCmd(RCC_Periph, ENABLE);
|
||||
|
||||
//初始化IO口
|
||||
//init tx
|
||||
if(ptr->GPIO_Tx == GPIOA)RCC_Periph = RCC_APB2Periph_GPIOA;
|
||||
@@ -158,7 +153,7 @@ void usart_config(UART_ptr ptr,USART_TypeDef *UART, GPIO_TypeDef *GPIO_Tx, uint3
|
||||
else if(ptr->GPIO_Rx == GPIOE)RCC_Periph = RCC_APB2Periph_GPIOE;
|
||||
|
||||
RCC_APB2PeriphClockCmd(RCC_Periph, ENABLE);
|
||||
GPIO_InitStructure.GPIO_Pin = ptr->GPIO_Rx;
|
||||
GPIO_InitStructure.GPIO_Pin = ptr->Pin_Rx;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(ptr->GPIO_Rx, &GPIO_InitStructure);
|
||||
@@ -173,13 +168,11 @@ void usart_config(UART_ptr ptr,USART_TypeDef *UART, GPIO_TypeDef *GPIO_Tx, uint3
|
||||
|
||||
USART_Init(ptr->USART, &USART_InitStructure);
|
||||
|
||||
/*打开接收中断*/
|
||||
USART_ITConfig(ptr->USART, USART_IT_RXNE, ENABLE);//读取数据
|
||||
|
||||
/*打开IDLE数据检测中断*/
|
||||
USART_ITConfig(ptr->USART, USART_IT_IDLE, ENABLE);//读取整包数据(读取fifo)
|
||||
|
||||
|
||||
USART_ITConfig(ptr->USART, USART_IT_TXE, DISABLE);//发送可以不开中断,只要传到dma即可
|
||||
|
||||
uint8_t NVIC_IRQChannel = USART1_IRQn;
|
||||
|
||||
@@ -201,19 +194,74 @@ void usart_config(UART_ptr ptr,USART_TypeDef *UART, GPIO_TypeDef *GPIO_Tx, uint3
|
||||
|
||||
size_t usart_read(UART_ptr ptr,unsigned char *buff,const unsigned int len)
|
||||
{
|
||||
size_t size = 0;
|
||||
size_t i = 0;
|
||||
|
||||
return size;
|
||||
if (ptr->buffer_rx_len)
|
||||
{
|
||||
size_t blen = ptr->buffer_rx_head - ptr->buffer_rx_tail;
|
||||
if (blen < 0)
|
||||
{
|
||||
blen += ptr->buffer_rx_len;
|
||||
}
|
||||
if (blen > ptr->buffer_rx_max)
|
||||
{
|
||||
ptr->buffer_rx_max = blen;
|
||||
}
|
||||
for (; i < len; ++i)
|
||||
{
|
||||
if (ptr->buffer_rx_tail != ptr->buffer_rx_head)
|
||||
{
|
||||
buff[i] = ptr->buffer_rx[ptr->buffer_rx_tail++];
|
||||
if (ptr->buffer_rx_tail >= ptr->buffer_rx_len)
|
||||
{
|
||||
ptr->buffer_rx_tail = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
size_t usart_write(UART_ptr ptr,const unsigned char *buff,const unsigned int len)
|
||||
{
|
||||
size_t size = 0;
|
||||
size_t size = len;
|
||||
|
||||
ptr->pkg_tx++;
|
||||
|
||||
if (ptr->buffer_tx_len)
|
||||
{
|
||||
for (size_t i = 0; i < len; ++i)
|
||||
{
|
||||
ptr->buffer_tx[ptr->buffer_tx_head++] = buff[i];
|
||||
if (ptr->buffer_tx_head >= ptr->buffer_tx_len)
|
||||
{
|
||||
ptr->buffer_tx_head = 0;
|
||||
}
|
||||
}
|
||||
int blen = ptr->buffer_tx_head - ptr->buffer_tx_tail;
|
||||
if (blen < 0)
|
||||
{
|
||||
blen += ptr->buffer_tx_len;
|
||||
}
|
||||
if (blen > ptr->buffer_tx_max)
|
||||
{
|
||||
ptr->buffer_tx_max = blen;
|
||||
}
|
||||
if (ptr->buffer_tx_tail != ptr->buffer_tx_head)
|
||||
{
|
||||
if (ptr->GPIOx)
|
||||
{
|
||||
GPIO_WriteBit(ptr->GPIOx, ptr->GPIO_Pin, Bit_SET);
|
||||
}
|
||||
|
||||
/* enable the USARTx transmit interrupt */
|
||||
USART_ITConfig(ptr->USART, USART_IT_TXE, ENABLE);
|
||||
}
|
||||
}
|
||||
|
||||
USART_ITConfig(ptr->USART, USART_IT_TXE, ENABLE);//发送可以不开中断,只要传到dma即可
|
||||
return size;
|
||||
}
|
||||
|
||||
@@ -221,18 +269,14 @@ void UART_IRQHandler(UART_ptr ptr)
|
||||
{
|
||||
if (RESET != USART_GetITStatus(ptr->USART, USART_IT_RXNE))
|
||||
{
|
||||
|
||||
/* Read one byte from the receive data register */
|
||||
|
||||
ptr->buffer_rx[ptr->buffer_rx_head++] = (uint8_t)USART_ReceiveData(ptr->USART);
|
||||
//ptr->byt_rx++;
|
||||
ptr->byt_rx++;
|
||||
|
||||
if (ptr->buffer_rx_head >= ptr->buffer_rx_len)
|
||||
{
|
||||
ptr->buffer_rx_head = 0;
|
||||
}
|
||||
|
||||
USART_ClearITPendingBit(ptr->USART, USART_IT_RXNE);
|
||||
}
|
||||
|
||||
if ((RESET != USART_GetITStatus(ptr->USART, USART_IT_IDLE)))
|
||||
@@ -247,8 +291,33 @@ void UART_IRQHandler(UART_ptr ptr)
|
||||
{
|
||||
USART_ClearITPendingBit(ptr->USART, USART_IT_TXE);
|
||||
|
||||
/*打开发送中断*/
|
||||
USART_ITConfig(ptr->USART, USART_IT_TXE, DISABLE);//发送可以不开中断,只要传到dma即可
|
||||
if (ptr->buffer_tx_tail == ptr->buffer_tx_head)
|
||||
{
|
||||
/* disable the USARTx transmit interrupt */
|
||||
USART_ITConfig(ptr->USART, USART_IT_TXE, DISABLE);
|
||||
USART_ITConfig(ptr->USART, USART_IT_TC, ENABLE);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Write one byte to the transmit data register */
|
||||
USART_SendData(ptr->USART, ptr->buffer_tx[ptr->buffer_tx_tail++]);
|
||||
ptr->byt_tx++;
|
||||
if (ptr->buffer_tx_tail >= ptr->buffer_tx_len)
|
||||
{
|
||||
ptr->buffer_tx_tail = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//发送完成中断
|
||||
if (RESET != USART_GetITStatus(ptr->USART, USART_IT_TC))
|
||||
{
|
||||
USART_ClearITPendingBit(ptr->USART, USART_IT_TC);
|
||||
USART_ITConfig(ptr->USART, USART_IT_TC, DISABLE);
|
||||
if (ptr->GPIOx)
|
||||
{
|
||||
GPIO_WriteBit(ptr->GPIOx, ptr->GPIO_Pin, Bit_RESET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user