00. 目录
01. STM32概述
STM32是一款由意法半导体(STMicroelectronics,简称ST)公司制造的微控制器(MCU),它基于ARM Cortex-M内核设计,专为要求高性能、低成本、低功耗的嵌入式应用而设计。以下是对STM32的详细介绍:
产品概述
- 内核:STM32采用了ARM Cortex-M系列内核,包括M0、M0+、M3、M4和M7等多种系列,能够满足不同应用场景的需求。
- 特点:高性能、低成本、低功耗、可裁剪,这些特点使得STM32在嵌入式开发领域具有广泛的应用前景。
- 应用领域:STM32微控制器广泛应用于工业自动化、汽车电子、消费电子、物联网、无人机、嵌入式设备等多个领域。
产品系列
STM32系列微控制器按照内核架构和性能特点可以分为多个系列,主要包括:
- 主流产品:如STM32F0、STM32F1、STM32F3等,适用于一般的嵌入式应用。
- 超低功耗产品:如STM32L0、STM32L1、STM32L4等,专为低功耗设计,适用于对功耗要求较高的应用。
- 高性能产品:如STM32F2、STM32F4、STM32F7、STM32H7等,具有更高的处理速度和更强的外设功能,适用于需要高性能的应用场景。
技术特点
- 高性能:STM32微控制器的主频可达72MHz以上,能够满足各种高速数据处理需求。
- 丰富的外设资源:STM32集成了GPIO、USART、SPI、I2C等多种外设资源,可满足各种通信和控制需求。
- 低功耗:STM32采用了先进的低功耗技术,如休眠模式、待机模式等,可大幅降低功耗。
- 易用的开发工具:STM32提供了丰富的开发工具,如Keil、IAR等,支持多种编程语言(如C、C++、汇编等),方便开发人员进行开发和调试。
02. 硬件原理图
硬件只有 LED(DS0 和 DS1)。其电路在 ALIENTEK 战舰 STM32F103 上默认是已经连接好了的。DS0 接 PB5,DS1 接 PE5。
03. 程序示例一
GPIO 相关的函数和定义分布在 HAL库文件 stm32f1xx_hal_gpio.c 和头文件 stm32f1xx_hal_gpio.h 文件中。
LED0不断地闪烁
led.h
#ifndef __LED_H__
#define __LED_H__
#include "stm32f1xx.h"
//LED初始化
void led_init(void);
void led0_on(void);
void led1_on(void);
void led0_off(void);
void led1_off(void);
#endif /*__LED_H__*/
led.c
#include "led.h"
//LED初始化 DS0接PB5 DS1接PE5
void led_init(void)
{
GPIO_InitTypeDef GPIO_Init;
//使能对应的时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
//使能对应的时钟
__HAL_RCC_GPIOE_CLK_ENABLE();
//PB5
GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init.Pin = GPIO_PIN_5;
GPIO_Init.Pull = GPIO_PULLUP;
GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_Init);
//PE5
GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init.Pin = GPIO_PIN_5;
GPIO_Init.Pull = GPIO_PULLUP;
GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOE, &GPIO_Init);
//默认DS0和DS1处于灭的状态
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);
}
void led0_on(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
}
void led1_on(void)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET);
}
void led0_off(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
void led1_off(void)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);
}
main.c
#include "stm32f1xx.h"
#include "sys.h"
#include "led.h"
#include "delay.h"
int main(void)
{
GPIO_InitTypeDef GPIO_Initure;
HAL_Init();
Stm32_Clock_Init(RCC_PLL_MUL9);
delay_init(72);
led_init();
while(1)
{
led0_on();
delay_ms(1000);
led0_off();
delay_ms(1000);
}
}
程序下载:01-LED.rar
04. 程序示例二
LED0和LED1交替亮灭
led.h
#ifndef __LED_H__
#define __LED_H__
#include "stm32f1xx.h"
//LED初始化
void led_init(void);
void led0_on(void);
void led1_on(void);
void led0_off(void);
void led1_off(void);
#endif /*__LED_H__*/
led.c
#include "led.h"
//LED初始化 DS0接PB5 DS1接PE5
void led_init(void)
{
GPIO_InitTypeDef GPIO_Init;
//使能对应的时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
//使能对应的时钟
__HAL_RCC_GPIOE_CLK_ENABLE();
//PB5
GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init.Pin = GPIO_PIN_5;
GPIO_Init.Pull = GPIO_PULLUP;
GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_Init);
//PE5
GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init.Pin = GPIO_PIN_5;
GPIO_Init.Pull = GPIO_PULLUP;
GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOE, &GPIO_Init);
//默认DS0和DS1处于灭的状态
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);
}
void led0_on(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
}
void led1_on(void)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET);
}
void led0_off(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
void led1_off(void)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);
}
main.c
#include "stm32f1xx.h"
#include "sys.h"
#include "led.h"
#include "delay.h"
int main(void)
{
HAL_Init();
Stm32_Clock_Init(RCC_PLL_MUL9);
delay_init(72);
led_init();
while(1)
{
led0_on();
led1_off();
delay_ms(1000);
led0_off();
led1_on();
delay_ms(1000);
}
}
程序下载:02-LED.rar