文章目录
一、前言
1.1 开发环境
①Keil MDK V5.38a
②STM32CubemxV6.10.0
③正点原子战舰板(STM32F103ZET6)
④高速DAP仿真器
1.2 Pwm电路原理
1.3 开发板电路原理
二、功能实现
2.1 STM32Cubemx配置
基于【STM32】Gpio通用输入输出功能实现笔记所创建的工程进行修改,需要使能TIM3的CH2为PWM模式,并配置定时器的计数周期为1us,定时周期为20ms。
使能TIM3的定时中断
设置TIM3定时中断的优先级
2.2 Keil MDK工程编码
2.2.1 呼吸灯功能代码
void Led0_Breath_Start(void)
{
HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_2);
}
void Led0_Breath_Periodic_Scheduling(void)
{
uint32_t new_cmp_cnt = 0;
static uint8_t duty_cycle = 0;
static uint8_t light_state = 0;
if(0 != light_state)
{
if(100 == duty_cycle)
{
light_state = 0;
}
else
{
duty_cycle += 1;
}
}
else
{
if(0 == duty_cycle)
{
light_state = 1;
}
else
{
duty_cycle -= 1;
}
}
new_cmp_cnt = 20000 - 1;
new_cmp_cnt = new_cmp_cnt * duty_cycle;
new_cmp_cnt = new_cmp_cnt / 100;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, new_cmp_cnt);
}
void Led0_Breath_Stop(void)
{
HAL_TIM_PWM_Stop_IT(&htim3, TIM_CHANNEL_2);
}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim3.Instance)
{
Led0_Breath_Periodic_Scheduling();
}
}
2.2.2 Main函数代码
void Main_Handle(void)
{
static uint32_t beep_cnt = 0;
static uint32_t beep_flag = 0;
static uint32_t button_cnt = 0;
static uint32_t breath_flag = 0;
Led1_Open();
Beep_Open();
HAL_Delay(100);
Led1_Close();
Beep_Close();
while(1)
{
if(button_cnt++ >= 10)
{
button_cnt = 0;
Independent_Button_Periodic_Scheduling(10);
switch(Independent_Button_Scan())
{
case BUTTON_KEY0_PRESS:Led1_Toggle();break;
case BUTTON_KEY1_PRESS:
{
if(0 != breath_flag)
{
Led0_Breath_Stop();
}
else
{
Led0_Breath_Start();
}
breath_flag = !breath_flag;
} break;
case BUTTON_KEY2_PRESS:beep_flag = 1;Beep_Toggle();break;
default:break;
}
}
if((0 != beep_flag) && (beep_cnt++ >= 300))
{
beep_cnt = 0;
beep_flag = 0;
Beep_Toggle();
}
HAL_Delay(1);
}
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
Main_Handle();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
2.2.3 下载验证
①板卡上电后,Beep鸣叫100ms后关闭,同时Led1常亮100ms后关闭
②按下Key0后,Led1状态翻转
③按下Key1后,呼吸灯状态翻转(开启呼吸灯,关闭呼吸灯)
④按下Key2后,Beep鸣叫300ms后关闭
三、参考资料
[1]正点原子战舰板原理图-WarShip STM32F1_V3.4_SCH
[2]STM32F1开发指南-HAL库版本_V1.1
[3]STM32中文参考手册_V10
[4]Cortex-M3权威指南(中文)