STM32F103的流水灯点亮

STM32F103的流水灯点亮

一、Protues仿真实现流水灯

题目要求:了解STM32最小系统核心板(STM32F103C8T6,国际上又统称 STM32 Blue Bill开发板)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
1、最小系统板原理图:在这里插入图片描述

2、实验过程:

新建项目之后,在元件模式下如下图点击P按钮

在弹出的窗口搜索“STM32F103”,继续搜索LED,在结果中选择LED-BLUE、LED-GREEN、LED-RED

其中,电源在左侧的工具栏选择终端模式,之后点击Power
在这里插入图片描述

由于在代码中我们选择的是PA4、PB9和PC14,所以在仿真中的接法如下:
在这里插入图片描述

点击运行,仿真结果如下:

led3

二、STM32最小系统板实现LED灯轮流闪烁(寄存器)

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

1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;

2)用C语言寄存器方式编程实现,代码须有详细注解。

3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。

一、GPIO端口的初始化设置三步骤

1.GPIO 简介
GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO 被分成很多组,每组有 16 个引脚,如型号为 STM32F103VET6 型号芯片有 GPIOA、GPIOB、GPIOC至 GPIOE共 5组 GPIO,芯片一共 100个引脚,其中 GPIO就占了一大部分,所有的 GPIO 引脚都有基本的输入输出功能。
最基本的输出功能是由 STM32 控制引脚输出高、低电平,实现开关控制,如把 GPIO引脚接入到 LED灯,那就可以控制 LED灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的通断。
最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过电平高低区分按键是否被按下。

2.初始化设置
1:打开GPIO口的时钟
2:初始化GPIO口(选择推挽输出)
3: 设置低电平

二、点亮LED流水灯

1.打开GPIO口的时钟

时钟的地址:

在这里插入图片描述

GPIO的地址:

在这里插入图片描述

即0x40021018,则打开三个IO口的时钟需要将三个位都置1:

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

// 打开时钟
RCC_APB2ENR |= (1<<3); // 打开 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 打开 GPIOC 时钟
RCC_APB2ENR |= (1<<2); // 打开 GPIOA 时钟

2.初始化GPIO口

初始化
GPIO口有八种模式:

输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能、开漏复用功能

这里使用推挽输出

3.设置高低电平

输出高电平则为1,低电平则为0
以GPIOB和0号引脚(B0)为例,将其设置为低电平:

#define GPIOA_ODR (*(unsigned int *)0x4001080C)
GPIOB_ODR &= ~(1<<0); // 最后一位变0

对于GPIOB的B9、GPIOC的C15、GPIOA的A4,设置如下:

#define GPIOB_ODR (*(unsigned int )0x40010C0C)
#define GPIOC_ODR (
(unsigned int )0x4001100C)
#define GPIOA_ODR (
(unsigned int *)0x4001080C)

GPIOB_ODR &= ~(1<<9);
GPIOC_ODR &= ~(1<<15);
GPIOA_ODR &= ~(1<<4);

三、C语言实现

1.项目创建

具体见ARM汇编程序调试:基于MDK创建纯汇编语言的STM32工程
不同之处:
1)芯片选择STM32F103C8
2)当出现下图时,直接叉掉,不做选择

在这里插入图片描述

添加一个main.c文件:

在这里插入图片描述

打开魔术棒,如下图所示勾选Create HEX File:

在这里插入图片描述

在main.c中写入函数:

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

}

2.连接电路

根据设计的程序连接电路:
对于USB转TTL模块和stm32f103c8t6连接:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9

总电路:
红——B9
绿——C15
黄——A4

3.编译程序

编译:

在这里插入图片描述

连接到电脑,打开mcuisp,上传HEX文件到stm32f103c8t6上:

成功点灯:

在这里插入图片描述

led1


led2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值