STM32HAL库中断模式串口收发

发布者:极地征服者最新更新时间:2022-01-13 来源: eefocus关键字:STM32  HAL库  中断模式  串口收发 手机看文章 扫描二维码
随时随地手机看文章

一.简单了解

串口模式实现有三种

1.普通模式:在主函数中接收函数

2.中断模式:产生的不影响主程序运行

3. DMA模式:与主函数互不影响,独立运行

本文记录第二种普通模式。

学习目标是:实现中断串口的数据收发,发送数据时LED灯电平翻转。


二.步骤

在上一篇文章基础上,传送门:STM32HAL库普通模式串口收发

需在STM32CUBEMX软件中USART1的NVIC SETTING中使能中断,然后再次生成代码。

【小tips:如果在用户区域块编写代码的话不会被覆盖】

1-宏定义串口中断


#define UART1_IRQ

uint8_t TdataIRQ[]={"welcome to uart irq!rn"};//测试数组

uint8_t Rdata;//存放接收数据


2-同样是在stm32l4xx_hal_uart.c中1611行找到函数


HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);


3-在main函数中添加如下代码


#ifdef UART1_IRQ

HAL_UART_Receive_IT(&huart1,&Rdata,1);//触发中断接收

HAL_UART_Transmit_IT(&huart1,TdataIRQ,sizeof(TdataIRQ));//发送我们使用的IRQ TEST 

#endif

while(1)

{

#ifdef UART1_IRQ

HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);

printf("welcome to uart1 IRQ test!rn");

HAL_Delay(2000);

#endif

}


4-修改回调函数


//回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

#ifdef UART1_IRQ

//把接收到的数据发送回屏幕,发送函数要在接收函数前面

HAL_UART_Transmit(&huart1,&Rdata,1,0xff);

HAL_UART_Receive_IT(&huart1,&Rdata,1);

#endif

}


三.总结

1.在串口可以发现,使用串口中断实现数据的收发,是不影响while中的循环的,不影响主程序运行。

2.如果是在普通模式下使用串口,添加延时函数HAL_Delay(2000),会导致程序反应不过来。

关键字:STM32  HAL库  中断模式  串口收发 引用地址:STM32HAL库中断模式串口收发

上一篇:STM32HAL库DMA模式串口收发
下一篇:STM32HAL库普通模式串口收发

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

