我学习M3有一段时间,第一次写博客,通过博客分享自己学习的经验跟大家探讨同时提高自己对M3的认识。相信大家初学时第一个实验就是实现跑马灯,这里我就介绍下跑马灯的实现。
1.首先讲下GPIO
GPIO—general purpose intput output是通用输入输出端口的简称,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能 。
2.端口与引脚的区别
端口:单片机内部(CPU单元)和外部IO的接口组,比如说PORTA端口,有16个引脚,PORTA.0~PORTA.15。端口在IO空间映射有寄存器,这个寄存器反映当前端口的状态,如PORTA.0口上输入的电压是0~5V的信号,单片机在映射进寄存器时会定义一个门限(如1.8V),低于这个门限寄存器中相应位是0,高于这个门限相应位是1。一般端口还有其他控制寄存器,如控制端口引脚输入输出的寄存器,如控制端口引脚复用的寄存器等。当设置端口引脚为输出时,向相应的输出寄存器的相应位写1,该端口的对应IO引脚就会输出一个近似VCC的电平,当向相应位写0时,该端口的对应IO引脚会输出一个近似0V的电平。
3.跑马灯实现
#ifndef _LED_H
#define _LED_H
#include "stm32f10x.h"
#include "sys.h"
void Led_Init(void);
void Beep_Init(void);
#define LED1 PFout(7)
#define LED2 PBout(5)
#define LED3 PAout(8)
#define LED4 PAout(1)
#define BEEP PBout(8)
#endif
#include "led.h"
/*
函数功能:LED初始化;
硬件连接:
LED1 -> PF7;
LED2 -> PB5;
LED3 -> PA8;
LED4 -> PA1;
*/
void Led_Init(void)
{
//1.时钟使能
RCC->APB2ENR |=1<<3; //GPIOB
RCC->APB2ENR |=1<<2; //GPIOA
RCC->APB2ENR |=1<<7; //GPIOF
//2.端口工作模式配置
GPIOB->CRL &=0xFF0FFFFF; //PB.5
GPIOB->CRL |=0x00300000; //通用推挽输出
GPIOB->ODR |=1<<5; //先拉高,这里低电平驱动LED
GPIOA->CRL &=0xFFFFFF0F; //PA.1
GPIOA->CRL |=0x00000030;
GPIOA->ODR |=1<<1;
GPIOA->CRH &=0xFFFFFFF0; //PA.8
GPIOA->CRH |=0x00000003;
GPIOA->ODR |=1<<8;
GPIOF->CRL &=0x0FFFFFFF; //PF.7
GPIOF->CRL |=0x30000000;
GPIOF->ODR |=1<<7;
}
#include "led.h"
#include "delay.h"
int main(void)
{
Led_Init();
Delay_Init(72);
LED1=0;
while(1)
{
/*
这里只是实现简单的两盏灯交替闪烁,如果
大家想实现其他骚气的样式只要操作LED的电平
*/
LED1=!LED1;
LED2=!LED2;
delay_MS(400);
}
}
最后,自己最近学M3也是第一次发博客,想通过发博客提高对M3的认知同时也是想分享自己对M3的理解,大家可评论探讨,后期会更新我的博客(超声波,GSM,GPS,蓝牙,WIFI,OLED,摄像头,串口封包解包,红外解码编码等)也有上传资源(M3的小实验和小项目)。欢迎关注~