一.GPIO端口初始化
1.配置时钟使能
(1).通过查阅数据手册可知RCC(复位和时钟控制)地址范围。
(2).查找端口端口偏移地址以及对应端口所在位置
其中IOPxEN(x对应A,B,C,D等)为对应IO端口x使能
2.配置端口输出寄存器
(1).查询端口寄存器基地址
本次实验使用PA4,PB5,PC13这3个引脚控制LED灯,因此我们需要找到GpioA,GpioB,GpioC的基地址
查阅数据手册可知:GPIOA的寄存器地址在0x4001 0800到0x4001 0BFF范围内;GPIOB的寄存器地址在0x4001 0C00到0x4001 0FFF范围内;GPIOC的寄存器在0x4001 1000到0x4001 13FF范围内。
(2).查询端口输出寄存器地址偏移
其中A4、B5属于端口配置低寄存器偏移地址为0x00,C13属于端口配置高寄存器偏移地址为0x04。
(3).设置相应端口地址
//----------------配置GPIOA寄存器 -----------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
//----------------配置GPIOA寄存器 -----------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
//----------------配置GPIOC寄存器 -----------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
3.输入输出模式设置
我们需要的是输出高低电平,再加上开漏输出要外接上拉电阻,所以要设置为推勉输出。
GPIOA_CRL&=0xFFF0FFFF; //设置位 清零
GPIOA_CRL|=0x00020000; //PA4推挽输出
GPIOB_CRL&=0xFF0FFFFF; //设置位 清零
GPIOB_CRL|=0x00200000; //PB5推挽输出
GPIOC_CRH&=0xF0FFFFFF; //设置位 清零
GPIOC_CRH|=0x00200000; //PC13推挽输出
二.c语言实现
1.创建工程
创建项目
选择stm32f103c8
配置如下
2.写入代码
#include "stm32f10x.h"
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C)
//延时函数
void Delay()
{
u32 i=0;
for(;i<10000000;i++);
}
int main(void)
{
RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能
GPIOA_CRL&=0xFFF0FFFF; //设置位 清零
GPIOA_CRL|=0x00020000; //PA4推挽输出
GPIOA_ODR&=~(1<<4); //设置初始灯为灭
GPIOB_CRL&=0xFF0FFFFF; //设置位 清零
GPIOB_CRL|=0x00200000; //PB5推挽输出
GPIOB_ODR&=~(1<<5); //设置初始灯为灭
GPIOC_CRH&=0xF0FFFFFF; //设置位 清零
GPIOC_CRH|=0x00200000; //PC13推挽输出
GPIOC_ODR&=~(1<<13); //设置初始灯为灭
while(1){
//A灯
GPIOA_ODR|=1<<4; //PB5高电平
Delay();
GPIOA_ODR&=~(1<<4); //PB5低电平
//B灯
GPIOB_ODR|=1<<5; //PB5高电平
Delay();
GPIOB_ODR&=~(1<<5); //PB5低电平
//C灯
GPIOC_ODR&=~(1<<13); //PB5低电平
Delay();
GPIOC_ODR|=1<<13; //PB5高电平
}
}
3.编译运行
三.程序烧录
1.烧录
在编译后会生成hex文件在object文件夹内,此时连接电脑,开启flyMCU,上传hex文件到stm32f103c8t6内
读取器件信息,确认flash空间
开始编程
烧录完毕
四.硬件连接及实现效果
1.线路连接
USB转TTL接口连接如下:
3.3v与GND连接供电,TXD接PA10,RXD接PA9。
2.实际效果
实物连接如下:
五.总结
在本次使用寄存器方式实现流水灯,让我明白了在仿真操作和实际使用硬件进行操作存在很多区别的,实际上手使用硬件操作让我学到更多的基础知识;