嵌入式综合实验

实验器材

stm32f103c8t6,stlink

实验目的

综合使用实验开发板上的四个led和usart串口,结合前面学习的gpio、定时器、usart等知识,设计综合实验

实验内容

实现功能:上位机通过usart通信控制由定时器中断驱动的led灯切换不同闪烁模式,并实现简单的命令提示功能

应用场景是需要实时手动调整运行参数的环境,通过串口通信可以实时调参,极大避免了每次更新程序参数再烧录的繁琐流程和时间的浪费。

实现代码

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "misc.h"
#include "stdio.h"
#include "stm32f10x_usart.h"
uint16_t dat = 'h'; // 保存接收到的数据
int led_state = 0;  // led状态void gpio_init(void);
void TIM2_Configuration(void);
void USART1_Config(void);
void LED_POWER1(int k);
void LED_POWER2(int k);
void LED_POWER3(int k);
void LED_POWER(int k);
void INFO();
int main(void)
{gpio_init();          // GPIO 初始化USART1_Config();      // 配置 USART1TIM2_Configuration(); // 配置定时器// printf("Please Input string ! \r\n"); // 开机后提示输入字符串for (;;);
}
void gpio_init(void)
{GPIO_InitTypeDef GPIO_InitStructure; // 定义一个 GPIO 初始化类型结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);// 开启 AFIO 时钟和 GPIOB\A 的外设时钟GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);                         // 禁用 JTAG 功能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5 | GPIO_Pin_4; // 选择要控制的 GPIOB 引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                // 设置引脚速率为 50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                 // 设置引脚模式为通用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);                                           // 调用库函数,初始化 GPIOBGPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;       // 选择要控制的 GPIOA 引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 用作串口输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 用作串口输入GPIO_Init(GPIOA, &GPIO_InitStructure);
}void TIM2_Configuration(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;              // 定义一个定时器初始化参数结构体NVIC_InitTypeDef NVIC_InitStructure;                        // 定义 NVIC 初始化结构体RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        // 开启 APB1 的 TIM2 外设时钟TIM_DeInit(TIM2);                                           // 将外设 TIM2 的寄存器重设为缺省值TIM_TimeBaseStructure.TIM_Prescaler = (7200 - 1);           // 设置预分频系数为(7200-1)TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式TIM_TimeBaseStructure.TIM_Period = 10000;                   // 自动加载值设置,累计 10000 个时钟周期(1s)后溢出TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);             // 根据 TIM_TimeBaseStructure 中指定的参数初始化 TIM2 里的相关寄存器TIM_ClearFlag(TIM2, TIM_FLAG_Update);                       // 清除溢出中断标志TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);                  // 使能 TIM2 中断,允许更新中断TIM_Cmd(TIM2, ENABLE);                                      // 使能 TIM2 外设NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);           // 选择中断优先级分组 0NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;           // 选择配置 TIM2 全局中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级为 0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        // 响应优先级为 1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           // 使能 TIM2 中断通道NVIC_Init(&NVIC_InitStructure);                           // 根据以上配置初始化 NVIC
}
void LED_POWER1(int k)
{switch (k){case 0:GPIO_ResetBits(GPIOB, GPIO_Pin_4);GPIO_SetBits(GPIOB, GPIO_Pin_7);break;case 1:GPIO_ResetBits(GPIOB, GPIO_Pin_5);GPIO_SetBits(GPIOB, GPIO_Pin_4);break;case 2:GPIO_ResetBits(GPIOB, GPIO_Pin_6);GPIO_SetBits(GPIOB, GPIO_Pin_5);break;case 3:GPIO_ResetBits(GPIOB, GPIO_Pin_7);GPIO_SetBits(GPIOB, GPIO_Pin_6);break;default:break;}
}
void LED_POWER2(int k)
{switch (k){case 0:GPIO_ResetBits(GPIOB, GPIO_Pin_7);GPIO_SetBits(GPIOB, GPIO_Pin_4);break;case 1:GPIO_ResetBits(GPIOB, GPIO_Pin_6);GPIO_SetBits(GPIOB, GPIO_Pin_7);break;case 2:GPIO_ResetBits(GPIOB, GPIO_Pin_5);GPIO_SetBits(GPIOB, GPIO_Pin_6);break;case 3:GPIO_ResetBits(GPIOB, GPIO_Pin_4);GPIO_SetBits(GPIOB, GPIO_Pin_5);break;default:break;}
}
void LED_POWER3(int k)
{k %= 2;switch (k){case 0:GPIO_ResetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5 | GPIO_Pin_4);break;case 1:GPIO_SetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5 | GPIO_Pin_4);break;default:break;}
}
void INFO(void)
{printf("creart by cyx 225211 & zxh 225350\r\n");
}
void LED_POWER(int k)
{switch (dat){case '0':LED_POWER1(k);break;case '1':LED_POWER2(k);break;case '2':LED_POWER3(k);break;case '3':GPIO_ResetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5 | GPIO_Pin_4);break;case '4':GPIO_SetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5 | GPIO_Pin_4);break;case '5':printf("info\r\n");INFO();dat = '4';break;case 'h':printf("0  Forward flashing\r\n1  reverse flashing\r\n2  flashing\r\n3  constant lighting\r\n4  off\r\n5  info\r\n");dat = '4';break;default:printf("default model !\r\nprass 'h' for help......\r\n");dat = '4';break;}
}
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // 1S 时间到,检测到 TIM2 中断{led_state++;               // 状态加 1led_state = led_state % 4; // 取模,状态循环从 0 到 4LED_POWER(led_state);      // 控制 LED 状态TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); // 清除中断标志位}
}
int fputc(int ch, FILE *f) // 重定向 printf()函数
{USART_SendData(USART1, (unsigned char)ch);// 将 printf()中的内容发往串口while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)// 发送数据寄存器非空时,循环等待{}return (int)ch; // 返回值
}
void USART1_Config(void)
{USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 开启 USART1 和 USART1 中断时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);// 配置 USART1 参数USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;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;// 初始化 USART1USART_Init(USART1, &USART_InitStructure);// 使能 USART1USART_Cmd(USART1, ENABLE);// 配置 USART1 中断优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);           // 设置NVIC优先级分组NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;         // USART1 中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        // 子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           // 使能中断NVIC_Init(&NVIC_InitStructure);                           // 初始化NVIC// 使能 USART1 中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能 USART1 接收中断
}
void USART1_IRQHandler(void)
{if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 检查接收中断标志{dat = USART_ReceiveData(USART1); // 读取接收到的数据// 清除接收中断标志USART_ClearITPendingBit(USART1, USART_IT_RXNE);}
}

说在最后,其实代码由可以改进的空间(其实就是懒得改,一开始写的时候有点赶,就没有想那么多)

可以把led控制函数在主函数调用,在定时器中断里调用时,如果串口传来控制信息,最坏情况需要1s才能实现模式改变(定时器设的1s),放到主函数调用就可以及时响应模式改变了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天一个数据分析题(三百七十九)- 用户留存

某公司为更好进行用户留存,需建立用户行为画像,并且历史数据集中也没有用户标签信息,需要使用算法找出合理的画像标签,可用以下哪种算法实现? A. 聚类算法 B. 多元线性回归算法 C. 决策树算法 D. 朴素贝叶斯算法 …

基于Python的自然语言处理项目 ChatTTS 推荐

**项目名称:ChatTTS**  ChatTTS是一个基于Python的自然语言处理项目,旨在实现一个简单的文本到语音转换系统。它使用深度学习技术,通过自然语言处理和语音合成算法,将文本转换为语音输出。  **项目介绍**:  Chat…

Web前端项目-页面动态背景【附完整源码】

页面动态背景 一&#xff1a;花瓣背景 页面效果&#xff1a; HTML代码 <!DOCTYPE HTML> <HTML> <TITLE>花瓣漫舞</TITLE> <META NAME"Generator" CONTENT"EditPlus"> <META NAME"Author" CONTENT"&quo…

区块链技术:探索7个物联网应用的潜力

在当今数字化时代&#xff0c;区块链技术逐渐成为一种受到广泛关注的技术创新。本文将以《区块链技术&#xff1a;探索7个物联网应用的潜力》为题&#xff0c;介绍区块链技术在物联网领域的七个应用潜力。物联网作为未来发展的重要方向&#xff0c;结合区块链技术的应用将为我们…

【因果推断python】47_元学习1

目录 S-Learner 简单回顾一下&#xff0c;我们现在感兴趣的是发现治疗效果的异质性&#xff0c;即确定单位对治疗的不同反应。在这个框架中&#xff0c;我们想估计 或 在连续的情况下。换句话说&#xff0c;我们想知道这些单位对治疗的敏感程度。这在我们不能治疗所有人并且需…

使用Python进行自然语言处理:从基础到实战

使用Python进行自然语言处理:从基础到实战 自然语言处理(Natural Language Processing, NLP)是人工智能的重要领域,旨在处理和分析自然语言数据。Python凭借其丰富的库和社区支持,成为NLP的首选编程语言。本文将介绍自然语言处理的基础概念、常用的Python库以及一个实战项…

Flink 1.19.1 standalone 集群模式部署及配置

flink 1.19起 conf/flink-conf.yaml 更改为新的 conf/config.yaml standalone集群: dev001、dev002、dev003 config.yaml: jobmanager address 统一使用 dev001&#xff0c;bind-port 统一改成 0.0.0.0&#xff0c;taskmanager address 分别更改为dev所在host dev001 config.…

腾讯云 - 边缘安全加速平台 EO、内容分发网络 CDN、全站加速网络 ECDN、安全加速 SCDN 等产品对比

边缘安全加速平台 EO &#xff08;Tencent cloud EdgeOne&#xff0c;下文简称为 EdgeOne&#xff09;是 内容分发网络 CDN 的全面升级产品&#xff0c;可提供更加丰富的功能、更灵活的配置方式以及更简便的上手方式&#xff0c;相比 CDN 产品来说&#xff0c;除了涵盖原 CDN 加…

故障:笔记本电脑更新系统后开机黑屏只剩鼠标

某天上班的时候&#xff0c;发现笔记本电脑在自动更新&#xff0c;更新完了突然右下角落弹出了火绒的提示&#xff0c;发现了一个木马&#xff0c;要删除&#xff0c;名称是explorer.exe&#xff0c;我还在发懵&#xff0c;它已经被删掉了&#xff0c;然后笔记本开始开机&#…

【SD3的Turbo也来了】Jasper AI用Flash Diffusion的蒸馏技术为SD3提速

Flash Diffusion 是一种新颖的图像生成方法&#xff0c;旨在显著提高现有条件扩散模型&#xff08;例如教师模型&#xff09;的速度&#xff0c;而无需牺牲性能。它通过引入以下技术来实现这一点&#xff1a; 蒸馏损失&#xff1a;在教师模型和学生模型之间引入蒸馏损失&#…

React+TS前台项目实战(十三)-- 全局常用响应式加载动画Loading组件封装

文章目录 前言Loading组件1. 功能分析2. 代码详细注释3. 使用方式4. 不同尺寸loading动画效果展示 总结 前言 高阶组件有几大优点&#xff0c;其中一个就是渲染劫持&#xff0c;如懒加载&#xff0c;是否显示该元素loading&#xff0c;这在项目中我们经常用到。毫无疑问&#…

单阶段目标检测--NMS

目录 一、概念: 二、算法过程 三、代码实现 一、概念: 在目标检测的初始结果中&#xff0c;同一个物体&#xff0c;可能对应有多个边界框 &#xff08;bounding box&#xff0c;bb&#xff09;&#xff0c;这些边界框通常相互重叠。如何从中选择一个最合适 的&#xff08;也就…

DATaGrip的安装与使用

在数据库开发的过程中&#xff0c;有一款专业的软件必不可少。相较于navicat&#xff0c;DataGrip功能更为齐全&#xff0c;如SQL语句编辑、数据库连接管理、数据导入和导出、数据库比较和同步等等。DataGrip支持多种数据库&#xff0c;如MySQL、PostgreSQL、Oracle、Microsoft…

Python | Leetcode Python题解之第171题Excel列表序号

题目&#xff1a; 题解&#xff1a; class Solution:def titleToNumber(self, columnTitle: str) -> int:number, multiple 0, 1for i in range(len(columnTitle) - 1, -1, -1):k ord(columnTitle[i]) - ord("A") 1number k * multiplemultiple * 26return n…

JavaScript:at()方法遇到的问题并解决

目录 第一章 前言 第二章 使用at方法 第三章 分析原因并解决问题 第一章 前言 最近上线了一个项目&#xff0c;测试过程中并没有什么问题&#xff0c;但是上线后使用的用户多了&#xff0c;结果出现了这么一个问题&#xff1a;.at方法对低版本手机的浏览器不兼容问题&#x…

yolo训练中停止指令

在使用 YOLO 进行训练时&#xff0c;通常有几种方法可以停止训练过程&#xff1a; 手动中断&#xff1a;在大多数命令行界面中&#xff0c;你可以使用特定的快捷键来终止正在运行的进程。最常见的是按下 Ctrl C。这会发送一个中断信号给操作系统&#xff0c;然后操作系统会尝试…

信息打点-协议应用_内网资产_CDN_WAF_负载均衡_防火墙

服务信息获取-协议应用&内网资产 常见端口默认对应的服务&#xff1a; 特殊服务端口&#xff1a; 端口扫描工具&#xff1a; 旁注查询 旁注查询&#xff0c;又称为旁站查询或同服务器网站查询&#xff0c;是一种信息安全和网络侦查技术&#xff0c;主要用于发现与目标网站…

iOS APP内存泄漏的问题

iOS APP内存泄漏是指应用程序不再使用内存&#xff0c;但内存却没有被释放&#xff0c;导致应用程序占用过多的内存&#xff0c;甚至崩溃。内存泄漏是iOS开发中常见的问题&#xff0c;会严重影响应用程序的性能和稳定性。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

PMBOK® 第六版 指导与管理项目工作

目录 读后感—PMBOK第六版 目录 我们都不情愿去做重复的工作&#xff0c;也不期望只得到一个计划&#xff0c;而具体的工作任务却笼统模糊&#xff0c;需要在做的过程中一边摸索。如此一来&#xff0c;对于熟悉的事情会因反复而影响心态&#xff0c;对于不熟悉的事情则由于痛苦…

网络安全法视角下的等保测评重要性与合规路径

简述 网络安全等级保护测评&#xff08;以下简称等保测评&#xff09;是根据《网络安全法》等相关法律法规要求&#xff0c;对信息系统进行的安全评估活动。它不仅关系到信息系统的安全防护能力&#xff0c;也是组织合法合规运营的必要条件。本文将从网络安全法的视角出发&…