添加I2C

This commit is contained in:
2024-03-02 01:06:06 +08:00
parent deafcfed1a
commit bef8342c93
21 changed files with 20646 additions and 18411 deletions
+94 -25
View File
@@ -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);
}
}
}