正点原子STM32F103(精英版)------跑马灯

配合正点原子视频(工程新建与路径加入省略)
跑马灯硬件连接:

        GPIO输出方式:
                               推挽输出
                              CRL寄存器    0X3 表示推挽输出模式(做输出口用,50M 速率)

一.库函数版本

1) 使能 IO 口时钟。调用函数为 RCC_APB2PeriphColckCmd();

2) 初始化 IO 参数。调用函数GPIO_Init();

3) 操作 IO。

     GPIO_SetBits();

     GPIO_ResetBits();

1.重要函数

(1)初始化函数

     void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

   作用:初始化一个或者多个IO口(同一组)的工作方式和速度。

              该函数主要是操作GPIO_CRL(CRH)[端口配置寄存器]寄存器,在上拉或者下拉的

              时候有设置BSRR[置位/复位]或者BRR[复位]寄存器

这个函数有两个参数:

第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG。

第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。

可以查看结构体的定义:

typedef struct
{ uint16_t GPIO_Pin; 
 GPIOSpeed_TypeDef GPIO_Speed; 
 GPIOMode_TypeDef GPIO_Mode; 
}GPIO_InitTypeDef;

初始化实例

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置 GPIO

上面代码的意思是设置 GPIOB 的第 5 个端口为推挽输出模式,同时速度为 50M。

(2)读取输入电平函数

//实际操作的是GPIOx_IDR寄存器。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

(3)读取输出电平函数

//实际操作的是GPIO_ODR寄存器。
uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

(4)设置输出电平函数

//实际操作BSRR寄存器
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//实际操作BRR寄存器
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin

2.软件设计

新建HARDWARE组,添加led.h,led.c文件。

led.h


#ifndef __LED_H
#define __LED_H

void LED_Init(void);
#endif

led.c

#include"led.h"
#include"stm32f10x.h"
void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能 GPIOB,GPIOE 端口时钟
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LED0--->GPIOB.5,端口配置
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
	GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB.5
	GPIO_SetBits(GPIOB,GPIO_Pin_5);//GPIOB.5 输出高
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//LED1-->GPIOE.5 推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//初始化 GPIOE.5
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
	GPIO_Init(GPIOE,&GPIO_InitStructure);//初始化GPIOE.5
	GPIO_SetBits(GPIOE,GPIO_Pin_5);//GPIOE.5 输出高
}

该代码里面就包含了一个函数 void LED_Init(void),该函数的功能就是用来实现配置 PB5 和 PE5 为推挽输出。这里需要注意的是:在配置 STM32 外设的时候,任何时候都要先使能该 外设的时钟。GPIO 是挂载在 APB2 总线上的外设,在固件库中对挂载在 APB2 总线上的外设时 钟使能是通过函数 RCC_APB2PeriphClockCmd()来实现的。

main.c

#include"stm32f10x.h"
#include"led.h"
#include"delay.h"

int main(void)
{
	delay_init();//延时函数初始化
	LED_Init();//初始化与LED连接的硬件接口
	
	while(1)
	{
			GPIO_SetBits(GPIOB,GPIO_Pin_5);
	        GPIO_SetBits(GPIOE,GPIO_Pin_5);
			delay_ms(500);//延时300ms

			GPIO_ResetBits(GPIOB,GPIO_Pin_5);
			GPIO_ResetBits(GPIOE,GPIO_Pin_5);
		    delay_ms(500);延时300ms


	}
	
	
}

二.寄存器版本

1) 使能 IO 口时钟。配置寄存器 RCC_APB2ENR

2) 初始化 IO 参数。配置寄存器 GPIOx_CRH/CRL

3) 操作 IO。配置寄存器 GPIOX_ODR或者BSRR/BRR

1.寄存器

我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、ODR。

配置模式的 2 个 32 位的端口 配置寄存器 CRL 和 CRH;

2 个 32 位的数据寄存器 IDR 和 ODR;

1 个 32 位的置位/复位寄存器 BSRR;一个 16 位的复位寄存器 BRR;

1 个 32 位的锁存寄存器 LCKR;

(1)寄存器实例

设置了 PC11 为上拉输入,PC12 为推挽输出。

GPIOC->CRH&=0XFFF00FFF; //清掉这 2 个位原来的设置,同时也不影响其他位的设置
GPIOC->CRH|=0X00038000; //PC11 输入,PC12 输出
GPIOC->ODR=1<<11; //PC11 上拉

2.软件设计

led.h

#ifndef __LED_H
#define __LED_H


void LED_Init(void);


#endif

led.c

#include"led.h"
#include"stm32f10x.h"

void LED_Init(void)
{
	RCC->APB2ENR|=1<<3;//使能 PORTB 时钟
	RCC->APB2ENR|=1<<6;//使能 PORTE 时钟
	//GPIOB.5
	GPIOB->CRL&=0xFF0FFFFF;//清零
	GPIOB->CRL|=0x00300000;//PB.5 推挽输出 (置1)
	GPIOB->ODR|=1<<5;//PB.5 输出高
	//GPIOE.5
	GPIOE->CRL&=0xFF0FFFFF;
	GPIOE->CRL|=0x00300000;//PE.5 推挽输出
	GPIOE->ODR|=1<<5;//PE.5 输出高
}

