一.Proteus仿真原理图:
运行结果:
video_20231007_202842
二.
设计思路:stm32的点灯则是,通过使能外设GPIO时钟,发出指令给外设GPIO,外设GPIO收到指令后,着手配置自己的寄存器,然后给IO口模式,让其实现各种功能,过程为:
CPU给指令---GPIO收到指令---配置内部寄存器----配置IO口模式----控制LED灯亮灭`
1.输入输出模式和输出模式速率设置
本次实验采用通用推挽输出模式,最高输出时钟频率2Mhz。分别用到A、B、C三个引脚。其中A属于端口配置低寄存器偏移地址为0x00,B、C属于端口配置高寄存器偏移地址为0x04。
(1)找到GPIOA,B,C的地址
查询数据手册找到GPIOA、GPIOB、GPIOC的地址,可发现本次实验采用GPIOA、B、C三个端口,该三个端口都属于APB2总线
(2)配置对应引脚寄存器
(3)设置输出模式为推挽输出,输出速率为2mhz
2.时针地址
由查询数据可发现,外设时钟使能寄存器,设偏移量为0x18,起始地址为0x4002 1000,该寄存器地址为0x4002 1018。
输入代码并进行编译:
实验代码:
#include "stm32f10x.h" //--------------APB2使能时钟寄存器------------------------
#define RCC_AP2BENR ((unsigned volatile int)0x40021018) //----------------GPIOA配置寄存器 - #define GPIOA_CRL ((unsigned volatile int)0x40010800)
#define GPIOA_ODR ((unsigned volatile int)0x4001080C)//----------------GPIOB配置寄存器 ----- #define GPIOB_CRH ((unsigned volatile int)0x40010C04)
#define GPIOB_ODR ((unsigned volatile int)0x40010C0C) //----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH ((unsigned volatile int)0x40011004)
#define GPIOC_ODR ((unsigned volatile int)0x4001100C) //-------------------简单的延时函数-----------------------
void SystemInit(void);
void Delay_ms(volatile unsigned int); v
oid A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t) {
unsigned int i;
while(t--) for (i=0;i<800;i++);
}
void A_LED_LIGHT(){ GPIOA_ODR=0x0<<5; //PA5低电平
GPIOB_ODR=0x1<<9;
//PB9高电平
GPIOC_ODR=0x1<<14;
//PC14高电平
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5高电平
GPIOB_ODR=0x0<<9; //PB9低电平
GPIOC_ODR=0x1<<14; //PC14高电平
} void C_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5高电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x0<<14; //PC14低电平
} //------------------------主函数--------------------------
int main() {
int j=100;
RCC_APB2ENR|=1<<2; //APB2-GPIOA外设时钟使能
RCC_APB2ENR|=1<<3; //APB2-GPIOB外设时钟使能
RCC_APB2ENR|=1<<4; //APB2-GPIOC外设时钟使能 //这两行代码可以合为 RCC_APB2ENR|=1<<3|1<<4;
GPIOA_CRL&=0xFF0FFFFF; //设置位 清零
GPIOA_CRL|=0X00200000; //PA5推挽输出
GPIOA_ODR|=1<<5; //设置PA5初始灯为灭
GPIOB_CRH&=0xFFFFFF0F; //设置位 清零
GPIOB_CRH|=0x00000020; //PB9推挽输出
GPIOB_ODR|=0x1<<9; //设置初始灯为灭
GPIOC_CRH&=0xF0FFFFFF; //设置位 清零 GPIOC_CRH|=0x02000000; //PC14推挽输出 GPIOC_ODR|=0x1<<14; //设置初始灯为灭 while(j) { A_LED_LIGHT(); Delay_ms(1000000); B_LED_LIGHT(); Delay_ms(1000000); C_LED_LIGHT(); Delay_ms(1000000); }
} void SystemInit(){ }