STM32的USART DMA传输(转)
问题描述: 我有一个需求,AD采得一定数目的数据之后,由串口DMA发出,由于AD使用双缓冲,所以每次开始DMA的时候都需要重新设置开始的内存地址以及传输的数目(这些都是理所当然的),但是在开始调试的时候,遇到了一些问题,问题如下:当第一次DMA传输完毕,关闭DMA以设置内存地址等,再开启DMA,发现不启动了。 开始是参考了《STM32中文参考手册REV10》,里面的发送步骤如下: 1. 在DMA控制寄存器上将USART_DR寄存器地址配置成DMA传输的目的地址。在每个TXE事件后,数据将被传送到这个地址。 2. 在DMA控制寄存器上将存储器地址配置成DMA传输的源地址。在每个TXE事件后,将从此存储器区读出数据并
[单片机]
STM32的DAC输出驱动电压
目的 项目中的模块对输出电压的改变来控制功率、所以考虑用stm32内部的DAC来输出电压作为驱动。 源代码 #include dac.h void Dac1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitType; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPI
[单片机]
STM32定时器----Toggle模式实现2路pwm移相
原理如下: 以下代码实现了利用TIM3的CH3以及CH4输出两路移相的PWM,移相角度为225度。 void TIM3_PWMShiftInit(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; GPIO_InitTypeDef GPIO_InitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; /**********************TIM3 GPIO配置*****************************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,
[单片机]
STM32示波器 信号发生器
简介:关于stm32的示波器,网上以经有很多了。这里还是想把自己的设计思想发表出来。这个项目已经准备了很久。这里首先要感谢以前的团队,非常感觉陈师和覃总两位经验丰富的嵌入式工程师,获得了不少多方面的考虑。如果不是工作调整等原因,很有可能会出产品。但最后没有做完深感遗憾。这里发表下我的设计流程,希望能给做示波器的朋友有一定的帮助。也是让自己对此项目的一个总结。 本示波器有效测量频率0.1 ~ 100KHz 双通道 集成信号发生器 时间轴每格 1,2,5递增范围:2us ~ 1s 时间轴每屏12格 硬件结构: 主芯 stm32zet6 触摸屏 SSD1289 320*240 RGB565 AD: STM32内部ADC
[单片机]
<font color='red'>STM32</font>示波器 信号发生器
STM32系统时钟设置,采用外部有源晶振相关配置问题
今天在调试STM32系统时钟设置时遇到一个问题:TIM2定时1Ms,TIM2中断服务函数time++,time=100时LED状态改变。程序运行后发现LED不是按照0.1S的时间闪烁,闪烁的很慢。 查找程序发现在系统时钟初始化时,RCC_HSEConfig(RCC_HSE_Bypass); 语句配置不对,此语句解释为HSE晶振被外部时钟旁路。指将芯片内部的用于外部晶体起振和功率驱动等的部分电路和XTAL_OUT引脚断开,这时使用的外部时钟是有源时钟或者其他STM32提供的CCO输出等时钟信号,直接单线从XTAL_IN输入,这样即使外部有晶体也震荡不起来了。 因为之前用的是有源晶振,接法如下图1:HSE配置如下:RCC_HSECon
[单片机]
RN8209+stm32+spi通信一直接收0xff
要养成及时总结的习惯!!!留下重要的经验! 留给下次的经验:做成品板之前建议先做一个demo板,越大越省时间,只要10*10之内的都是一个价嘛。但一定是要这个芯片或者功能的最全版本,接口都要留出来,便于调试! 这次的rn8209-demo板: 1在pcb布局完成后,可以多增加几个接口。 2spi/串口转换开关 3脉冲输出引脚​ 当然除非你对这个电路非常有把握,那没有必要去做这个demo板了。​ RT(如题),关于RN8209的资料很详细,但程序就那两个,调试出了问题,找了好久没有找到,一直怀疑是程序有问题,但又没有其他现成的程序可以参考,没办法只能一点一点地找问题。 最后在google搜索到的一个帖子上找到了一点其他​
[单片机]
STM32输入捕获实验示例详解
STM32输入捕获实验 寄存器部分讲解(以TIM5_CH1为例) TIMx_CCMR1.ICF 的作用 滤波器的作用就是“采集取样以便于确定准确的电平状态”。我们以ICIF = 0010为例: 实例应用:假设输入信号在最多5个内部时钟周期的时间内抖动,我们须配置滤波器的带宽长于5个时钟周期。因此我们可以(以fDTS频率)连续采样8次,以确认在TI1上一次真实的边沿变换,即在TIMx_CCMR1寄存器中写入IC1F=0011。 TIMx_CCER.CC1P的作用 这个寄存器很重要,它决定了“上升沿/下降沿触发输入捕获 “,而且最重要的是,它是用来配置极性的唯一寄存器,这说明输入极性与输出极性都要经过它进行配置,因此
[单片机]
<font color='red'>STM32</font>输入捕获实验示例详解
STM32如何确定执行哪个中断函数
如下面所示: NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //NRF24L01 中断响应 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); 则对应的中断函数就是 STM3210x_
[单片机]

推荐帖子

写了INF,但是安装失败,帮忙看一下
我的INF是为Realtek8139网卡写的我在设备管理器中,用更新驱动的方式想把驱动加载上网卡,但是每次都提示“向导无法为您的硬件找到比您现在已经安装的软件更匹配的软件”,请问这是什么原因啊?我的INF是用DDK下的GenINF的WIZARD写了一个框架,没有添加其他东西,然后用chkinf检查了一下,没有错误,但是有下面的警告Warnings:Line0:(W22.1.2212)NoCopyrightinformationfound.Line15:(W22.1.
wlm99111 嵌入式系统
1611产生不规则波形
1611产生不规则波形的频率最大能达到多少啊,有没有范例可以借鉴,谢谢啊1611产生不规则波形啥叫不规则波形?就像线性调频信号,150KHZ的能产生吗?
wangfei890912 微控制器 MCU
地址编址的问题
我在FPGA中建了个FIFO,16位输出数据,片选了ARM的nRCS2,EBI总线连接到FPGA中FIFO的16位输出端,请问物理地址0x10000000中的数据是否就是FIFO中的首个的数据呢?这两个芯片中的地址是怎么对应的呢?地址编址的问题
kuandeng 嵌入式系统
如何检测西门子gprs模块收到数据?
用西门子的gprs手机模块实现tcp连接时,用什么方式知道已经收到数据,可以读出来了?谢谢如何检测西门子gprs模块收到数据?PING下固定IP?一般TCP建链成功,会返回信息的。
dg00010170 嵌入式系统
Freescale 基于IMX536处理器的Dialog DA9053电源管理参考设计
Freescale基于IMX536处理器的DialogDA9053电源管理参考设计----------墨翟科技(上海)有限公司编撰在2012年飞思卡尔技术论坛中国站的展示区,Dialog公司推出并展示了一款用于飞思卡尔i.MX53处理器的电源原始设计电路。该公司型号为DA9053的单芯片系统电源管理芯片(PMIC)处于飞思卡尔i.MX53双核/四核应用处理器的电源管理原始设计电路的核心位置,可满足基于飞思卡尔多核i.MX53系列应用处理器的平板
modichina 单片机
ADI公司的精密电容测量方案分享
方案主题:ADI公司精密电容测量方案设计背景:在产品设计中,需要动态采集微弱电容值(pF级别)并将容值反馈给单片机进行对应的信号判断及逻辑控制。方案选型:AD7747设计方案一:基于ADI公司的AD7747进行微弱电容值测量AD7747基本介绍:1.AD7747是一款24位电容数字转换器(CDC)。可以测量接地式容性传感器的电容,即传感器直接连接至AD7747输入引脚。2.测量精度:10fF3.测量线性度:0.01%4.共模式电容值测量最高:17pF
beyond_笑谈 ADI · 世健工业技术
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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