资讯详情

STM32F103C8T6实现流水灯(C语言)

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

在这里插入图片描述 1.2 stm32f103c8t六点亮流水灯原理 寄存器可以存储数据、指令或作为特定功能,stm32板内有许多寄存器。如果要实现流水灯操作,需要操作相应的引脚。如果要操作引脚,需要时钟配置相应的引脚和端口配置(高or低)寄存器配置,端口输出寄存器配置,即步骤

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

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

3.跳到这里,是外设时钟使能寄存器,偏移量为0x18,而在前面一个表可以看到起始地址为0x4002 1000,偏移量为0x所以寄存器的地址是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,这个端口需要打开,所以相应的位置应该是相应的值,我在这里是0x设置推拉输出,最大速度为2万Mhz,以下是相应的代码

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

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

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

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

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

二、编程实现

1.首先创建一个项目:led

勾选配置环境

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

输入代码:

//--------------APB使能时钟寄存器------------------------ #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_AB2ENR|=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语言的同时更好的理解和掌握汇编语言的相关知识。

 

 

 

 

标签: 伟力通t6c内置传感器电池

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台