做网站背景的图片大小鲅鱼圈网站建设

张小明 2026/1/3 4:49:19
做网站背景的图片大小,鲅鱼圈网站建设,三河市城乡建设局网站,微信企业号网站开发软件文章目录一、中断模式串口收发的核心原理1. 中断触发机制2. 中断模式优势#xff08;对比查询模式#xff09;二、硬件与基础配置#xff08;STM32F103 HAL库#xff09;1. 串口引脚与时钟配置三、中断模式接收数据#xff08;两种常用方式#xff09;方式1#xff1a;R…文章目录一、中断模式串口收发的核心原理1. 中断触发机制2. 中断模式优势对比查询模式二、硬件与基础配置STM32F103 HAL库1. 串口引脚与时钟配置三、中断模式接收数据两种常用方式方式1RXNE中断接收固定长度/单字节数据1. 启动接收中断2. 中断服务函数核心3. 主函数中处理接收数据方式2IDLE中断接收不定长数据推荐1. 启动IDLERXNE中断2. 中断服务函数处理IDLE中断3. 主函数处理逻辑同方式1四、中断模式发送数据TXE中断1. 启动发送中断函数2. 中断服务函数中添加TXE处理3. 主函数调用发送五、51单片机中断模式串口收发补充六、中断模式串口调试避坑指南1. 常见问题与解决方案2. 调试技巧中断模式是串口通信中最常用的高效收发方式核心优势在于无需CPU轮询寄存器状态仅在数据到达/发送完成时触发中断大幅降低CPU占用率提升系统实时性。一、中断模式串口收发的核心原理1. 中断触发机制串口中断的核心是“事件触发”接收中断RXNE当串口接收寄存器DR中有新数据时硬件自动置位RXNE标志触发中断CPU立即读取数据发送中断TXE当串口发送寄存器DR中的数据已发送完成、寄存器为空时置位TXE标志触发中断CPU可写入下一个字节IDLE中断可选当串口接收线空闲无数据接收超过一个帧周期时触发常用于接收不定长数据以“空闲”作为数据帧结束标志。2. 中断模式优势对比查询模式特性查询模式中断模式CPU占用100%持续轮询寄存器极低仅中断时响应实时性差可能错过数据高数据到达立即处理系统并发性无CPU被轮询占用好CPU可处理其他任务适用场景简单小数据收发实时性要求高、多任务场景二、硬件与基础配置STM32F103 HAL库以STM32F103C8T6的USART1为例先完成串口基础初始化再开启中断配置。1. 串口引脚与时钟配置#includestm32f1xx_hal.h/* 全局变量定义 */UART_HandleTypeDef huart1;// 串口1句柄uint8_tuart1_rx_buf[1024]{0};// 接收缓冲区uint16_tuart1_rx_len0;// 已接收数据长度uint8_tuart1_rx_flag0;// 接收完成标志0未完成1完成uint8_tuart1_tx_buf[1024]{0};// 发送缓冲区uint16_tuart1_tx_len0;// 待发送数据长度uint16_tuart1_tx_index0;// 发送数据索引/* 串口1初始化函数115200 8N18位数据、无校验、1位停止位 */voidMX_USART1_UART_Init(void){huart1.InstanceUSART1;// 串口1huart1.Init.BaudRate115200;// 波特率huart1.Init.WordLengthUART_WORDLENGTH_8B;// 8位数据位huart1.Init.StopBitsUART_STOPBITS_1;// 1位停止位huart1.Init.ParityUART_PARITY_NONE;// 无校验huart1.Init.ModeUART_MODE_TX_RX;// 同时开启收发huart1.Init.HwFlowCtlUART_HWCONTROL_NONE;// 无硬件流控huart1.Init.OverSamplingUART_OVERSAMPLING_16;if(HAL_UART_Init(huart1)!HAL_OK){Error_Handler();// 初始化失败处理}}/* HAL库底层硬件初始化引脚、时钟、中断 */voidHAL_UART_MspInit(UART_HandleTypeDef*uartHandle){GPIO_InitTypeDef GPIO_InitStruct{0};if(uartHandle-InstanceUSART1){/* 1. 使能时钟 */__HAL_RCC_USART1_CLK_ENABLE();// USART1时钟使能__HAL_RCC_GPIOA_CLK_ENABLE();// GPIOA时钟使能USART1对应PA9/PA10/* 2. 配置TX/RX引脚 */// PA9(TX)推挽复用输出GPIO_InitStruct.PinGPIO_PIN_9;GPIO_InitStruct.ModeGPIO_MODE_AF_PP;GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);// PA10(RX)浮空输入GPIO_InitStruct.PinGPIO_PIN_10;GPIO_InitStruct.ModeGPIO_MODE_INPUT;GPIO_InitStruct.PullGPIO_NOPULL;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);/* 3. 配置串口中断核心 */HAL_NVIC_SetPriority(USART1_IRQn,0,0);// 设置中断优先级主优先级0子优先级0HAL_NVIC_EnableIRQ(USART1_IRQn);// 使能USART1中断}}/* 错误处理函数 */voidError_Handler(void){__disable_irq();while(1){// 可添加LED闪烁等错误提示}}三、中断模式接收数据两种常用方式方式1RXNE中断接收固定长度/单字节数据适用于接收已知长度的数据每收到1个字节触发一次中断逐字节接收。1. 启动接收中断/* 启动串口1接收中断逐字节接收 */voidUART1_Start_RXNE_IT(void){__HAL_UART_CLEAR_FLAG(huart1,UART_FLAG_RXNE);// 清除RXNE标志__HAL_UART_ENABLE_IT(huart1,UART_IT_RXNE);// 开启RXNE中断接收非空}2. 中断服务函数核心串口中断需在USART1_IRQHandler中处理先判断中断类型再读取数据/* USART1中断服务函数 */voidUSART1_IRQHandler(void){uint8_trecv_data0;// 处理RXNE中断接收非空if(__HAL_UART_GET_FLAG(huart1,UART_FLAG_RXNE)!RESET__HAL_UART_GET_IT_SOURCE(huart1,UART_IT_RXNE)!RESET){recv_datahuart1.Instance-DR;// 读取接收寄存器数据自动清除RXNE标志// 数据存入接收缓冲区if(uart1_rx_len1023)// 防止缓冲区溢出{uart1_rx_buf[uart1_rx_len]recv_data;// 示例以\n作为接收完成标志if(recv_data\n){uart1_rx_flag1;// 置位接收完成标志}}else{uart1_rx_len0;// 缓冲区满重置}}// 其他中断处理如错误中断HAL_UART_IRQHandler(huart1);}3. 主函数中处理接收数据intmain(void){/* 系统初始化 */HAL_Init();SystemClock_Config();// 需自行实现系统时钟配置如72MHzMX_USART1_UART_Init();/* 启动接收中断 */UART1_Start_RXNE_IT();/* 主循环 */while(1){// 检测到接收完成if(uart1_rx_flag1){// 回显接收到的数据查询模式发送简化示例HAL_UART_Transmit(huart1,uart1_rx_buf,uart1_rx_len,1000);// 重置标志和缓冲区uart1_rx_flag0;uart1_rx_len0;memset(uart1_rx_buf,0,sizeof(uart1_rx_buf));}// 其他任务如LED闪烁HAL_Delay(100);}}方式2IDLE中断接收不定长数据推荐IDLE中断在“接收线空闲”时触发无需指定数据长度适合接收不定长的字符串/数据帧如上位机发送的任意长度指令。1. 启动IDLERXNE中断/* 启动串口1 IDLE中断接收不定长数据 */voidUART1_Start_IDLE_IT(void){__HAL_UART_CLEAR_FLAG(huart1,UART_FLAG_IDLE);// 清除IDLE标志__HAL_UART_ENABLE_IT(huart1,UART_IT_IDLE);// 开启IDLE中断__HAL_UART_ENABLE_IT(huart1,UART_IT_RXNE);// 开启RXNE中断保证逐字节接收// 启动HAL库接收中断可选辅助管理HAL_UART_Receive_IT(huart1,uart1_rx_buf[uart1_rx_len],1);}2. 中断服务函数处理IDLE中断voidUSART1_IRQHandler(void){uint32_ttemp;uint8_trecv_data0;// 处理RXNE中断逐字节接收数据if(__HAL_UART_GET_FLAG(huart1,UART_FLAG_RXNE)!RESET__HAL_UART_GET_IT_SOURCE(huart1,UART_IT_RXNE)!RESET){recv_datahuart1.Instance-DR;if(uart1_rx_len1023){uart1_rx_buf[uart1_rx_len]recv_data;// 继续开启HAL接收中断HAL_UART_Receive_IT(huart1,uart1_rx_buf[uart1_rx_len],1);}}// 处理IDLE中断接收完成if(__HAL_UART_GET_FLAG(huart1,UART_FLAG_IDLE)!RESET__HAL_UART_GET_IT_SOURCE(huart1,UART_IT_IDLE)!RESET){__HAL_UART_CLEAR_IDLEFLAG(huart1);// 清除IDLE标志必须手动清除// 读SR和DR寄存器确保标志清除彻底temphuart1.Instance-SR;temphuart1.Instance-DR;uart1_rx_flag1;// 置位接收完成标志}// HAL库默认中断处理处理错误等HAL_UART_IRQHandler(huart1);}3. 主函数处理逻辑同方式1仅需将UART1_Start_RXNE_IT()替换为UART1_Start_IDLE_IT()其余逻辑不变。四、中断模式发送数据TXE中断发送中断在“发送寄存器为空”时触发适用于大数据量发送避免CPU等待逐字节自动填充数据。1. 启动发送中断函数/* 启动串口1发送中断发送指定长度数据 */voidUART1_Start_TXE_IT(uint8_t*data,uint16_tlen){if(len0||dataNULL)return;// 拷贝数据到发送缓冲区memcpy(uart1_tx_buf,data,len);uart1_tx_lenlen;uart1_tx_index0;// 清除TXE标志开启发送中断__HAL_UART_CLEAR_FLAG(huart1,UART_FLAG_TXE);__HAL_UART_ENABLE_IT(huart1,UART_IT_TXE);// 发送第一个字节触发首次TXE中断huart1.Instance-DRuart1_tx_buf[uart1_tx_index];}2. 中断服务函数中添加TXE处理在USART1_IRQHandler中补充TXE中断逻辑voidUSART1_IRQHandler(void){// 原有RXNE/IDLE中断处理...// 处理TXE中断发送寄存器空if(__HAL_UART_GET_FLAG(huart1,UART_FLAG_TXE)!RESET__HAL_UART_GET_IT_SOURCE(huart1,UART_IT_TXE)!RESET){if(uart1_tx_indexuart1_tx_len){// 发送下一个字节huart1.Instance-DRuart1_tx_buf[uart1_tx_index];}else{// 发送完成关闭TXE中断__HAL_UART_DISABLE_IT(huart1,UART_IT_TXE);// 可选置位发送完成标志}}HAL_UART_IRQHandler(huart1);}3. 主函数调用发送intmain(void){// 系统初始化...UART1_Start_IDLE_IT();// 启动接收中断uint8_tsend_data[]Hello UART Interrupt!\r\n;UART1_Start_TXE_IT(send_data,sizeof(send_data)-1);// 启动发送中断while(1){// 接收数据处理...}}五、51单片机中断模式串口收发补充51单片机串口中断配置更简单以STC89C52为例对比理解#includereg52.h#defineFOSC11059200L#defineBAUD9600#defineTIMER1_VAL(256-FOSC/(16*BAUD))unsignedcharuart_rx_buf[32]{0};unsignedcharuart_rx_len0;/* 串口初始化9600波特率中断模式 */voidUART_Init(void){TMOD|0x20;// 定时器1工作在模式28位自动重装TH1TIMER1_VAL;TL1TIMER1_VAL;TR11;// 启动定时器1SCON0x50;// 串口模式1REN1允许接收EA1;// 开启总中断ES1;// 开启串口中断}/* 串口中断服务函数 */voidUART_ISR(void)interrupt4{if(RI)// 接收中断标志{RI0;// 清除接收标志uart_rx_buf[uart_rx_len]SBUF;// 读取数据if(uart_rx_len31)uart_rx_len0;}if(TI)// 发送中断标志{TI0;// 清除发送标志}}/* 中断模式发送字节 */voidUART_Send_Byte(unsignedchardat){SBUFdat;// 写入发送寄存器触发发送while(!TI);// 等待发送完成51无TXE中断需轮询仅接收为纯中断TI0;}voidmain(void){UART_Init();while(1){if(uart_rx_len0){// 回显数据for(inti0;iuart_rx_len;i){UART_Send_Byte(uart_rx_buf[i]);}uart_rx_len0;}}}六、中断模式串口调试避坑指南1. 常见问题与解决方案问题现象核心原因解决方案中断不触发1. 中断未使能2. 优先级配置错误3. 标志未清除1. 检查HAL_NVIC_EnableIRQ()2. 确认优先级未被屏蔽3. 中断前清除标志接收数据乱码1. 波特率不匹配2. 时钟配置错误3. 缓冲区溢出1. 核对串口参数115200 8N12. 确认STM32系统时钟如72MHz3. 增加缓冲区或限制长度数据丢失1. 中断响应过慢2. 缓冲区未及时处理3. IDLE标志未清除1. 提高中断优先级2. 主循环快速处理接收数据3. 手动清除IDLE标志读SRDR发送中断死循环发送索引越界严格判断uart1_tx_index uart1_tx_len发送完成关闭中断2. 调试技巧分步验证先通过查询模式确认串口基础通信正常再开启中断断点调试在中断服务函数中添加断点查看是否进入中断、数据是否正确硬件辅助用示波器观察TX/RX引脚电平确认中断触发时电平变化缓冲区保护添加长度限制防止数组越界如if(uart1_rx_len 1023)。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

