STM32_HAL库入门笔记(一) USART配置

发布者:心若清泉最新更新时间:2019-07-09 来源: eefocus关键字:STM32  HAL库  USART配置 手机看文章 扫描二维码
随时随地手机看文章

串口发送功能:


uint8_t TxData[10]= "01234abcde";

HAL_UART_Transmit(&huart2,TxData,10,0xffff);//把TxData的内容通过uart2发送出去,长度是10,timeout的时间是最大值0xffff


串口接收功能1:

uint8_t value='F';

HAL_UART_Receive(&huart2,(uint8_t *)&value,1,1000);//在这个语句停留1000ms内等待接收1个字节数据,把数据存放在value中


串口接收功能2:

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


串口接收功能3:

if(HAL_UART_Receive_IT(&huart2,(uint8_t *)&value,1) != HAL_OK){    //这一句写在main函数的while(1)上面。用于启动程序启动一次中断接收

        HAL_UART_Transmit(&huart2, (uint8_t *)&"ERRORrn",7,10);    

        while(1);

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)

{

    HAL_UART_Transmit(&huart2, (uint8_t *)&"rninto HAL_UART_RxCpltCallbackrn",32,0xffff);    //验证进入这个函数了

    HAL_UART_Transmit(&huart2,(uint8_t *)&value,1,0xffff);      //把接收到的数据通过串口发送出去        

    HAL_UART_Receive_IT(&huart2,(uint8_t *)&value,1);        //重新打开串口中断

}


串口DMA发送

DMA的TX要这样设置


    uint8_t txData[] = {"HelloWorldrn"};

    HAL_UART_Transmit_DMA(&huart2,txData,sizeof(txData));//可以通过DMA把数据发出去


 DMA接收

if(HAL_UART_Receive_DMA(&huart2, (uint8_t *)rxData, sizeof(rxData)-1) != HAL_OK)//main函数while(1)前,启动一次DMA接收

    {

        Error_Handler();

    }


串口回调函数:


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle){

    

    uint8_t temp[] = {"rnin Callbackrn"};

    HAL_UART_Transmit_DMA(&huart2,temp,sizeof(temp)-1);//可以通过DMA把数据发出去

    

    HAL_UART_Receive_DMA(&huart2, (uint8_t *)rxData, sizeof(rxData)-1);    //重新使能接收    

}


 main函数while(1)中不断输出rxData值


HAL_UART_Transmit_DMA(&huart2,rxData,sizeof(rxData)-1);//可以通过DMA把数据发出去


总结:分轮询方式和中断方式。发送可以使用轮询方式进行,接收建议使用中断方式,如使用轮询方式,会占用系统工作内存过多的现象。

现在需要考虑的地方在于,回调函数放在哪里比较合适。


关键字:STM32  HAL库  USART配置 引用地址:STM32_HAL库入门笔记(一) USART配置

上一篇:[HAL库]STM32之DMA方式串口发送
下一篇:STM32CUBE HAL库 关于串口usart收发的一个问题

推荐阅读最新更新时间:2024-11-12 19:15

