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

STM入门(12)

STM入门(12)

#include "stm32f10x.h"                    // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"int main()
{// 模块初始化OLED_Init();          // OLED初始化Serial_Init();        // 串口初始化// 串口基本函数Serial_SendByte(0x41);				              // 串口发送一个字节数据0x41uint8_t MyArray[] = {0x42, 0x43, 0x44, 0x45};	  // 定义数组Serial_SendArray(MyArray, 4);		              // 串口发送一个数组Serial_SendString("\r\nNum1=");		              // 串口发送字符串Serial_SendNumber(111, 3);			              // 串口发送数字// 下述3种方法可实现printf的效果/*方法1:直接重定向printf,但printf函数只有一个,此方法不能在多处使用*/printf("\r\nNum2=%d", 222);		         //串口发送printf打印的格式化字符串//需要重定向fputc函数,并在工程选项里勾选Use MicroLIB/*方法2:使用sprintf打印到字符数组,再用串口发送字符数组,此方法打印到字符数组,之后想怎么处理都可以,可在多处使用*/char String[100];					   //定义字符数组sprintf(String, "\r\nNum3=%d", 333);   //使用sprintf,把格式化字符串打印到字符数组Serial_SendString(String);			   //串口发送字符数组(字符串)/*方法3:将sprintf函数封装起来,实现专用的printf,此方法就是把方法2封装起来,更加简洁实用,可在多处使用*/Serial_Printf("\r\nNum4=%d", 444);	   //串口打印字符串,使用自己封装的函数实现printf的效果Serial_Printf("\r\n");while(1){}
}
#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>/*** 函    数:串口初始化* 参    数:无* 返 回 值:无*/
void Serial_Init(void)
{// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);    // 开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);     // 开启GPIOA的时钟// GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);                        // 将PA9引脚初始化为复用推挽输出// USART初始化USART_InitTypeDef USART_InitStructure;                       // 定义结构体变量USART_InitStructure.USART_BaudRate = 9600;                   // 波特率// 硬件流控制,不需要USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   USART_InitStructure.USART_Mode = USART_Mode_Tx;              // 模式,选择为发送模式       USART_InitStructure.USART_Parity = USART_Parity_No;			 // 奇偶校验,不需要USART_InitStructure.USART_StopBits = USART_StopBits_1;		 // 停止位,选择1位USART_InitStructure.USART_WordLength = USART_WordLength_8b;  // 字长,选择8位USART_Init(USART1,&USART_InitStructure);					 // 将结构体变量交给USART_Init,配置USART1// USART使能USART_Cmd(USART1,ENABLE);
}/*** 函    数:串口发送一个字节* 参    数:Byte 要发送的一个字节* 返 回 值:无*/
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);         // 将字节数据写入数据寄存器,写入后USART自动生成时序波形while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);  // 等待发送完成/*下次写入数据寄存器后会自动清除发送完成标志位,故此循环后,无需清除标志位*/
}/*** 函    数:串口发送一个数组* 参    数:Array  要发送数组的首地址* 参    数:Length 要发送数组的长度* 返 回 值:无*/
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i = 0;i < Length; i++)      // 遍历数组{Serial_SendByte(Array[i]);  // 依次调用Serial_SendByte发送每个字节数据}
}/*** 函    数:串口发送一个字符串* 参    数:String 要发送字符串的首地址* 返 回 值:无*/
void Serial_SendString(char *String)
{uint8_t i;for(i = 0;String[i] != '\0';i++)   // 遍历字符数组(字符串),遇到字符串结束标志位后停止{Serial_SendByte(String[i]);    // 依次调用Serial_SendByte发送每个字节数据}
}/*** 函    数:次方函数(内部使用)* 返 回 值:返回值等于X的Y次方*/
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result = 1;      // 设置结果初值为1while(Y--)                // 执行Y次{Result *= X;          // 将X累乘到结果}return Result;
}/*** 函    数:串口发送数字* 参    数:Number 要发送的数字,范围:0~4294967295* 参    数:Length 要发送数字的长度,范围:0~10* 返 回 值:无*/
void Serial_SendNumber(uint32_t Number,uint8_t Length)
{uint8_t i;for(i = 0;i < Length;i ++)                // 根据数字长度遍历数字的每一位{// 依次调用Serial_SendByte发送每位数字Serial_SendByte(Number / Serial_Pow(10,Length - i - 1) % 10 + '0');   }
}/*** 函    数:使用Printf需要重定向的底层函数* 参    数:保持原始格式即可,无需变动* 返 回 值:保持原始格式即可,无需变动*/
int fputc(int ch, FILE *f)
{Serial_SendByte(ch);			//将printf的底层重定向到自己的发送字节函数return ch;
}/*** 函    数:自己封装的Prinf函数* 参    数:format 格式化字符串* 参    数:... 可变的参数列表* 返 回 值:无*/
void Serial_Printf(char *format, ...)
{char String[100];				   //定义字符数组va_list arg;					   //定义可变参数列表数据类型的变量argva_start(arg, format);			   //从format开始,接收参数列表到arg变量vsprintf(String, format, arg);	   //使用vsprintf打印格式化字符串和参数列表到字符数组中va_end(arg);					   //结束变量argSerial_SendString(String);		   //串口发送字符数组(字符串)
}
#ifndef __SERIAL_H
#define __SERIAL_H#include <stdio.h>void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array, uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNumber(uint32_t Number, uint8_t Length);
void Serial_Printf(char *format, ...);#endif
http://www.jsqmd.com/news/492815/

