基于寄存器与基于固件库的stm32 LED流水灯例子
一、基于寄存器的stm32 LED流水灯程序
基于寄存器&基于固件库的stm32 LED流水灯例子的编程方式有什么差异
固件库:资料多,简单,易于理解。如果没有CortexM系列内核的开发基础,建议从固件库开始玩起。等有一定基础,再用寄存器。
寄存器:有更好的可移植性,学习寄存器编程会比较有帮助,程序运行占用资源少。
原理图如下
1. 创建一个keil工程(寄存器版)
- 打开keil,点击Project,选择New uVision Project
- 选择 CPU 型号,根据开发板进行选择
- 在线添加库文件
用寄存器控制 STM32 时,不需要在线添加库文件,可以直接关掉。 - 添加文件
①添加已经存在文件
在新建的工程中添加启动文件(startup_stm32f10x_hd.s),该文件可以先到固件库中复制到此处startup_stm32f10x_hd.s。
②创建新文件
stm32f10x.h
手动新建,用于存放寄存器映射的代码,暂时为空。
main.c
手动新建,用于存放 main 函数,暂时为空。 - 配置魔术棒选项卡
①Target设置
②Output设置
③Debug设置
2. 基于寄存器stm32 LED流水灯
-
寄存器的定义
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。 -
GPIO (通用输入输出端口)
STM32 可控制的引脚。
实现代码
int main(void)
{
// 配置RCC寄存器,开启 GPIOC 端口时钟配置RCC寄存器
*(unsigned int *)0x40021018 |=(1<<4);
// 配置CRL寄存器,配置 PC2 为通用推挽输出,速度为 10M
//*(unsigned int *)GPIOC_CRL |=(1<<(4*2));
*(unsigned int *)0x40011000 |=(1<<(4*2));
//配置ODR寄存器,清空控制 PC2 的端口位
//*(unsigned int *)GPIOC_ODR &=~(1<<2);
*(unsigned int *)0x4001100C &=~(1<<2);
while (1)
{
}
}
二、 基于固件库的stm32 LED流水灯程序
1. 创建一个keil工程(固件库版)
方法类似于寄存器的创建。
不同点
需要添加组文件夹。
在新建的工程中添加 5 个组文件夹,用来存放各种不同的文件,文件从本地建好的工程文件夹下获取,双击组文件夹就会出现添加文件的路径,然后选择文件即可。
C/C++选项卡设置
添加处理宏及编译器编译的时候查找的头文件路径。如果头文件路径添加有误,则编译的时候会报错找不到头文件。
2. 四、基于固件库stm32 LED流水灯
bsp_led.c
//初始化GPIO函数
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK , ENABLE);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIO*/
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
/*调用库函数,初始化GPIO*/
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
/* 关闭所有led灯 */
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
}
main.c
#include "stm32f10x.h"
#include "bsp_led.h"
#define SOFT_DELAY Delay(0x0FFFFF);
void Delay(__IO u32 nCount);
int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
while (1)
{
LED1_ON; // 亮
SOFT_DELAY;
LED1_OFF; // 灭
LED2_ON; // 亮
SOFT_DELAY;
LED2_OFF; // 灭
}
}
void Delay(__IO uint32_t nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}
三、总结
经过这次体验,让我对stm32的串口通信有了更深入的理解,通过代码可以发送自己想要的字符,软件与硬件的结合非常神奇,但我对硬件的掌握还有待提高