STM32l151低功耗芯片串口通信(HAL库)

发布者:ShimmeringStar最新更新时间:2018-12-29 来源: eefocus关键字:STM32l151  功耗芯片  串口通信  HAL库 手机看文章 扫描二维码
随时随地手机看文章

参考原子的stm32f系列的串口通信实验,移植到stm23l系列的程序代码。


1、采用串口中断方式,串口接收到消息产生中断,因此需要使能RXNE寄存器。HAL库函数的调用方式是__HAL_UART_ENABLE_IT(&UartHandle1, UART_IT_RXNE);


 UartHandle1是UART_HandleTypeDef类型,具体参考stm32lxx_hal_uart.h文件。


2、关于串口初始化,由于HAL库中的串口初始化函数HAL_UART_Init();会调用HAL_UART_MspInit();后者是一个关于串口1和串口2的I/O端口模式选择及初始化的函数。


 为了使程序能顺利进入中断,可在MspInit()函数或者HAL_UART_Init()函数中使能串口并在这里设置优先级,HAL_NVIC_SetPriority(USART1_IRQn,0,1);

HAL_NVIC_EnableIRQ(USART1_IRQn);


3、编写串口中断函数。采用一个unsigned char类型数组作为串口缓存,一个unsigned short int 作为串口接收缓存区的指针。


      需要注意的是发生了中断必须要清除中断标志,否则程序将一直处于该中断。但是从参考手册可以得知,在中断中对数据寄存器进行一次读操作,即可清除RXNE寄存器的标志位,所以,在中断里读取并且保存DR寄存器中的内容是一个很好的选择。


4、部分代码


1.串口初始化


bool InitSerial(uint32_t  BaudRate)

{

UartHandle1.Instance        = USART1;

  UartHandle1.Init.BaudRate   = BaudRate;

  UartHandle1.Init.WordLength = UART_WORDLENGTH_8B;

  UartHandle1.Init.StopBits   = UART_STOPBITS_1;

  UartHandle1.Init.Parity     = UART_PARITY_NONE;

  UartHandle1.Init.HwFlowCtl  = UART_HWCONTROL_NONE;

  UartHandle1.Init.Mode       = UART_MODE_TX_RX;

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


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

  if (HAL_UART_Init(&UartHandle1) != HAL_OK)

  {

    /* Initialization Error */

Print("USART1 Init failed.");

  }

__HAL_UART_ENABLE_IT(&UartHandle1, UART_IT_RXNE);

return true;

}

2. MspInit

void HAL_UART_MspInit(UART_HandleTypeDef *huart)

{

  GPIO_InitTypeDef  GPIO_InitStruct;

 

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

  /* Enable GPIO TX/RX clock */

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

 

  /* Enable USARTx clock */

  __HAL_RCC_USART1_CLK_ENABLE();

__HAL_RCC_USART2_CLK_ENABLE();

 

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

  /* UART TX GPIO pin configuration  */

  GPIO_InitStruct.Pin       = GPIO_PIN_9;

  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull      = GPIO_PULLUP;

  GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

 

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

  /* UART RX GPIO pin configuration  */

  GPIO_InitStruct.Pin = GPIO_PIN_10;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

 

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


HAL_NVIC_SetPriority(USART1_IRQn,0,1);

HAL_NVIC_EnableIRQ(USART1_IRQn);



//UART2

GPIO_InitStruct.Pin = GPIO_PIN_2;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART2;


HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


GPIO_InitStruct.Pin = GPIO_PIN_3;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART2;


HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

HAL_NVIC_SetPriority(USART2_IRQn,2,2);

HAL_NVIC_EnableIRQ(USART2_IRQn);

}


3.中断程序

void USART1_IRQHandler(void)

