嵌入式软件--stm32 DAY 2

大家学习嵌入式的时候,多多学习用KEIL写代码,虽然作为编译器,大家常用vscode等常用工具关联编码,但目前keil仍然是主流工具之一,学习掌握十分必要。

1.再次创建项目

1.1编译器自动生成文件

1.2初始文件

这样下次创建新项目时,只需复制上一个项目,删除自动生成的文件,后根据自我需求进行修改。

重新打开工程后,需要重新配置,重新配置后才会生成文件。

2.再做项目

2.1需求

在第一个项目中,我们点亮了黄灯。接下来点亮蓝灯和绿灯。

2.2准备工作

2.2.1原理图查接线

 

由原理图可知,LED负极端给一个低电平就可以点亮。得出有效条件:低电平有效

2.2.2有效信息写代码

我们知道,所有外设都基本挂在系统总线上,APB1  APB2.从总线上找GPIO

他们都属于GPIOA同一组时钟。

配置PA1为输出,看寄存器CRL.PA0是后面的四位,那PA1就是前面的四位。

通用推挽输出的配置通常需要将 CNF 设置为 00(推挽输出),而 MODE 根据所需的速度选择,比如 2MHz、10MHz 或 50MHz。例如,对于 50MHz 的速度,MODE 位应设置为 11。因此,对应的 CRL 位需要设置为 0011,即十进制的 3,也就是0x 30

最后几位应该是1101,对应16进制D。所以0xfffd。

蓝灯就会亮起。黄灯之所以不亮是因为如果没有延迟,是观察不到的,它的程序反应速度很快。

绿灯对应引脚PA8。因为8-15的引脚不在低寄存器里,需要看高寄存器。也就是CRH的最低四位

基地址+偏移地址。*(uint32 *)(0x4001 0800+0x04)=0x03

输出低电平,偏移量0x0c.给ODR8一个0.也就是0xfeff.

这样绿灯就会亮起。

看到这里,也就明白了,让三灯同时亮起。

也就是ODR端口数据寄存器配置为0xfefc。

端口配置寄存器CRL,就让低8位为00110011,其他全是0,也就是0x33.

这就是电灯案例的标准库寄存器写法,但是不是有些难看?

寄存器写法的步骤也无非就是开启GPIO时钟,配置端口寄存器输入输出,配置输入输出数据。

先找到引脚的起始地址,再找寄存器对应偏移量,加一起就可以找到寄存器操作地址,还需要强转成32位指针。可不可以不需要这些地址?

我们可以选择优化!

2.3代码优化

不知道大家发现没,我们并没有用到Start里面的.h文件。并没有引入各种额外文件。

如果简化的话,就需要引入额外文件。将一些地址加以宏定义,就会好看许多。

2.3.1 改进1 使用宏定义改写寄存器地址

引入文件

时钟配置也可以

RCC->APB2ENR=4;

注意stm32f10x.h文件里面集成了很多寄存器和引脚的宏定义。只有引用他才能宏替换地址。

优点:这样比地址好看很多,只要记住模块名和寄存器名称,就能配置。

但是目前缺陷也很明显。例如RCC->APB2ENR=4,不仅打开了GPIOA时钟,也将其他的模块关闭了。我们应该在不影响其他模块的前提下,打开GPIOA时钟。

C语言里面讲过位运算,只改想要的位,不改其他位。

2.3.2 使用位运算对某一位进行操作

跟0作位于,一定为0;跟1作位或,一定为1;

置0,与0位于,置一,与1位或.

2.3.3 改进2 使用位运算实现只改变某一位的值。

RCC->APB2ENR=4  4即0x0100,只要让第三位为1,其他保持不变。那就只要和一个第三位为1,其他为0的数作位或即可。也就是与(1<<2)做位或。

RCC->APB2ENR|=(1<<2)即可。

配置PA0为输出,GPIOA->CRL=0x03; 0011,cnF0=00,mode=11,前两位为0,后两位是1,其他位不受影响。这样才能保证PA0为输出。

GPIOA->CRL|=(1<<0);

GPIOA->CRL|=(1<<1);

GPIOA->CRL&=~(1<<3);

GPIOA->CRL&=~(1<<4);

  PA0输出低电平,ODR最后一位为0,其他位不改变。

GPIOA->ODR&=~(1<<0);

led1 黄灯就会亮。

这种写代码方法只需要记住模块和寄存器,后续还要记住第几位,需要查手册。

2.3.4 改进3 使用宏定义改变每一位的表示

