STM32F0xx HAL 库使用问题记录

1. SPI 数据收发函数HAL_SPI_xxx传入传出 buf 指针地址必需16位对齐

例如,SPI收发数据函数HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
pTxData和pRxData,必需16位对齐,若不能保证16位对齐,可以在调用SPI收发函数之情,申请两个16位对齐的buf替代原有的buf进行SPI收发数据,示例如下:

HAL_StatusTypeDef spiTxRx(const uint8_t *txData, uint8_t *rxData, uint16_t length)
{
    HAL_StatusTypeDef ret;

    /* txbuf, rxbuf 地址是16位对齐的,可作为SPI收发函数的参数 */
    uint8_t txbuf[255];
    uint8_t rxbuf[255];

    /* 将SPI要发送的数据拷贝到txbuf */
    if(txData != NULL) {
        memcpy(rxbuf, txData, length);
    }

    /* 使用txbuf和rxbuf进行SPI数据收发 */
    ret = HAL_SPI_TransmitReceive(hspi, txbuf, rxbuf, length, Timeout);

    /* 将SPI接收的数据拷回rxData */
    if(rxData != NULL) {
        memcpy(rxData, rxbuf, length);
    }

    return ret;
}

2. 使用HAL库提供的串口接收中断处理函数,需要在中断处理中再次调用HAL_UART_Receive_IT使能串口接收中断,此函数调用可能会失败,导致串口接收中断未使能,无法通过串口接收中断接收数据

HAL库提供的串口接收中断API使用方法:

  1. 中断处理程序中调用HAL_UART_IRQHandler,此函数中会除能串口接收中断、调用HAL_UART_RxCpltCallback
  2. 实现HAL_UART_RxCpltCallback,在此函数中接收串口数据,并再次调用HAL_UART_Receive_IT使能串口接收中断,此时可能会失败,导致不能再次进入串口接收中断。

解决方法:不使用HAL提供的处理函数,中断处理程序中直接判断中断标志位接收数据,并清除中断标志。

原文地址:https://www.cnblogs.com/chenbeibei/p/11404296.html

时间: 2024-10-31 00:15:27

STM32F0xx HAL 库使用问题记录的相关文章

HAL库延时、SYCCNT与SYSTICK

HAL库驱动中,由于某些外设的驱动需要使用超时判断(比如I2C.SPI.SDIO等),需要精确延时(精度为1ms),使用的是SysTick,但是在操作系统里面,我们需要使用SysTick来提供系统时基,那么就冲突了,怎么办?答案是利用DWT重新编写HAL库的相关延时和超时函数HAL_InitTick().HAL_GetTick()和HAL_Delay(),这三个函数在HAL库中都是弱定义函数(函数开头带__weak关键字). 在Cortex-M内核里面有一个外设叫DWT(Data  Watchp

【安富莱】V6,V5开发板用户手册,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔(2019-07-21)

说明: 1.本教程重在BSP驱动包设计方法和HAL库的框架学习,并将HAL库里面的各种弯弯绕捋顺,从而方便我们的程序设计. 2.本次工程延续以往的代码风格,从底层BSP驱动包到应用代码,变量命名,文件命名,程序框架,注释等都比较规范,大家阅读或者移植都会比较方便.      另外,阅读代码时,务必将编辑器的缩进参数和TAB设置为4来阅读本文件,否则显示不整齐. 3.本教程每周会继续更新1-2章,之后将开启配套的视频教程制作,加大对初学者的支持力度. 4.V5,V6,V7将通过这次升级,达到底层驱

STM32标准外设库、 HAL库、LL库

工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常用的库,后面的LL库是ST最近才添加,目前支持的芯片也偏少.各库如下所示: 其中STD库和HAL库两者相互独立,互不兼容.几种库的比较如下: 目前几种库对不同芯片的支持情况如下: 上图中,LL库目前有部分芯片不支持,官方计划2017年逐步完善. STM32Snippets 它是代码示例的集合,直接基于STM32外设寄存器,可在文档和软件包中使用.

【HAL库每天一例】freemodbus移植

例程下载:资料包括程序.相关说明资料以及软件使用截图 百度云盘:https://pan.baidu.com/s/1slN8rIt 密码:u6m1 360云盘:https://yunpan.cn/OcPiRp3wEcA92u密码 cfb6 (硬石YS-F1Pro开发板HAL库例程持续更新\6. 软件设计之Modbus(HAL库版本)\YSF1_HAL_freemodbus_001. freemodbus移植)/**  ****************************************

STM32 HAL库和LL库的区别

上次开发一个项目,使用一个小容量的STM32 ARM CORTEX核心的单片机,使用STM32CUBEMX自动生成配置代码,正准备编写程序的时候,发现容量竟然有6K多.这个容量在使用大容量FLASH的单片机时不感到什么,可是使用小容量单片机的时候,就明显不够用了. 没有办法,只好打算回去使用原来的StdLib库,前两年不就这么干的嘛,也没什么难的.可是回头找对应库的时候,发现悲剧了,没有这个序列的标准库. 这也难不倒我们老司机!我就从HAL库里面把必须的寄存器语句摘出来,把冗余的有效检验和冲突处

STM32F103 PWM输出实验(HAL库)

1.芯片输出PWM波形打码步骤 1.0主函数 int main(void) { HAL_Init(); //初始化HAL库 Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M delay_init(72); //初始化延时函数 uart_init(115200); //初始化串口 LED_Init(); //初始化LED TIM1_PWM_Init(20000,72); //72分频,即1M . 1000000/20000 = 50 Hz ,即20ms whil

USART与USB接收不定数据方法,标准库、HAL库都适用

很多时候,我们使用串口或USB接收数据时,往往不知道PC端会发多长的数据下来, 为了解决这个不定数据接收问题,在此各提供一个解决思路. 串口数据不定接收: 由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据, 由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机. IDLE就是串口收到一帧数据后,发生的中断.什么是一帧数据呢?比如说给单片机一 次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以 叫做一包数据. 还有一

STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeMX配置外部时钟 注意在进行外部时钟配置时,即"High Speed Clock"和"Low Speed Clock"需配置成"Crytal/Ceramic Resonator(低温/陶瓷谐振器)"不能配置为"BYASS Clock Sour

STM32 IIC双机通信—— HAL库硬件IIC版

参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HAL库的硬件IIC要比标准库的稳定.好了,下面就从STM32CubeMx 配置开始一步步实现IIC通讯. STM32CubeMx的配置,这里关于新建工程的步骤我就不细说了,如果还不会操作STM32CubeMx 的可以点击链接查看, 这里主要对IIC的配置进行说明. 了解IIC的都知道,IIC通信有主从