当前位置: 首页 > article >正文

STM32 USART1 串口调试打印,映射printf函数

该代码可以在freertos中正常运行,你可以进行更多细节优化
PA9(TX)
PA10(RX)

#include "usart.h"// 解决串口死机问题
#pragma import(__use_no_semihosting)                
struct __FILE       { int handle; };     // 标准库需要的支持函数
FILE __stdout;                           // FILE 在stdio.h文件
void _sys_exit(int x) {	x = x; }         // 定义_sys_exit()以避免使用半主机模式//串口1中断服务程序
u8 USART1_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
u16 USART1_RX_STA=0;       //接收状态标记	  //串口2中断服务程序
u8 USART2_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
u16 USART2_RX_STA=0;       //接收状态标记	
//初始化IO 串口1 
//bound:波特率
void usart1_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX	  GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 2 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		//子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE);                    //使能串口1 
}//重定义fputc函数  
int fputc(int ch, FILE *f)               // 重定向fputc函数,使printf的输出,由fputc输出到UART,  这里使用串口1(USART1)
{   //if(xFlag.PrintfOK == 0) return 0;  // 判断USART是否已配置,防止在配置前调用printf被卡死while((USART1->SR&0X40)==0);        // 等待上一次串口数据发送完成  USART1->DR = (u8) ch;      	     // 写DR,串口1将发送数据    return ch;
}//串口1中断服务程序              	
void USART1_IRQHandler(void)                	
{u8 Res;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART1);	//读取接收到的数据if((USART1_RX_STA & 0x8000) == 0)    //接收未完成{if(USART1_RX_STA & 0x4000)       //接收到了0x0d{if(Res != 0x0a) USART1_RX_STA = 0; //接收错误,重新开始else {USART1_RX_STA |= 0x8000;	//接收完成了 // 当接收完成后,将接收到的数据返回给 PCfor (u16 i = 0; i < (USART1_RX_STA & 0x3FFF); i++) {printf("%c", USART1_RX_BUF[i]);}// 提示接收成功printf("\rReceive Success!\r\n");// 清空接收缓冲区和状态USART1_RX_STA = 0;}}else //还没收到0X0D{	if(Res == 0x0d) USART1_RX_STA |= 0x4000;else{USART1_RX_BUF[USART1_RX_STA & 0x3FFF] = Res;USART1_RX_STA++;if(USART1_RX_STA > (USART_REC_LEN - 1)) USART1_RX_STA = 0; //接收数据错误,重新开始接收	  }		 }}   		 USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志位} 
}/ USART 2 ///void usart2_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  // 使能 USART2 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   // 使能 GPIOA 时钟//USART1_TX   GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//USART1_RX	  GPIOA.3初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉GPIO_Init(GPIOA, &GPIO_InitStructure);//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		//子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART2, &USART_InitStructure); //初始化串口2USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART2, ENABLE);                    //使能串口2 
}//串口2中断服务程序              	
void USART2_IRQHandler(void)                	
{u8 Res;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART2);	//读取接收到的数据if((USART2_RX_STA & 0x8000) == 0)    //接收未完成{if(USART2_RX_STA & 0x4000)       //接收到了0x0d{if(Res != 0x0a) USART2_RX_STA = 0; //接收错误,重新开始else {USART2_RX_STA |= 0x8000;	//接收完成了 // 当接收完成后,将接收到的数据返回给 PCfor (u16 i = 0; i < (USART2_RX_STA & 0x3FFF); i++) {printf("%c", USART2_RX_BUF[i]);}// 提示接收成功printf("\rReceive Success!\r\n");// 清空接收缓冲区和状态USART2_RX_STA = 0;}}else //还没收到0X0D{	if(Res == 0x0d) USART2_RX_STA |= 0x4000;else{USART2_RX_BUF[USART2_RX_STA & 0x3FFF] = Res;USART2_RX_STA++;if(USART2_RX_STA > (USART_REC_LEN - 1)) USART2_RX_STA = 0; //接收数据错误,重新开始接收	  }		 }}   		 USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清除中断标志位} 
}
#ifndef __USART_H
#define __USART_H
#include "stdio.h"	
#include "stm32f10x.h"#define USART_REC_LEN  			200  	//定义最大接收字节数 200extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART1_RX_STA;         		//接收状态标记	void usart1_init(u32 bound);extern u16 USART2_RX_STA;         		//接收状态标记	void usart2_init(u32 bound);
#endif

