这里写目录标题
一. 了解STM32最小系统核心板(STM32F103C8T6)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
proteus新建工程,完成如图的连线
给芯片烧进.hex文件后仿真如下:
二、程序原理
1.先找出GPIOA、GPIOB、GPIOC寄存器地址
APB2外设时钟使能寄存器
stm32 想要端口正常工作需要打开外设使能时,例如0x400210100表示寄存器RCC_APB2ENR的地址,加上偏移地址0x400210118,|= (1<<2)表示使能GPIOA(同理|= (1<<3)表示使能GPIOB)
2、端口配置低寄存器
如图:我们将CNFy设置为通用推挽模式,MODEy设置为最大速度为2Mhz的输出模式:即0010,换算成16进制为2。
例如我们6号口为输出口,则编码为:0200 0000
3、代码(附详细解释)
#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|=0x00000002; //PA0推挽输出
GPIOA_ODR&=~(1<<5); //设置初始灯为灭
GPIOB_CRL&=0xFF0FFFFF; //设置位 清零
GPIOB_CRL|=0x00000002; //PB0推挽输出
GPIOB_ODR&=~(1<<9); //设置初始灯为灭
GPIOC_CRH&=0xF0FFFFFF; //设置位 清零
GPIOC_CRH|=0x02000000; //PC14推挽输出
GPIOC_ODR&=~(1<<14); //设置初始灯为灭
while(1){
//A灯
GPIOA_ODR|=1<<0; //PA0高电平
Delay();
GPIOA_ODR&=~(1<<0); //PA0低电平,因为是置0,所以用按位与
//B灯
GPIOB_ODR|=1<<0; //PB0高电平
Delay();
GPIOB_ODR&=~(1<<0); //PB0低电平,因为是置0,所以用按位与
//C灯
GPIOC_ODR|=1<<14; //PC14高电平
Delay();
GPIOC_ODR&=~(1<<14); //PC14低电平,因为是置0,所以用按位与
}
}