目录

  • 1 课程简介
    • 1.1 课程简介
    • 1.2 课程标准
    • 1.3 职业证书对接
    • 1.4 课程分工
  • 2 数据采集
    • 2.1 数据采集之数字量传感数据采集
    • 2.2 数据采集之模拟量传感数据采集
    • 2.3 数据采集之模拟量转换为数字量
    • 2.4 数据采集之开关量传感数据采集
  • 3 STM32微控制器基本外设应用开发
    • 3.1 STM32基础知识
    • 3.2 任务1 开发环境搭建和工程建立
    • 3.3 任务2 LED流水灯应用开发
    • 3.4 任务3 按键控制LED灯亮灭
    • 3.5 任务4 串行通信控制LED流水灯应用开发
    • 3.6 任务5 电池电量检测应用开发
  • 4 RS-485总线通信应用
    • 4.1 RS-485基本知识
    • 4.2 RS-485通信协议及网关通信协议
    • 4.3 Modbus通信协议
    • 4.4 任务1 案例分析及工程代码编写
    • 4.5 任务2 系统搭建及云平台项目创建
  • 5 CAN总线通信应用
    • 5.1 CAN总线基本知识
    • 5.2 CAN通信帧
    • 5.3 CAN控制器和收发器
    • 5.4 任务1 案例分析及工程代码编写
    • 5.5 任务2 系统搭建及云平台项目创建
    • 5.6 任务3 CAN通信数据抓包与解析
  • 6 BasicRF的无线通信应用
    • 6.1 BasicRF基础知识
    • 6.2 任务1创建工程项目
    • 6.3 任务2 温湿度节点数据采集
    • 6.4 任务3 火焰节点数据采集
    • 6.5 任务4 传感器节点组网
    • 6.6 任务5 传感数据汇聚
  • 7 WiFi数据通信
    • 7.1 WI-FI基础知识
    • 7.2 使用AT指令配置WI-FI工作模式
    • 7.3 WI-FI接入云平台
  • 8 NB-IoT联网通信
    • 8.1 NB-IoT技术简介
    • 8.2 利尔达NB-IoT模组介绍
    • 8.3 任务1 “智慧路灯”AT指令代码编写
    • 8.4 任务2.烧写智能路灯
    • 8.5 任务3NB-IoT接入云平台
  • 9 LoRa 通信技术
    • 9.1 基础知识
    • 9.2 项目分析与LoRa驱动移植
    • 9.3 任务2 LoRa温湿度传感器节点应用程序开发
    • 9.4 任务3 LoRa光照传感器节点数据采集
    • 9.5 任务4 LoRa网关节点汇聚传感器数据
    • 9.6 讨论
任务2 LED流水灯应用开发
  • 1 知识介绍
  • 2 PPT
  • 3 学习视频
  • 4 国家脊梁

任务要求

设计一个LED流水灯系统,共有8个LED灯,都有各自的编号,从LED1~LED8,当上电之后,这8个灯处于熄灭,再接下来8个LED灯依次点亮,并循环往复。LED1~LED8上电进入熄灭状态。(如图 2-26所示)

2


2-26LED流水灯电路图


知识链接

(一)认识STM32Cube嵌入式软件包——以STM32CubeF1为例

找到软件包的存放地址。图 2-27

图片2


2-27嵌入式软件包的存放地址


进入嵌入式软件包存放地址。图 2-28

图片3


2-28嵌入式软件包的构成


软件包的组件构成框架。图 2-29

图片4


2-29STM32Cube软件包组件


(二)工程架构分析

