嵌入式课程实验1STM32F103的流水灯点亮版本1(寄存器地址操作)

目录

前言

一、用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。

        1.keil程序编写

        2.Proteus仿真

二、以 STM32最小系统核心板(STM32F103C8T6)+面包板+3只_(或更多)红绿黄LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。

        1.根据仿真图连接实物图

​编辑

        2.STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。

总结


前言

        嵌入式开发的第一次实验,学习STM32系统核心板相关的知识,了解其工作原理,加深对芯片的理解。


一、用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。

        1.keil程序编写

       代码如下:

#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
 
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void 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<<4;		//PA4低电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x1<<15;		//PC15高电平
}
void B_LED_LIGHT(){
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x0<<9;		//PB9低电平
	GPIOC_ODR=0x1<<15;		//PC15高电平
}
void C_LED_LIGHT(){
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x0<<15;		//PC15低电平	
}
 
int main()
{
	int j=100;
	// 开启时钟
	RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
	RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
	RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
	
	// 设置 GPIO 为推挽输出
	GPIOB_CRH&= 0xffffff0f;	//设置位 清零		
	GPIOB_CRH|=0x00000020;  //PB9推挽输出
 
	GPIOC_CRH &= 0x0fffffff; //设置位 清零		
	GPIOC_CRH|=0x30000000;  //PC15推挽输出
 
	GPIOA_CRL &= 0xfff0ffff; //设置位 清零		
	GPIOA_CRL|=0x00010000; //PA4推挽输出
 
	// 3个LED初始化为不亮(即高点位)
	GPIOB_ODR |= (1<<9); 
	GPIOC_ODR |= (1<<15); 
	GPIOA_ODR |= (1<<4);  
	
	while(j)
    {
		B_LED_LIGHT();
		Delay_ms(1000000);
 
		C_LED_LIGHT();
		Delay_ms(1000000);
 
		A_LED_LIGHT();
		Delay_ms(1000000);
	}
}

void SystemInit()
{
	
}

        在keil中进行编译,没有报错,成功生成了hex文件。

        2.Proteus仿真

        绘制仿真图如下:

        结果如下:

二、以 STM32最小系统核心板(STM32F103C8T6)+面包板+3只_(或更多)红绿黄LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。

        1.根据仿真图连接实物图

        烧录代码后板子效果如下

        2.STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。

        实物图同上,代码需修改,具体如下:

 #define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
	
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void 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<<4;		//PA4低电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x1<<13;		//PC13高电平
}
void B_LED_LIGHT()
{
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x0<<9;		//PB9低电平
	GPIOC_ODR=0x1<<13;		//PC13高电平
}
void C_LED_LIGHT()
{
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x0<<13;		//PC13低电平	
}
 
int main()
{
	int j=100;
	// 开启时钟
	RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
	RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
	RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
	
	// 设置 GPIO 为推挽输出
	GPIOB_CRH&= 0xffffff0f;	//设置位 清零		
	GPIOB_CRH|=0x00000020;  //PB9推挽输出
	GPIOC_CRH &= 0xff0fffff; //设置位 清零		
	GPIOC_CRH|=0x00300000;  //PC15推挽输出
 
	GPIOA_CRL &= 0xfff0ffff; //设置位 清零		
	GPIOA_CRL|=0x00010000; //PA4推挽输出

	// 3个LED初始化为不亮(即高点位)
	GPIOB_ODR |= (1<<9); 
	GPIOC_ODR |= (1<<13); 
	GPIOA_ODR |= (1<<4);  
	
	while(j)
    {
		
		B_LED_LIGHT();
		Delay_ms(2000);//单片机上2000    100
 
		C_LED_LIGHT();
		Delay_ms(3000);//单片机上3000    200
 
		A_LED_LIGHT();
		Delay_ms(3000);//单片机上3000    200
	}
}
 
void SystemInit()
{
	
}

        烧录后板子实物图如下:


总结

        这次实验需要我们动手的地方有很多,需要制作仿真图,需要连接在板子上接线,中途也遇到了很多的问题,但是通过在网络上查找相关资料也算解决了很多,但是仍然由很多知识是我还没接触到的,应该继续努力,加强训练。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的嵌入式流水灯实验代码,使用的是STM32F103C8T6开发板和Keil uVision 5开发环境: ```c #include "stm32f10x.h" int main(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置GPIOC的8个引脚为输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); while (1) { // 依次点亮8个LED灯 GPIO_SetBits(GPIOC, GPIO_Pin_0); delay_ms(500); GPIO_SetBits(GPIOC, GPIO_Pin_1); delay_ms(500); GPIO_SetBits(GPIOC, GPIO_Pin_2); delay_ms(500); GPIO_SetBits(GPIOC, GPIO_Pin_3); delay_ms(500); GPIO_SetBits(GPIOC, GPIO_Pin_4); delay_ms(500); GPIO_SetBits(GPIOC, GPIO_Pin_5); delay_ms(500); GPIO_SetBits(GPIOC, GPIO_Pin_6); delay_ms(500); GPIO_SetBits(GPIOC, GPIO_Pin_7); delay_ms(500); // 依次熄灭8个LED灯 GPIO_ResetBits(GPIOC, GPIO_Pin_0); delay_ms(500); GPIO_ResetBits(GPIOC, GPIO_Pin_1); delay_ms(500); GPIO_ResetBits(GPIOC, GPIO_Pin_2); delay_ms(500); GPIO_ResetBits(GPIOC, GPIO_Pin_3); delay_ms(500); GPIO_ResetBits(GPIOC, GPIO_Pin_4); delay_ms(500); GPIO_ResetBits(GPIOC, GPIO_Pin_5); delay_ms(500); GPIO_ResetBits(GPIOC, GPIO_Pin_6); delay_ms(500); GPIO_ResetBits(GPIOC, GPIO_Pin_7); delay_ms(500); } } // 延时函数 void delay_ms(u16 nms) { u32 i, j; for (i = 0; i < nms; i++) { for (j = 0; j < 3600; j++); } } ``` 这个代码使用了GPIO库来控制开发板上的8个LED灯,通过依次点亮和熄灭LED灯来实现流水灯效果。同时还使用了一个简单的延时函数`delay_ms`来实现每个灯点亮和熄灭之间的时间间隔。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值