在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟!

APB2ENR 是 APB2 总线上的外设时钟使能寄存器

 

 端口配置低寄存器(GPIOx_CRL) (x=A..E)

 

 

 

  1. 因PB5属于GPIO0~7之间,所以,需通过GPIOB_CRL寄存器才能实现对PB5的设置。
  2. 因GPIOB_CRL寄存器中每4位决定一个GPIO工作模式,所以,需通过设置GPIOB_CRL的第20~23位。
  3. 因PB5引脚“输出模式”,从图中2可以看出须把GPIOB_CRH寄存器的MODE5[1:0]设置为11(50MHz)。
  4. 根据MODE[1:0]的值为11可知,CNF11[1:0]需要选择“在输出模式(MODE[1:0]>00)”中选择需要设置的值。
  5. 因PB5须设置为“通用推挽输出模式”,故CNF11[1:0]需设置为00。(0011 = 3)
  6. 最终设置指令为:
    GPIOB->CRL&=0xFF0FFFFF;//清零
    GPIOB->CRL|=0x00300000;//PB.5 推挽输出 (置1)

main.c


#include "stm32f10x.h"
#include "led.h"
#include "delay.h"

int main(void)
{
	delay_init(72);
	LED_Init();
     while(1)
		 {
			 GPIOB->ODR|=1<<5;
			 GPIOE->ODR|=1<<5;
			 delay_ms(500);
			 GPIOB->ODR&=~(1<<5);
			 GPIOE->ODR&=~(1<<5);
			 delay_ms(500);
		 }
       

}

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 正点原子STM32F103和MPU6050传感器可以用于实现计步器功能。以下是一种可能的源码实现方法。 首先,需要配置STM32F103的GPIO和I2C以及MPU6050的I2C。 然后,可以通过I2C读取MPU6050的加速度计和陀螺仪数据,并将其转换为计步器所需的数据。 计步器的原理是通过检测人的运动来累计步数。一般来说,当加速度计的数据超过一定的阈值时,可以判断为步行动作。可以设置合适的阈值来适应不同的步行习惯。 编写一个计步器算法函数,该函数接收加速度计的数据作为输入,根据设定的阈值和算法判断步行动作。可以使用滑动窗口法或者峰值检测法来实现步数的累计。当检测到步行动作时,步数加1,并将步数数据显示在LCD上。 在主函数中,设置STM32F103的时钟和相关的中断,并调用配置好的函数和计步器算法函数。通过定时器中断控制数据的采集和计步器算法的执行。 最后,将编写好的源码烧录到STM32F103开发板上,连接MPU6050传感器,并运行程序,即可实现步数的计算和显示。 当然,这只是一种简单的实现方法,根据具体的需求和实际情况可能需要进行更多的优化和改进。 ### 回答2: 正点原子是一个STM32F103系列的开发板品牌,MPU6050是一种常用的六轴陀螺仪和加速度计模块。实现计步器功能的源码就是通过正点原子STM32F103开发板和MPU6050模块来获取加速度数据,并根据这些数据进行步数的计算。 基本的实现步骤如下: 1. 配置正点原子STM32F103开发板的GPIO和I2C接口用于与MPU6050通信。 2. 初始化MPU6050模块,设置好合适的采样频率。 3. 通过I2C接口读取MPU6050中的加速度数据。 4. 根据获取到的加速度数据进行计算,可以使用简单的算法例如计算总体加速度大小是否超过一定阈值。 5. 根据计算结果判断是否步行步数是否发生变化,并进行更新。 6. 可以通过串口或者LCD等方式输出步数信息。 需要注意的是,实现计步器的准确性是一个较为复杂的问题,通常需要综合考虑多种因素,例如姿势的变化、外部干扰等。此外,还可以进一步优化算法,例如引入滤波器和积分来提高计步器的精度。 ### 回答3: 正点原子是一款青少年学习STM32的开发板,可以用来学习和开发各种应用。本回答将简要介绍如何使用正点原子开发板和MPU6050传感器实现一个计步器的源码。 首先,我们需要准备一些基本的硬件设备,包括正点原子STM32F103开发板和MPU6050加速度传感器。接下来,我们需要进行一些准备工作和设置。 在正式编写源码之前,我们首先需要配置MPU6050的寄存器,以便获取正确的加速度传感器数据。可以使用IIC总线来读取和写入MPU6050的寄存器值。 接下来,我们需要设置STM32F103的时钟和IIC总线的参数,以确保数据传输的准确性和稳定性。我们可以使用STM32F103的I2C库函数来轻松地进行IIC总线通信。 在编写源码之前,我们还需要了解计步器的算法原理。一般来说,计步器通过对加速度传感器数据进行分析,检测步数的变化。常用的算法包括阈值法、绝对阈值法、卡尔曼滤波法等。 具体的源码编写涉及到硬件的配置和算法的实现。我们可以使用STM32的开发环境,如Keil、IAR等来编写、调试和下载源码。 总的来说,实现一个计步器的源码涉及到硬件的配置、传感器的数据获取和计步算法的实现等步骤。希望以上的回答对你有所帮助,祝你成功实现计步器的源码编写!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值