建设网站公司怎么收费松江新桥专业网站建设

Windows 2000 中的 Kerberos 服务器认证详解 1. 引言 在网络安全领域,认证协议起着至关重要的作用。Kerberos 版本 5 是 Windows 2000 的默认网络认证协议。它并非微软新发明的协议,在 UNIX 世界已使用多年。微软在 Windows 2000 中采用 Kerberos 网络认证,旨在增强安全性…

张小明 2025/12/21 6:30:22 网站建设

大型网站 网站建设做网站 哪里发布

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T4672305M设计简介:本设计是基于STM32的智能镜子系统,主要实现以下功能:带有补光灯,并可通过手势或语音控制…

张小明 2026/1/1 8:38:51 网站建设

制作公司网站结构图免费设计网

Everything MCP Server:一站式MCP协议测试解决方案 【免费下载链接】servers Model Context Protocol Servers 项目地址: https://gitcode.com/GitHub_Trending/se/servers 你是否在开发MCP客户端时遇到过这样的困扰:需要搭建多个测试环境来验证不…

张小明 2025/12/21 6:26:19 网站建设

重庆手机网站推广定做p2p理财网站开发框架

在日常工作中,你是否常常为绘制流程图而烦恼?手动绘制不仅耗时费力,还容易出错,让原本清晰的思路变得混乱。别担心,今天就给大家介绍一款神奇的工具,它能让文字秒变流程图,轻松解决你的困扰。这…

张小明 2025/12/21 6:22:16 网站建设

做一个网站能挣多少钱怎么做网站文章伪原创

3分钟搞定ZeroOmega:告别繁琐的网络配置切换困境 【免费下载链接】ZeroOmega Manage and switch between multiple proxies quickly & easily. 项目地址: https://gitcode.com/gh_mirrors/ze/ZeroOmega 还在为不同网络环境下的配置调整而头疼吗&#xff…

张小明 2025/12/25 18:27:23 网站建设

网站建设实训个人总结3000字网站统计

Excalidraw链接功能详解:超链接与跳转处理 在数字协作日益深入的今天,一张静态的草图早已无法满足团队对信息联动和知识穿透的需求。Excalidraw之所以能在众多白板工具中脱颖而出,不仅因为其标志性的手绘风格让人耳目一新,更在于它…

张小明 2025/12/21 6:16:12 网站建设