了解STM32CubeMX软件生成的初始C代码工程:

  • 工程架构(图 2-30

  • 主要函数功能与执行过程(图 2-31

图片5


2-30初始C代码工程架构8


2-31系统初始化与主循环函数功能说明


(三)GPIO工作模式配置

某个GPIO端口的初始化函数原型是:

void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init) 

其原型定义为:

typedef struct

{

uint32_t Pin;    //要初始化的GPI0引脚编号

uint32_t Mode;    //GPIO引脚的工作模式

uint32_t Pull;    //GPIo引脚的上拉/下拉形式

uint32_t Speed.;    //GPI0引脚的输出速度

}GPIO InitTypeDef;

GPIO的工作模式如图 2-32所示。

10


2-32GPIO工作模式


(四)定时器基本定时功能配置

1.STM32F103VE型号MCU定时器概述(图 2-33

11


2-33STM32F103VE定时器


三种类型定时器的功能差异(图 2-34

12


2-34定时器区别


2.基本定时器功能框图

基本定时器主要的三个部分:时钟源,控制器模块,时基单元。其中时基单元包含三个寄存器:计数器寄存器,预分频器寄存器,自动重载寄存器。(图 2-35

13


2-35基本定时器构成


计数器寄存器(TIMx_CNT):存储定时器当前的计数值

预分频器寄存器(TIMx_PSC):可以计算CK_CNT的时钟频率与CK_PSC的时钟频率关系

自动重载寄存器(TIMx_ARR):预装载寄存器和影子寄存器

使用STM32F103VE微控制器的基本定时器(图 2-36

图片6


2-36基本定时器功能框图


①时钟源

②控制器模块

③时基单元

3.定时器基本初始化结构体介绍

定时器工作参数的配置是通过“定时器基本初始化结构体”来完成的,其原型定义如下:

typedef struct

{

uint32_t Prescaler;      //定时器时钟源分频系数

uint32_t CounterMode;      //计数模式

uint32_t Period;      //周期(自动重载值)

uint32_t ClockDivision:      //定时器内部时钟分频系数

uint32_t RepetitionCounteri;     //重复计数值

uint32_t AutoReloadPreload;      //是否启用预加载功能

}TIM_Base_InitTypeDef;

4.配置定时器的工作参数

任务要求:LED流水灯每隔1秒钟切换一次显示效果。因此可以使能TIM6的更新中断,时间间隔配置为1秒钟。

配置CK_CNT频率:TIM6挂载在APB1总线上,定时器时钟源频率(CK_INT = CK_PSC)为72MHz。可将TIMx_PSC配置为7199,根据计算公式可得:

fCK_CNT = 72MHz / (7199 + 1) = 10000Hz(周期为100μs)

配置自动重载寄存器TIMx_ARR值:

1s(1000000μs)÷ 100us = 10000 = (TIMx_ARR + 1)

即:TIMx_ARR = 10000 – 1 = 9999

任务实施

(一)建立STM32CubeMX工程并生成初始C代码

1.建立工程存放的文件夹

2.新建STM32CubeMX工程

3.选择MCU型号:STM32F103VE的微控制器

4.配置调试端口:(“PA13”引脚配置为SWDIO功能,“PA14”引脚配置为SWCLK功能)

5.配置MCU时钟树:(HCLK配置为72MHz,PCLK1配置为36MHz,PCLK2配置为72MHz)

6.配置LED灯相关的GPIO功能(图 2-37

图片8


2-37GPIO功能配置


①GPIO默认的输出电平配置为“High”

②GPIO模式配置为“Output Push Pull”

③GPIO上拉下拉功能配置为“No pull-up        and no pull-down”

④GPIO最大输出速度配置为“High”

⑤用户标签分别配置成“LED1~LED8”

7.配置定时器TIM6的参数与中断功能(图 2-38图 2-39

图片9


2-38定时器TIM6的配置图片10


2-39定时器中断的配置


8.保存STM32CubeMX工程

9.生成初始C代码工程

(二)完善代码

1.启动TIM6中断

在“main.c”中添加以下代码启动TIM6的中断。

/* USER CODE BEGIN 2 */
if (HAL_TIM_Base_Start_IT(&htim6)!=HAL_OK)
{
    Error_Handler();
}
/* USER CODE END 2 */

2.编写TIM6中断服务程序

在“main.c”中定义公共变量num:

/* USER CODE BEGIN PV */
  uint16_t num = 0x100;
/* USER CODE END PV */

添加TIM6中断服务程序:

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(TIM6 == htim->Instance)
  {
    num = num>>1;
    if(num == 0)
      num = 0x80;
    HAL_GPIO_WritePin(GPIOE,0xff,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOE,num,GPIO_PIN_RESET);
  }
}
/*USER CODE END 4 */