嵌入式实验一

一.Proteus仿真原理图:

img

运行结果:

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(){ }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值