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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F103C8T6实现流水灯(C语言) -> 正文阅读

[嵌入式]STM32F103C8T6实现流水灯(C语言)

一、实验原理
1.1 stm32f103c8t6介绍
STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。

在这里插入图片描述
1.2 stm32f103c8t6点亮流水灯原理
寄存器可以存储数据,指令,也可以担任一些特定的功能,stm32板子里由很多寄存器,如果想实现流水灯操作,就需要对相应的引脚进行操作,想对引脚进行操作,就需要对相应的引脚进行时钟使能配置、端口配置(高or低)寄存器配置、端口输出寄存器配置,也就是一下步骤

?

1.因为流水灯要操作的引脚都是在GPIO端口的,所以根据系统结构图,属于AHB总线,所以所要用的端口的复位和时间控制都受RCC控制。

在这里插入图片描述

?

2.再看寄存器组起始地址表,可以看到RCC的地址范围,且可以看到要控制的寄存器都是在APB2总。

在这里插入图片描述

?

3.跳到这里,就是外设时钟使能寄存器,,偏移量为0x18,而在前面一个表可以看到起始地址为0x4002 1000,偏移量为0x18,所以该寄存器的地址为0x4002 1018

在这里插入图片描述

?

4.图中圈处理就是该寄存器里各位的含义,比如第三位也就是2那个位置为1时,就是GPIOA的时钟开启了。这时我们就可以用代码表达出来了,以PA7引脚为例

#define RCC_AP2ENR	*((unsigned volatile int*)0x40021018) #时钟使能寄存器
RCC_AP2ENR|=1<<2;			//开启APB2-GPIOA外设时钟使能


5.接下来就是配置端口配置寄存器了,这个就比较关键了,可以发现上面的时钟使能寄存器开启时钟是针对一个区域的,并不能确定引脚,而这个寄存器就是确定引脚的,端口配置寄存器有两个,分别为端口配置低寄存器(CRL)和端口配置高寄存器(CRH),每四位配置一个端口,如11 01,11就是选择开启功能,01就是选择模式和确定最大速度,但有一点不一样,低寄存器的偏移地址为0x00,高寄存器的偏移地址为0x04

在这里插入图片描述

?在这里插入图片描述

?

6.以PA7为示例,相应端口配置器GPIOA_CRL地址为GPIOA的基址+上偏移量,为0x40010800,而这个端口要开启,所以要使对应位为相应的值,我这里是0x20000000,设置推挽输出并设置最大速度为2Mhz,下面为相应代码

#define GPIOA_CRL?? ?*((unsigned volatile int*)0x40010800)
GPIOA_CRL=0x20000000;?? ??? ?//PA7推挽输出,2Mhz



7.接下来就是配置端口输出寄存器(ORD),可以看到偏移量为0xc,所以该寄存器的地址等于端口的基址加上偏移量,在相应的位赋值可以控制输出电压,0为低电压,1为高电压,以pa7引脚为例子,想要输出高电压,就需要在第八位赋1。

代码如下,有位操作,不熟悉自行查阅:

#define	GPIOA_ORD	*((unsigned volatile int*)0x4001080C)
GPIOA_ORD|=1<<7;			//设置初始灯为亮



8.这里就可以控制led亮或者灭了,实现流水灯只需增加灯的数量和增加一些延时就行了。

二、编程实现

1.首先创造一个工程:led

勾选配置环境

?

?2.然后再创造一个.c文件:led.c?

输入代码:

//--------------APB2使能时钟寄存器------------------------
#define RCC_AP2ENR	*((unsigned volatile int*)0x40021018)
	//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRL	*((unsigned volatile int*)0x40010800)
#define	GPIOA_ORD	*((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRH	*((unsigned volatile int*)0x40010C04)
#define	GPIOB_ORD	*((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH	*((unsigned volatile int*)0x40011004)
#define	GPIOC_ORD	*((unsigned volatile int*)0x4001100C)
//-------------------简单的延时函数-----------------------
void  Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
	GPIOA_ORD=0x0<<7;		//PA7低电平
	GPIOB_ORD=0x1<<9;		//PB9高电平
	GPIOC_ORD=0x1<<15;		//PC15高电平
}
void B_LED_LIGHT(){
	GPIOA_ORD=0x1<<7;		//PA7高电平
	GPIOB_ORD=0x0<<9;		//PB9低电平
	GPIOC_ORD=0x1<<15;		//PC15高电平
}
void C_LED_LIGHT(){
	GPIOA_ORD=0x1<<7;		//PA7高电平
	GPIOB_ORD=0x1<<9;		//PB9高电平
	GPIOC_ORD=0x0<<15;		//PC15低电平	
}
//------------------------主函数--------------------------
int main()
{
	int j=100;
	RCC_AP2ENR|=1<<2;			//APB2-GPIOA外设时钟使能
	RCC_AP2ENR|=1<<3;			//APB2-GPIOB外设时钟使能	
	RCC_AP2ENR|=1<<4;			//APB2-GPIOC外设时钟使能
	//这两行代码可以合为 RCC_APB2ENR|=1<<3|1<<4;
	GPIOA_CRL&=0x0FFFFFFF;		//设置位 清零	
	GPIOA_CRL|=0x20000000;		//PA7推挽输出
	GPIOA_ORD|=1<<7;			//设置PA7初始灯为灭
	
	GPIOB_CRH&=0xFFFFFF0F;		//设置位 清零	
	GPIOB_CRH|=0x00000020;		//PB9推挽输出
	GPIOB_ORD|=1<<9;			//设置初始灯为灭
	
	GPIOC_CRH&=0x0FFFFFFF;		//设置位 清零
	GPIOC_CRH|=0x30000000;   	//PC15推挽输出
	GPIOC_ORD|=0x1<<15;			//设置初始灯为灭	
	while(j)
	{	
		A_LED_LIGHT();	
		Delay_ms(10000000);
		B_LED_LIGHT();
		Delay_ms(10000000);
		C_LED_LIGHT();
		Delay_ms(10000000);
	}
}


3.编译后点击魔法棒,然后生成hex文件

?

?4.根据网上教程下载安装仿真软件flymcu

?

5.电路按此图拼装好?

?

?

6.勾选校验、编程后执行,点击开始编程(同时把编程到FLASH时写选项字节勾选掉)?

?

?

?7.进行运行

三、总结

?

?通过本实验的学习,我对C语言调用函数参数的传递方式以及ARM寄存器使用方法有了更加深刻的理解,其实汇编语言和C语言有很多共通之处,我们可以在学习C语言的同时更好的理解和掌握汇编语言的相关知识。

?

?

?

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:39:15  更:2021-10-23 12:41:22 
 
开发: 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:20:14-

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