嵌入式-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 headerint main(void){//配置RCC寄存器,使能GPIOC的时钟。GPIO都属于APB2外设RCC->APB2ENR = 0x00000010;//配置寄存器PC13:通用推挽输出模式、输出模式50MHzGPIOC->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:通用推挽输出模式、输出模式50MHZGPIOB->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灯》

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

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

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

相关文章

Flume 之自定义 Source

1、简介 Flume 自带 Source 有 Avro、Thrift、Netcat、Taildir、Kafka、Http等,有些场合比如我们指定访问接口获取数据当做 Flume 的 Source,像这种定制化的 Source 需要我们自己实现,下面我将介绍如何自定义实现 Source。 2、自定义实现 Fl…

Git 是什么?

Git 是什么? Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,…

Cesium 模型压平

最近整理了下手上的代码,以下是对模型压平的说明。 原理是使用了customShader来重新设置了模型的着色器,通过修改模型顶点的坐标来实现了压平。 废话不多说,下面上代码: /*** class* description 3dtiles模型压平*/ class Flat…

推荐给前端程序员的5款浏览器插件

所谓“工欲善其事,必先利其器”。Chrome(谷歌浏览器) 应该是程序员或者互联网行业人员使用最多的浏览器了。而在日常开发中,下面几款 浏览器 扩展也许能让你的开发工作事半功倍 。 1、Vimium vimium 是一个旨在将你的双手从鼠标…

C++核心编程(包含:内存、函数、引用、类与对象、文件操作等)【持续更新】

🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 C核心编程🌏1 内存分区模型🎄1.1 程序运行前🎄1.2 程序运行后🎄1.3 new操作符 🌏2 引用🎄2.1 引用的基…

【Golang开源项目】Golang高性能内存缓存库BigCache设计与分析

项目地址 BigCache 是一个快速,支持并发访问,自淘汰的内存型缓存,可以在存储大量元素时依然保持高性能。BigCache将元素保存在堆上却避免了GC的开销。 背景介绍 BigCache的作者在项目里遇到了如下的需求: 支持http协议支持 10…

Linux shell编程学习笔记39:df命令

0 前言1 df命令的功能、格式和选项说明 1.1 df命令的功能1.2 df命令的格式1.3 df命令选项说明 2 df命令使用实例 2.1 df:显示主要文件系统信息2.2 df -a:显示所有文件系统信息2.3 df -t[]TYPE或--type[]TYPE:显示TYPE指定类型的文件系统信…

解决英特尔无线网卡WiFi或者蓝牙突然消失问题

winR,输入“devmgmt.msc”,检查设备管理器中的无线网卡驱动是否安装好。 访问https://www.intel.cn/content/www/cn/zh/download/19351/windows-10-and-windows-11-wi-fi-drivers-for-intel-wireless-adapters.html下载对应系统版本的英特尔无线网卡WiFi…

遇到问题不要慌,轻松搞定内存泄露

当一个系统在发生 OOM 的时候,行为可能会让你感到非常困惑。因为 JVM 是运行在操作系统之上的,操作系统的一些限制,会严重影响 JVM 的行为。故障排查是一个综合性的技术问题,在日常工作中要增加自己的知识广度。多总结、多思考、多…

基于PyQT的图片批处理系统

项目背景: 随着数字摄影技术的普及,人们拍摄和处理大量图片的需求也越来越高。为了提高效率,开发一个基于 PyQt 的图片批处理系统是很有意义的。该系统可以提供一系列图像增强、滤波、水印、翻转、放大缩小、旋转等功能,使用户能够…

SpringBoot:详解依赖注入和使用配置文件

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、&#x1f3…

力扣精选算法100题——等于目标值的两个数or三数之和(双指针专题)

目录 🚩等于目标值的俩个数 第一步:了解题意 第二步:算法原理 第三步:代码实现 🚩三数之和 第一步:了解题意 第二步:算法原理 思路: ❗不漏: ❗去重: &#xf…

Simulink旧版本如何打开新版的模型文件

Simulink旧版本如何打开新版的模型文件 当用旧版本Simulink软件打开模型时会报错,是因为版本不兼容造成的 解决办法 在simulink的选项中去掉 do not load models created with newer version of Simulink

计算机视觉的应用

计算机视觉(Computer Vision)是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说,计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标,计算机视觉结合了图像处理、机器学习、模…

分享用 vector的vector实现一个二维数组并初始化的逆置矩阵问题

题目名称 867.转置矩阵 目录 题目名称 867.转置矩阵 1.题目 2.题目分析 3.题目知识点 3.1vector的构造函数 3.2vector构造二维数组 最后💐 推荐阅读顺序: 1.题目->2.题目分析->3.题目知识点 1.题目 如果矩阵 matrix为 m 行 n列,则转置后的矩…

【Python学习】Python学习15-模块

目录 【Python学习】Python学习15-模块 前言创建语法引入模块from…import 语句from…import* 语句搜索路径PYTHONPATH 变量-*- coding: UTF-8 -*-导入模块现在可以调用模块里包含的函数了PYTHONPATH 变量命名空间和作用域dir()函数globals() 和 locals() 函数reload() 函数Py…

Python中如何简化if...else...语句

一、引言 我们通常在Python中采用if...else..语句对结果进行判断,根据条件来返回不同的结果,如下面的例子。这段代码是一个简单的Python代码片段,让用户输入姓名并将其赋值给变量user_input。我们能不能把这几行代码进行简化,优化…

RocketMQ源码阅读-Message拉取与消费-Consumer篇

RocketMQ源码阅读-Message拉取与消费-Consumer篇 1. Consumer2. PushConsumer3. PushConsumer 订阅3.1 subscribe订阅3.2 registerMessageListener注册监听器 4. PushConsumer 消息队列Rebalance4.1 Rebalance流程4.2 Rebalance策略AllocateMessageQueueAveragelyAllocateMessa…

CSS 动态邮件查收效果

<template><view class="content"><view class="tooltip-container"><text class="tooltip">查看</text><text class="text">@</text></view></view> </template><sc…

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf 症状 Visual Studio调试模式下&#xff0c;程序停在断点时&#xff0c;我临时需要将ppt转为pdf&#xff0c;遂右键单击文件&#xff0c;想直接转pdf&#xff0c;奈何光标转了几秒钟&#xff0c;毫无反应。 解决方法 …