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

嵌入式-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灯》

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

相关文章:

  • docker 批量更改镜像标签
  • Quartus 软件界面介绍与部分使用技巧
  • 【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
  • 【迅搜17】SCWS分词(二)自定义字典及分词器
  • 【Matlab】加载路径下所有指定文件
  • go中常见的错误-以及泛型
  • DeepFloyd IF:由文本生成图像的强大模型,能够绘制文字的 AI 图像工具
  • 9.5.1 函数模板特化
  • 使用Android Compose实现网格列表滑到底部的提示信息展示
  • 常用Java代码-Java中的并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)
  • Sqoop的增量数据加载策略与示例
  • 解决Unexpected record signature 0X9maven 资源过滤
  • jar包部署到linux虚拟机的docker中之后连不上mysql
  • 【Spring实战】28 @Autowired 和 @Resource注解的区别与使用
  • Linux完全卸载Anaconda3和MiniConda3
  • 03Go 类型总结
  • If…else
  • JAVA多线程机制解析-volatilesynchronized
  • Nodejs和JavaWeb协助开发
  • React系列之 Redux 架构模式
  • scrapy学习之路4(itemloder的使用)
  • Spring Boot快速入门(一):Hello Spring Boot
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 订阅Forge Viewer所有的事件
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 你对linux中grep命令知道多少?
  • Java总结 - String - 这篇请使劲喷我
  • Linux权限管理(week1_day5)--技术流ken
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #### go map 底层结构 ####
  • #define与typedef区别
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (7)摄像机和云台
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (十一)手动添加用户和文件的特殊权限
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (新)网络工程师考点串讲与真题详解
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)jdk与jre的区别
  • ./configure,make,make install的作用(转)
  • .gitignore文件_Git:.gitignore
  • .net mvc 获取url中controller和action
  • .NET MVC第三章、三种传值方式
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .net6Api后台+uniapp导出Excel
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /boot 内存空间不够
  • @GetMapping和@RequestMapping的区别
  • @PreAuthorize与@Secured注解的区别是什么?
  • @selector(..)警告提示