相关文章:

  • Qwen3-14B保姆级部署教程:3步搞定企业级AI客服,小白也能快速上手
  • YOLO26实战全流程:从数据集标注到端到端无NMS推理(附ProgLoss调参技巧)
  • BV电视版 0.3.14.r877 | 纯净好用的第三方B站TV,支持8K视频
  • 如何用Python+OpenCV快速搭建草莓病虫害检测系统(附数据集下载)
  • 运维3年裸辞转行:告别7×24小时背锅,我用4个月逆袭上岸(附全流程实操指南)
  • 亚洲美女-造相Z-Turbo效果对比:Z-Image-Turbo基模 vs LoRA微调版亚洲特征强化分析
  • Phi-3-vision-128k-instruct惊艳效果展示:高精度图文理解生成作品集
  • 从实验室到生产线:YOLOv11多任务统一框架(检测+分割+姿态估计)行业应用
  • Docker 27正式版工业部署实战指南:从CI/CD流水线到OT网络隔离的7大关键配置
  • 比迪丽AI绘画Anaconda环境配置:科学计算与艺术创作完美结合
  • 让照片活起来:Image-to-Video图像转视频生成器实战体验
  • Phi-3-vision-128k-instruct镜像免配置:Docker一键拉起+Chainlit前端自动对接
  • 内网安全部署方案:Qwen3-VL:30B在内网穿透环境下的加密通信实现
  • 酷9多线 1.7.7.8(内置35源) | 魔改版,内置35条直播源,频道非常丰富
  • 弦音墨影参数详解:视觉定位模块阈值、帧采样率与响应延迟调优
  • 在线式UPS设计:双输入无感切换与数字模拟混合控制
  • Dify Rerank插件一键部署教程:从零下载、5步安装、实测QPS提升2.3倍的完整链路
  • Spring_couplet_generation 错误排查指南:解决403 Forbidden等常见网络错误
  • 高级 RAG 技术:查询转换与查询分解
  • Face Analysis WebUI模型微调指南:定制化人脸识别系统开发
  • STC32G12K128核心板:高可靠性工业级8051开发平台
  • 法环
  • 通义千问3-Reranker-0.6B优化电商产品评论分析
  • Phi-3-vision-128k-instruct实战落地:跨境电商多语言商品图理解与翻译辅助
  • Visual Studio Code初次使用注意事项
  • OWL ADVENTURE 小说解析器增强:基于封面与插图的智能分类与推荐
  • 麦田圈本质上是引力波印章
  • 为什么你的电脑需要14.318MHz晶振?揭秘主板时钟频率的冷知识
  • HALCON/C#混合开发必看:为什么你的GenEmptyObj()和new HObject()其实没区别?
  • Windows计划任务终极指南:从schtasks命令到taskschd.msc的完整实战手册