一、前言
前面文章分享了很多关于 STM32F103 系列知识点、物联网相关的小项目,工程都采用的是寄存器方式编写;很多小伙伴接触 STM32 开始都采用库函数编程,不清楚如何使用寄存器方式开发 STM32;这篇文章就讲一下如何新建寄存器风格的 STM32 工程,并介绍需要用到哪些官方系统文件等。
二、环境介绍
开发环境: keil5.25
编程语言: C 语言
操作系统: win10 64 位
MCU 型号: ST32F103C8T6 (F103 系列都是通用的,区分容量即可)
库函数的版本: 3.5 (新建工程需要用到库函数包里的一些系统必要文件)
STM32 系列简介:
STM32 系列专为要求高性能、低成本、低功耗的嵌入式应用设计的。 主流产品(STM32F0、STM32F1、STM32F3)、超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能产品(STM32F2、STM32F4、STM32F7、STM32H7)
以 STM32F103RBT6 这个型号的芯片为例,该型号的组成为 7 个部分,其命名规则如下:
STM32L 电路的设计目的是以低电压实现高性能,有效延长电池供电设备的充电间隔。片上模拟功能的最低工作电源电压为 1.8V。数字功能的最低工作电源电压为 1.65V,在电池电压降低时,可以延长电池供电设备的工作时间。
从应用类别来说,STM32 可以有以下用处:
(1). 无人机制作:现在无人机主流的微控制器所用的就是 stm32 控制器。
(2). 简单仪器仪表:stm32 可以用作简单示波器、频率计,对采集的数字信号进行处理并送入屏幕显示。
(3). 机器人:常看到的就是家用的扫地机器人,还要就是国内各种机器人比赛的小型机器人,几乎都用的是 stm32 控制器,毕竟现在 stm32 接口种类齐全、功能又多、价格便宜、资料齐全。
(4). 电源控制器:全国电子设计大赛常考题的电源题,很多同学制作电源首选控制器也大多会选择 stm32。
三、新建工程
接下来就可以写代码点亮第一盏 LED 灯。
#include "stm32f10x.h" int main() { while(1) { } }
复制代码
编写 LED 流水灯代码:
#include "stm32f10x.h"#include "led.h"#include "delay.h"#include "key.h"int main(){ u8 val; LED_Init(); BEEP_Init(); KeyInit(); while(1) { val=KeyScan(); if(val) { BEEP=!BEEP; LED1=!LED1; LED2=!LED2; LED3=!LED3; LED4=!LED4; } }}
#include "led.h"/*函数功能: LED灯初始化硬件连接: LED1-->PF7 LED2-->PB5 LED3-->PA8 LED4-->PA1*/void LED_Init(void){ /*1. 开时钟*/ RCC->APB2ENR|=1<<2; //PA RCC->APB2ENR|=1<<3; //PB RCC->APB2ENR|=1<<7; //PF /*2. 配置GPIO模式*/ GPIOF->CRL&=0x0FFFFFFF; GPIOF->CRL|=0x30000000; GPIOB->CRL&=0xFF0FFFFF; GPIOB->CRL|=0x00300000; GPIOA->CRH&=0xFFFFFFF0; GPIOA->CRH|=0x00000003; GPIOA->CRL&=0xFFFFFF0F; GPIOA->CRL|=0x00000030; /*3. 上拉GPIO口电平(关闭LED)*/ GPIOF->ODR|=1<<7; GPIOA->ODR|=1<<8; GPIOA->ODR|=1<<1; GPIOB->ODR|=1<<5;}
/*函数功能: 蜂鸣器初始化硬件连接: PB8*/#define RCC_APB2 *((u32*)(0x40021000+0x18))#define GPIOB_CRH *((u32*)(0x40010C00+0x04))void BEEP_Init(void){ /*1. 开时钟*/ //RCC->APB2ENR|=1<<3; //PB RCC_APB2|=1<<3; //PB /*2. 配置GPIO口模式*/ // GPIOB->CRH&=0xFFFFFFF0; // GPIOB->CRH|=0x00000003; GPIOB_CRH&=0xFFFFFFF0; GPIOB_CRH|=0x00000003;}
#include "key.h"/*函数功能: 按键初始化硬件连接: KEY_UP->PA0 KEY2--->PE4 KEY3--->PE3 KEY4--->PE2*/void KeyInit(void){ /*1. 开时钟*/ RCC->APB2ENR|=1<<2; //PA RCC->APB2ENR|=1<<6; //PE /*2. 配置模式*/ GPIOA->CRL&=0xFFFFFFF0; GPIOA->CRL|=0x00000008; GPIOE->CRL&=0xFFF000FF; GPIOE->CRL|=0x00088800; /*3. 配置上下拉*/ GPIOA->ODR&=~(1<<0); //下拉,输出低电平 GPIOE->ODR|=0x7<<2; //上拉}
/*函数功能: 获取按键值返 回 值: 返回检测到按键值(0,1,2,3,4) 0表示没有按键按下按键有两种情况: 单击按下、连续按下*/u8 KeyScan(void){ static u8 flag=0; /*只要有一个按键就进入if语句*/ if((KEY_UP||KEY2==0||KEY3==0||KEY4==0)&&flag==0) { flag=1; //记录按下按键已经按下 DelayMs(50); //按键消抖 if(KEY_UP)return 1; //按键值1 if(KEY2==0)return 2; //按键值1 if(KEY3==0)return 3; //按键值1 if(KEY4==0)return 4; //按键值1 } else if(KEY_UP==0&&KEY2&&KEY3&&KEY4) //所有的按键松开之后再进去 { flag=0; //记录按下按键已经松开 } return 0; }
复制代码
评论