1、STM32F103C8T6最小系统:最少的电路组成单片机可以工作的系统
电源电路、时钟电路、复位电路、调试下载电路、启动选择电路
2、存储结构:0x0000 0000 – 0xFFFF FFFF 一共4GB
0x0800 0000 – 0x0801 FFFF是flash,存放下载的代码
0x2000 0000是SRAM内存,代码运行过程中所产生的临时数据变量
0x4000 0000 是外设
0xE000 0000 – 0xE010 0000是M3内部外设寄存器地址,比如中断向量表,系统的滴答时钟等
3、开发方式:
- 汇编操作寄存器:执行效率高,编写难度大、移植性差
代码如下:实现功能:开发板上的LED间隔1s闪烁
MainLoop
; 设置GPIOA_1输出高电平
LDR R0, =(0x40010800 + 0xC) ; GPIOA_ODR
LDR R1, [R0]
ORR R1, R1, #(1<<1)
STR R1, [R0]
BL Delay
; 设置GPIOA_1输出低电平
LDR R0, =(0x40010800 + 0xC) ; GPIOA_ODR
LDR R1, [R0]
BIC R1, R1, #(1<<1)
STR R1, [R0]
BL Delay
B MainLoop
- 使用C语言操作编写寄存器:执行效率适中,编写效率低,移植性差
//定义各个寄存器
#define RCC_APB2ENR (0x40021000 + 0x18)
#define GPIOA_BASE (0x40010800)
#define GPIOA_CRL (GPIOA_BASE + 0)
#define GPIOA_ODR (GPIOA_BASE + 0X0c)
void delay(volatile long i)
{
while (i--);
}
int main(void)
{
volatile unsigned int *pRccApb2Enr;
volatile unsigned int *pGpioaCrl;
volatile unsigned int *pGpioaOdr;
pRccApb2Enr = (volatile unsigned int *)RCC_APB2ENR;
pGpioaCrl = (volatile unsigned int *)GPIOA_CRL;
pGpioaOdr = (volatile unsigned int *)GPIOA_ODR;
/* 1. 使能GPIOA的时钟
* GPIO是挂载在APB2上的,所以我们要使能APB2的外设时钟使能位
* 从RCC_APB2ENR寄存器描述中我们可以看到APB2ENR[8:2]是GPIO[G:A]时钟的控制位,控制GPIO时钟是失能或者使能
* 开发板上的LED的GPIO组是使用的GPIOA,即要使能APB2ENR[2]位,为其赋值“1”即可打开GPIOA的时钟 */
*pRccApb2Enr |= (1<<2);
/* 2. 设置GPIO为输出功能:
* MODE_0=1,PB0输出模式,输出速率最大10MHz
*/
///操作寄存器的地址
*pGpioaCrl |= (1<<4);
while (1)
{
*pGpioaOdr |= (1<<1);
delay(1000000);
*pGpioaOdr &= ~(1<<1);
delay(1000000);
}
}
以上两种开发方式适合任何芯片,阅读数据手册找到对应的寄存器,通过指针变量的方式操作寄存器。
- 使用标准库开发:执行效率稍低,编写效率高,移植性稍低。ST公司最早发布的固件库,对STM32芯片进行了完整的封装,包含所有的外设性能特性,每个外设驱动都由一组函数组成,这组函数可以覆盖该外设的所有功能。但标准库只针对某一系列的stm32芯片,移植性差。
#include "main.h"
#include "stm32f10x.h"
#include "driver_led.h"
void delay(volatile long i)
{
while (i--);
}
int main(void)
{
// 初始化LED
LedGpioInit();
// 点亮LED灯
while(1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
delay(1000000);
GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);
delay(1000000);
}
}
在LedGpioInit()中定义结构体变量,使能相应的时钟,配置引脚参数,初始化引脚配置。
- 使用HAL库开发:执行效率稍低,编写效率高,移植性好。
HAL库支持STM32全系产品,相比于标准库,HAL库具有更的抽象整合水平,可以轻松实现一个STM32产品移植到另一个不同系列的STM32产品上。
#include "main.h"
#include "driver_led.h"
int main(void)
{
// 初始化HAL库函数必须要调用此函数
HAL_Init();
// 系统时钟即AHB/APB时钟配置
SystemClock_Config();
// 初始化LED
LedGpioInit();
// 点亮LED灯
while(1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_Delay(1000);
}
}