当前位置:   article > 正文

【STM32+HAL】PWM呼吸灯实现_hal库pwm呼吸灯

hal库pwm呼吸灯

一、准备工作:

有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置

二、所用工具:

1、芯片: STM32F407ZGT6

2、STM32CubeMx软件

3、IDE: MDK-Keil软件

4、STM32F4xxHAL库

三、实现功能:

1、控制LED一秒闪烁一次

2、实现串口通信:电脑控制pwm频率,串口输出pwm频率

3、按键控制呼吸灯暂停与继续

4、非线性呼吸灯实现

四、HAL库配置 (初始配置完成):

1、配置引脚

根据数据手册配置相应引脚的参数,此芯片PF10为LED灯,PB8,PB9,PA0为按键

2、设置优先级

为避免在按键中断中延时函数卡死,需改变Time base优先级 

3、开启定时器1

设置定时器频率为1HZ

定时器频率=168MHZ / (PSC+1) / (ARR+1)

4、开启PWM引脚

占空比先不填,到代码中实现

5、生成代码  

至此,CUBEMX配置完成 

五、KEIL填写代码:

1、串口重定向

  1. #include "stdio.h"
  2. int fputc(int ch, FILE *f)
  3. {
  4. HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  5. return ch;
  6. }
  7. int fgetc(FILE *f)
  8. {
  9. uint8_t ch = 0;
  10. HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  11. return ch;
  12. }

2、初始化

  1. HAL_TIM_Base_Start_IT(&htim1);//定时器1中断初始化
  2. HAL_TIM_PWM_Start (&htim14, TIM_CHANNEL_1);//Pwm初始化
  3. printf("Hello World\r\n");//串口输出测试
  4. HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1); //串口接收初始化

3、pwm函数,在while(1)中运行

  1. void pwm(void)
  2. {
  3. if(fxx==0){ //若为线性呼吸灯
  4. if(k&&flag){
  5. if(bri>=TIM14->ARR){
  6. dir=-1;
  7. }
  8. else if(bri<=0){
  9. dir=1;
  10. }
  11. bri+=dir;
  12. }
  13. }
  14. else if(fxx==1){ //若为非线性呼吸灯
  15. if(bri>=TIM14->ARR){
  16. dir=-1;
  17. i=0;
  18. flag_fxx=1;
  19. }
  20. else if(bri<=0){
  21. dir=1;
  22. flag_fxx=0;
  23. }
  24. i=(dir+i>=100||flag_fxx)?0:i+1;
  25. bri+=dir+i;
  26. }
  27. TIM14->CCR1=bri;
  28. HAL_Delay(10);
  29. }

4、接收数据函数

  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3. UNUSED(huart);
  4. if(huart==&huart2){
  5. if(Uart1_Rx_Cnt >= 255) {
  6. Uart1_Rx_Cnt = 0;
  7. memset(RxBuffer,0x00,sizeof(RxBuffer));
  8. HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
  9. }
  10. else{
  11. RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;
  12. if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) {
  13. strcpy(rx_buf,RxBuffer);
  14. pl=0;
  15. pl=atoi(rx_buf);
  16. htim14.Instance->PSC = (uint16_t )((double)84000000/(double)(htim14.Instance->ARR+1)/pl)+1;
  17. while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);
  18. Uart1_Rx_Cnt = 0;
  19. memset(RxBuffer,0x00,sizeof(RxBuffer));
  20. }
  21. flag=0;
  22. }
  23. HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
  24. }
  25. }

5、定时器中断

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
  2. if ( htim -> Instance == TIM1 ){
  3. HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
  4. duty=(double)(htim14.Instance->CCR1)/(double)(htim14.Instance->ARR+1);
  5. HZ=84000000/(htim14.Instance->ARR +1)/(htim14.Instance->PSC);
  6. printf ("HZ==%.0fhz DuTy==%.1f%%\r\n \r\n",HZ,duty*100);
  7. }
  8. }

6、按键中断

  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3. if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET){
  4. HAL_Delay(20); //延时消抖
  5. if(GPIO_Pin == KEY0_Pin){
  6. k=1-k;
  7. flag=1-flag;
  8. printf("NO.%d\r\n",no++);
  9. }
  10. }
  11. else if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET){
  12. HAL_Delay(20);
  13. if(GPIO_Pin == KEY1_Pin){
  14. fxx=1-fxx;
  15. printf("NO.%d\r\n",no++);
  16. }
  17. }
  18. }

7、主函数

  1. while(1){
  2. if(k&&flag==0){
  3. HAL_Delay(5);
  4. k=1;
  5. flag=1;
  6. }
  7. pwm();
  8. }

完工

六、原理讲解:

参见

STM32CubeMX学习笔记(13)——PWM输出(呼吸灯)使用

【STM32】HAL库 STM32CubeMX教程七---PWM输出(呼吸灯)

PWM原理 PWM频率与占空比详解

七、源码提供:

【免费】【STM32+HAL】PWM呼吸灯实现

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/700029
推荐阅读
相关标签
  

闽ICP备14008679号