时钟开启可以改进:RCC->APB2ENR|=(1<<2)

改进后:RCC->APB2ENR|=RCC_APB2ENR_IOPAENR

大家要熟悉这种写法,以后寄存器写法的代码都是这种风格。完全靠宏定义取代了地址的写法,这个主推!!!

3.GPIO整体概述

GPIO引脚就是通用输入输出引脚。存在意义便是用程序控制他们的输入或输出。

3.1 与GPIO相关寄存器

3.2 8种工作模式

3.3推挽输出总结

3.4 开漏输出

3.5 推挽输出和开漏输出的选择 

使用推挽:

1.驱动能力需求较高的场合

2.高速信号传输

3.无需共用信号线的场合

使用开漏:

1.多个设备共用信号线

2.不同电压系统之间的接口

3.需要外部上拉电阻来确定逻辑高电平的场合 

3.6复用输出模式

复用输出信号来自片上外设(芯片中各种外设模块)

通用开漏,连ODR。

复用开漏,那条线打到片上外设,选哪个模块,配置哪个

复用功能(AF),端口必须配置成复用输出。

看下图,输入模式下,输出完全不导通。

浮空输入,上拉下拉都断开。还想上下拉的话,外部接上拉电阻或下拉电阻。

总结:

模拟输入耗电极小,肖特基触发器关闭。

输入模式就不用分通用还是复用了,都是外部输入来的。

4.GPIO寄存器

每组GPIO端口,都有7个相关寄存器。

配置寄存器和数据寄存器几乎是配置GPIO必用的,必须背会。

上下拉输入都是10 00,那么就用ODR这一位来区分。下拉ODR配0,上拉ODR配1.

0-7引脚用端口配置低寄存器来配,8-15引脚用端口高寄存器来配。

复位值16进制,每一位都是4,0100,对应浮空输入,断掉上下拉电阻的开关,最省电。

输入数据寄存器IDR,16位,一个引脚对应1位。

BS0为1,间接ODR0为1;BR0为1,间接导致OER0为0.如果同时启动BSy和BRy,只有BS起作用。

        LCK0直接对ODR0进行锁定。锁定之后在下次端口位复位前不改配置。

5.Keil+VSCode优化开发体验

为了让页面更好看,联想能力更强。就用keil负责与32的联接烧录,VSCode复制写代码。

VSCode我之前在C语言的教程中,安装过,这里不再阐述,关于汉化和C/C++的扩展插件也下载好。

关键插件:Keil Assistant

 

5.1 下载安装VScode

6.GPIO应用案例:流水灯

需求:在三个LED灯上实现流水灯效果。

注意点:加入延时效果(定时器)。

6.1软件设计

之前我们有过点灯的案例,启动文件和用户文件已经配好,那么可以直接复制使用。将文件的名字和工程名字改过来就可以了。删掉无关文件和目录(编译器自动生成)。

点开工程,完成一系列必要的配置。连上硬件和S-TINK.

之后确定即可。

在VScode里面打开.

导入文件,后写代码

配置GPIOA时钟,再把三个GPIO引脚配成通用推挽输出。记住位或置一,位于置零。

然后我们想想,初始状态得让他们全关灯,然后一个一个亮,前一个亮,后一个就得灭。

我们需要定义延时函数。

我们这个芯片可以用系统滴答定时器。每滴答一次-1.那么多长时间滴答一次?

CPU主频72MHZ,所以一秒钟72M次滴答,1/72M 秒滴答一次。

这样就可以实现流水灯了。

