前段时间有幸获得了APM32F411V Tiny Board的试用机会,这款开发板是极海半导体去年年底研发主推的,有兴趣的网友可通过https://geehy.com/design/hardware_detail/33获取关于该板卡的基本信息,可通过https://geehy.com/product/fifth/APM32F411可知该板卡在该系列的配置排名。板载32位Arm Cortex-M4F内核,工作频率120MHz,512KB的Flash,128KB的SRAM。 今天来分享一下使用TMR11输出PWM,并驱动LED,实现呼吸灯效果的使用经验。 该板卡的TMR9/10/11/12/13/14通用定时器以时基单元为核心,拥有输入捕获和输出比较等功能,可以用来测量脉冲宽度、频率和占空比,以及产生输出波形。含有一个16位的自动重装载计 数器(实现向上计数)。其结构框图如下: 在此之前,因为需要采用Keil开发,因此我们需要安装基于该板卡的pack支持包,官方的SDK包中有提供
根据《APM32F411xCxE 数据手册 V1.3》可知使用GPIOB_9复用TMR11。 使用GPIO复用TMR功能,需要配置GPIO的通讯速率。我们知道GPIO可以配置为通用输入、通用输出、复用功能、模拟输入输出。通用输入可以配置成浮空输入、上拉输入、下拉输入,通用输出可以配置成推挽输出、开漏输出,复用功能可以用于数字外设,模拟输入输出可以用于模拟外设以及低功耗模式;可以配置使能/禁止上拉/下拉电阻;可以配置2MHz、10MHz、50MHz、100MHz的速度,速度越大,功耗、噪声也会越大。 通过TMR11配置产生1KHz的PWM信号,这里使用GPIO的高速100MHz速率,根据计算可设定Prescaler=100-1,Period=1000-1。编写的部分代码展示如下: 1. #include "main.h" 2. #include "Board.h" 3. 4. int led_val=1; 5. int led_dut=0; 6. void delay_ms(uint16_t time) 7. { 8. u16 i=0; 9. while(time--) 10. { 11. i=10000; 12. while(i--); 13. } 14. } 15. 16. int main(void) 17. { 18. GPIO_Config_T GPIO_ConfigStruct; 19. TMR_BaseConfig_T TMR_TimeBaseStruct; 20. TMR_OCConfig_T OCcongigStruct; 21. 22. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR11); 23. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB); 24. 25. /* TMR11_CH1 */ 26. GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_9, GPIO_AF_TMR11); 27. 28. /* Config TMR11 GPIO for output PWM */ 29. GPIO_ConfigStruct.pin = GPIO_PIN_9; 30. GPIO_ConfigStruct.mode = GPIO_MODE_AF; 31. GPIO_ConfigStruct.otype = GPIO_OTYPE_PP; 32. GPIO_ConfigStruct.speed = GPIO_SPEED_100MHz; 33. GPIO_Config(GPIOB, &GPIO_ConfigStruct); 34. 35. /* config TMR11 */ 36. TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1; 37. TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP; 38. TMR_TimeBaseStruct.division = 99; 39. TMR_TimeBaseStruct.period = 999; 40. TMR_ConfigTimeBase(TMR11, &TMR_TimeBaseStruct); 41. 42. /* Configure channel1 */ 43. TMR_ConfigOCStructInit(&OCcongigStruct); 44. 45. OCcongigStruct.mode = TMR_OC_MODE_PWM1; 46. OCcongigStruct.outputState = TMR_OC_STATE_ENABLE; 47. OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH; 48. 49. OCcongigStruct.pulse = 0; 50. TMR_ConfigOC1(TMR11, &OCcongigStruct); 51. TMR_ConfigOC1Preload(TMR11, TMR_OC_PRELOAD_ENABLE); 52. 53. TMR_EnableAutoReload(TMR11); 54. TMR_Enable(TMR11); 55. 56. while(1) 57. { 58. delay_ms(10); 59. if(led_val == 1)led_dut+=10; 60. else led_dut-=10; 61. 62. if(led_dut > 1000)led_val=0; 63. if(led_dut < 1)led_val=1; 64. 65. TMR_ConfigCompare1(TMR11,led_dut); 66. } 67. } 由于板载调试下载模块,只需一条Type-C数据线即可完成,程序实现的效果如下:
|