stm32的HAL库uart的注意点

发布者:chang_ri最新更新时间:2019-08-08 来源: eefocus关键字:stm32  HAL库  uart 手机看文章 扫描二维码
随时随地手机看文章

(一)、uart / usart 要注意的 API使用方法。

  1.__HAL_UART_GET_FLAG 是获取 SR 寄存器标志位状态

  2.__HAL_UART_CLEAR_FLAG 是清除 SR 寄存器标志位状态,不同于读改写的清零方式,这是直接清零。

  3.__HAL_UART_CLEAR_xxFLAG ,xx为PE FE NE ORE IDLE 共5个, 清除方式都是一样的,要先读取SR,再读取DR才能清除对应的标志位

  4.UART_Receive_IT或许有bug,tmp = (uint16_t*) huart->pRxBuffPtr;需要pRxBuffPtr十六位对齐,但是pRxBuffPtr类型是uint8_t *,是不一定对齐的。所以在声明buffer的时候要注意声明称16位以上对齐的数据。

  5.SR不能用软件置1,一般都是软件清零,通过读改写方式清零会导致中断请求丢失,推荐软件直接写0清除标志。

  6.注意UART_FLAG_xx和UART_IT_xx的区别

  7.串口发送只能一次,问题在于没有开启TC中断

 

(二)串口的框图需要理解透

 

 

 (三)代码如下

 

接收不定长的数据

