datasheet

STM32L0xx_HAL_Driver库的使用——UART

2019-06-15来源: eefocus关键字:STM32L0xx_HAL_Driver库  UART  单片机

单片机型号:STM32L051C8T6


开发环境MDK5.12


库版本:STM32L0xx_HAL_Driver V1.1.0


主机环境:Windows XP


之前一直使用的STM32F030C8T6单片机来做开发,因需求更改更换了一个新型号STM32L051C8T6,主要是用到了其低功耗特性,本以为直接把代码拷贝一下就可以使用了,结果是太天真了,STM32F030C8T6使用的库是STM32F0_StdPeriph_Lib而STM32L051C8T6使用的库是STM32L0xx_HAL_Driver两者的差别还是很大的,而且官方也推荐使用后者,没办法,重新学习一下吧。。。参考其例程磕磕绊绊的勉强可以写一个工程了,这里写一下有关UART的调试。


参考的程序是STM32L053R8-Nucleo例程中的UART_TwoBoards_ComIT工程,采用中断方式来进行两个单片机之间的通信。STM32L0xx_HAL_Driver库的分层更加明显,板极初始化代码如下



void HAL_UART_MspInit(UART_HandleTypeDef *huart)

{  

  GPIO_InitTypeDef  GPIO_InitStruct;

  

  /*##-1- Enable peripherals and GPIO Clocks #################################*/

  /* Enable GPIO TX/RX clock */

  USARTx_TX_GPIO_CLK_ENABLE();

  USARTx_RX_GPIO_CLK_ENABLE();

  /* Enable USART1 clock */

  USARTx_CLK_ENABLE(); 

  

  /*##-2- Configure peripheral GPIO ##########################################*/  

  /* UART TX GPIO pin configuration  */

  GPIO_InitStruct.Pin       = USARTx_TX_PIN;

  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull      = GPIO_NOPULL;

  GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;

  GPIO_InitStruct.Alternate = USARTx_TX_AF;

  

  HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

    

  /* UART RX GPIO pin configuration  */

  GPIO_InitStruct.Pin = USARTx_RX_PIN;

  GPIO_InitStruct.Alternate = USARTx_RX_AF;

    

  HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);

    

  /*##-3- Configure the NVIC for UART ########################################*/

  /* NVIC for USART1 */

  HAL_NVIC_SetPriority(USARTx_IRQn, 0, 1);

  HAL_NVIC_EnableIRQ(USARTx_IRQn);

}

 

/**

  * @brief UART MSP De-Initialization 

  *        This function frees the hardware resources used in this example:

  *          - Disable the Peripheral's clock

  *          - Revert GPIO and NVIC configuration to their default state

  * @param huart: UART handle pointer

  * @retval None

  */

void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)

{

  /*##-1- Reset peripherals ##################################################*/

  USARTx_FORCE_RESET();

  USARTx_RELEASE_RESET();

 

  /*##-2- Disable peripherals and GPIO Clocks #################################*/

  /* Configure UART Tx as alternate function  */

  HAL_GPIO_DeInit(USARTx_TX_GPIO_PORT, USARTx_TX_PIN);

  /* Configure UART Rx as alternate function  */

  HAL_GPIO_DeInit(USARTx_RX_GPIO_PORT, USARTx_RX_PIN);

  

  /*##-3- Disable the NVIC for UART ##########################################*/

  HAL_NVIC_DisableIRQ(USARTx_IRQn);

}


这两个函数没什么可说的跟开发板对应修改即可,这样使得串口初始化更加的简洁只需要进行逻辑上的初始化即可


/**********************************************************************

函数:uart_init()

函数作用:串口初始化

参数:

uint32_t BaudRate=========================串口波特率

返回值:无

上一版本:无

当前版本:1.0

作者:

最后修改时间:2015-04-02

说明: 

**********************************************************************/

void uart_init(uint32_t BaudRate)

{

    

    UartHandle.Instance        = USARTx;

    UartHandle.Init.BaudRate   = BaudRate;

    UartHandle.Init.WordLength = UART_WORDLENGTH_8B;

    UartHandle.Init.StopBits   = UART_STOPBITS_1;

    UartHandle.Init.Parity     = UART_PARITY_NONE;

    UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;

    UartHandle.Init.Mode       = UART_MODE_TX_RX;

    

    if(HAL_UART_Init(&UartHandle) != HAL_OK)

    {

        Error_Handler();

    }

__HAL_UART_ENABLE(&UartHandle);

 

NVIC_SetPriority(USARTx_IRQn,0);

NVIC_EnableIRQ(USARTx_IRQn);

uart_rev.front = aRxBuffer;

uart_rev.rear = aRxBuffer; //两个指针指向相同的地址空间

if(HAL_UART_Receive_IT(&UartHandle,(uint8_t*)aRxBuffer,1) != HAL_OK)

{

Error_Handler();

}

}


