IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F103寄存器方式点亮LED流水灯 -> 正文阅读

[嵌入式]STM32F103寄存器方式点亮LED流水灯

目录

一、STM32F103系列芯片的地址映射和寄存器映射原理和GPIO端口的初始化设置三步骤

1.STM32F103的存储器映射&寄存器映射

存储器映射

???????? 寄存器映射

2.GPIO端口的初始化设置三步骤

二、以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红黄绿LED 灯搭建电路,轮流闪烁,间隔时长1秒。?

1.STM32核心板原理图

2.安装CH340-driver驱动

3.检查端口

4.将核心板的BOOT调为1,0

5.搭建流水灯电路

6.代码实现并进行烧录

7.最终结果演示

三、总结

四、参考链接


一、STM32F103系列芯片的地址映射和寄存器映射原理和GPIO端口的初始化设置三步骤

1.STM32F103的存储器映射&寄存器映射

存储器映射

??????? 在STM32内部的每个内存块存放不同的功能,而每个内存块都有地址。每个内存块中又分为好几个内存块,每个内存块有不同的寄存器,一个地址存放4个字节,在STM32内存中,1个地址存放32位的寄存器,有的寄存器有可能用不到32位(地址之间都相差4,比如第一个地址为0x00,那第二个地址为0x04),只用其中的低16位,那高16位将被保。外设内存块中,GPIO的内存块,在这个内存块中又分为GPIOA内存块,GPIOB内存块等等,内存块中存放的就是一些寄存器,每4个地址存放一个32位的寄存器。偏移地址是基于每个最小内存块(就是像GPIOA,GPIOB之类的内存块)的首地址。每个最小内存块都有地址范围,且GPIO内存块的首地址就是GPIOA内存块的首地址。

?

?

?

寄存器映射

寄存器映射:给具有特殊功能的内存块的首地址取一个具有特殊意义名称的过程就叫做寄存器映射。??????

?????? 学过C语言的同学都知道指针,我们要想取地址中的值必须利用指针,比如GPIOA_OTYPER寄存器的偏移地址为0x04,且GPIOA内存块的首地址为0X4000 0000,那么我们就可以利用下面的方式来取寄存器中的值。

首先我们知道GPIOA_OTYPER寄存器的地址为(0x04+0x4000 0000),这样写还不够,因为编译器并不知道这是地址,所以我们利用指针将其转成地址(unsigned int *)(0x04+0x4000 0000),最后我们再利用指针*(unsigned int *)(0x04+0x4000 0000)就可以读写寄存器了。

#define??GPIOA_OTYPER? ? ??*(unsigned int *)(0x04+0x4000 0000)这就是寄存器映射。

2.GPIO端口的初始化设置三步骤

GPIO端口初始化时,需要下面的步骤:

  1. 使能GPIO时钟,RCC_APB2PeriphClockCmd。

  2. 设置GPIO参数:输出OR输入,工作模式,端口翻转速率;

  3. 调用初始化函数:GPIO_Init

二、以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红黄绿LED 灯搭建电路,轮流闪烁,间隔时长1秒。?

1.STM32核心板原理图

2.安装CH340-driver驱动

3.检查端口

右击我的电脑,点击管理,点击设备管理器查看端口

4.将核心板的BOOT调为1,0

5.搭建流水灯电路

对于USB转TTL模块和stm32f103c8t6连接

GND — GND,3v3 — 3v3,TXD — A10,RXD — A9,黄灯—A0,绿灯—B0,红灯—C15

6.代码实现并进行烧录

1.新建项目
点击Project下的New uVision Project:,然后选择项目路径,填写文件名。
选择芯片:

?

?在右边文件夹添加新文件:

选择一个.c文件进行创建。

之后将所需要的启动文件复制到项目目录下(f103c8t6启动文件为startup_stm32f10x_md.s:

然后将其添加到文件夹:

?

?最终结果:

?打开魔术棒,如下图所示勾选Create HEX File:

?

?输入代码:

#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800

#define RCC_APB2ENR (*(unsigned int *)0x40021018)

#define GPIOB_CRL (*(unsigned int *)0x40010C00)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)

#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
	


void SystemInit(void);
void Delay_ms(volatile  unsigned  int);

void Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}


int main(){
	// 开启时钟
	RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
	RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
	RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
	
	
	// 设置 GPIO 为推挽输出
	// 设置 GPIOB 最后四位为 0001 (B0)
	GPIOB_CRL |= (1<<0);  // 最后一位设置为1
	GPIOB_CRL &= ~(0xE);  // 倒数二、三、四位设置为0
	// 设置 GPIOC 前四位为 0001  (C15)
	GPIOC_CRH |= (1<<28); // 第四位设置为1
	GPIOC_CRH &= ~(0xE0000000);  // 前三位设置为0
	// 设置 GPIOA 最后四位为 0001 (A0)
	GPIOA_CRL |= (1<<0);  // 最后一位设置为1
	GPIOA_CRL &= ~(0xE);  // 倒数二、三、四位设置为0

	
	// 3个LED初始化为不亮(即高点位)
	GPIOB_ODR |= (1<<0);  // 最后一位设置为1
	GPIOC_ODR |= (1<<15); // 倒数第15位设置为1
	GPIOA_ODR |= (1<<0);  // 最后一位设置为1
	
	
	while(1){
		GPIOB_ODR &= ~(1<<0); // 点灯1
		Delay_ms(1000000);
		GPIOB_ODR |= (1<<0);  // 灭灯1
		Delay_ms(1000000);
		
		GPIOC_ODR &= ~(1<<15); // 点灯2
		Delay_ms(1000000);
		GPIOC_ODR |= (1<<15);  // 灭灯2
		Delay_ms(1000000);
		
		GPIOA_ODR &= ~(1<<0); // 点灯3
		Delay_ms(1000000);
		GPIOA_ODR |= (1<<0);  // 灭灯3
		Delay_ms(1000000);
		
	}
	
}


void SystemInit(){
	
}

核心板由8个管脚控制,因此首先必须进行初始化8个引脚。先开启GPIOB,GPIOC,GPIOA时钟,然后依次设置参数,然后为了实现流水效果,我的原理是依次让每个灯亮,每个灯之间添加延时函数Delay_ms进行点灯和灭灯操作,以实现流水的效果。

进行编译并生成了LED.hex文件

?将面包板和USB连接到电脑,打开mcuisp,上传HEX文件到stm32f103c8t6上并烧录:

?7.最终结果演示

三、总结

???? ?? 本次流水灯实验难度相对较大,对于我来说比较困难的几个点在于:电路的搭建和端口识别问题,但这些问题都在同学和论坛大佬的帮助下一一解决了。随着学的东西越高级,我就越能体会到基础的重要,不能害怕BUG,因为错,才会有经验。我应该学会和同学讨论,交流出新知,利用网上的教学视频和博客。通过本实验的学习,我对C语言调用函数参数的传递方式以及寄存器使用方法有了更加深刻的理解。

四、参考链接

STM32------寄存器映射和存储器映射 - crazyyang - 博客园

STM32最小核心板F103串口通信USART_vic_to_ry的博客-CSDN博客

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:40:09  更:2021-10-25 12:40:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:33:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码