STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记

STM32Cube对于新项目的开发能节省不少时间,从繁琐芯片初始化中解脱出来


1.STM32 UART初始化部分,配置好工程,采用STM32cube生成代码,初始化即已经完成。


2.串口中断方式的发动作:HAL_UART_Transmit_IT

没做任何处理的情况下,我们在程序中使用printf会把信息打印到显示屏中去,这时我们需要将printf重定向就能将printf的消息打印到串口中 去。在主函数中添加如下函数:

int fputc(int ch, FILE *f) 
{
    HAL_UART_Transmit_IT(&huart1, (uint8_t *)&ch, 1);
    osDelay(1);
    return 0;
}

//即完成重定向,执行printf即能将任意长度的字符发送到串口中


3.串口中断的收动作:HAL_UART_Receive_IT

HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);//程序不会在这个语句停留,直接会按照中断方式把接收数据存放在value中,但是这个语句只能使能一次串口中断。所以要在中断服务函数或者回调函数中重新使能
代码:

//接收缓存初始化
#define MAX_RECV_LEN 1024 
uint8_t msg_buff[MAX_RECV_LEN] = {0};
uint8_t * msg = msg_buff;
static int flag = false;

//接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)  
{  
    uint8_t ret = HAL_OK;
    msg++;
    if( msg == msg_buff + MAX_RECV_LEN)
    {
        msg = msg_buff;
    }
    do  
    {  
        ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);            
    }while(ret != HAL_OK);
    
    if(*(msg-1) == '\n')   //接收以\n为结尾字符,则表示接收完成
    {
        flag  = true;
    }
} 


void uart_main(void)
{
    extern UART_HandleTypeDef huart1;
    HAL_UART_Receive_IT(&huart1, (uint8_t *)msg, 1); //开启第一次中断

    while(1)
    {
        if (flag == true)
        {
            printf("msg_buff = %s\r\n",msg_buff);
            memset(msg_buff, 0, sizeof(msg_buff));   //清空缓存区
            // 指向接收缓存的头部
            msg = msg_buff;
            (&huart1)->pRxBuffPtr = msg;
            flag = false;
        }
        osDelay(10);
    }
}


  • 17
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
你可以使用STM32F103的硬件UART模块来实现串口收发任意长度的数据包,而不使用HAL。下面是一个示例代码,展示了如何使用STM32Cube来配置和控制UART模块。 首先,你需要在STM32CubeMX中配置UART模块的引脚和时钟设置。确保使能相应的UART模块,并设置合适的波特率和数据位数。 接下来,在生成的代码中,找到usart.c文件,并添加以下函数: ```c void UART_SendData(uint8_t* data, uint16_t len) { for (uint16_t i = 0; i < len; i++) { while (!(USART1->SR & USART_SR_TXE)); // 等待发送完成 USART1->DR = data[i]; // 发送数据 } while (!(USART1->SR & USART_SR_TC)); // 等待发送完毕 } void UART_ReceiveData(uint8_t* data, uint16_t len) { for (uint16_t i = 0; i < len; i++) { while (!(USART1->SR & USART_SR_RXNE)); // 等待接收到数据 data[i] = USART1->DR; // 读取接收到的数据 } } ``` 以上代码中,UART_SendData函数用于发送数据包,UART_ReceiveData函数用于接收数据包。你可以根据需要修改USART1为你要使用的UART模块。 最后,在主函数中调用这两个函数来发送和接收数据包。例如: ```c #define PACKET_SIZE 10 int main(void) { uint8_t txData[PACKET_SIZE] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}; uint8_t rxData[PACKET_SIZE] = {0}; // 初始化串口 // 发送数据包 UART_SendData(txData, PACKET_SIZE); // 接收数据包 UART_ReceiveData(rxData, PACKET_SIZE); // 处理接收到的数据 while (1) { // 主循环 } } ``` 这样,你就可以在STM32F103上实现串口收发任意长度的数据包,而不使用HAL。记得根据你的具体硬件和需求进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值