这里为串口的接收开辟了500个字节的缓冲区aRxBuffer使用首尾指针来进行数据的接收和存取,即单缓冲机制。


struct uart

{

uint8_t *rear; //在中断函数中更改

uint8_t *front; //在主循环中更改

};


由于STM32L0xx_Hal_Driver库的使用串口底层分为了3种:查询方式、中断方式、DMA方式,都是使用HAL函数来实现,因此我们使用中断方式接收不能自动开启,必须使用函数HAL_UART_Receive_IT来打开接收中断,这里我们每接收一个字节就进入中断。STM32L0xx_Hal_Driver库的使用使得中断函数也十分简洁一句话搞定,采用回调函数机制来处理中断


void USARTx_IRQHandler(void)

{

  HAL_UART_IRQHandler(& UartHandle);

}

在HAL_UART_IRQHandler()中会自动调用串口接收中断的回调函数


/**

  * @brief  Rx Transfer completed callback

  * @param  UartHandle: UART handle

  * @note   This example shows a simple way to report end of IT Rx transfer, and 

  *         you can add your own implementation.

  * @retval None

  */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)

{

uint8_t ret = HAL_OK;

/* Set transmission flag: trasfer complete*/

uart_rev.rear++; //更新rear指针

if(uart_rev.rear >= (aRxBuffer + BUFFSIZE))

uart_rev.rear = aRxBuffer;

do

{

ret = HAL_UART_Receive_IT(UartHandle,uart_rev.rear,1);

}while(ret != HAL_OK);

}


每次把接收到的数据存入rear所指向的地址空间,存入数据只更新rear指针,同时开启请求下一个数据的到来。在主函数中调用uart_read函数来取出数据


/**********************************************************************

函数:uart_read()

函数作用:从接收缓冲区中读取数据

参数:

uint8_t *fmt--------------------------------接收到的数据

uint16_t time_out---------------------------超时时间

返回值:0:读取到数据-1:没有读取到数据

上一版本:无

当前版本:1.0

作者:

最后修改时间:2015-04-08

说明: 

**********************************************************************/

int8_t uart_read(uint8_t *fmt, uint16_t time_out)

{

while(time_out)

{

if(uart_rev.front != uart_rev.rear)

{

//如果队首指针和队尾指针不同表明缓冲区中有数据还未收取

*fmt=*uart_rev.front;

uart_rev.front++;

 

if (uart_rev.front >= (aRxBuffer+BUFFSIZE))

uart_rev.front = aRxBuffer;

 

return 0;

}

time_out--;

}

return (int8_t)-1;

}


取数据只更新front指针,这里有个不足的地方是如果一直不取数据或者取数据速度较慢而接收的数据很多会造成数据覆盖即出现数据丢失的情况,不过一般很少会有这种情发生(对于我来说是在主循环中不停地进行读取操作,所以没事啦),整个文件如下


#include "UART.h"

#include "stm32l0xx_hal_def.h"

#include "utils.h"

 

UART_HandleTypeDef UartHandle;

uint8_t aRxBuffer[BUFFSIZE];

struct uart uart_rev;

 

void HAL_UART_MspInit(UART_HandleTypeDef *huart)

{  

  GPIO_InitTypeDef  GPIO_InitStruct;

  

  /*##-1- Enable peripherals and GPIO Clocks #################################*/

  /* Enable GPIO TX/RX clock */

  USARTx_TX_GPIO_CLK_ENABLE();

  USARTx_RX_GPIO_CLK_ENABLE();

  /* Enable USART1 clock */

  USARTx_CLK_ENABLE(); 

  

  /*##-2- Configure peripheral GPIO ##########################################*/  

  /* UART TX GPIO pin configuration  */

  GPIO_InitStruct.Pin       = USARTx_TX_PIN;

  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull      = GPIO_NOPULL;

  GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;

  GPIO_InitStruct.Alternate = USARTx_TX_AF;

  

  HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

    

  /* UART RX GPIO pin configuration  */

  GPIO_InitStruct.Pin = USARTx_RX_PIN;

  GPIO_InitStruct.Alternate = USARTx_RX_AF;

    

  HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);

    

  /*##-3- Configure the NVIC for UART ########################################*/

  /* NVIC for USART1 */

  HAL_NVIC_SetPriority(USARTx_IRQn, 0, 1);

  HAL_NVIC_EnableIRQ(USARTx_IRQn);

}

 

/**

  * @brief UART MSP De-Initialization 

  *        This function frees the hardware resources used in this example:

  *          - Disable the Peripheral's clock

  *          - Revert GPIO and NVIC configuration to their default state

  * @param huart: UART handle pointer

  * @retval None

  */

void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)

