【STM32】5—UART串口(中断模式)

发布者:RoboPilot最新更新时间:2022-08-17 来源: csdn关键字:STM32  UART串口  中断模式 手机看文章 扫描二维码
随时随地手机看文章

0 实验预期效果

        完成串口数据的接收和发送


1 相关原理图

2 软件配置 

        STM32CubeMX配置USART1:      

        在NVIC中配置USART中断优先级:

3 代码编写        

        3.1 函数认识

        见博客【STM32】HAL库学习 2—hal_uart_kokoのadventure的博客-CSDN博客


        3.1.1 串口发送

/**

  * @brief  Sends an amount of data in non blocking mode.

  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),

  *         the sent data is handled as a set of u16. In this case, Size must indicate the number

  *         of u16 provided through pData.

  * @param  huart Pointer to a UART_HandleTypeDef structure that contains

  *               the configuration information for the specified UART module.

  * @param  pData Pointer to data buffer (u8 or u16 data elements).

  * @param  Size  Amount of data elements (u8 or u16) to be sent

  * @retval HAL status

  */

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

        3.1.2 串口接收 

/**

  * @brief  Receives an amount of data in non blocking mode.

  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),

  *         the received data is handled as a set of u16. In this case, Size must indicate the number

  *         of u16 available through pData.

  * @param  huart Pointer to a UART_HandleTypeDef structure that contains

  *               the configuration information for the specified UART module.

  * @param  pData Pointer to data buffer (u8 or u16 data elements).

  * @param  Size  Amount of data elements (u8 or u16) to be received.

  * @retval HAL status

  */

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

         3.1.3 中断回调函数

/**

  * @brief  Rx Transfer completed callbacks.

  * @param  huart  Pointer to a UART_HandleTypeDef structure that contains

  *                the configuration information for the specified UART module.

  * @retval None

  */

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

  /* Prevent unused argument(s) compilation warning */

  UNUSED(huart);

  /* NOTE: This function should not be modified, when the callback is needed,

           the HAL_UART_RxCpltCallback could be implemented in the user file

   */

}

        3.2 代码编写

        3.2.1 定义发送和接收缓冲区

/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

uint8_t hello[] = "USART1 is ready...n";

uint8_t recv_buf[13] = {0};

/* USER CODE END 0 */

        3.2.2 重新实现中断回调函数

        HAL中弱定义了一个中断回调函数 HAL_UART_RxCpltCallback, 我们需要在用户文件中重新定义该函数,放在哪都可以,这里我放在 main.c 中:


/* USER CODE BEGIN 4 */

/* 中断回调函数 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

/* 判断是哪个串口触发的中断 */

if(huart ->Instance == USART1)

{

//将接收到的数据发送

HAL_UART_Transmit_IT(huart, (uint8_t*)recv_buf, 13);

//重新使能串口接收中断

HAL_UART_Receive_IT(huart, (uint8_t*)recv_buf, 13);

}

}

/* USER CODE END 4 */

        3.2.3 修改main函数

int main(void)

{

  HAL_Init();

 

  SystemClock_Config();

 

  MX_GPIO_Init();

  MX_USART1_UART_Init();

 

  /* USER CODE BEGIN 2 */

  //使能串口中断接收

  HAL_UART_Receive_IT(&huart1, (uint8_t*)recv_buf, 13);

  //发送提示信息

  HAL_UART_Transmit_IT(&huart1, (uint8_t*)hello, sizeof(hello));

  /* USER CODE END 2 */

 

  while (1)

  {

  }

}


4 实验结果 

关键字:STM32  UART串口  中断模式 引用地址:【STM32】5—UART串口(中断模式)

上一篇:【STM32】实战1—用STM32与ULN2003驱动步进电机28BYJ-48(一)
下一篇:【STM32】4—UART串口(查询模式)

推荐阅读最新更新时间:2024-11-04 14:48

基于STM32和CAN总线的电动车电池管理系统设计
 随着电池能源的广泛应用,石油资源的枯竭和环境污染,电动汽车以其节能环保的优势引起越来越多的重视,在电动汽车的研究和发展上,车载电池及其管理系统的研究与制造占据着重要位置。电动汽车动力电池在应用中的主要问题表现在:生产过程中,电池的工艺,技术以及成组技术还不能保证其初始性能具有良好的一致性;使用过程中,对过充电、过放电、过温度、过电流等非常敏感,这类情况的发生会明显缩短电池寿命,甚至会导致电池报废。电池组是几十个甚至上百个单体电池串联,单体电池之间存在不一致性,随着连续的充放电循环,电池间的不一致性加剧,电池组的可用容量受容量最小的单体电池制约。对于这些情况,电池的初始性能必须要依靠企业生产工艺的优化,生产过程关键参数的控制来改善
