嵌入式-Stm32-江科大基于寄存器点亮LED灯

文章目录

    • 前言:
    • 一:搭建基于寄存器控制LED的工程
    • 二:用江科大的STM32板子实现基于寄存器点亮LED灯
    • 三:用非江科大stm32板子实现基于寄存器点亮LED灯
      • 道友:一星陨落,黯淡不了星空灿烂;一花凋零,荒芜不了整个春天。

当前stm32的开发方式主要有:
①基于寄存器:最底层,最直接,效率更高,结构复杂,寄存器太多,不太推荐。
②基于标准库(库函数):使用ST官方提供的封装好的函数,通过调用函数来间接地配置寄存器,江科大课程主打基于库函数开发。封装好的函数都在STM32F103x标准外设库(固件库)
③基于HAL库:用图形化界面快速配置STM32,适合快速上手,但隐藏了底层逻辑。

推荐文章
1.《嵌入式-stm32-hal库通过GPIO点LED灯》
2.《嵌入式-stm32-江科大基于标准库通过GPIO点LED灯》

前言:

0.1 原理图
在这里插入图片描述
0.1 STLINK烧录方式

在这里插入图片描述0.2 Keil5内设置STlink烧录方式
在这里插入图片描述
0.3 复位按键reset和run
在这里插入图片描述

一:搭建基于寄存器控制LED的工程

1.1 从0到最终代码截图预览在这里插入图片描述
1.2 从零开始搭建 项目(一步一步)

先newproject,再选芯片ARM→STM32F103C8。

芯片选型
1.3 从stm32固件库复制来的文件

下面主要工作是创建文件夹来存放从固件库复制来的各种文件,第一次比较麻烦,但后续自己开发一般都是复制黏贴上一份项目的文件

项目建好之后,默认就是这个文件夹
在这里插入图片描述

手动在KEIL5内添加文件组

在这里插入图片描述
1.4 文件夹组成

工程文件夹里手动创建Start、User 文件夹,复制固件库里面的部分文件到工程文件夹

①Start部分1:启动文件,位于固件库文件夹.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”。**STM32的程序从启动文件执行。**启动文件选择只需根据下表选择其中一个.s文件

②Start部分2:位于固件库目录“.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”的三个文件。"stm32f10x.h"描述STM32外设寄存器 及其对应的地址 ,作用相当于51单片机中的头文件“REG52.h”。“system_stm32f10x.h”、"system_stm32f10x.c"主要用于配置时钟,比如配置STM32的主频为72MHz。

③Start部分3:位于固件库目录“.\Libraries\CMSIS\CM3\CoreSupport”的两个文件。“core_cm3.h”和“core_cm3.c”是内核寄存器的描述文件,并且还带了一些内核的配置函数。

④User文件夹:存放用户编写的main.c等文件。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
1.5 工程里对应建立Start、User等同名称的分组,然后将文件夹内的文件添加到工程分组里。
带了小钥匙的代表是只读文件,不能修改

下一步是需要有在工程选项里添加这个文件夹的头文件路径,要不然软件是找不到.h文件的

Strart分组:注意启动文件的选择,只需根据下表选择其中一个.s文件。

在这里插入图片描述

User分组:注意添加main.c文件时,路径要选上User文件夹,否则默认路径在文件外。下面给出main.c文件中的代码:

#include "stm32f10x.h"                  // Device header
int main(void){
 while(1){
 }
}
//注意最后一行必须是空着

1.6 工程选项,C/C++.Include Paths内声明所有包含头文件的文件夹,否则软件找不到.h文件。 点击魔术棒按钮→C/C++→Include Path →右侧的三个点按钮,添加对应的文件夹即可

在这里插入图片描述

必须要添加这个头文件,相当于这个是51单片机的“reg52.h”

在这里插入图片描述

二:用江科大的STM32板子实现基于寄存器点亮LED灯

Cortex-M3 →系统总线 →AHB总线 → 桥接2 →GPIOC→PC13

#include "stm32f10x.h"                  // Device header

int main(void){
  //配置RCC寄存器,使能GPIOC的时钟。GPIO都属于APB2外设
  RCC->APB2ENR = 0x00000010;
  //配置寄存器PC13:通用推挽输出模式、输出模式50MHz
  GPIOC->CRH = 0x00300000;
  //输出数据寄存器PC13:
  GPIOC->ODR = 0x00002000;//LED灭
//  GPIOC->ODR = 0x00000000;//LED亮
  while(1){}
}


在这里插入图片描述

在这里插入图片描述在这里插入图片描述

