当前位置: 首页 > java >正文

【STM32开发】-单片机开发基础(以STM32F407为例)

一、单片机简介

        单片机又称单片微控制器,不是完成某个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上,与计算机相比,单片机只缺少I/O设备

        以STM32F407为例:

 特点:

1、它是ST推出的基于ARM Cortex-M4内核的高性能微控制器;

2、性价比高。一般十几元就能购得。

3、市场大,开发质料很多,对初级开发中很友好。

4、性能强大。工作频率为168MHz。

5、外设丰富。通信接口比如I2C,SPI、CAN等。

二、常用操作

1、GPIO操作

        在开发中需要控制一些许多结构简单的外部设备,使用传统的串口或者并口就比较复杂,所以GPIO又被称为“通用可编程I/O端口”。

        在STM32F407上,有7组I/O:GPIOA~GPIOG,每组I/O有16个I/0口,通常表示为PAx,PBx......

        知识点:

1、GPIO复用:

        单片机有很多内置的外设,这些外设的外部引脚与GPIO共用,如果要使用这些内置外设功能的引脚,那就需要GPIO复用,那么当GPIO作为内置外设使用的时候,就叫作复用。

2、GPIO的输入模式:

        浮空输入,模拟输入,上拉输入,下拉输入。

3、GPIO的输出模式;

        开漏输出(带上拉或者下拉,以下同),复用开漏输出,推挽输出,复用推挽输出。

2、中断

        中断是指计算机运行过程中,出现某些意外的情况需要计算机处理时,计算机能够自动停止正在运行的程序并转入处理新的情况的程序,处理完又回到原来暂停的程序继续执行的功能。

中断的三个重要因素:

        1、中断源:引起中断发生的原因。

        2、中断处理函数:当中断发生时,需要指定为该中断处理的特定函数,否则计算机无法处理这个中断。

        3、可返回:中断完必须能够返回原先执行的程序。

中断向量表:

        在STM32中,将中断分为两种类型:内核中断外部中断,然后将所有中断编排成一个表,也就是常说的中断向量表。

!!!注意:内部中断是不能被打断的,也不能设置优先级,凌驾于外部中断之上,比如复位。

外部中断在实际使用更多,可配置两种优先级:抢占优先级响应优先级;

        抢占优先级:就是抢占优先级高的能够打断抢占优先级低的,优先级高的处理完后回来在处理优先级低的任务。

        响应优先级:就是若两个任务的抢占式优先级相同时,响应优先级高的先执行。

在STM32中,有一个专门管理中断的控制器:NVIC

补充知识点:EXTI外部中断

在STM32中,所有的GPIO都引入了EXTI的外部中断线上,所有的I/O口配置后都能够触发中断;同一时刻每个中断线只能对应一个GPIO的中断,比如:EXTI0对应PA0、PB0、PC0......

在EXTI中有三种触发中断的方式:

(1)上升沿触发:就是GPIO口的输入电压由低电平变高电平的瞬间。

(2)下降沿触发:GPIO口的输入电压由高电平变低电平的瞬间。

(3)双边沿触发:就是GPIO口的输入电压由低电平变高电平或者GPIO口的输入电压由高电平变低电平都能触发。

3、定时器

        定时器的本质就是一个加1计数器。随着计数器的输入脉冲进行自加1,常见用法:

        1、定时功能:实现精确的定时功能。

        2、PWM输出:在定时器中断处理函数中控制GPIO引脚输出电平,可以实现输出一个PWM波形,比如电机控制。

        3、输入捕获:对于某些作为输入的引脚,可以使用定时器中断精确的获取波形的变化时间间隔。

在STM32中,通常分为高级控制定时器、32位通用定时器、16位通用定时器、基本定时器。

经常使用的定时器:

1、systick定时器

        systick定时器捆绑在NVIC中,通常我们使用systick定时来做精确的延时功能:

static u8 fac_us=0; //us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
//delay初始化函数
void delay_init()
{//设置8分频,也就是72/8=9MHzSysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);fac_us = SYSCLK/8;fac_ms = (u16)fac_us * 1000;
}
void dely_us(u32 nus)
{u32 time;SysTick->LOAD = nus*fac_us;                //时间加载SysTick->VAL = 0x00;                      //清空计数器SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始倒计时do{time = SysTick->CTRL;}while((time&0x01) &&! (time&(1<<16)));//等待时间到SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;//关闭定时器SysTick->VAL = 0x00;//关闭计数器
}
//ms级别的....

4、USART串口

有两个:

UART:通用异步串行接受发送器;

USART: 通用同步异步串行接受发送器;

区别:USART比UART多一个同步功能,其他基本上没区别。

串口最重要的参数是波特率,也就是每秒传送的码元符号的个数,因此比特率越大,数据的传输速度就越快。

知识点:

数据格式:

USART一般格式为:启动位、数据位、奇偶校验位、停止位。

5、I2C总线(重点)

        i2c总线是一种简单的双线二线制同步串行总线,是一个主从结构的总线,所有的数据传输都必须由主机发起,通常单片机做主机,其他设备为从机。

        从机(元器件)地址:连接在i2c总线上的设备,都有自己的地址,主机想要和某个元器件通信,先往i2c总线发送从机地址。地址一般为8位,最后一位为读写标志位。

重要知识点:

        1、I2C时序:

I2C总线只需要两根线数据线(SDA)时钟线(SCL)。数据格式主要有:

①起始位:主机要使用i2c数据传输时,需要先往i2c总线发起起始位。起始位的条件为:SCL线为高电平时,SDA线从高电平向低电平切换。

②停止位:主机要停止i2c数据传输时,需要先往i2c总线发起停止位。停止位的条件是:SCL线为高电平时,SDA线从低电平向高电平切换。

③数据位:数据线上的每个字节必须是8位,传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。

④应答位:每个字节传输必须带响应位。

⑤NACK位

        2、模拟I2C

主要通过模拟I2C时序,使用I/O模拟I2C,具体通过GPIO口实现模拟I2C功能。

在实际使用时,根据I2C的时序,需要写I2C的初始化,起始信号停止信号应答信号,比如发送一字节:

//sen为要发送的数据
void IIC_write(u8 sen)
{u8 t;IIC_SCL = 0;for(t=0;t<8;t++){//先发送高位IIC_SDAOUT = (sen&0x80)>>7;//左移一位sen = (sen<<1);delay_us(2);IIC_SCL = 1;delay_us(2);IIC_SCL = 0;delay_us(2);}
}

读时序和发时序相同,不同的是发送时需要在SCL低电平时改为SDA数据位,二读时需要在SCL高电平的时候读取SDA数据位。 

6、SPI总线

         SPI是一种同步串行接口,用于MCU与各种外围元器件进行全双工、同步串行通信。

知识点:

1、四条线

只需要四条线就可以完成MCU与各种外围元器件的通信:串行时钟线(CSK)主机输入/从机输出数据线(MISO)主机输出/从机输入数据线(MOSI)低电平有效从机选择线(CS)

2、四种工作模式

从设备的通信方式一般在出厂就设置好了,主设备可通过CPOL(时钟极性)CPHA(时钟相位)来选择和从设备相同的通信模式,注意:通信双方必须在同一模式下。

四种模式:

①CPOL=0,CPHA=0;

② CPOL=0,CPHA=1;

③CPOL=1,CPHA=0;

④CPOL=1,CPHA=1;

对于STM32,它提供SPI控制器,只需要设置好相关参数就可以进行SPI通信。一般步骤为:

1、初始化CS片选引脚:CS输出高电平表示对应从设备不工作,低电平则表示进行通信。

2、初始化CSK、MISO、MOSI引脚。

3、配置SPI控制器:主要配置CPOL、CPHA,即配置对应的SPI工作模式。

4、发送和接受数据可以使用STM32标准库函数,可以直接使用。

暂且学到这。(*^▽^*)

http://www.xdnf.cn/news/5408.html

相关文章:

  • SEO长尾关键词布局优化法则
  • 虚拟内存笔记(三)虚拟内存替换策略与机制
  • 前端项目打包部署流程j
  • 北大闰凯博士:热辐射输运问题蒙特卡罗模拟中的全局最优参考场方法
  • HTOL集成电路老化测试学习总结-20250510
  • Linux : 多线程【线程概念】
  • ssh -T git@github.com 测试失败解决方案:修改hosts文件
  • 计算机基础
  • 深入了解linux系统—— 自定义shell
  • 24、TypeScript:预言家之书——React 19 类型系统
  • MYSQL语句,索引,视图,存储过程,触发器(一)
  • 用 LVGL 打造苹果风格音量滑块:圆润无球,极简优雅
  • TCP/IP 模型每层的封装格式
  • C++ stl中的set、multiset、map、multimap的相关函数用法
  • SQL语句的优化
  • 学习和测试WebApi项目限制客户端ip访问接口(基于中间件)
  • Python httpx库终极指南
  • 端口号被占用怎么解决
  • 《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions)
  • JAVA EE_网络原理_网络层
  • PowerShell 脚本中文乱码处理
  • 《Linux命令行大全(第2版)》PDF下载
  • TAPIP3D:持久3D几何中跟踪任意点
  • Java--图书管理系统(简易版优化)
  • Oracle — 内置函数
  • Python Bug 修复案例分析:多线程数据竞争引发的bug 两种修复方法
  • Java多态详解
  • 图形学、人机交互、VR/AR领域文献速读【持续更新中...】
  • TypeScript 类型保护详解
  • 《Go小技巧易错点100例》第三十一篇