前段时间有幸在某论坛上获得了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。编写的部分代码展示如下:
#include "main.h" #include "Board.h" int led_val=1; int led_dut=0; void delay_ms(uint16_t time) { u16 i=0; while(time--) { i=10000; while(i--); } } int main(void) { GPIO_Config_T GPIO_ConfigStruct; TMR_BaseConfig_T TMR_TimeBaseStruct; TMR_OCConfig_T OCcongigStruct; RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR11); RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB); /* TMR11_CH1 */ GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_9, GPIO_AF_TMR11); /* Config TMR11 GPIO for output PWM */ GPIO_ConfigStruct.pin = GPIO_PIN_9; GPIO_ConfigStruct.mode = GPIO_MODE_AF; GPIO_ConfigStruct.otype = GPIO_OTYPE_PP; GPIO_ConfigStruct.speed = GPIO_SPEED_100MHz; GPIO_Config(GPIOB, &GPIO_ConfigStruct); /* config TMR11 */ TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1; TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP; TMR_TimeBaseStruct.division = 99; TMR_TimeBaseStruct.period = 999; TMR_ConfigTimeBase(TMR11, &TMR_TimeBaseStruct); /* Configure channel1 */ TMR_ConfigOCStructInit(&OCcongigStruct); OCcongigStruct.mode = TMR_OC_MODE_PWM1; OCcongigStruct.outputState = TMR_OC_STATE_ENABLE; OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH; OCcongigStruct.pulse = 0; TMR_ConfigOC1(TMR11, &OCcongigStruct); TMR_ConfigOC1Preload(TMR11, TMR_OC_PRELOAD_ENABLE); TMR_EnableAutoReload(TMR11); TMR_Enable(TMR11); while(1) { delay_ms(10); if(led_val == 1)led_dut+=10; else led_dut-=10; if(led_dut > 1000)led_val=0; if(led_dut < 1)led_val=1; TMR_ConfigCompare1(TMR11,led_dut); } }
由于板载调试下载模块,只需一条Type-C数据线即可完成,程序实现的效果如下:
至此分享告一段落,有疑问的欢迎留言评论,分享一下关于该板卡的资料手册。