相关文章:

STM32 USART1 串口调试打印,映射printf函数

该代码可以在freertos中正常运行&#xff0c;你可以进行更多细节优化 PA9(TX) PA10(RX) #include "usart.h"// 解决串口死机问题 #pragma import(__use_no_semihosting) struct __FILE { int handle; }; // 标准库需要的支持函数 FILE __…...

DeepSeek大模型本地部署实战

1. 下载并安装Ollama 打开浏览器&#xff1a;使用你常用的浏览器&#xff08;如Chrome、Firefox等&#xff09;访问Ollama的官方网站。无需特殊网络环境&#xff0c;直接搜索“Ollama”即可找到。 登录与下载&#xff1a;进入Ollama官网后&#xff0c;点击右上角的“Download…...

【学习总结|DAY037】Linux 项目部署

引言 在当今的软件开发领域&#xff0c;Linux 以其安全、稳定、免费且开源的特性&#xff0c;成为项目部署的首选操作系统。无论是 Java 项目&#xff0c;还是各类开发、测试、生产环境中的软件安装&#xff0c;Linux 都占据着重要地位。本文将结合我今天所学内容&#xff0c;…...

Spring Boot Actuator使用

说明&#xff1a;本文介绍Spring Boot Actuator的使用&#xff0c;关于Spring Boot Actuator介绍&#xff0c;下面这篇博客写得很好&#xff0c;珠玉在前&#xff0c;我就不多介绍了。 Spring Boot Actuator 简单使用 项目里引入下面这个依赖 <!--Spring Boot Actuator依…...

[css] 黑白主题切换

link动态引入 类名切换 css滤镜 var 类名切换 v-bind css预处理器mixin类名切换 【前端知识分享】CSS主题切换方案...

阿里云专有云网络架构学习

阿里云专有云网络架构 叶脊&#xff08;spine-leaf&#xff09;网络和传统三层网络拓扑对比 阿里云网络架构V3拓扑角色介绍推荐设备设备组网举例带外管理网络带外网和带内网对比设备介绍 安全网络设备介绍 参考 后续更新流量分析叶脊&#xff08;spine-leaf&#xff09;网络和传…...

【AIGC】冷启动数据与多阶段训练在 DeepSeek 中的作用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;冷启动数据的作用冷启动数据设计 &#x1f4af;多阶段训练的作用阶段 1&#xff1a;冷启动微调阶段 2&#xff1a;推理导向强化学习&#xff08;RL&#xff0…...

在SIP路由中,常见的对接方式

好的&#xff0c;我已将应用场景和案例分为两列。修改后的表格如下&#xff1a; 对接方式描述应用场景案例注册 (REGISTER)用于用户注册&#xff0c;将用户位置&#xff08;如IP地址&#xff09;与其用户名进行绑定。用户通过发送REGISTER请求将自己注册到SIP服务器。注册过程…...

GenAI + 电商:从单张图片生成可动态模拟的3D服装

在当今数字化时代,电子商务和虚拟现实技术的结合正在改变人们的购物体验。特别是在服装行业,消费者越来越期待能够通过虚拟试衣来预览衣服的效果,而无需实际穿戴。Dress-1-to-3 技术框架正是为此而生,它利用生成式AI模型(GenAI)和物理模拟技术,将一张普通的穿衣照片转化…...

harmonyOS生命周期详述