GPIO都是APB2的外设 第一: //配置RCC寄存器,使能GPIOC的时钟。GPIO都属于APB2外设 RCC->APB2ENR= 0x00000010;

在这里插入图片描述

第二: //配置寄存器PC13:通用推挽输出模式、输出模式50MHz GPIOC->CRH = 0x00300000;

因为这里是PC13端口,0-7是低位寄存器,8-15位是高寄存器,所以用来配置高寄存器

在这里插入图片描述

二进制和16进制的转换,4位换1位

在这里插入图片描述

三:用非江科大stm32板子实现基于寄存器点亮LED灯

3.1 复制前面项目,只修改main.c内代码

#include "stm32f10x.h"

int main(void)
{
	while(1)
	{
//	//配置RCC寄存器,使能GPIOC的时钟。GPIO都属于APB2外设
//		RCC->APB2ENR = 0x00000010;
//	//配置寄存器PC13:通用推挽输出模式、输出模式50MHZ
//	GPIOC->CRH = 0x00300000;
//	//输出数据寄存器PC13:
//	GPIOC->ODR = 0x00000000;//led亮
		
		
		
	//配置RCC寄存器,使能GPIOB的时钟。GPIO都属于APB2外设
		RCC->APB2ENR = 0x00000008;
	//配置寄存器PB8:通用推挽输出模式、输出模式50MHZ
	GPIOB->CRH = 0x00000003;
	
	//输出数据寄存器PB8 :
	GPIOB->ODR = 0x00000100;//led灭
	GPIOB->ODR = 0x00000000;//led亮
		while(1){}
	
	}
}

3.2 根据自己板子的原理图点灯

Cortex-M3 →系统总线 →AHB总线 → 桥接2 →GPIOB→PB8→LED1

选用PB8控制LED1

在这里插入图片描述

3.3 看数据手册

配置RCC(APB2外设时钟使能寄存器)→GPIO端口配置高寄存器→GPIO端口输出数据寄存器

图3.31 RCC->APB2ENR = 0x00000008;

配置RCC(APB2外设时钟使能寄存器),GPIO是由APB2控制的,IOPB就是控制B组,置1,其余都是0

图3.32 GPIOB->CRH = 0x00000003;

GPIO端口配置高寄存器,0-7 是低位,8-15是高位,我们要控制PB8,8是高位

图3.33GPIOB->ODR = 0x00000100;//led灭

GPIO端口输出数据寄存器,图二控制GPIO的B组,图三控制GPIO的B组的8引脚

以上就是STM32基于寄存器开发的方式,简单了解就行。

参考博主:虎慕
推荐文章
1.《嵌入式-stm32-hal库通过GPIO点LED灯》
2.《嵌入式-stm32-江科大基于标准库通过GPIO点LED灯》

道友:一星陨落,黯淡不了星空灿烂;一花凋零,荒芜不了整个春天。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

认识Linux指令之 “find grep” 命令

01.find指令: -name Linux下find命令在目录结构中搜索文件,并执行指定的操作。 Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来…

Set和Map

一、Set的介绍 1.1、Set相关文档介绍 cplusplus.com/reference/set/set/?kwset 1. set是按照一定次序存储元素的容器 2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。 set中的元素不能在容器中修改…

iOS14 Widget 小组件调研

桌面小组件是iOS14推出的一种新的桌面内容展现形式。 根据苹果的统计数据,“一般用户每天进入主屏幕的次数超过90次”,如果有一个我们应用的小组件在桌面,每天都有超过90次曝光在用户眼前的机会,这绝对是一个顶级的流量入口。 “…

世邦通信 SPON IP网络对讲广播系统uploadjson.php任意文件上传漏洞

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统uploadjson.php存在任意文件上传漏洞,攻击者可以通过构造特殊请求包上传恶意后门…

【NLP】多标签分类【上】

简介 《【NLP】多标签分类》主要介绍利用三种机器学习方法和一种序列生成方法来解决多标签分类问题(包含实验与对应代码)。共分为上下两篇,上篇聚焦三种机器学习方法,分别是:Binary Relevance (BR)、Classifier Chain…

python 爬虫 request get或post传参

爬虫传参 import requestsurl http://www.xxx# get 或 post 传参数据 data {"pageNo": 1652,"pageSize": 10, }headers {Cookie: ,Host: ,Origin: ,Referer: ,User-Agent: , }# get 请求 # res requests.get( # url, # paramsdata, # hea…

PINN物理信息网络 | 泊松方程的物理信息神经网络PINN解法

基本介绍 泊松方程是一种常见的偏微分方程,它在物理学和工程学中具有广泛的应用。它描述了在某个区域内的标量场的分布与该场在该区域边界上的值之间的关系。 物理信息神经网络(PINN)是一种结合了物理定律和神经网络的方法,用于…

