嵌入式系统作业5

一,使用工具

1.stm32f103C8T6
2.USB转串口
3.面包板
4.导线若干
5.LED3个

二,程序设计思路

这里我们通过GPIO端口来点亮LED灯
首先打开GPIO口的时钟
然后初始化GPIO端口
最后设置低电平

1.关于GPIOx地址

在这里插入图片描述

2.时钟的地址

在这里插入图片描述
在这里插入图片描述
打开GPIO端口的时钟这里我们需要将三个位置全部置1

#define RCC_APB2ENR (*(unsigned int *)0x40021018)
// 打开时钟
RCC_APB2ENR |= (1<<3);  // 打开 GPIOB 时钟
RCC_APB2ENR |= (1<<4);  // 打开 GPIOC 时钟
RCC_APB2ENR |= (1<<2);  // 打开 GPIOA 时钟

3.初始化GPIO端口

GPIO端口有八种模式,这里我们使用推挽式输出。
在这里插入图片描述

在这里插入图片描述
端口1-7为低,端口8-15为高。每个引脚由四个位控制。
以GPIOB和0号引脚(B0)为例,将其设置为推挽输出,并设置最大速度为10MHz,则将控制B0的四个位设置为0001

这里GPIO A,B,C分别对应A0,B0,C15
代码如下:

#define GPIOB_CRL (*(unsigned int *)0x40010C00)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)// 配置 GPIO 口为推免输出
// GPIOB----最后四位为0001
GPIOB_CRL |= (1<<0);  // 最后一位变1
GPIOB_CRL &= ~(0xE<<0);  // 倒数2、3、4位变0
// GPIOC----前四位为0001
GPIOC_CRH |= (1<<28);  //  第四位变1
GPIOC_CRH &= ~(0xE0000000);  // 前三位变0
// GPIOA----最后四位为0001
GPIOA_CRL |= (1<<0);  // 最后一位变1
GPIOA_CRL &= ~(0xE<<0);  // 倒数2、3、4位变0

4.设置低电平

在这里插入图片描述
这里GPIO A,B,C分别对应A0,B0,C15
代码如下:

#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
GPIOB_ODR &= ~(1<<0);  //最后一位变为0
GPIOC_ODR &= ~(1<<15); //倒数16位变为0
GPIOA_ODR &= ~(1<<0);  //最后一位变为0

三,创建LED项目

1.新建项目

点击project下的第一个
在这里插入图片描述
选择项目路径,创建文件名
这里是LED1.0
在这里插入图片描述
然后是选择芯片,这里是STM32F103C8
在这里插入图片描述
这里不需要多加设置所以直接关闭
在这里插入图片描述
右击文件夹,点击第二个添加新文件
在这里插入图片描述
选择.c,文件命名为LEDmain
在这里插入图片描述
找到所需要的启动文件
将所需要的启动文件复制到项目目录下(f103c8t6启动文件为startup_stm32f10x_md.s
在这里插入图片描述
在这里插入图片描述
右击文件夹,选择Add Existing Files to Group Source Group 1(或双击文件夹)
在这里插入图片描述
选择All FIles,选择刚刚添加的启动文件,Add,Add之后Close:
在这里插入图片描述
点开魔术棒,具体设置如下
在这里插入图片描述

2.编写代码

代码如下所示


#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800

#define RCC_APB2ENR (*(unsigned int *)0x40021018)

#define GPIOB_CRL (*(unsigned int *)0x40010C00)
#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 Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}


int main(){
	// 开启时钟
	RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
	RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
	RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
	
	
	// 设置 GPIO 为推挽输出
	// 设置 GPIOB 最后四位为 0001 (B0)
	GPIOB_CRL |= (1<<0);  // 最后一位设置为1
	GPIOB_CRL &= ~(0xE);  // 倒数二、三、四位设置为0
	// 设置 GPIOC 前四位为 0001  (C15)
	GPIOC_CRH |= (1<<28); // 第四位设置为1
	GPIOC_CRH &= ~(0xE0000000);  // 前三位设置为0
	// 设置 GPIOA 最后四位为 0001 (A0)
	GPIOA_CRL |= (1<<0);  // 最后一位设置为1
	GPIOA_CRL &= ~(0xE);  // 倒数二、三、四位设置为0

	
	// 3个LED初始化为不亮(即高点位)
	GPIOB_ODR |= (1<<0);  // 最后一位设置为1
	GPIOC_ODR |= (1<<15); // 倒数第15位设置为1
	GPIOA_ODR |= (1<<0);  // 最后一位设置为1
	
	
	while(1){
		GPIOB_ODR &= ~(1<<0); // 点灯1
		Delay_ms(1000000);
		GPIOB_ODR |= (1<<0);  // 灭灯1
		Delay_ms(1000000);
		
		GPIOC_ODR &= ~(1<<15); // 点灯2
		Delay_ms(1000000);
		GPIOC_ODR |= (1<<15);  // 灭灯2
		Delay_ms(1000000);
		
		GPIOA_ODR &= ~(1<<0); // 点灯3
		Delay_ms(1000000);
		GPIOA_ODR |= (1<<0);  // 灭灯3
		Delay_ms(1000000);
		
	}
	
}


void SystemInit(){
	
}

四,连接电路

对于USB转TTL模块和stm32f103c8t6连接
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
总电路如下:
在这里插入图片描述
然后编译
在这里插入图片描述

连接到电脑,打开flymcu,上传HEX文件到stm32f103c8t6上:
在这里插入图片描述
开始编程
成功点亮LED灯
在这里插入图片描述

五,总结

学习和理解STM32F103系列芯片的地址映射和寄存器映射原理。
了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。
注意面包板是分块的,不然无法通电。
这个实验进行起来还是比较困难,还需要多加学习。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值