harmonyOS的生命周期分为app(应用)的生命周期和页面的生命周期函数两部分 应用的生命周期-app应用 在app.js中写逻辑,具体有哪些生命周期函数呢,请看下图: onCreated()、onShow()、onHide()、onDestroy()这五部分 页面及组件生命周期 着重说下onShow和onHide,分别代表是不是…...

记一次调整磁盘分区大小的经验

背景 redhat 6 系统 根目录挂载的逻辑卷满了&#xff0c;系统都不能正常运行了 但是/home目录挂载的另外一个逻辑卷却占用只有4% 所以想把/home挂的逻辑卷分一部分给/ 挂的逻辑卷 备份 先把系统整盘备份一下&#xff0c;用clonezilla做一个磁盘镜像&#xff0c;免得失误了搞…...

css:怎么设置图片不变形

问&#xff1a; main元素中有一个img元素&#xff0c;这个img src‘/assets/images/tupian.png’css设置了img元素width&#xff1a;50% height:50%但是图片变形了&#xff0c;我应该怎么设置保持图片样式不变形 回答&#xff1a; 为了确保图片在调整大小时不变形&#xff0…...

软件测试就业

文章目录 2.6 初识一、软件测试理论二、软件的生产过程三、软件测试概述四、软件测试目的五、软件开发与软件测试的区别&#xff1f;六、学习内容 2.7 理解一、软件测试的定义二、软件测试的生命周期三、软件测试的原则四、软件测试分类五、软件的开发与测试模型1.软件开发模型…...

【Pandas】pandas Series sum

Pandas2.2 Series Computations descriptive stats 方法描述Series.abs()用于计算 Series 中每个元素的绝对值Series.all()用于检查 Series 中的所有元素是否都为 True 或非零值&#xff08;对于数值型数据&#xff09;Series.any()用于检查 Series 中是否至少有一个元素为 T…...

后缀表达式(蓝桥杯19I)

有减于号时 假设有n个大于0从大到小的数&#xff0c;加减符号数为n-1&#xff1a;a,b,c,d,。。。。。&#xff0c;e sum求最大&#xff1a;(max )-(min ) a - (e - ( ) -&#xff08;&#xff09;)( ( )( ) ( ) 。。。。 ) 当序列中有负数时&#xff1a; a -&am…...

问题大集04-浏览器阻止从 本地 发起的跨域请求,因为服务器的响应头 Access-Control-Allow-Origin 设置为通配符 *

1、问题 localhost/:1 Access to XMLHttpRequest at xxx&#xff08;请求&#xff09; from origin http://localhost:xxx&#xff08;本地&#xff09; has been blocked by CORS policy: The value of the Access-Control-Allow-Origin header in the response must not be t…...

mac环境下,ollama+deepseek+cherry studio+chatbox本地部署

春节期间&#xff0c;deepseek迅速火爆全网&#xff0c;然后回来上班&#xff0c;我就浅浅的学习一下&#xff0c;然后这里总结一下&#xff0c;我学习中&#xff0c;总结的一些知识点吧&#xff0c;分享给大家。具体的深度安装部署&#xff0c;这里不做赘述&#xff0c;因为网…...

TypeScript 中的联合类型:灵活的类型系统

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

DeepSeek-R1 32B Windows+docker本地部署

最近国产大模型DeepSeek兴起&#xff0c;本地部署了一套deepseek同时集成Open WebUI界面,给大家出一期教程。 软件&#xff1a;Ollama、docker、Open WebUI 一、用Ollama下载模型 首先我们需要安装Ollama&#xff0c;它可以在本地运行和管理大模型。 到Ollama官网 https://ol…...

MySQL部署基于二进制日志文件位置的主从复制集群

MySQL主从复制介绍 MySQL 主从复制&#xff08;Master-Slave Replication&#xff09; 作为一种经典的数据库复制方案&#xff0c;被广泛应用于企业生产环境&#xff0c;尤其是在提升数据库性能、实现数据备份和分布式扩展方面具有重要作用。 官方文档&#xff1a;https://de…...