{

uint8_t Res;

if(__HAL_USART_GET_FLAG(&UartHandle1,USART_FLAG_RXNE)!=RESET) //´®¿Ú1½ÓÊÕµ½ÏûÏ¢

{

Res=(uint16_t)(USART1->DR & (uint16_t)0x01FF); //¶ÁÈ¡Êý¾Ý¼Ä´æÆ÷£¬´Ë²Ù×÷»áÇå³ýÖжϱê־λ

if((USART1_STA&0x8000)==0){ //½ÓÊÕ»¹Î´Íê³É

if(USART1_STA&0x4000){

if(Res!=0x0a)USART1_STA=0;

else USART1_STA|=0x8000;

}

else

{

if(Res==0x0d)USART1_STA|=0x4000;

else{

USART1_RX_BUF[USART1_STA&0x3FFF]=Res;

USART1_STA++;

if(USART1_STA>255)USART1_STA=0;

}

}

}

}

}

4.主函数测试代码

Print("USART1_Test: USART1_STA=%d\r\n",USART1_STA);

while(1)

{

if(USART1_STA&0x8000)

{

len=USART1_STA&0x3fff;

Print("Receive message from PC,Length is %d\r\n",len);

Print("USART1_RX_BUF is :\t");

HAL_UART_Transmit(&UartHandle1,USART1_RX_BUF,len,20);

Print("\r\n");

USART1_STA=0;

}

else

{

cnt++;

if(cnt==500){

Print("test!\r\n");

ToggleLed();

cnt=0;

}

}

HAL_Delay(10);

}



串口间通信方法(示例:串口1发送给串口2)

void USART1_TO_USART2(void)

{     

unsigned char len = 0;

    unsigned char i = 0;

len = USART1_STA;             

    if ((USART1_STA&0x8000) != 0 )

    {

HAL_Delay(10);

len = USART1_STA&0x3FFF;

USART1_RX_BUF[len] ='\n';    /* ¸ø×Ö·û½áβ²¹½áÊøλ */      

      USART1_RX_BUF[len+1] ='\n';    /* ¸ø×Ö·û½áβ²¹½áÊøλ */                

for ( i = 0; i <= len+1; i++ )

{

RX1_Buff[i] = USART1_RX_BUF[i];

      }

      USART1_STA = 0;      /* ÖØÖÃÖ¸Õë */

HAL_UART_Transmit(&UartHandle2,(uint8_t*)RX1_Buff,len+1,20);

#ifdef DEBUG

Print("Receive message from USART1:\r\n");

// Print("%s",RX1_Buff); //°Ñ·¢Ë͸øUSART2µÄÄÚÈÝÏÔʾ³öÀ´

#endif

}

}


关键字:STM32l151  功耗芯片  串口通信  HAL库 引用地址:STM32l151低功耗芯片串口通信(HAL库)

上一篇:STM32F429HAL库定时器学习笔记
下一篇:STM32硬件IIC驱动设计

推荐阅读最新更新时间:2024-03-16 16:21

