我学习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的小实验和小项目)。欢迎关注~