AIOS: 一个大模型驱动的Multi-Agent操作系统设计与Code分析

AIOS: 一个大模型驱动的Multi-Agent操作系统设计与Code分析 随着人工智能技术的快速发展&#xff0c;传统操作系统逐渐暴露出难以适应AI时代多样化需求的局限性。特别是在支持多个智能体协同工作方面存在显著不足。为此&#xff0c;我们提出了一种名为AIOS&#xff08;Artifici…...

C++Primer学习(2.2)

2.2 变量 变量提供一个具名的、可供程序操作的存储空间。C中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围&#xff0c;以及变量能参与的运算。对C程序员来说,“变量(variable)”和“对象(object)”一般可以互换使用。 术…...

Mac 基于Ollama 本地部署DeepSeek离线模型

最近节日期间最火的除了《哪吒》就是deepseek了&#xff0c;毕竟又让西方各个层面都瑟瑟发抖的产品。DeepSeek凭借其强大的AI能力真的是在全球多个领域展现出强大的影响力。由于受到外部势力的恶意攻击倒是deepseek官方服务不稳定&#xff0c;国内其他厂家的适配版本也不是很稳…...

google

GAID&#xff1a;广告id&#xff0c;即Google Advertising ID&#xff08;GAID&#xff09;&#xff0c;是由Google Play service提供给用户的可以重置的唯一广告id&#xff0c;通常也被用来作为设备的唯一标识&#xff0c;用于数据收集。但用户手机上必须安装有google play服务…...

基于kamailio开发VoIP管理系统的方案【CHATGPT提供】

好的&#xff0c;以下是更新后的最终方案&#xff0c;加入了按秒计费功能&#xff0c;并汇总了各个功能模块的详细描述&#xff1a; 最终方案&#xff1a;VoIP管理系统功能模块 功能模块功能描述应用场景SIP 注册服务器处理用户注册请求&#xff0c;维护用户的位置信息&#…...

机器学习数学基础:14.矩阵的公式

1. 操作顺序可交换 对于矩阵 A A A&#xff0c;若存在两种运算 ? ? ?和 ? ? ?&#xff0c;使得 ( A ? ) ? ( A ? ) ? (A^{?})^{?}\ (A^{?})^{?} (A?)? (A?)?&#xff0c;这意味着这两种运算的顺序可以交换。由此我们得到以下三个重要等式&#xff1a; ( A …...

DeepSeek-V2 论文解读:混合专家架构的新突破

论文链接&#xff1a;DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model 目录 一、引言二、模型架构&#xff08;一&#xff09;多头部潜在注意力&#xff08;MLA&#xff09;&#xff1a;重塑推理效率&#xff08;二&#xff09;DeepSeekM…...

C语言的灵魂——指针(3)

前言&#xff1a;上期我们介绍了const修饰指针&#xff0c;saaert断言都是针对指针本身的&#xff0c;文章后面我们用指针与数组建立了联系&#xff0c;这种联系或者是关系就是这篇文章所要介绍的。上一篇文章的传送门&#xff1a;指针2 指针3 一&#xff0c;数组名的含义及理解…...

机器学习之Transformer 模型

Transformer 模型详解 Transformer 是由 Vaswani et al. 在 2017 年 提出的模型,最初用于 机器翻译 任务,并迅速成为自然语言处理(NLP)领域的标准模型架构。与传统的 RNN(循环神经网络) 和 LSTM(长短期记忆网络) 不同,Transformer 的核心思想是 完全基于自注意力机制…...

SSD1306 128*32屏幕驱动

最近在做一个小项目&#xff0c;使用合宙air001做主控&#xff0c;arduino开发环境&#xff0c;项目设计一个小屏作为显示&#xff0c;本身使用u8g2库&#xff0c;奈何这个air001空间太小&#xff0c;没写多少就把程序储存空间占满了&#xff0c;log也没办法打印&#xff0c;对…...