[电源管理]
基于<font color='red'>STM32</font>和CAN总线的电动车电池管理系统设计
意法与厦门大学合作研发32位嵌入式系统
        微控制器设计开发的厂商意法半导体协同其增值服务商深圳市博巨兴,宣布与厦门大学签订合作协议,成立“ST嵌入式系统联合实验室”,并举行实验室揭牌仪式。意法半导体持续推动校园合作计划,与中国的大学携手开发嵌入式应用技术和培训电子工程专业学生,再迈出重要的一步。   作为32位微控制器的主导厂商之一,意法半导体将向厦门大学提供先进的基于32位ARM CORTEX-M3的STM32微控制器及其开发工具,信息科学与技术学院(通信工程系、电子工程系、自动化系、计算机系及智能科学与技术系)的本科生及研究生将参与意法半导体的实际项目的开发。此外,意法半导体将提供所需的全部培训和技术支持,从事教学和学术研究,协助大学院校及产业
[单片机]
STM32启动文件简单分析
STM32启动文件简单分析(STM32F10x.s适用范围)定时器, 型号, 名字在 STM32不完全手册里面 ,我们所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无**常使用。又比如,你TIM1~
[单片机]
基于 STM32 RTC的万年历
例子基本是照抄官方的 万年历算法也没深入研究 主要是大赛 都要求会用DS1302 若我用STM32来做 肯定不用那个片子了。 这个用的是 LSE (片外低速时钟)配合 掉电寄存器来确定是否配置时钟。 注释很全 话不多说了。 u8 TimeDisplay; int main(void) { SystemInit(); stm32_Init (); //GPIO PA8 Init USART_Configuration(); //USART2 9600-8-N-1 NVIC_Configuration(); //Enable the RTC Interrupt RTC_Configuration(); //RTC的启动 s
[单片机]
基于 <font color='red'>STM32</font> RTC的万年历
基于STM32串口循环队列
先说串口,这个应该都知道吧(不知道的童鞋,先把基本功学好),大部分单片机或者处理器都会带一个或者多个串口,方便进行数据的通信。 那么,串口的循环队列是什么?这里以STM32的串口为例,进行解释说明。 假设串口一次只发一个数据,这倒是简单了,每次只对这一个数据进行判断,然后处理相关指令。但现实不会一直都这么美好,很多时候你收到的可能是一大串数据,你要先小心翼翼的把它们存好,然后再依次判断这里面有哪些指令要处理。 假设你定义了一个30个元素的数组a ,每次串口收到数据都往里面存,存的时候地址加一。这个操作很简单吧,应该是都会的。 但是取的时候怎么取?你收到的指令可能是2个数据,也可能是3个数据,几种长度不一样的指令混在
[单片机]
关于STM32的GPIO配置不同输出速度会有什么影响?
今天有人问:GPIO配置不同输出速度会有什么影响?你知道答案吗? 1写在前面 这个问题看起来比较简单,我相信很多人都能说出答案。 但是,很多人都只是停留在表面,至于深层次的含义,估计很少有人思考。 需要更深理解其中含义,可能需要结合特定场景来说,我自己也是在项目中才深刻体会其中含义。 2GPIO输出速度 不管标准外设库,还是STM32CubeMX配置GPIO输出引脚,都会有速度GPIO_InitStruct.Speed这个选项。 类似如下: GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruc
[单片机]
关于<font color='red'>STM32</font>的GPIO配置不同输出速度会有什么影响?
stm32 iap跳转isp实现上电isp下载
概述:本程序上电等3秒种,期间每隔10ms检测一次串口是否收到握手指令(0x7F),若收到则跳转到isp程序执行。可以用mcuisp软件通过串口1直接升级程序。是一种简单的iap程序。初次下载需要手动让mcu进入isp模式。 1先看看最终效果:成功! 2.实现isp跳转 stm32的isp程序在系统存储区,可以通过boot0,boot1引脚选择,也可以通过程序直接跳转,isp程序的入口地址为 0x1FFFF000 跳转函数如下: #define ISP_ADDR 0x1FFFF000 void IspProgramRun(void) { u32 IspSpInitVal; //IAP
[单片机]
STM32 assert_param
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。 所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。 这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。 它确实在程序的运行上牺牲了效率(但只
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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