与51单片机不同,STM32有三种开发模式
寄存器模式:最底层的开发,运行速度最快。实际上也是使用了固件库,但是不是使用固件库的函数,而是使用了固件库的定义,包括宏定义,结构体定义。和51的开发差不多,但因为32的寄存器太多,实际开发手动配置大量寄存器极其耗费时间,同时在没有注释的情况下可读性差,所以较少使用。
标准库模式:基于寄存器进行了函数的封装,而由于函数封装以及内部大量的检查参数有效性的代码,运行速度相对于寄存器模式较慢。封装之后可以根据函数名字就能明白代码作用,容易记忆,使用方便,所以较多人使用。
HAL库模式:全称是Hardware Abstraction Layer(抽象印象层),相比于标准库更加深入的封装,有句柄、回调函数等概念(ps:有点类似Windows开发),因此相对于标准库模式有更好的可移植性(可在不同芯片的移植),但代价就是更多的性能损失。
目前我所用的为标准库模式
使用单片机时一定得开外设时钟-每个外设都有独立时钟,如果不打开时钟外设就不能用,原因就是为了低功耗节省用电,不用的外设可以不打开时钟
开设时钟方法
/*
AHB外设总线:
DMA1,DMA2,SRAM,FLITF,CRC,FSMC,SDIO
*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,DISABLE);
/*
APB1外设总线:
TIM2,TIM3,TIM4,TIM5,TIM6,TIM7,TIM12,TIM13,TIM14,WWDG
SPI2,SPI3,USART2,USART3,UART4,UART5,I2C1,I2C2,USB,CAN1,CAN2,BKP,PWR,DAC,CEC,
*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,DISABLE);
/*
APB2外设总线:
AFIO,GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG,ADC1,ADC2
TIM1,SPI1,TIM8,USART1,ADC3,TIM15,TIM16,TIM17,TIM9,TIM10,TIM11
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, DISABLE);
使LED闪烁和使用蜂鸣器
一般我们用GPIO(中文名为通用输入和输入端口)
GPIO有八种模式
大多数情况谁用推挽模式
所以LED闪烁我们在GPIO中的GPIOA口实现(GPIOB也可以)
首先连接好相关的电路
例如
并在keil5写好相关程序
开启外设时钟->初始化GPIO端口->给外设端口置低电平
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1)
{
GPIO_Write(GPIOA, ~0x0001);
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0002);
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0004);
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0008);
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0010);
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0020);
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0040);
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0080);
Delay_ms(100);
}
}
蜂鸣器与LED类似
连接图
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
while (1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
}