STM32 Cubemax(十一) ——JY901陀螺仪数据的读取与简单数据处理
前言 JY901是维特公司出品的9轴陀螺仪,个人在使用上感觉是十分不错的,他们家的产品都可以使用串口或者IIC来进行数据读取。且内部自带滤波效果,不需要对其数据进行处理,就可以直接使用。 如果买了他们家产品,应该都有他们家的上位机,这里就不给出链接了,如果有需要私聊。 JY901简单介绍 JY901这款陀螺仪,每次发送出来的数据,可以在上位机中查看,且可以在上位机中选择需要发送出来的数据。 我们分析原始数据或者看手册都可以知道,JY901每次发送出来的数据都是11位的,其中第一位位帧头,第二位为判断属于的类型。 一、上位机调试 我们在第一次使用时,记得将陀螺仪水平,然后点击加计校准,来校准陀螺仪。 我们在上位机
[单片机]
<font color='red'>STM32</font> Cubemax(十一) ——JY901陀螺仪数据的读取与简单数据处理
从汇编代码,看STM32的启动过程
分享这篇文章,谈一下STM32启动流程。如果读者朋友已经有过汇编相关基础,能更好理解本文内容。汇编语言是比C语言更接近机器底层的编程语言,能让我们更好的理解和操纵硬件底层。 STM32的三种启动模式 下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,这就是所谓的启动过程。 STM32上电或者复位后,代码区始终从0x00000000开始,其实就是将存储空间的地址映射到0x00000000中。 三种启动模式如下: 从主闪存存储器启动:将主Flash地址0x08000000映射到0x00000000,这样代码启动之后就相当于从0x08000000开始。主闪存存储器是STM32内置的Flash,作为芯
[单片机]
STM32 低功耗 stop模式
关键代码: 1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); 2. /** * @brief Configures system clock after wake-up from STOP: enable HSE, PLL * and select PLL as system clock source. * @param None * @retval None */ static void SYSCLKC
[单片机]
定时器周期计算公式
例如: TIM_TimeBaseStructure.TIM_Period = 10000-1; //当定时器从0计数到10000,即为10000次,为一个定时周期10khz TIM_TimeBaseStructure.TIM_Prescaler = 71; //设置预分频:1us/clk TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频(是对外部时钟TIMXETR进行滤波的) TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 T
[单片机]
定时器周期计算公式
STM32是如何进入中断函数的
中断相信很多人都知道是什么意思,不同的任务有不同的优先级,高任务优先级会比低优先级先执行。在嵌入式系统中, 任务的调度和切换都是根据优先级来判断的。 中断可以分为软中断和硬中断。一开始接触到的一般都是软中断,软中断就是中断程序包含在主程序里面,当中断条件满足时,直接跳转到中断函数执行,然后再返回。就相当于判断语句。 刚开始接触STM32的小伙伴可能会发现main.c里面没有中断程序也没用跳转判断语句。例如:定时器中断 #include system.h #include SysTick.h #include led.h #include time.h int main() { u8 i; SysTic
[单片机]
stm32 接收蓝牙(uart)等设备命令的处理
方法有两种: 方法1:查询法 static void BT_RX_Handler(void) { u8 data = USART_ReceiveData(USART2); if((BT_Buf_Status & 0x80) == 0) /* not complete */ { if(BT_Buf_Status & 0x40) { BT_RcvBuf = data; BT_RecCur++; if((data == 0xEC) && (8 == BT_RecCur)) //if((data == 0xEC)) { BT_Buf_Status |= (1 7); /* comple
[单片机]
STM32软件复位的实现方法
前些天写程序的时候,需要做一个自动复位的功能,也就是当收到外部通讯设备复位指令时,主设备立刻执行复位操作。当时是想到的用看门狗实现。但是觉得似乎不太妥当,因为看门狗的复位是需要一定的时间。而在这段时间内系统还是处于正常运行当中,而且所有中断都会正常响应。这恰好与要实现的功能南辕北辙。需求是当收到复位指令时,系统停止执行后面的所有操作,包含中断响应。所以看门狗无法实现。 我用的是STM32F103芯片,了解这颗芯片能用来复位的只有5种,外部复位、独立/窗口看门狗、软件复位功耗管理。看来我能用的也就只有软件复位了。但是我查了所有STM32F103芯片相关的资料,还是没有找到具体的实现方法,最多是提到过这种复位寄存器SYSRESET
[单片机]
使用MCU GD32替代STM32的体会
GD32作为国产MCU里的佼佼者,产品线也比较丰富,是替代STM32的一个很好的选择。前段时间有个项目用到GD32的单片机,今天来说说使用的一些体会。 1.硬件我用的单片机型号为GD32F405RGT6,对应STM32F405RGT6。首先,硬件上基本兼容,有一点不同的是GD32的31和47脚为NC,STM32的为VCAP。STM32这两个引脚需要分别连接一个电容到GND,而GD32则不需要。当然,有这两个电容也无所谓,所以,硬件上GD32可以直接替换STM32。 仿真器可以使用Jlink,也可以使用STLink,但是下载程序时会弹框提示,非ST芯片。 2.软件软件上,前期
[单片机]
使用MCU GD32替代<font color='red'>STM32</font>的体会
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved