STM32第一周复习

资料可以去意法半导体官网

最底层(了解)CM3权威指南/CM4权威指南

芯片参考手册(了解)STM32F10x中文参考手册

官方其他资源教程(了解)固件库包(含参考源码),官方培训PPT

熟练掌握C语言

熟练掌握一种开发环境

库函数和寄存器对比学习

入门一款单片机的学习目标

基本外设

  • GPIO输入输出,
  • 外部中断
  • 定时器
  • 串口

基本外设接口

  • SPI
  • IIC
  • WDG
  • FSMC
  • ADC/DAC
  • SDIO

高级功能

  • UCOS
  • FATFS
  • EMWIN

外什么选择STM32

什么是STM32

Cortex-M3属于ARMv7架构

A系列 面对尖端的基于虚拟内存系统的操作系统和用户

R系列 针对于实时系统

M系列 对微控制器

性价比高,更稳定,所以可以替换ARM7

芯片有哪些资源

ZET6 144个引脚 112个IO 512K 64K

RCT6 64个引脚 51个IO 256K 48K

强大的时钟系统

上电复位,掉电复位

低功耗

AD 3个12位 内置参考电压 内置温度

DA 2个12位

DMA 12个DMA通道

定时器 多达11个定时器

通信接口 2个I2C 5个串口 3个SPI 1个CAN2.0 1个USB FS 1个SDIO

最小系统

供电

复位

时钟

boot启动模式选择

下载电路

后备电池

程序下载

串口下载
STM32的ISP下载只能通过串口1,也就是对应的PA9,PA10

选择DTR低电平复位,RTS高电平进bootloader

STlink下载时sw下载模式,只要四根线

新建工程

  • 新建user文件夹 新建工程 将对应的启动文件复制到user目录下
  • 为了代码的整洁,新建OBJ文件夹,把自动生的listings和objects文件夹里的东西全放过来
  • 将系统代码拷贝到SYSTEM
  • 新建test.c保存在USER文件夹
  • 修改路径和宏定义 STM32F10X_HD
  • 库函数多加一个STM32F10x_FWLib和core
  • STM32F10x_FWLib里面是inc 和 snc
  • 库函数多拷贝七个文件在user目录下

GPIO

  • 有ft的可以容忍5v

浮空输入 可以读取外部电平

输入下拉

输入上拉

模拟输入 ADC转化

开漏输出适合于做电流型的驱动,
其吸收电流的能力相对强(一般 20ma 以内)。利用外部电路的驱动能力,减少 IC 内部的驱动,开漏是用来连接不同电平的器件

推挽输出 推拉式输出级既提高电路的负载能力,又提高开关速度。

复用开漏输出

复用推挽输出

  • 引脚复用
  • 端口重映射
  • 所有IO口都可以作为外部中断输入

上拉电阻和下拉电阻

上拉电阻与下拉电阻的作用

  • 提高输出引脚的驱动能力:
    例如,当STM32的CPU引脚输出高电平,但由于后续电路的影响,输出的高电平不高,就是达不到VCC,影响电路工作。所以要接上拉电阻(其实就是增加导线的输出电流)。下拉电阻情况相反,让STM32的CPU引脚输出低电平,结果由于后续电路影响输出的低电平达不到GND(其实就是降低导线的输出电流),所以接个下拉电阻。

  • 在引脚电平不定的时候,让后面有一个稳定的电平:
    例如,以接上拉电阻举例,在STM32刚上电的时候,芯片引脚电平是不定的,特别引脚是接按键的时候,必须给他个确定的电平,下拉电阻的作用就是如果前面的引脚电平不定的话,强制让电平保持在高电平。

  • 防止引脚悬空,否则会容易产生积累电荷,静电荷,造成电路不稳定。

GPIO库函数

  • 1个初始化函数
  • 2个读取输入电平函数
  • 2个读取输出电平函数
  • 4个设置输出电平函数

库函数步骤

  • 创建init结构体
  • 使能时钟
  • 设置mode pin speed 然后赋给init

寄存器步骤

  • 使能IO口时钟。配置寄存器RCC_APB2ENR
  • 初始化IO口模式。配置寄存器GPIOx_CRH/CRL
  • 操作IO口,输出高低电平。配置寄存器GPIOX_ODR或者BSRR/BRR

位带操作

  • 使能IO口时钟,调用函数RCC_APB2PeriphClockCmd();
  • 初始化IO口模式。调用函数GPIO_Init();
  • 操作IO口,输出高低电平。使用位带操作

APB2外设复位寄存器 RCC_APB2RSTR

MDK中寄存器地址名称映射分析

#define PERIPH_BASE ((uint32_t)0x40000000)  //外设基地址
#define APB2PFRIPH_BASE (PERIPH_BASE + 0x10000)  //APB2基地址
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)  //GPIOA基地址
#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)  //把基地址强制转换成结构体指针类型

时钟系统

STM32第一周复习_第1张图片

HSI RC

  • 内置高速时钟 系统时钟可以选择 可以倍频成系统时钟 ~8M 如果HSE晶体振荡器失效,HSI时钟会被作为备用时钟源

HSE

  • 高速外部时钟 系统时钟可以选择 可以倍频成系统时钟 =4-16M 它的频率最高可达25MHz

LSE

  • 外部低速时钟 实时时钟可以选择 =32.768k

LSI

  • 内部低速时钟 实时时钟可选择 独立看门狗时钟 ~40khz

MCO

  • 输出内部时钟的引脚 SYSCLK HSI HSE PLLCLK

USBCLK

  • usb时钟 48MHz 来自PLL锁相环倍频输出

HCLK

  • 系统时钟 一般72MHz

PCLK1

  • 低速外设 36MHz TIM定时器

PCLK2

  • 高速外设 72MHz TIM1定时器

system_init

  • 参考中文手册
  1. 打开HSE
  2. 等待他就绪
  3. 确定三个分频系数
  4. 确定PLL和倍频系数
  5. 打开PLL
  6. 把系统时钟切换到PLL

Systick定时器

  • 一个简单的定时器 做延时 或者实时系统中的心跳时钟
  • 24位倒数计时器 即使在睡眠模式下也能工作

相关寄存器

  1. CTRL 控制和状态寄存器
  2. LOAD 重装载数值寄存器
  3. VAL 当前值寄存器

端口复用和重映射

端口复用

  • 查看芯片数据手册
  1. IO时钟使能
  2. 外设时钟使能
  3. 初始化IO为对应模式

重映射

  • 查看芯片数据手册
  1. 使能GPIO时钟
  2. 使能功能外设时钟
  3. 使能AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)
  4. 开启重映射GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE)

中断优先级管理

NVIC中断优先级分组

  • STM32F103 60个中断
  1. 抢占优先级高的可以打断低抢断优先级
  2. 高响应优先级不能打断低响应优先级
  3. 同时发生时,高响应优先级先执行
    只设置一次中断优先级分组

中断优先级设置步骤

  1. 系统运行后先设置中断优先级分组。调用函数:
    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
    整个系统执行过程中,只设置一次中断分组。
  2. 针对每个中断,设置对应的抢占优先级和响应优先级:
    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
  3. 如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。

串口通信

通信标准 引脚说明 通信方式 通信方向
UART TXD:发送端RXD:接收端GND:公共地 异步通信 全双工
单总线 DQ:发送端/接收端 异步通信 半双工
SPI SCK:同步时钟 MSIO:主机输入,从机输出 MOSI:主机输出,从机输入 同步通信 全双工
I2C SCL:同步时钟 SDA:数据输入/输出端 同步通信 半双工

串口配置的一般步骤

  1. 串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
  2. 串口复位:USART_DeInit(); 这一步不是必须的
  3. GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP
  4. 串口参数初始化:USART_Init();
  5. 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)NVIC_Init();USART_ITConfig();
  6. 使能串口:USART_Cmd();
  7. 编写中断处理函数:USARTx_IRQHandler();
  8. 串口数据收发:
    void USART_SendData();//发送数据到串口,DR
    uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
  9. 串口传输状态获取:
    FlagStatusUSART_GetFlagStatus(USART_TypeDef* USARTx,uint16_t USART_FLAG);
    void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

你可能感兴趣的:(STM32第一周复习)