经过前面一段时间的测试,我们把STM32L051 的需要用到的基本功能都测试过了,这次我们得把产品替换成L051了。 基本的IO使用都没问题,数据存储EEPROM和flash也没有问题,测试过正常用就可以了 但是在串口的使用上,还是有点需要测试一下。
1、串口接收发送不定长度的数据(非DMA方式)
以前在在标准库STM32F103标准库的使用上用到的IDLE中断接收一帧数据,测试用起来确实好用
void USART2_IRQHandler(void)
{
u8 clear=clear;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_RX_BUF[RX_Data++] = USART2->DR;
}
else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
{
clear=USART2->SR;
clear=USART2->DR;
ReceiveState=1;
}
}
不需要自己做延时处理,在某些情况下,比如通讯模块的串口3使用中,还是用到了延时处理,具体就是判断串口是否接收到一个字节的数据?如果接收到一个字节的数据,那么延时一定时间,一般是几毫秒(这个延时时间就是干等,等待这一串数据全部接收完成,所以这个时间需要实际使用中不同的测试优化,干等时间太长了不太合理,太短数据接收不完全处理起来会出错),如下:
RETURN_TYPE blue_getTelegram(TEL_RADIO_TYPE *pu8RxRadioTelegram, TEL_PARAM_TYPE *pu8TelParam)
{
uint8 u8CRC = 0;
uint8 u8Count = 0;
uint8 TmpVal = 0;
uint8 DATA_LEN = 0;
uint8 n = 0;
uint8 HEADER_BYTES[4];
uint8 DatBuf[30] = {0};
u8state = GET_SYNC_STATE;
if (Read_pt != Enocean_Data){
delay_ms(7);
while (Read_pt != Enocean_Data)
{
TmpVal = USART_Enocean_BUF[Read_pt++];
if(Read_pt >= 100)
Read_pt = 0;
switch(u8state)
...
自己也使用过环形缓冲区等一些方式进行优化,可能目前的处理方式能够满足大部分功能需求,所以也没有确实的花心思正真去测试优化一个环形缓冲区的使用。
那么现在再L051下面,我们怎么来使用 IDLE 中断呢? 当然我先去网上查找了大神们的各种帖子,然后还是得自己修改一下程序,来一步一步做测试,先回到串口接收简单的测试:
if(test_data != Enocean_Data){
HAL_Delay(7);
if(Enocean_Data > 10){
HAL_UART_Transmit(&huart1,USART_Enocean_BUF, Enocean_Data,0xFFFF);
}
memset(USART_Enocean_BUF, 0, sizeof(USART_Enocean_BUF));
Enocean_Data=0;
(&hlpuart1)->pRxBuffPtr = USART_Enocean_BUF;
}
}
在主函数初始化串口后,有这么一句,打开串口中断(这里的中断可不可以理解为打开IT中断)
HAL_UART_Receive_IT(&hlpuart1, (uint8_t *)&USART_Enocean_BUF[0], 1);
现在我们要开启IDLE中断
__HAL_UART_ENABLE_IT(&hlpuart1,UART_IT_IDLE);
HAL_UART_Receive_IT(&hlpuart1, (uint8_t *)&USART_Enocean_BUF[0], 1);
在stm32l0xx_it.c中找到 LPUART1_IRQHandler函数,因为所有中断先是进入 stm32l0xx_it.c 中相应的IRQHandler函数中,调用对应函数,最后才会进入到 自己设置的 Callback函数中,我们这次测试直接在void LPUART1_IRQHandler(void)函数中系统设置的函数前写一个 实现 IDLE中断后操作的函数:
void LPUART1_IRQHandler(void)
{
if((__HAL_UART_GET_FLAG(&hlpuart1,UART_FLAG_IDLE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&hlpuart1);
ReceiveState = 1;
}
HAL_UART_IRQHandler(&hlpuart1);
}
用 ReceiveState 来标志是否接受到了一串数据,然后打印函数变成
if(ReceiveState == 1){
ReceiveState = 0;
HAL_UART_Transmit(&huart1,USART_Enocean_BUF, Enocean_Data,0xFFFF);
memset(USART_Enocean_BUF, 0, sizeof(USART_Enocean_BUF));
Enocean_Data=0;
(&hlpuart1)->pRxBuffPtr = USART_Enocean_BUF;
}
结果, 数据异常,就是收不全,结尾会有问题,明天得继续测试优化了,先上个正常的接收,这是上面用HAL_Delay(7)测试得到的正常结果。
|