STM32F103的流水灯点亮版本
文章目录
一、用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
1.创建程序
2.选择对应器件,连接线路
3.烧入代码后,运行
1695902057672
二、 以 STM32最小系统核心板+面包板+3只红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
1.利用GPIOA,GPIOB,GPIOC三个端口实现流水灯
查询数据手册找到GPIOA、GPIOB、GPIOC的地址
寄存器起始地址
可以看出AHB的时钟起始地址
APB2的偏移地址为0x18
由于STM32的每个IO都需要4个位来配置,所以一个32位的寄存器最大只能配置8个IO(32位的单片机的寄存器就是32位的)用端口配置高寄存器(GPIOx_CRH)来配置引脚Px8-Px15。
配置引脚PB8,使用的寄存器是GPIOB_CRH
并选择推挽输出的方式
找到端口输出数据寄存器,这个数据寄存器的地址就是0x4001 0C0C,把第8位写为0就行。默认就是0
#define GPIOA_ODR *(volatile unsigned int *)40010800+0x0C//GPIOA的地址+端口输出寄存器
GPIOA_ODR &= ~(1<<3);
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<5000000;i++);
}
int main(void)
{
RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能
GPIOA_CRL&=0xFFF0FFFF; //设置位 清零
GPIOA_CRL|=0x00020000; //PA5推挽输出
GPIOA_ODR&=~(1<<5); //设置初始灯为灭
GPIOB_CRL&=0xFF0FFFFF; //设置位 清零
GPIOB_CRL|=0x00200000; //PB9推挽输出
GPIOB_ODR&=~(1<<9); //设置初始灯为灭
GPIOC_CRH&=0xF0FFFFFF; //设置位 清零
GPIOC_CRH|=0x02000000; //PC14推挽输出
GPIOC_ODR&=~(1<<14); //设置初始灯为灭
while(1){
//A灯
GPIOA_ODR|=1<<5; //PA5高电平
Delay();
GPIOA_ODR&=~(1<<5); //PA5低电平,因为是置0,所以用按位与
//B灯
GPIOB_ODR|=1<<9; //PB9高电平
Delay();
GPIOB_ODR&=~(1<<9); //PB9低电平,因为是置0,所以用按位与
//C灯
GPIOC_ODR|=1<<14; //PC14高电平
Delay();
GPIOC_ODR&=~(1<<14); //PC14低电平,因为是置0,所以用按位与
}
}
效果