实现目标
1、STM32 基于HAL库定时器的使用;
2、加强数码管的学习。
一、定时器概述?
1、生活中哪些场景会用到定时器?
2、STM32F1定时器
二、原理图设计
三、STM32CubeMX 配置
1.定时器时钟配置
2.定时器3、数码管、蜂鸣器的配置
3.开启定时器3中断
四、程序设计
1.打开定时器3中断
开启定时中断函数: HAL_TIM_Base_Start_IT(&htimx); //x 为要开启的定时器号,下面代码为开启定时器2中断,x= 3
HAL_TIM_Base_Start_IT(&htim3);//开启定时器3中断
2.重写中断回调函数
中断回调函数内尽量少放我们处理的代码。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim3.Instance) //1S进入1次中断
{
s++;//秒 ++
if ( s >= 60)//1s 到
{
s = 0;
flag = 1;
}
}
}
3.74HC595驱动程序、自写延时函数
void HC595_Send_Byte(unsigned char byte)
{
unsigned char i;
for (i = 0; i < 8; i ++) //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
{
/**** 步骤1:将数据传到DS引脚 ****/
if (byte & 0x80) //先传输高位,通过与运算判断第八是否为1
HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_SET); //如果第八位是1,则与 595 DS连接的引脚输出高电平
else //否则输出低电平
HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_RESET);
/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_RESET); // SHCP拉低
for_delay_us(5); // 适当延时
HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_SET); // SHCP拉高, SHCP产生上升沿
for_delay_us(5);
byte <<= 1; // 左移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1
}
/** 步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器 **/
HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_RESET); // 将STCP拉低
for_delay_us(5);
HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_SET);// 再将STCP拉高,STCP即可产生一个上升沿
for_delay_us(5);
}
/*
for循环实现延时us
*/
void for_delay_us(uint32_t nus)
{
uint32_t Delay = nus * 168/4;
do
{
}
while (Delay --);
}
4.while(1)中实现的功能函数
if (flag == 1)
{
flag = 0;
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
HAL_Delay(200);
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
HAL_Delay(200);
}
HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);
HC595_Send_Byte(table[s/10]);//函数调用
for_delay_us(5); // 适当延时
HC595_Send_Byte(0xff); // 消影
HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);
HC595_Send_Byte(table[s%10]);//函数调用
for_delay_us(5); // 适当延时
HC595_Send_Byte(0xff);// 消影