单片机
返回首页

STM32 重新理解GPIO配置以及配置PWM波输出

2017-09-29 来源:eefocus

最近做了个SD卡BOOTLOARDER程序。在测试过程中,想到可以利用板子的LED灯进行萤火虫灯的制作,通过BOOTLOARDER将APP文件下载到板子里面查看LED灯的闪烁。可能是因为太过自信,这么个小程序能搞不定,所以并没有仔细阅读DATASHEET,导致最终费了半天时间才查出原因。

此为引子,便有了这篇文章。

  

我的板子LED灯引脚为PB5,引脚功能为:

 



该引脚TIM3_CH2为REMAP功能,引脚配置如下:



[cpp] view plain copy print?

  1. GPIO_InitTypeDef GPIO_InitStructure;  

  2. /*配置时钟*/  

  3. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);         //使能TIM3时钟  

  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);  //使能GPIOB以及复用功能时钟  

  5.   

  6. /*配置PB5引脚*/  

  7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;               //PB5复用为TIM3的通道2  

  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  10. GPIO_Init(GPIOB, &GPIO_InitStructure);  

  11. /*TIM3局部复用功能开启   在TIM3的局部复用开启时,PB5会被复用为TIM3_CH2*/  

  12. GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE);         




 在定时器重映射说明中查到TIM3_CH2在PB5中是部分重映射,所以使用GPIO_PartialRemap_TIM3:




[cpp] view plain copy print?

  1. /*------------------------------------------------------------------- 

  2.  TIM3CLK=72MHz  预分频系数Prescaler=2 经过分频 定时器时钟为24MHz 

  3.  根据公式 通道输出占空比=TIM3_CCR2/(TIM_Period+1),可以得到TIM_Pulse的计数值      

  4.  捕获/比较寄存器2 TIM3_CCR2= CCR2_Val        

  5.  -------------------------------------------------------------------*/  

  6.  TIM3_TimeBaseStructure.TIM_Prescaler = 2;                          //预分频器TIM3_PSC=3       

  7.  TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;       //计数器向上计数模式 TIM3_CR1[4]=0  

  8.  TIM3_TimeBaseStructure.TIM_Period =24000;                          //自动重装载寄存器TIM3_APR  确定频率为1KHz              

  9.  TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0;                    //时钟分频因子 TIM3_CR1[9:8]=00  

  10.  TIM3_TimeBaseStructure.TIM_RepetitionCounter = 0x0;  

  11.   

  12.  TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure);                    //写TIM3各寄存器参数  

  13.    

  14.  TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                 //PWM模式2 TIM3_CCMR1[14:12]=111 在向上计数时,  

  15.                                                                     //一旦TIMx_CNT

  16.  TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //输入/捕获2输出允许  OC2信号输出到对应的输出引脚PB5  

  17.  TIM3_OCInitStructure.TIM_Pulse = CCR2_Val;                         //确定占空比,这个值决定了有效电平的时间。  

  18.  TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;      //输出极性  低电平有效 TIM3_CCER[5]=1;  

  19.           

  20.  TIM_OC2Init(TIM3, &TIM3_OCInitStructure);  

  21.  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  

  22.  TIM_Cmd(TIM3,ENABLE);                                          //启动定时器3 TIM3_CR1[0]=1;   

  


至此,各配置结束,以下只要配置系统时钟,使其在一定时间间隔中断,改变占空比。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章