#include "stm32f10x.h"
//定义延时函数
void delay_ms(u16 ms);
void delay_us(u16 us);
void delay_s(u16 s);int main(void)
{//1.时钟配置,开启GPIOA时钟RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;//2.工作模式配置,PA0 PA1 PA8通用推挽输出  CNF=00,MODE=11GPIOA->CRL&=~GPIO_CRL_CNF0;GPIOA->CRL|=GPIO_CRL_MODE0;GPIOA->CRL&=~GPIO_CRL_CNF1;GPIOA->CRL|=GPIO_CRL_MODE1;GPIOA->CRH&=~GPIO_CRH_CNF8;GPIOA->CRH|=GPIO_CRH_MODE8;//3.初始全高电平,都置1GPIOA->ODR|=GPIO_ODR_ODR0;GPIOA->ODR|=GPIO_ODR_ODR1;GPIOA->ODR|=GPIO_ODR_ODR8;//4.在循环中依次点亮,延迟一段时间关闭while(1){//点亮LED1GPIOA->ODR&=~GPIO_ODR_ODR0;//延时半秒delay_ms(500);//关闭LED1GPIOA->ODR|=GPIO_ODR_ODR0;//点亮LED2GPIOA->ODR&=~GPIO_ODR_ODR1;//延时半秒delay_ms(500);//关闭LED2GPIOA->ODR|=GPIO_ODR_ODR1;//点亮LED3GPIOA->ODR&=~GPIO_ODR_ODR8;//延时半秒delay_ms(500);//关闭LED3GPIOA->ODR|=GPIO_ODR_ODR8;}}void delay_us(u16 us)
{//设置系统定时器的初始计数值SysTick->LOAD=72 * us;//配置系统定时器SysTick->CTRL=0x05;//轮询等待计数值变为0,countflag-1while(!(SysTick->CTRL&SysTick_CTRL_COUNTFLAG)){}
//关闭定时器
SysTick->CTRL&=~SysTick_CTRL_ENABLE;
}void delay_s(u16 s)
{while (s--){delay_ms(1000);}
}void delay_ms(u16 ms)
{while (ms--){delay_us(1000);}}

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

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

相关文章

游戏引擎学习第234天:实现基数排序

回顾并为今天的内容设定背景 我们今天继续进行排序的相关&#xff0c;虽然基本已经完成了&#xff0c;但还是想收尾一下&#xff0c;让整个流程更完整。其实这次排序只是个借口&#xff0c;主要是想顺便聊一聊一些计算机科学的知识点&#xff0c;这些内容在我们项目中平时不会…

计算机网络——常见的网络攻击手段

什么是XSS攻击&#xff0c;如何避免? XSS 攻击&#xff0c;全称跨站脚本攻击&#xff08;Cross-Site Scripting&#xff09;&#xff0c;这会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;因此有人将跨站脚本攻击缩写为XSS。它指的是恶意攻击者往Web页面…

Agent的九种设计模式 介绍

Agent的九种设计模式 介绍 一、ReAct模式 原理:将推理(Reasoning)和行动(Acting)相结合,使Agent能够在推理的指导下采取行动,并根据行动的结果进一步推理,形成一个循环。Agent通过生成一系列的思维链(Thought Chains)来明确推理步骤,并根据推理结果执行相应的动作,…

LeetCode 热题 100:回溯

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xff…

cJSON_Print 和 cJSON_PrintUnformatted的区别

cJSON_Print 和 cJSON_PrintUnformatted 是 cJSON 库中用于将 cJSON 对象转换为 JSON 字符串的两个函数&#xff0c;它们的区别主要在于输出的格式&#xff1a; 1. cJSON_Print 功能&#xff1a;将 cJSON 对象转换为格式化的 JSON 字符串。 特点&#xff1a; 输出的 JSON 字符…

A股周度复盘与下周策略 的deepseek提示词模板

以下是反向整理的股票大盘分析提示词模板&#xff0c;采用结构化框架数据占位符设计&#xff0c;可直接套用每周市场数据&#xff1a; 请根据一下markdown格式的模板&#xff0c;帮我检索整理并输出本周股市复盘和下周投资策略 【A股周度复盘与下周策略提示词模板】 一、市场…

Linux下使用C++获取硬件信息

目录 方法获取CPU信息&#xff1a;读取"/proc/cpuinfo"文件获取磁盘信息&#xff1a;读取"/proc/diskstats"文件获取BIOS信息有两种方法&#xff1a;1、读取文件&#xff1b;2、使用dmidecode命令获取主板信息有两种方法&#xff1a;1、读取文件&#xff1…

BootStrap:进阶使用(其二)

今天我要讲述的是在BootStrap中第二篇关于进一步使用的方法与代码举例; 分页&#xff1a; 对于一些大型网站而言&#xff0c;分页是一个很有必要的存在&#xff0c;如果当数据内容过大时&#xff0c;则需要分页来分担一些&#xff0c;这可以使得大量内容能整合并全面地展示&a…

【技术派后端篇】技术派中的白名单机制:基于Redis的Set实现

在技术派社区中&#xff0c;为了保证文章的质量和社区的良性发展&#xff0c;所有发布的文章都需要经过审核。然而&#xff0c;并非所有作者的文章都需要审核&#xff0c;我们通过白名单机制来优化这一流程。本文将详细介绍技术派中白名单的实现方式&#xff0c;以及如何利用Re…

TRAE.AI 国际版本

国际版下载地址&#xff1a; https://www.trae.ai/https://www.trae.ai/ 国际版本优势&#xff1a;提供更多高校的AI助手模型 Claude-3.5-Sonnet Claude-3.7-Sonnet Gemini-2.5-Pro GPT-4.1 GPT-40 DeepSeek-V3-0324DeepSeek-V3DeepSeek-Reasoner(R1)

关于支付宝网页提示非官方网页

关于支付宝网站提示 非官方网站 需要找官方添加白名单 下面可以直接用自己的邮箱去发送申请 支付宝提示“非支付宝官方网页&#xff0c;请确认是否继续访问”通常是因为支付宝的安全机制检测到您访问的页面不是支付宝官方页面&#xff0c;这可能是由于域名或页面内容不符合支…

【今日三题】打怪(模拟) / 字符串分类(字符串哈希) / 城市群数量(dfs)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 打怪(模拟)字符串分类(字符串哈希)城市群数量(dfs) 打怪(模拟) 打怪 #include <iostream> using namespace std;int …

npm install 版本过高引发错误,请添加 --legacy-peer-deps

起因&#xff1a;由于使用"react": "^19.0.0", 第三方包要低版本react&#xff0c;错解决方法&#xff01; npm install --save emoji-mart emoji-mart/data emoji-mart/react npm install --save emoji-mart emoji-mart/data emoji-mart/react npm err…

Python基础总结(七)之条件语句

文章目录 条件语句if一、Python中的真假二、条件语句格式2.1 if语句格式2.2 if-else语句2.3 if-elif-else语句 三、if语句嵌套 条件语句if 条件语句其实就是if语句&#xff0c;在讲解if语句之前需要知道Python中对于真假的判断。 一、Python中的真假 在Python中非0的都为真&…

基于Ubuntu2504部署OpenStack E版

OpenStack 初始化环境安装数据库、memcahe、rabbitmq等服务安装keystone服务安装glance服务安装placement服务安装nova服务安装neutron服务安装horizon服务 官网 OpenStack Epoxy 巩固了作为 VMware 替代方案的地位&#xff0c;增强了安全性&#xff0c;并改进了硬件支持 第 3…

可发1区的超级创新思路(python 、MATLAB实现):基于多尺度注意力TCN-KAN与小波变换的时间序列预测模型

一、数学模型与原理 1.1 小波变换多尺度分解 输入功率序列 x(t) 经小波变换分解为近似系数 Aj​ 与细节系数 Dj​: 1.2 多尺度TCN特征提取 对每个尺度子序列 {A3​,D3​,D2​,D1​} 采用独立TCN: 式中 ∗d​ 为扩张率 d=2l 的扩张卷积,Wd​ 为可学习参数。 1.3 多尺度注…

YOLOv11改进有效涨点专栏:从理论到实战的深度优化指南

## YOLOv11的进化之路 在目标检测领域,YOLO系列算法始终保持着革命性的创新步伐。YOLOv11作为该系列的最新演进版本,在保持实时检测优势的同时,通过架构层面的深度优化实现了精度与速度的平衡。本文将从**七大核心模块**出发,系统性地解析针对YOLOv11的有效改进方案,涵盖从…

Cursor新版0.49.x发布

小子看到 Cursor 0.49.x 版本正式发布&#xff0c;截止今天已经有两个小patch版本&#xff01;本次更新聚焦于 自动化Rules生成、改进的 Agent Terminal 以及 MCP 图像支持&#xff0c;并带来了一系列旨在提升编码效率和协作能力的改进与修复。 以下是本次更新的详细内容&…

《手环表带保养全攻略:材质、清洁与化学品避坑指南》

系列文章目录 文章目录 系列文章目录前言一、表带材质特性与专属养护方案二、清洁剂使用红黑榜三、家庭清洁实验&#xff1a;化学反应警示录四、保养实践方法论总结 前言 手环作为现代生活的智能伴侣&#xff0c;表带材质选择丰富多样。从柔软亲肤的皮质到耐用耐磨的金属&…

实现批量图片文字识别(python+flask+EasyOCR)

话不多说,向上效果图 1)先说框架版本 为什么要先说框架版本呢,因为我在各种版本中尝试了两天,总算确定了如下版本适合我,至于其他的版本,各位自己去尝试 python 3.9.7 EasyOCR 1.7.2 flask 3.0.3 2)执行操作效果图 2.1)多选文件 2.2)图片预览 2.3)提取选中文件 2.4)提取所有文…