-
1 知识介绍
-
2 PPT
-
3 学习视频
-
4 国家脊梁
任务要求
设计一个LED流水灯系统,共有8个LED灯,都有各自的编号,从LED1~LED8,当上电之后,这8个灯处于熄灭,再接下来8个LED灯依次点亮,并循环往复。LED1~LED8上电进入熄灭状态。(如

知识链接
(一)认识STM32Cube嵌入式软件包——以STM32CubeF1为例
找到软件包的存放地址。

进入嵌入式软件包存放地址。

软件包的组件构成框架。

(二)工程架构分析
了解STM32CubeMX软件生成的初始C代码工程:
工程架构(
图 2-30 )主要函数功能与执行过程(
图 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的工作模式如

(四)定时器基本定时功能配置
1.STM32F103VE型号MCU定时器概述(图 2-33 )

三种类型定时器的功能差异(

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

计数器寄存器(TIMx_CNT):存储定时器当前的计数值
预分频器寄存器(TIMx_PSC):可以计算CK_CNT的时钟频率与CK_PSC的时钟频率关系
自动重载寄存器(TIMx_ARR):预装载寄存器和影子寄存器
使用STM32F103VE微控制器的基本定时器(

①时钟源
②控制器模块
③时基单元
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功能(

①GPIO默认的输出电平配置为“High”
②GPIO模式配置为“Output Push Pull”
③GPIO上拉下拉功能配置为“No pull-up and no pull-down”
④GPIO最大输出速度配置为“High”
⑤用户标签分别配置成“LED1~LED8”
7.配置定时器TIM6的参数与中断功能(


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 */


