不晓得是不是自己用寄存器操作习惯了,总是用不习惯STM32的HAL库,效率实在是有些低。特别是用到多个串口进行高速传输的应用,就一个入口函数,然后一个一个的callback调用,效率上讲,实在是有些差。于是自己尝试了一下,在基于STM32cube的基础上(借用一下Cube生成的初始化函数,还是有必要的),改成了寄存器操作版本。这样,GPIO口的初始化,时钟的初始化之类的操作,就利用了cube。。偷个懒吧。
我还是使用了STM32G070的开发板,利用板载的USART2。RX使用中断来接收,Tx为polling的方式。FIFO的阈值为1/8(没记错的话)。
MX_USART2_UART_Init(void)修改如下:
static void MX_USART2_UART_Init(void)
{
... ... ...
/* USER CODE BEGIN USART2_Init 2 */
//启动单字节接收,实际上直接使用USART2->CR1这样调用也可以
huart2.Instance->CR1 |= USART_CR1_RE | USART_CR1_RXNEIE_RXFNEIE;
huart2.Instance->CR1 |= USART_CR1_PEIE;
/* USER CODE END USART2_Init 2 */
}
在中断函数USART2_IRQHandler修改为:
unsigned char RxData[256];//用来测试接收的情况
unsigned char RxIndex;
void USART2_IRQHandler(void)
{
if(USART2->ISR & USART_ISR_RXNE_RXFNE) //接收数据寄存器非空
{
RxData[RxIndex++] = USART2->RDR;
}
}
main函数中,进行循环发送测试:
//在主循环中不停的发,来测试
unsigned int Delay = 60000;
while(Delay--);
USART2->TDR = 'a';
while(!(USART2->ISR & USART_ISR_TC));
USART2->TDR = '1';
while(!(USART2->ISR & USART_ISR_TC));
USART2->TDR = '3';
while(!(USART2->ISR & USART_ISR_TC));
USART2->TDR = '9';
while(!(USART2->ISR & USART_ISR_TC));
以上只是个简单的例程,不涉及到错误的处理,例如帧错误,溢出错误等。如果要加这些功能,就需要额外对USART2进行寄存器配置操作。对应的中断函数,也需要额外的处理流程
不晓得是不是自己用寄存器操作习惯了,总是用不习惯STM32的HAL库,效率实在是有些低。特别是用到多个串口进行高速传输的应用,就一个入口函数,然后一个一个的callback调用,效率上讲,实在是有些差。于是自己尝试了一下,在基于STM32cube的基础上(借用一下Cube生成的初始化函数,还是有必要的),改成了寄存器操作版本。这样,GPIO口的初始化,时钟的初始化之类的操作,就利用了cube。。偷个懒吧。
我还是使用了STM32G070的开发板,利用板载的USART2。RX使用中断来接收,Tx为polling的方式。FIFO的阈值为1/8(没记错的话)。
MX_USART2_UART_Init(void)修改如下:
static void MX_USART2_UART_Init(void)
{
... ... ...
/* USER CODE BEGIN USART2_Init 2 */
//启动单字节接收,实际上直接使用USART2->CR1这样调用也可以
huart2.Instance->CR1 |= USART_CR1_RE | USART_CR1_RXNEIE_RXFNEIE;
huart2.Instance->CR1 |= USART_CR1_PEIE;
/* USER CODE END USART2_Init 2 */
}
在中断函数USART2_IRQHandler修改为:
unsigned char RxData[256];//用来测试接收的情况
unsigned char RxIndex;
void USART2_IRQHandler(void)
{
if(USART2->ISR & USART_ISR_RXNE_RXFNE) //接收数据寄存器非空
{
RxData[RxIndex++] = USART2->RDR;
}
}
main函数中,进行循环发送测试:
//在主循环中不停的发,来测试
unsigned int Delay = 60000;
while(Delay--);
USART2->TDR = 'a';
while(!(USART2->ISR & USART_ISR_TC));
USART2->TDR = '1';
while(!(USART2->ISR & USART_ISR_TC));
USART2->TDR = '3';
while(!(USART2->ISR & USART_ISR_TC));
USART2->TDR = '9';
while(!(USART2->ISR & USART_ISR_TC));
以上只是个简单的例程,不涉及到错误的处理,例如帧错误,溢出错误等。如果要加这些功能,就需要额外对USART2进行寄存器配置操作。对应的中断函数,也需要额外的处理流程
举报