STM32简介
系统架构
新建工程
建立工程文件夹,Keil中新建工程,选择型号(STM32F103C8)
工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run
解决STLink驱动问题
驱动文件keil自带(64位):C:\Keil_v5\ARM\STLink\USBDriver\dpinst_amd64.exe
使用寄存器点灯
#include "stm32f10x.h" // Device header
int main(void)
{
//配置三个寄存器就可以点灯
RCC->APB2ENR=0x00000010;//打开GPIOC时钟
GPIOC->CRH=0X00300000;//配置PC13口的模式
// GPIOC->ODR=0x00002000;//熄灭
GPIOC->ODR=0x00000000;//点亮
while(1){
}
}
RCC->APB2ENR=0x00000010
RCC 是 Reset and Clock Control 的缩写,用于控制STM32微控制器的时钟和重置功能。
RCC->APB2ENR:APB2 外设时钟使能寄存器
Advanced Peripheral Bus 2 Enable Register
GPIOC->CRH=0X00300000;
GPIOC 代表了GPIO端口C,是微控制器上一个用于通用输入输出的端口。
CRH 是 Control Register High 的缩写,用于设置GPIO端口的高位引脚(通常是8-15号引脚)的模式和输出类型。
0000 0000 0011 0000 0000 0000 0000 0000,其中 0011 对应13号引脚
GPIOC->ODR=0x00002000;
ODR 是 Output Data Register 的缩写,用于控制GPIO端口上的引脚输出。
0x00002000 是用来设置端口输出的数据。这个值在二进制中为 0000 0000 0000 0000 0010 0000 0000 0000,这里主要设置了13号引脚为高电平,通常这意味着点亮连接到该引脚的LED灯
使用库函数点灯
//使用库函数点灯
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//启用了GPIOC的时钟
//配置端口模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//0x10,设置GPIO端口的模式为推挽输出(Push-Pull Output)
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//配置的引脚是13号引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//引脚的速度为50MHz,这是输出信号变化的最大频率。
GPIO_Init(GPIOC,&GPIO_InitStructure);
//GPIO_SetBits(GPIOC,GPIO_Pin_13);//设置Pin13高电平
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//设置Pin13低电平
while(1){
}
GPIO
- GPIO(General Purpose Input Output)通用输入输出口
- 可配置为8种输入输出模式
- 引脚电平:0V~3.3V,部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
一个端口只能有一个输出,但可以有多个输入
在GPIO的这8种模式中,除了模拟输入这个模式会关闭数字的输入功能,其他模式,输入功能均有效
TTL肖特基触发器(施密特触发器)阙值,防抖
GPIO输出
开漏输出、开漏复用输出、推挽输出、推挽复用输出
开漏输出
I2C通信的引脚
P-MOS无效,N-MOS有效
当数据为0时 上管无效,下管导通,输出直接接到VSS,就是输出低电平
当数据为1时 上管无效,下管断开 高阻模式
输出5v的电平信号(高电平)
复用开漏输出
复用推挽输出
推挽输出
P-MOS N-MOS均有效
推挽模式下,STM32对IO口具有绝对的控制权,高低电平都由STM32说的算.
数据寄存器位为1时:上管导通,下管断开,输出直接接到VDD,就是输出高电平
数据寄存器位为0时:上管断开,下管导通,输出直接接到VSS,就是输出低电平
LED闪烁&LED流水灯&蜂鸣器
LED闪烁
\STM32入门教程资料\程序源码\STM32Project-无注释版\1-1 接线图
操作STM-32的GPIO需要三个步骤
第一步:使用RCC开启GPIO时钟
第二步:使用GPIO_Init初始化GPIO
第三步:使用输出或输入函数控制GPIO
测试开漏模式的高电平
LED流水灯
//时钟
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){
//给电 流水灯点亮
unsigned char i=0;
for(i=0;i<8;i++){
GPIO_Write(GPIOA, ~(0x001<<i)); //0000 0000 0000 0001,PA0引脚为低电平,其他引脚均为高电平,注意数据有按位取反
Delay_ms(500); //延时100ms
}
}
蜂鸣器
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
//使用各个外设前必须开启时钟,否则对外设的操作无效
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //GPIO引脚,赋值为第12号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数
//函数内部会自动根据结构体的参数配置相应寄存器
//实现GPIOB的初始化
/*主循环,循环体内的代码会一直循环执行*/
while (1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_11); //将PB12引脚设置为低电平,蜂鸣器鸣叫
Delay_ms(100); //延时100ms
GPIO_SetBits(GPIOB, GPIO_Pin_11); //将PB12引脚设置为高电平,蜂鸣器停止
Delay_ms(100); //延时100ms
GPIO_ResetBits(GPIOB, GPIO_Pin_11); //将PB12引脚设置为低电平,蜂鸣器鸣叫
Delay_ms(100); //延时100ms
GPIO_SetBits(GPIOB, GPIO_Pin_11); //将PB12引脚设置为高电平,蜂鸣器停止
Delay_ms(700); //延时700ms
}
GPIO输入
输出断开
浮空输入
P-MOS,N-MOS均无效,电平取决于输入数据
上拉输入
P-MOS有效
下拉输入
N-MOS有效
模拟输入
两个MOS管均无效,端口的信号由外部信号控制。ADC配置模拟输入