51单片机串口通信
基本介绍 单片机通信是指单片机和单片机 或者 单片机和计算机的相互通信,一般比较多都是单片机(下位机)和计算机(上位机)作为通信。 串行通信其实用的还是挺多的,就比如我们在调试程序时,可以通过串行口来调试程序。像什么蓝牙模块、语音模块等等也挺多是用串行通信。 一般通信方式为两种:并行通信 和 串行通信。 通信制式 一共为3种: 单双工: 一个只能发送,一个只能接收。(相当于两个人,一个只能说话,一个只能听) 半双工:都可以发送和接收,但是同一时刻不能发送和接收同时进行。相当于一般的对讲机 你说话的时候 你是接收不了对方说的话的。 全双工:就是可以同时发送或者接收。相当于现在我们的手机打电话一样。可以两个人互骂哈哈
[单片机]
51单片机<font color='red'>串口通信</font>篇
STM32 HAL库头文件包含关系
如图,从左到右下的顺序写: -------------------------------------------------------------------------------------------------------------------------------- The header of the common HAL driver file(stm32f1xx_hal.h) includes the common configurations for the whole HAL library.It is the only header file that is included in th
[单片机]
STM32 <font color='red'>HAL库</font>头文件包含关系
RS485总线究竟能挂接多少个设备?
N年前做门禁系统上位机软件开发的时候突击培训过串口通信编程基础。后来在我的脑海里一直认为RS485总线能且只能挂接256个设备(因为地址是1byte,取值范围也就0-255)。 后来经过几个项目的了解,发现这个数字有着比较大的出入。有专门做串口嵌入式设备开发的说RS485总线只能挂接32个节点,这是由它自身的驱动能力决定的。而到网上搜索发现有人说可以支持128个,也有说能支持256个,甚至400个......莫衷一是。 后来静下心来找了一些资料发现他们说的都没错(咳,只怪自己理解有误没有理论联系实际啊): 485通讯中一个串口可以控制多少个设备的问题是与该485网络中的电气特性和协议特性所决定的。所谓电气特性就
[嵌入式]
【STM32H7教程】第44章 STM32H7的ADC基础知识和HAL库API
44.1 初学者重要提示 STM32H7虽然支持差分,但不支持负压测量。 STM32H7的ADC采集通道体验快速通道Fast Channels和低速通道Slow Channels的区别,详情看本章2.12小节的电气特性。 STM32H7的ADC支持过采样,通过过采样技术可以做到26位分辨率。 ADC的专业术语诠释文档,推荐大家看看: http://www.armbbs.cn/forum.php?mod=viewthread&tid=89414 。 44.2 ADC基础知识 ADC的几个关键知识点放在开头说: STM32H7支持三路ADC,分别是ADC1,ADC2和ADC3。其中ADC1和ADC2可以组成双ADC
[单片机]
【STM32H7教程】第44章 STM32H7的ADC基础知识和<font color='red'>HAL库</font>API
PIC16F883单片机EUSART串口通信
在两个单片机之间建立串口通信。 说明:我们使用数码管显示接收到的数据,数据是对方的按键编号。 硬件连接图: 有一点至关重要,就是两个单片机要共地。发送和接收引脚在两个单片机上交叉相连。 这里采用的是异步发送和接收。 发送原理图: EUSART接收图: 时序图: 实现代码流程图: 实现代码: #include p16f883.inc __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF &
[单片机]
PIC16F883单片机EUSART<font color='red'>串口通信</font>
嵌入式系统中串口通信帧的同步方法
引 言    串口通信是日前单片机和DSP等嵌入式系统之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式。在嵌入式系统的硬件结构中,通常只有一个8位或16位的CPU,不仅要完成主流程的工作,同时还要处理随时发生的各种中断,因而嵌入式系统中的串口通信程序设计与PC机有很大的不同。若嵌入式系统中.中断服务子程序在系统运行过程中占用了较多的时间,就有可能在中断眼务子程序正运行时,又产生一个同类型或其他类型的中断,从而造成主程序得不到执行或后续中断数据丢失。所以,嵌入式系统中的串口通信虽然看似简单,但其中仍有许多问题值得研究,例如串口通信过程中的帧同步问题。本文针对该问题给出了逐次比较、基于FIFO队列和基于状态
[单片机]
基于STM32中串口通信的实例分析
串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等。 在串行通信中,数据在1位宽的单条线路上进行传输,一个字节的数据要分为8次,由低位到高位按顺序一位一位的进行传送。串行通信的数据是逐位传输的,发送方发送的每一位都具有固定的时间间隔,这就要求接收方也要按照发送方同样的时间间隔来接收每一位。不仅如此,接收方还必须能够确定一个信息组的开始和结束。 常用的两种基本串行通信方式包括同步通信和异步通信
[单片机]
基于STM32中<font color='red'>串口通信</font>的实例分析
stm32F4XX之窗口看门狗 HAL库
首先讲一下独立看门狗和窗口看门狗之间的区别。 独立看门狗Iwdg——独立于系统之外,因为有独立时钟,一般是外部低速时钟。主要用于监视硬件错误。 窗口看门狗wwdg——系统内部的故障探测器,采用内部RCC时钟,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。主要用于监视软件错误 1)独立看门狗没有中断,窗口看门狗有中断 2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制 3)独立看门狗只有下限,窗口看门狗又下限和上限 4)独立看门狗是12位递减的。窗口看门狗是7位递减的 5)独立看门狗是用的内部的大约40KHZ RC振荡器(不受系统时钟限制,即使系统时钟坏了也能工作),窗口看门狗是用的系统时钟
[单片机]
stm32F4XX之窗口看门狗 <font color='red'>HAL库</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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