一、关于STM32寄存器
STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。
其引脚图如下:
二、STM32实例之LED流水灯
1、GPIO端口初始化
(1)时钟配置
选用GPIO中的A、B、C三个端口
时钟寄存器映射地址
A、B、C三个端口的地址为:
2、找到偏移地址和A、B、C端口位置:
对应端口时钟代码:
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
RCC_APB2ENR|=1<<2|1<<3|1<<4;
(2)输入输出模式和输出速率配置
1、需要用到A4、B5、C14引脚
采用推挽输出模式,输出模式,最大速度为2MHz
00:通用推挽输出模式
01:通用开漏输出模式
10:复用功能推挽输出模式
11:复用功能开漏输出模式
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.创建LSD文件
2、选择STM32F103C8
点击OK
在Manage Run-Time Environment界面选择cancel
在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);
}
}
编译:
![在这里插入图片描述](https://img-blog.csdnimg.cn/ef12f388750f488c9316d9b87a3331e7.png)
烧录:![在这里插入图片描述](https://img-blog.csdnimg.cn/477e89b9259345df92f2a222d8e25e27.png)
烧录成功连线得到最终结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/db5c1475714f4dbbbfe61708aa814c41.gif#pic_center)
参考博客:
https://blog.csdn.net/qq_46467126/article/details/120791793?spm=1001.2014.3001.5501
https://blog.csdn.net/m0_58406663/article/details/127250982?spm=1001.2014.3001.5502