{

  /*##-1- Reset peripherals ##################################################*/

  USARTx_FORCE_RESET();

  USARTx_RELEASE_RESET();

 

  /*##-2- Disable peripherals and GPIO Clocks #################################*/

  /* Configure UART Tx as alternate function  */

HAL_GPIO_DeInit(USARTx_TX_GPIO_PORT

[1] [2]

关键字:STM32L0xx_HAL_Driver库  UART  单片机

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic464740.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32CubeMx之串行通信
下一篇:用于stm32Discovery的图像转代码取模小工具

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32L0xx_HAL_Driver库的使用——UART

单片机型号:STM32L051C8T6开发环境MDK5.12库版本:STM32L0xx_HAL_Driver V1.1.0主机环境:Windows XP之前一直使用的STM32F030C8T6单片机来做开发,因需求更改更换了一个新型号STM32L051C8T6,主要是用到了其低功耗特性,本以为直接把代码拷贝一下就可以使用了,结果是太天真了,STM32F030C8T6使用的库是STM32F0_StdPeriph_Lib而STM32L051C8T6使用的库是STM32L0xx_HAL_Driver两者的差别还是很大的,而且官方也推荐使用后者,没办法,重新学习一下吧。。。参考其例程磕磕绊绊的勉强可以写一个工程了,这里写一下有关UART
发表于 2019-05-30

STM32L0xx_HAL_Driver库的使用——UART续

单片机型号:STM32L051C8T6开发环境MDK5.12库版本:STM32L0xx_HAL_Driver V1.1.0主机环境:Windows XP承接上文,为采用双缓冲机制,重新开辟一个500字节的空间aTxBuffer来存放所需发送的字节,初始化uart_snd的指针 uart_snd.front = aTxBuffer; uart_snd.rear = aTxBuffer; //两个指针指向相同的地址空间编辑发送单字节的函数uart_char/**********************************************************************函数:uart_char()函数作用
发表于 2019-05-30
STM32L0xx_HAL_Driver库的使用——UART续

STM32L0xx_Hal_Driver库的使用--EXTI

单片机型号:STM32L051C8T6开发环境MDK5.12库版本:STM32L0xx_HAL_Driver V1.1.0主机环境:Windows XP 之前碰到的串口问题还没解决,现在在学习EXTI时又遇到了新的问题。。。很是无语在编写EXTI时因为需求特殊需要统计一些IO口的信号频率,信号分为两大类共3种,Oscillator信号其频率在256HZ左右,M+和M-信号比较特殊其在2S之内会有26个左右的波峰,因此对其信号的统计是统计2S,Oscillator是统计1S。管脚分配如下参考库中EXTI的例程,编辑代码,先统计Oscillator信号,再统计M+信号,最后统计M-信号。在主循环中输出结果,如下
发表于 2019-05-30
STM32L0xx_Hal_Driver库的使用--EXTI

STM32L0xx_HAL_Driver库的使用——UART

单片机型号:STM32L051C8T6开发环境MDK5.12库版本:STM32L0xx_HAL_Driver V1.1.0主机环境:Windows XP之前一直使用的STM32F030C8T6单片机来做开发,因需求更改更换了一个新型号STM32L051C8T6,主要是用到了其低功耗特性,本以为直接把代码拷贝一下就可以使用了,结果是太天真了,STM32F030C8T6使用的库是STM32F0_StdPeriph_Lib而STM32L051C8T6使用的库是STM32L0xx_HAL_Driver两者的差别还是很大的,而且官方也推荐使用后者,没办法,重新学习一下吧。。。参考其例程磕磕绊绊的勉强可以写一个工程了,这里写一下有关UART
发表于 2018-12-29

STM32CubeMX 4 解锁UART模块

先打开设置界面: 我想使用UART3口,想使用的引脚是PB10 和PB11(非默认引脚,所以要在引脚上设置,如果在左边configuration设置就会是默认引脚了)。 选完发现是黄的,之后配置左边的uart3,选择异步通信。 选完就发现是绿的了。 双击UART3弹出configuration的设置界面。这边就是熟悉的参数设置了,波特率什么的。然后要enable 全局中断(理解成所有关于UART3的中断即可?)   还可以配置成DMA传送数据,下一篇讲这个。至此,在CubeMX中的设置都结束了。 generate code打开之后先编译一下。 
发表于 2019-07-22
STM32CubeMX 4 解锁UART模块

STM32F103 UART4 DMA接收

//网上找了老半天也找不到UART4-DMA的程序,自己调试成功了,特地分享一下</pre><pre name="code" class="cpp"><pre name="code" class="cpp">uint8_t UART4_Rx_buffer[512],UART4_Rx_num;void UART4_Config(void){ GPIO_InitTypeDef GPIO_InitStructure;             
发表于 2019-07-22

小广播

何立民专栏

单片机及嵌入式宝典

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

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