STM32F103C8T6寄存器简单应用(流水灯)

一、STM32寄存器

STM32F103C8T6

(1)微控制器

STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。

(2)基本参数

类别:集成电路(IC)
家族:嵌入式-微控制器
总线宽度:32-位
速度:72MHz
外围设备:DMA,电机控制PWM,PWM,温度传感器
输入/输出数:37
程序存储器容量:64KB (64K x 8)
程序存储器类型:FLASH
RAM容量:20K x 8
电压-电源(Vcc/Vdd):2 V ~ 3.6 V
模数转换器:A/D 10x12b
振荡器型:内部

(3)引脚图

在这里插入图片描述

(4)具体结构

STM32F103C8T6整个系统结构可以分为由ARM公司设计的Cortex-M3内核和ST公司在此基础上优化的总线矩阵、DMA(Direct Memory Access,直接内存读取)、AHB、APB1以及APB2上挂载的外设等两个部分

在这里插入图片描述

二、STM32LED实例

1、GPIO端口初始化

(1)时钟配置

1、本次实验我们选中GPIO的A、B、C三个端口。
找到使能时钟寄存器映射地址:

在这里插入图片描述

A、B、C端口寄存器地址:

在这里插入图片描述

2、找到偏移地址和A、B、C端口位置:

在这里插入图片描述

3、对应端口时钟代码

//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR		*((unsigned volatile int*)0x40021018)

	RCC_APB2ENR|=1<<2|1<<3|1<<4;			//APB2-GPIOA、GPIOB、GPIOC外设时钟使能	

(2)输入输出模式和输出速率配置

1、本实验需要用到A4、B5、C14引脚

采用推挽输出模式,输出模式,最大速度为2MHz

在这里插入图片描述

2、配置对应引脚寄存器,基地址+偏移量,代码为

//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL		*((unsigned volatile int*)0x40010800)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL		*((unsigned volatile int*)0x40010C00)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH		*((unsigned volatile int*)0x40011004)

3、设置输出模式为推挽输出,输出速度为2Mhz,代码为

	GPIOA_CRL&=0xFFF0FFFF;		//设置位 清零	
	GPIOA_CRL|=0x00020000;		//PA4推挽输出,把第19、18、17、16位变为0010
	
	GPIOB_CRL&=0xFF0FFFFF;		//设置位 清零	
	GPIOB_CRL|=0x00200000;		//PB5推挽输出,把第23、22、21、20变为0010
	 
	GPIOC_CRH&=0xFF0FFFFF;		//设置位 清零	
	GPIOC_CRH|=0x00200000;		//PC14推挽输出,把第23、22、21、20变为0010

2、工程文件创立

(1)创建工程

1、创建新文件LSD

在这里插入图片描述

2、选择STM32F103C8
点击OK后,Manage Run-Time Environment界面我们选择cancel
在这里插入图片描述

3、加入启动代码
将startup_stm32f10x_md.s文件拷贝到LSD文件夹里面
在这里插入图片描述4、加入文件
添加完毕后,在LSD文件下新建两个文件夹分别用于存放不同的文件,以防止混乱
在这里插入图片描述
5、将下载的SYSTEM代码复制过来

在这里插入图片描述
6、打开keil点击Target1,点击Manage Project Items,添加如下文件
在这里插入图片描述
7、在USER下加入一个main.c文件
在这里插入图片描述
8、点击魔法棒,选择output选项
在这里插入图片描述
然后再点击Listing
在这里插入图片描述
9、加入sys、delay、usart的include路径:
在这里插入图片描述
这样,一个完整的 STM32F1 开发工程模板下建立好了。接下来我们就可以进行代码下载和仿真调试了。

(2)代码

1、在USER文件下新建两个文件为led.c和led.h
在这里插入图片描述
2、led.c内编写程序

#include "led.h"
//初始化 PB1 PC4 PD8为输出口.并使能这三个口的时钟 
//LED IO 初始化
void LED_Init(void)
{
    
    
	RCC->APB2ENR|=1<<2; //使能 PORTA 时钟 
	RCC->APB2ENR|=1<<3; //使能 PORTB 时钟 
//	RCC->APB2ENR|=1<<4; //使能 PORTC 时钟
//	RCC->APB2ENR|=1<<5; //使能 PORTD 时钟	
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5 推挽输出 
	GPIOB->ODR|=1<<5; //PB.5 输出高 
	
	GPIOB->CRL&=0XFFFFFFF0; 
	GPIOB->CRL|=0X00000003;//PB.0 推挽输出 
	GPIOB->ODR|=1<<0; //PB.0 输出高
	
	GPIOA->CRL&=0XFFFFFF0F; 
	GPIOA->CRL|=0X00000030;//PA.1 推挽输出 
	GPIOA->ODR|=1<<1; //PA.1 输出高
}

led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PBout(5) // DS0
#define LED1 PBout(0) // DS1
#define LED2 PAout(1) // DS2
void LED_Init(void); //初始化 
#endif

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
int main(void)
{
    
     
	Stm32_Clock_Init(9); //系统时钟设置
	delay_init(72); //延时初始化
	LED_Init(); //初始化与 LED 连接的硬件接口
	while(1)
	{
    
    
		LED0=0;
		LED1=1;
		LED2=1;
		delay_ms(1000);
		LED0=1;
		LED1=0;
		LED2=1;
		delay_ms(1000);
		LED0=1;
		LED1=1;
		LED2=0;
		delay_ms(1000);
	} 
}

3、点击编译

在这里插入图片描述
编译成功

4、烧录
在这里插入图片描述
烧录成功,找下图连接线路
在这里插入图片描述
在这里插入图片描述
实现流水灯。

三、总结

本次实验使我更熟练的使用keil软件进行编程,以及代码的烧录,STN32接口之间的关系。面包板相比于传统焊接更加方便节省时间。

四、参考博客

https://blog.csdn.net/qq_46467126/article/details/120791793?spm=1001.2014.3001.5501

猜你喜欢

转载自blog.csdn.net/m0_58406663/article/details/127250982