/**
  * @brief  This function handles UART interrupt request.
  * @param  huart: pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void user_Uart1Handler(void)
{

    if ( (__HAL_UART_GET_FLAG (&huart1, UART_FLAG_RXNE) != RESET) )//接收数据
    {
        if (uart1RxCounter < 99)
        {
            uart1RxBuf[uart1RxCounter] =(char)( huart1.Instance->DR & 0xff);
            uart1RxCounter++;
        }
        __HAL_UART_CLEAR_FLAG (&huart1, UART_FLAG_RXNE);

    }

    if(__HAL_UART_GET_FLAG (&huart1, UART_FLAG_TXE) != RESET) //可以发送下个字节
    {
        __HAL_UART_DISABLE_IT(&huart1, UART_IT_TXE);
        __HAL_UART_DISABLE_IT(&huart1, UART_IT_TC);
    }

    if ( (__HAL_UART_GET_FLAG (&huart1, UART_FLAG_IDLE) != RESET) ) //接收完一帧数据,空闲标志
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        rx1_cplt = SET;
        huart1.RxState = HAL_UART_STATE_READY;
    }
    
    if ( (__HAL_UART_GET_FLAG (&huart1, UART_FLAG_TC) != RESET) ) //发送完一帧数据,TC标志
    {
        __HAL_UART_CLEAR_PEFLAG (&huart1);
        __HAL_UART_CLEAR_PEFLAG (&huart1);
        huart1.gState = HAL_UART_STATE_READY;
    }
    
    {
        uint32_t state;
        state = __HAL_UART_GET_FLAG (&huart1, UART_FLAG_PE)| __HAL_UART_GET_FLAG (&huart1, UART_FLAG_FE)
        |__HAL_UART_GET_FLAG (&huart1, UART_FLAG_NE)|__HAL_UART_GET_FLAG (&huart1, UART_FLAG_ORE);
        if (state != RESET)
        {
            __HAL_UART_CLEAR_PEFLAG (&huart1);
            
        }
    }
    
    if(huart1.ErrorCode != HAL_UART_ERROR_NONE)
    {
        Error_Handler();
    }

}

printf回调 发送单个字节的程序如下,前提是打开dma和中断:

 

void Uart_PutChar(UART_HandleTypeDef *huart, char ch)
{
    if(__HAL_UART_GET_FLAG (huart, UART_FLAG_TXE) != RESET)
    {
        huart->Instance->DR = (uint16_t)ch &    (uint16_t)0x01FF;//每次写DR会清零TXE
        while(__HAL_UART_GET_FLAG(huart,UART_FLAG_TXE) != SET)
        {
        
        }
    }

}
void putchar_uart1_callback(char ch)
{   
    Uart_PutChar(&huart1,ch);
}

printf回调 ,发送多个字符串的程序如下,前提是打开dma和中断:

void putstring_uart1_callback(char *data, unsigned int size)
{
    HAL_UART_Transmit_DMA(&huart1,(uint8_t *)data,size);
}

还要记得在main循环之前,打开相关中断:
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
    
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);

    __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);

    __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);


关键字:stm32  HAL库  uart 引用地址:stm32的HAL库uart的注意点

上一篇:stm32的HAL库i2c从机实现
下一篇:关于stm32 hal 库 iic 一直是 busy 问题

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

串口通信的实验
串口操作相关库函数(省略入口参数): void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能 void USART_Cmd();//使能串口 void USART_ITConfig();//使能相关中断 void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据 FlagStatus USART_GetFlagStatus();//获取状态标志位 void USART_ClearFlag();//清除状态标志位 ITStatus USART_GetITStatus();/
[单片机]
串口通信的实验
STM32的GPIO在实际开发设计的使用配置和技巧
一、前言 本篇开始对STM32的GPIO在实际开发设计中的使用配置和技巧进行探讨,可以先去回顾下之前介绍的GPIO的相关理论基础知识包括基本结构,工作模式和寄存器原理。 了解过STM32的GPIO相关的理论知识,这样在应用GPIO开发过程中,能更好的理解GPIO的特点,应用起来会更加的得心应手。 后续将从以下图1中所示的几个方面对GPIO应用设计中的步骤展开介绍。本篇先介绍GPIO的基本API函数定义,配置初始化的流程,以及使用技巧;针对将GPIO的引脚用于外部中断的功能将作为单独的一篇进行详细的讨论介绍。 图1 GPIO应用设计 二、API函数 STM32有多种类型的库,本节所介绍的STM32的GPIO函数接口是ST
[单片机]
<font color='red'>STM32</font>的GPIO在实际开发设计的使用配置和技巧
STM32学习笔记:通用定时器输出PWM
脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出 对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度、电机转速等。 STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出。其中高级定时器TIM1和TIM8可以同时产生高达7路的PWM输出,通用定时器TIM2~TIM5可以同时产生4路PWM输出。 使用通用定时器输出PWM同样需要4步配置,由于输出PWM信号时,不需要定时器中断,所以不需要配置NVIC,但是需要配置TIM_OCInitStructure。下面已配置TIM2为例: (1)开启系统时钟 RCC_APB1PeriphClockCm
[单片机]
STM32 MDK工程中使用printf
首先,要包含头文件 stdio.h 第二:printf()函数使用了int fputc(int ch,FILE *f)完成其功能。 要使用printf,就需要重写这个函数。 第三,在工程选项的Target里边勾选USE MicroLIB项。 fputc示例如下: int fputc(int ch,FILE *f) { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of tra
[单片机]
STM32入门学习之ADC(STM32F030F4P6基于CooCox IDE)
#include stm32_lib/inc/stm32f0xx_rcc.h #include stm32_lib/inc/stm32f0xx_adc.h #include stm32_lib/inc/stm32f0xx_gpio.h int main(void) { //时钟配置 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC IO配置,此处定义PA0口为ADC端口 GPIO_InitTypeDef PORT_ADC; PORT_AD
[单片机]
Uart接口TTL电平详解
Uart接口的详细解释 我面试的时候一般喜欢问应聘者一个问题:UART与RS232/RS485的区别与联系?很多人对于这个问题答得都不是很好。还有些人压根就没有想过这个问题,一直认为他们是同一个东西,就是咱们俗称的串口。 我刚入嵌入式的大门时,对这个问题也困惑过很久,后来终于弄明白了。跟大家一起分享一下吧。 简单来说,区别在于UART是一种接口,而RS232/RS485是一种总线。UART这个接口,后面可以接TTL电平,这就是我们俗称的普通的串口。而UART如果接了RS232/RS485的转换芯片,那么后面的总线上就是按照RS232/RS485规则来传输数据。RS232/RS485总线的具体规则我们后续再讨论,本篇主要
[测试测量]
<font color='red'>Uart</font>接口TTL电平详解
STM32——按键
一、GPIO工作模式 1、当I/O端口配置为输入时: 输出缓冲器被禁止 施密特触发输入被激活 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 对输入数据寄存器的读访问可得到I/O状态 2、当I/O端口被配置为输出时: 输出缓冲器被激活 ─ 开漏模式:输出寄存器上的’0’激活 N-MOS,而输出寄存器上的’1’将端口置于高阻状态(P-MOS 从不被激活)。 ─ 推挽模式:输出寄存器上的’0’激活 N-MOS,而输出寄存器上的’1’将激活 P-MOS。 施密特触发输入被激活 弱上拉和下拉电阻被禁止 出现在I/O脚上的数据在每个APB2时
[单片机]
<font color='red'>STM32</font>——按键
STM32 cannot enter debug mode错误
调试STM32时,MDK环境,有的代码下进去后,突然以后再Debug的时候,就会出现:Cannot enter Debug Mode ,显示错误Error:Flash Download failed-Target DLL has been cancalled. 可以尝试着用ISP方式,将片上的FLASH全部擦掉就OK了。 使用先设置跳线boot0 = 1,boot1=0。然后连上串口线,波特率默认即可,读STM32的器件信息,再擦除。。。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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