极海APM32F407IG Tiny Board开发板测评4:按键+定时器测试
按键+定时器测试
先整理了一下开发板支持文件,因为工程只针对APM32F407IG Tiny Board,便将其它板子的文件都删掉了,目录结构变成了这样。
把目录下的几个bsp文件也都加到了工程中。
bsp的头文件有包含main.h,但是我自己创建的这个工程并没有这个文件,就都改成了Board_APM32F407_TINY.h,另外修改的时候发现Board_APM32F407_TINY中的bsp_usart.c中的串口初始化函数中写的还是APM_MINI_COMInit,应该是官方漏改了,不过也在这里给官方提个意见,这些开发板支持函数还是不要加什么MINI
TINY的了,不然的话如果要把例程移植到其它板子上还要去替换这些函数名,一不小心就会有像前面提到的那样有漏掉的,如果能保持一致就省事多了。
4.1 按键轮询
通过不断的查询按键电平状态来判断按键是否有按下,由于按下键时有可能会抖动所以延时一下再次判断电平,简单实现按键1 2控制LED2 3亮灭的代码。
代码示例
#include "Board_APM32F407_TINY.h"
#include "bsp_delay.h"
int main(void)
{
APM_DelayInit();
APM_TINY_LEDInit(LED2);
APM_TINY_LEDInit(LED3);
APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);
APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO);
while (1)
{
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
APM_DelayMs(30);
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);
APM_TINY_LEDToggle(LED2);
}
}
if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
{
APM_DelayMs(30);
if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
{
while(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET);
APM_TINY_LEDToggle(LED3);
}
}
}
}
void SysTick_Handler(void)
{
APM_DelayTickDec();
}
编译烧录查看效果
4.2 按键中断
配置按键IO在下降沿时产生中断,由于按下键时有可能会抖动导致多次中断,还是需要延时判断一下按键电平。
代码示例
#include "Board_APM32F407_TINY.h"
#include "bsp_delay.h"
uint8_t key1down = 0;
uint8_t key2down = 0;
int main(void)
{
APM_DelayInit();
APM_TINY_LEDInit(LED2);
APM_TINY_LEDInit(LED3);
APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_EINT);
APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_EINT);
while (1)
{
if(key1down > 0)
{
key1down = 0;
APM_DelayMs(30);
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
APM_TINY_LEDToggle(LED2);
}
if(key2down > 0)
{
key2down = 0;
APM_DelayMs(30);
if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
APM_TINY_LEDToggle(LED3);
}
}
}
void EINT15_10_IRQHandler(void)
{
if(EINT_ReadIntFlag(KEY1_BUTTON_EINT_LINE))
{
key1down = 1;
EINT_ClearIntFlag(KEY1_BUTTON_EINT_LINE);
}
if(EINT_ReadIntFlag(KEY2_BUTTON_EINT_LINE))
{
key2down = 1;
EINT_ClearIntFlag(KEY2_BUTTON_EINT_LINE);
}
}
void SysTick_Handler(void)
{
APM_DelayTickDec();
}
编译烧录查看效果
4.3 定时器
APM32F407有很多定时器定时器可用
用timer3做一个闪灯程序,按键切换闪烁速度
timer3是一个16位的定时器,从这张图中可以看到timer3的最大时钟是42M
之前对定时器时钟理解有误,对于定时器的频率还有额外描述
再来看看系统初始化时APB1和2的分频系数
所以timer3的时钟频率为84MHz,将timer3的时钟设置为1分频,预分频系数设置为42,计数周期设置为,1000就能得到一个每0.5ms触发一次的定时器。
代码示例
#include "Board_APM32F407_TINY.h"
#include "bsp_delay.h"
#include "apm32f4xx_tmr.h"
volatile uint16_t tim3count = 0;
volatile uint16_t tim3countmax = 200;
void tim3_init()
{
TMR_BaseConfig_T TMR_TimeBaseStruct;
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3);
TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
TMR_TimeBaseStruct.division = 41;
TMR_TimeBaseStruct.repetitionCounter = 0;
TMR_TimeBaseStruct.period = 999;
TMR_ConfigTimeBase(TMR3, &TMR_TimeBaseStruct);
TMR_EnableInterrupt(TMR3,TMR_INT_UPDATE);
NVIC_EnableIRQRequest(TMR3_IRQn, 0, 0);
TMR_Enable(TMR3);
}
int main(void)
{
APM_DelayInit();
APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);
APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO);
tim3_init();
while (1)
{
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
APM_DelayMs(30);
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);
tim3countmax = 500;
}
}
if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
{
APM_DelayMs(30);
if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
{
while(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET);
tim3countmax = 200;
}
}
}
}
void SysTick_Handler(void)
{
APM_DelayTickDec();
}
void TMR3_IRQHandler(void)
{
if(TMR_ReadIntFlag(TMR3, TMR_INT_UPDATE) == SET)
{
if(tim3count < tim3countmax)
tim3count++;
else
{
tim3count = 0;
APM_TINY_LEDToggle(LED2);
APM_TINY_LEDToggle(LED3);
}
TMR_ClearIntFlag(TMR3, TMR_INT_UPDATE);
}
}
编译烧录查看效果
4.4 PWM输出
板子上的2个LED接的是PE5 PE6,可以使用timer9来实现pwm输出
写个程序两个按键分别控制LED的不同亮度,注意LED是低电平点亮,所以PWM要设置为低电平有效。
代码示例
#include "Board_APM32F407_TINY.h"
#include "bsp_delay.h"
#include "apm32f4xx_tmr.h"
void pwm_init()
{
TMR_BaseConfig_T TMR_TimeBaseStruct;
TMR_OCConfig_T OCcongigStruct;
GPIO_Config_T GPIO_ConfigStruct;
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOE);
GPIO_ConfigPinAF(GPIOE, GPIO_PIN_SOURCE_5, GPIO_AF_TMR9);
GPIO_ConfigPinAF(GPIOE, GPIO_PIN_SOURCE_6, GPIO_AF_TMR9);
GPIO_ConfigStruct.pin = GPIO_PIN_5 | GPIO_PIN_6;
GPIO_ConfigStruct.mode = GPIO_MODE_AF;
GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
GPIO_ConfigStruct.speed = GPIO_SPEED_100MHz;
GPIO_Config(GPIOE, &GPIO_ConfigStruct);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR9);
TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
TMR_TimeBaseStruct.division = 83;
TMR_TimeBaseStruct.repetitionCounter = 0;
TMR_TimeBaseStruct.period = 999; //频率1k 占空比调节0-1000
TMR_ConfigTimeBase(TMR9, &TMR_TimeBaseStruct);
OCcongigStruct.mode = TMR_OC_MODE_PWM1; //PWM模式1,计数小于比较值时输出有效电平
OCcongigStruct.outputState = TMR_OC_STATE_ENABLE; //通道使能
OCcongigStruct.idleState = TMR_OC_IDLE_STATE_SET; //空闲高电平
OCcongigStruct.polarity = TMR_OC_POLARITY_LOW; //有效电平为低电平
OCcongigStruct.outputNState = TMR_OC_NSTATE_DISABLE; //互补通道失能
OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;//互补通道空闲电平
OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH; //互补通道有效电平
OCcongigStruct.pulse = 500; //初始50%
TMR_ConfigOC1(TMR9, &OCcongigStruct);
TMR_ConfigOC2(TMR9, &OCcongigStruct);
TMR_ConfigOC1Preload(TMR9, TMR_OC_PRELOAD_ENABLE);
TMR_EnableAutoReload(TMR9);
TMR_Enable(TMR9);
TMR_EnablePWMOutputs(TMR9);
}
int main(void)
{
APM_DelayInit();
APM_TINY_LEDInit(LED2);
APM_TINY_LEDInit(LED3);
APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);
APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO);
pwm_init();
while (1)
{
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
APM_DelayMs(30);
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);
TMR_ConfigCompare1(TMR9,900);
TMR_ConfigCompare2(TMR9,900);
}
}
if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
{
APM_DelayMs(30);
if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
{
while(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET);
TMR_ConfigCompare1(TMR9,100);
TMR_ConfigCompare2(TMR9,100);
}
}
}
}
void SysTick_Handler(void)
{
APM_DelayTickDec();
}
编译烧录,查看效果
- |
- +1 赞 0
- 收藏
- 评论 0
本文由咪猫转载自21ic论坛极海半导体专区,原文标题为:【极海APM32F407IG Tiny Board开发板测评】4.按键+定时器测试,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关研发服务和供应服务
相关推荐
极海半导体APM32F407系列MCU支持国密算法,助力国产安全可控,适用于新能源等领域
极海推出的APM32F407系列MCU,结合当前环境要求,设计出了支持国密算法(SM2,SM3,SM4)的IP, 符合国家密码管理局认定和公布的密码算法标准及其应用规范,并凭借显著的性能优势,已应用至新能源、工业控制、医疗设备等众多领域。
原厂动态 发布时间 : 2023-01-07
极海联亮相2024全球MCU及嵌入式生态发展大会,展出新技术和产品并发表演讲
2024年7月25日,2024全球MCU及嵌入式生态发展大会在深圳君悦酒店举行,由AspenCore主办。极海作为特邀嘉宾在主论坛进行演讲,并展出新技术和产品,包括搭载Arm Cortex M52内核且采用Helium技术的G32R5系列实时控制MCU和针对电机市场的栅极驱动器与APM32M3514系列SoC等新品。
原厂动态 发布时间 : 2024-07-29
极海车规级MCU凭借可靠的产品品质,斩获“2023汽车芯片50强”与“MCU创新先锋”两项大奖
近日,极海车规级MCU凭借可靠的产品品质、专业周到的客户技术支持服务,以及量产级解决方案良好的市场表现,相继斩获“2023汽车芯片50强”、“MCU创新先锋奖”两项行业大奖。作为国内领先的32位车规级芯片设计企业,极海积极布局以服务汽车智能化、电动化、网联化的快速融合。
原厂动态 发布时间 : 2023-11-30
极海APM32F407IG Tiny Board开发板测评2:Keil MDK开发环境搭建
上文我们对极海APM32F407IG Tiny Board开发板进行了开箱测评,本文将介绍Keil MDK开发环境搭建。
设计经验 发布时间 : 2023-10-17
极海APM32F407IG Tiny Board开发板测评5:UART通讯+SPI驱动LCD12864+I2C读取D
上文对极海APM32F407IG Tiny Board开发板进行了按键+定时器测试,本文将就UART通讯+SPI驱动LCD12864+I2C读取D展开测试。
设计经验 发布时间 : 2023-10-26
极海半导体(Geehy Semiconductor)微控制器MCU选型指南(英文)
描述- Geehy Semiconductor Co., Ltd. is an IC Fabless company dedicated to developing industrial & automotive-grade MCUs, analog & mixed-signal ICs, and SoCs.
型号- APM32F030,APM32F051K6T6,APM32F4,APM32F405RGT6,APM32F003F6P6,APM32F003F6P7,APM32F103VET6,APM32E103,APM32F103VET7,APM32F051C6T6,APM32F0,APM32 SERIES,APM32F103RCT6,APM32F103RCT7,APM32E103RCT6,APM32E103VET6,APM32F105RCT6,APM32F035,APM32F407RGT6,GALT61120,APM32F030RCT6,APM32E103CET6,AGW32F103T4T6S,GW8811,APM32F407VET6,APM32A407ZGT7,GURC01,APM32A091RCT7,APM32F003F4U6,APM32A091,APM32F411VET6,APM32F051C6U6,APM32F103TBU7,APM32F103TBU6,APM32F107RBT6,G32A1445,APM32F051R8T6,APM32F417ZGT6,APM32F411CET6,G32A,APM32F405ZGT6,APM32F051K6U6,APM32M3514C8T7,APM32F030C8T6,G32A1445UAT0MLL,AGM32F103T4T6S,G32A1445UAT0MLH,APM32F103C8T6,APM32F103RBT7,APM32F411,GW3323HGU6,APM32F030K8T6,APM32F103RBT6,APM32A407,APM32F417,APM32F091CBU6,APM32M3514,APM32F407ZET6,APM32F072VBT6,APM32M3514C8U7,APM32E1,APM32,APM32F091CCU6,APM32E103CEU6,APM32F072R8T6,APM32F003F4M6,GW SERIES,APM32F107RCT6,APM32F072CBT6,APM32F407IGT6,APM32F003,APM32A103VET7,APM32F072CBT7,APM32F105RBT6,APM32F407,APM32F405,APM32F091,APW32F103T4T6S,APM32F405VGT6,APM32F035C8T7,GHD,APM32F072,APM32E103CCT6,APM32F103CCT6,APM32F051K8T6,APM32E103VCT6,APM32F051C8T6,APM32F072CBU6,APM32E103ZET6,GHD3125R,APM32F103VCT6,APM32F103ZET6,GEEHY-LINK,AP/GM/W32F103T4T6S,APM32F107VBT6,APM32A407VGT7,APM32A103,APM32F003F6U7,APM32F407RET6,APM32F407VGT6,GW3323,APM32F003F6U6,APM32F417IGT6,APM32F103T8U6,APM32F051K8U6,APM32F051C8U6,APM32F107,APM32F4T1RET6,APM32F105,APM32F105VCT6,APM32F103,APM32F417VGT6,GHD3440R5,APM32F051R6T6,APM32F103RET6,GHD3440R3,APM32F003F4P6,APM32F035K8T7,GURC,APM32F030CCT6,APM32F030C6T6,APM32F103R8T6,GALT,APM32F051,APM32F103CBT7,G32A1465UAT0MLL,APM32F103CBT6,GHD3440QE,G32A1465UAT0MLH,APM32F030K6T6,APM32F030R8T6,APM32F103VBT6,APM32F030K6T7,APM32F072C8T6,APM32F107VCT6,APM32F103T4T6S,APM32A103CBT7,APM32EF1,APM32F411CEU6,GW8811KEU6,GW8811CEU6,APM32F407ZGT6,APM32F072RBT6,APM32F072RBT7,APM32F003F6M6,GHD3440PF,APM32F407IGH6,APM32E103CCU6,GHD1620T,APM32A103RET7,APM32F105VBT6,APM32F030K6U6,GW,APM32E103RET6,APM32F072C8U6,G32A1465,APM32F072V8T6
tandby模式下,如何唤醒MCU APM32的RTC与WKUP?
APM32F103系列低功耗模式有三种:睡眠模式、停止模式和待机模式。通过关闭内核、时钟源、设置调压器来降低功耗。本文极海半导体解析了APM32的tandby模式下的RTC唤醒与WKUP唤醒功能如何实现。
设计经验 发布时间 : 2024-01-27
【应用】极海半导体MCU APM32F103系列用于HMI人机界面,可满足HMI功耗调整、蓝牙通信等需求
本文推荐采用极海半导体推出的APM32F103系列MCU作为HMI人机界面的主控,最高96MHz工作频率,FLASH 256K,SRAM 64K,支持FPU单元;资源丰富,有CRC/RTC/DMA通道,两个DMA;通信接口丰富。
应用方案 发布时间 : 2023-05-25
基于极海半导体APM32F411工业级高适配型MCU的移动电源控制板应用方案
随着技术的发展,消费者对移动电源产品品质和体验提出了更高要求,除了储电量、安全性、便携度等基本要求,更具美观、多功能、人性化等优势的产品才能赢得消费者的青睐。采用极海APM32F411RET6工业级高适配型MCU作为主控的移动电源控制板方案,满足性能、功能、体积等综合设计需求,可帮助客户打造更具性价比和市场竞争力的移动电源产品。
应用方案 发布时间 : 2024-08-14
【视频】极海APM32F407xG系列MCU培训
型号- APM32F405VGT6,APM32F091VCT6,APM32F051K6T6,APM32F091CCT6,APM32F003F6P6,APM32F051K8T6,APM32F103CCT6,APM32F405RGT6,APM32F003F6P7,APM32F103VET6,APM32E103VCT6,APM32F051C8T6,APM32F103RCT6,APM32E103ZET6,APM32F103RCT7,APM32F103VCT6,APM32F103ZET6,APM32E103RCT6,APM32E103VET6,APM32F415RGT6,APM32F407RGT6,APM32F030RCT6,APM32F091RCT6,APM32F003F6U7,APM32E103CET6,APM32F407RET6,APM32F407VGT6,APM32F415VGT6,APM32F407VET6,APM32F051K8U6,APM32F051C8U6,APM32F103TBU6,APM32F417VGT6,APM32F103RET6,APM32F051R8T6,APM32F417ZGT6,APM32F405ZGT6,APM32F051K6U6,APM32F030CCT6,APM32F030C8T6,APM32F103CBT6,APM32F103C8T6,APM32F030K6T6,APM32F030R8T6,APM32F103VBT6,APM32F103RBT6,APM32F407ZET6,APM32F407ZGT6,APM32F072VBT6,APM32F072RBT6,APM32F072RBT7,APM32F415ZGT6,APM32F407IET6,APM32F072CBT6,APM32F407IGT6,APM32F030K6U6,APM32E103RET6
极海APM32F407IG Tiny Board开发板测评9:利用DAC实现音频输出
【极海APM32F407IG Tiny Board开发板测评】9.利用DAC实现音频输出,开发板上还有USB和网口,可以尝试结合USB做个USB声卡,或者通过USB读取U盘中的WAV文件进行播放,或者利用以太网口通过网络播放,或者还可以用ADC连接MIC实现录音再用DAC播放,这里就不展开了,有兴趣的可以去尝试一下
设计经验 发布时间 : 2023-10-21
APM32F411xCxE Arm® Cortex®-M4F core-based 32-bit MCU User Manual
型号- APM32,APM32F411XCXE SERIES,APM32F411XCXE
【应用】国产极海半导体APM32系列工业级MCU助力推动新型工业化发展
工业级MCU应用场景范围十分广泛,并对使用寿命、温度、湿度、电磁辐射等有着严格的品质要求。极海半导体长期深耕中高端工控市场,本文就以绝对值编码器、高性能伺服驱动器及变频器方案为例,详细介绍极海半导体32位APM32位工业级MCU在工控领域的出色表现。
应用方案 发布时间 : 2022-11-02
【应用】国产工业级高性能MCU APM32F407VGT6用于PLC工控板,主频168MHz,通信外设丰富
某客户主要做各种工业自动控制系统装置,其中一款国产PLC工控板主控要更换成国产物料,推荐极海工业级高性能MCU APM32F407系列,主频高达168MHz、通信外设资源丰富,工作温度范围-40℃到+85℃。
应用方案 发布时间 : 2023-03-14
APM32F103xCxDxE Arm® Cortex® -M3 based 32-bit MCU User Manual
型号- APM32F103XCXDXE,APM32F103XDXE,APM32F103XCXDXE SERIES,APM32F103XC,APM32F
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
可烧录IC封装SOP/MSOP/SSOP/TSOP/TSSOP/PLCC/QFP/QFN/MLP/MLF/BGA/CSP/SOT/DFN;IC包装Tray/Tube/Tape;IC厂商不限,交期1-3天。支持IC测试(FT/SLT),管装、托盘装、卷带装包装转换,IC打印标记加工。
最小起订量: 1pcs 提交需求>
登录 | 立即注册
提交评论