机器学习---流形学习

1. 流形学习 作为机器学习研究的热点问题之一,流形学习是要从高维数据集中发现内在的低维流形,并基于低 维流形来实现随后的各种机器学习任务,如模式识别,聚类分析。与欧氏空间不同,流形学习主要 处理的是非欧空间里…

spark基础--学习笔记

1 spark 介绍 1.1 spark概念 Apache Spark是专为大规模数据处理而设计的快速通用的分布式计算引擎,是开源的类Hadoop MapReduce的通用分布式计算框架。和MapReduce一样,都是完成大规模数据的计算处理。 简而言之,Spark 借鉴了 MapReduce思…

Mysql是怎么运行的(上)

文章目录 Mysql是怎么运行的Mysql处理一条语句的流程连接管理解析与优化存储引擎 基本配置配置文件系统变量状态变量字符集四种重要的字符集MySQL中的utf8和utf8mb4各级别的字符集和比较规则MySQL中字符集的转换排序规则产生的不同的排序结果 InnoDB存储引擎介绍COMPACT行格式介…

06.构建大型语言模型步骤

在本章中,我们为理解LLMs奠定了基础。在本书的其余部分,我们将从头开始编写一个代码。我们将以 GPT 背后的基本思想为蓝图,分三个阶段解决这个问题,如图 1.9 所示。 图 1.9 本书中介绍的构建LLMs阶段包括实现LLM架构和数据准备过程、预训练以创建基础模型,以及微调基础模…

HarmonyOS应用开发学习笔记 UI布局学习 List(){}创建列表 列表形式显示 简单使用

List 创建列表 列表形式显示 官方文档:创建列表(List) 关键代码 List(){} 列表控件ListItem() {} 子元素 例如 1、简单使用代码 List(){} List() {ListItem() {Row() {Image($r(app.media.iconE)).width(40).height(40).margin(10)Tex…

继承详细说明

概述 Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。 例如:public class Student extends People {} Student称为子类(派生类),People称为父类(基类 或超类)。 …

分布式系统架构设计之分布式消息队列 VS 分布式事务

1、分布式事务的挑战 在分布式系统中,事务的处理变得尤为复杂,传统的数据库事务(ACID)在单一数据库中可以确保数据的完整性和一致性,但在多个分布式节点间保证事务的原子性、一致性、隔离性和持久性变得极具挑战性。 …

【Go】excelize库实现excel导入导出封装(三),基于excel模板导出excel

前言 大家好,这里是符华~ 关于excelize库实现excel导入导出封装,我已经写了两篇了,我想要的功能基本已经实现了,现在还差一个模板导出,这篇文章就来讲讲如何实现用模板导出excel。 前两篇: 【Go】excel…

作业:通过两台linux主机配置ssh实现互相免密登陆

做题步骤: 一.开启两个Linux主机,并且用ssh连接,要能够ping通 我这里是server:192.168.81.129 client:192.168.81.130 举例 步骤: 1.安装服务软件 2.运行软件程序 3.根据自定配置提供对应的服务/etc/chr…

02.构建和使用的大型语言模型(LLMs)阶段

我们为什么要建立自己的LLMs?LLM从头开始编码是了解其机制和局限性的绝佳练习。此外,它还为我们提供了必要的知识,可以保留或微调现有的开源LLM架构,以适应我们自己的特定领域的数据集或任务。 研究表明,在建模性能方面,定制(LLMs为特定任务或领域量身定制的)可以胜过…

如何高效阅读Linux的man page

有时候需要在man page中查某个命令的用法,我们一般会使用man command的方式来查询,例如man vmstat.但是对于一些bash内置的命令,如alias,如果使用man alias会打开General Commands Manual ,如下图 可以看到,内置命令很多&#xff…

如何通过 Prompt 优化大模型 Text2SQL 的效果

前言 在上篇文章中「大模型LLM在Text2SQL上的应用实践」介绍了基于SQLDatabaseChain的Text2SQL实践,但对于逻辑复杂的查询在稳定性、可靠性、安全性方面可能无法达到预期,比如输出幻觉、数据安全、用户输入错误等问题。 本文将从以下4个方面探讨通过Pr…

用于生成信息提取的大型语言模型综述

论文地址:https://arxiv.org/pdf/2312.17617.pdf 代码仓库:https://github.com/quqxui/Awesome-LLM4IE-Papers 信息抽取(IE)旨在从纯自然语言文本中提取结构化知识(如实体、关系和事件)。最近&#xff0c…