你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用STM32实现呼吸灯

[复制链接]
攻城狮Melo 发布时间:2022-11-13 18:11
功能要求:
(1)按下复位键后,数码管中间的横线(小灯)以一秒的速度呼吸三次,然后熄灭;
(2)小灯熄灭后按下UP键可以增加灯的亮度,按下的次数越多小灯越亮,达到最大亮度后,随着按键按下小灯亮度逐渐变暗;
(3)只能使用一个定时器。


实现代码:

  1. #include "stm32f10x.h"
  2. #include "GPIOLIKE51.h"
  3. #include "stm32f10x_tim.h"
  4. #include "stm32f10x_rcc.h"
  5. #include "stm32f10x_exti.h"

  6. uint16_t i=0;
  7. uint8_t j;

  8. //函数声明
  9. void TIM3_Config();
  10. void PWM_Config();
  11. void GPIO_Config();
  12. void delay(uint32_t n);
  13. void GPIO_Config_UP();
  14. void EXTI_Congig_UP();

  15. int main(void)
  16. {
  17.                 TIM3_Config();
  18.                 PWM_Config();
  19.                 GPIO_Config();
  20.                 GPIO_Config_UP();
  21.                 EXTI_Congig_UP();
  22.         while(1){}
  23. }

  24. //KEY_UP
  25. void EXTI_Congig_UP(){
  26.         EXTI_InitTypeDef a;
  27.         NVIC_InitTypeDef b;
  28.         
  29.         a.EXTI_Line=EXTI_Line0;
  30.         a.EXTI_LineCmd=ENABLE;
  31.         a.EXTI_Mode=EXTI_Mode_Interrupt;
  32.         a.EXTI_Trigger=EXTI_Trigger_Rising;
  33.         EXTI_Init(&a);
  34.         
  35.         b.NVIC_IRQChannel=EXTI0_IRQn;
  36.         b.NVIC_IRQChannelCmd=ENABLE;
  37.         NVIC_Init(&b);        
  38. }

  39. //KEY_LEFT的中断服务函数
  40. void EXTI0_IRQHandler(){
  41.         if(i<=0){
  42.                 j++;
  43.                 i=0;
  44.         }
  45.         if(i>=1000){
  46.                 j++;
  47.                 i=1000;
  48.         }
  49.         if(j%2==1){
  50.                 i+=50;
  51.                 delay(10000);
  52.                 TIM_SetCompare1(TIM3,i);
  53.         }
  54.         else{
  55.                 i-=50;
  56.                 delay(10000);
  57.                 TIM_SetCompare1(TIM3,i);
  58.         }
  59.         
  60.         EXTI_ClearFlag(EXTI_Line0);        //清除中断标志位
  61.         EXTI_ClearITPendingBit(EXTI_Line0);//更新中断标志位
  62. }

  63. //延时函数
  64. void delay(uint32_t n){
  65.         for(;n!=0;n--);
  66. }

  67. //定时器TIM3配置
  68. void TIM3_Config(){
  69.         TIM_TimeBaseInitTypeDef a;
  70.         NVIC_InitTypeDef b;
  71.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  72.         
  73.         a.TIM_ClockDivision=TIM_CKD_DIV1;
  74.         a.TIM_CounterMode=TIM_CounterMode_Up;
  75.         //定时1ms
  76.         a.TIM_Period=1000-1;
  77.         a.TIM_Prescaler=72-1;
  78.         
  79.         b.NVIC_IRQChannel=TIM3_IRQn;
  80.         b.NVIC_IRQChannelCmd=ENABLE;
  81.         NVIC_Init(&b);
  82.         
  83.         TIM_TimeBaseInit(TIM3,&a);
  84.         TIM_Cmd(TIM3,ENABLE);//启动定时器
  85.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//配置中断
  86. }
  87. //TIM3中断服务函数
  88. void TIM3_IRQHandler(){
  89.         if(j<7){
  90.                         if(i<=0||i>=1000){
  91.                                 j++;
  92.                         }
  93.                         if(j%2==0){
  94.                                 i-=2;
  95.                                 TIM_SetCompare1(TIM3,i);
  96.                         }
  97.                         else{
  98.                                 i+=2;
  99.                                 TIM_SetCompare1(TIM3,i);
  100.                         }
  101.                 }
  102.         else{
  103.                         TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);//关闭中断
  104.         }
  105.         TIM_ClearFlag(TIM3,TIM3_IRQn);
  106.         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  107. }
  108. //PWM波配置
  109. void PWM_Config(){
  110.         TIM_OCInitTypeDef a;
  111.         
  112.         a.TIM_OCMode=TIM_OCMode_PWM1;
  113.         a.TIM_OutputState=ENABLE;
  114.         TIM_OC1Init(TIM3,&a);
  115. }
  116. //GPIO_C6配置
  117. void GPIO_Config(){
  118.         GPIO_InitTypeDef a;
  119.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
  120.         //接口需要启用第二功能(输出PWM波),需要配置AFIO
  121.         
  122.         a.GPIO_Mode=GPIO_Mode_AF_PP;
  123.         a.GPIO_Pin=GPIO_Pin_6;
  124.         a.GPIO_Speed=GPIO_Speed_50MHz;
  125.         GPIO_Init(GPIOC,&a);
  126.         GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//完全重映像
  127. }

  128. void GPIO_Config_UP(){
  129.         GPIO_InitTypeDef a;
  130.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
  131.         //接口需要启用第二功能(作为外部中断的输入),需要配置AFIO
  132.         
  133.         a.GPIO_Mode=GPIO_Mode_IPD;
  134.         a.GPIO_Pin=GPIO_Pin_0;
  135.         a.GPIO_Speed=GPIO_Speed_50MHz;
  136.         GPIO_Init(GPIOA,&a);
  137. }
复制代码


————————————————
版权声明:瑶台月下逢

收藏 评论0 发布时间:2022-11-13 18:11

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版