极海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.按键+定时器测试,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
极海联亮相2024全球MCU及嵌入式生态发展大会,展出新技术和产品并发表演讲
2024年7月25日,2024全球MCU及嵌入式生态发展大会在深圳君悦酒店举行,由AspenCore主办。极海作为特邀嘉宾在主论坛进行演讲,并展出新技术和产品,包括搭载Arm Cortex M52内核且采用Helium技术的G32R5系列实时控制MCU和针对电机市场的栅极驱动器与APM32M3514系列SoC等新品。
极海半导体APM32F407系列MCU支持国密算法,助力国产安全可控,适用于新能源等领域
极海推出的APM32F407系列MCU,结合当前环境要求,设计出了支持国密算法(SM2,SM3,SM4)的IP, 符合国家密码管理局认定和公布的密码算法标准及其应用规范,并凭借显著的性能优势,已应用至新能源、工业控制、医疗设备等众多领域。
极海车规级MCU凭借可靠的产品品质,斩获“2023汽车芯片50强”与“MCU创新先锋”两项大奖
近日,极海车规级MCU凭借可靠的产品品质、专业周到的客户技术支持服务,以及量产级解决方案良好的市场表现,相继斩获“2023汽车芯片50强”、“MCU创新先锋奖”两项行业大奖。作为国内领先的32位车规级芯片设计企业,极海积极布局以服务汽车智能化、电动化、网联化的快速融合。
极海APM32F407IG Tiny Board开发板测评2:Keil MDK开发环境搭建
上文我们对极海APM32F407IG Tiny Board开发板进行了开箱测评,本文将介绍Keil MDK开发环境搭建。
【经验】APM32F4 MCU在RT-Thread系统上添加以太网驱动和使用LwIP网络组件的方法
本文详细介绍了如何将极海半导体APM32F4 MCU在RT-Thread系统上添加以太网驱动和使用LwIP网络组件,其他APM32带有以太网控制器的MCU,在RT-Thread使用LwIP网络功能也是大同小异的,按照这个过程基本都可以把网络功能应用起来。
APM32芯得 | 基于极海APM32E103系列MCU的SPI转CAN芯片MCP2515移植测试
极海半导体APM32E103系列MCU支持CAN协议2.0A和2.0B,通信波特率最大为1Mbit/s,并且拥有双CAN接口,能适应更多的应用场合。将杜邦线按照引脚配置,接好线后仿真就能测试回环模式下收发数据了。可以看到断点打到接收部分,可以接收到CAN数据,与发送的数据一致。
tandby模式下,如何唤醒MCU APM32的RTC与WKUP?
APM32F103系列低功耗模式有三种:睡眠模式、停止模式和待机模式。通过关闭内核、时钟源、设置调压器来降低功耗。本文极海半导体解析了APM32的tandby模式下的RTC唤醒与WKUP唤醒功能如何实现。
极海APM32F407IG Tiny Board开发板测评5:UART通讯+SPI驱动LCD12864+I2C读取D
上文对极海APM32F407IG Tiny Board开发板进行了按键+定时器测试,本文将就UART通讯+SPI驱动LCD12864+I2C读取D展开测试。
还可以这样玩?极海半导体APM32F411系列MCU与pyocd的火花
前段时间笔者学习了一下如何使用pyocd配合APM32F411VCTINY板在命令行下给它进行各种骚操作,在使用一段时间后就想着:pyocd是基于python的,那是不是也可以使用python脚本+pyocd使用起来呢?本文中极海半导体与大家分享能够自动化完成重复操作的设计经验。
【应用】极海半导体MCU APM32F103系列用于HMI人机界面,可满足HMI功耗调整、蓝牙通信等需求
本文推荐采用极海半导体推出的APM32F103系列MCU作为HMI人机界面的主控,最高96MHz工作频率,FLASH 256K,SRAM 64K,支持FPU单元;资源丰富,有CRC/RTC/DMA通道,两个DMA;通信接口丰富。
【经验】极海MCU APM32F103 IAP的实现方式
拿到了一块APM32F103VC的MINI开发板,在学习了一段时间后发现其有非常丰富的外设资源,主频能达到96Mhz。最近在项目中使用到了IAP(In Application Programming)功能,特来评估一下APM32F103的IAP实现方式。
【应用】国产工业级高性能MCU APM32F407VGT6用于PLC工控板,主频168MHz,通信外设丰富
某客户主要做各种工业自动控制系统装置,其中一款国产PLC工控板主控要更换成国产物料,推荐极海工业级高性能MCU APM32F407系列,主频高达168MHz、通信外设资源丰富,工作温度范围-40℃到+85℃。
【视频】极海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
极海半导体32位MCU-M4选型表
极海半导体的APM32系列是基于Arm® Cortex®-M0+/M3/M4内核的优质国产32位通用MCU,具有低功耗、高性能、高集成度以及快速移植等特性。凭借优异的系统性能、丰富的协处理功能以及灵活的使用体验,有助于用户缩短产品设计时间、降低开发成本、实现性能最优化。
产品型号
|
品类
|
内核
|
Frequency(MHz)
|
FLASH(KB)
|
SRAM(KB)
|
SDRAM
|
Voltage
|
GPTMR(16bit)
|
GP TMR(32bit)
|
Advanced TMR(16bit)
|
Basic TMR
|
Systick
|
IWDG
|
WWDG
|
ADC 12-bit Cell
|
ADC 12-bit channels
|
DAC 12-bit channels
|
EMMC
|
SPI
|
I2S
|
I2C
|
U(S)ART
|
CAN
|
SDIO
|
USB OTG_FS
|
DCI
|
Ethernet
|
Package
|
对照型号
|
APM32F407IET6
|
32位MCU
|
ARM Cortex-M4
|
168MHz
|
512KB
|
192+4KB
|
1
|
1.8~3.6
|
8
|
2
|
2
|
2
|
1
|
1
|
1
|
3
|
24
|
2
|
1
|
3
|
2
|
3
|
4+2
|
2
|
1
|
1
|
1
|
1
|
LQFP176
|
STM32F407IET6
|
选型表 - 极海半导体 立即选型
电子商城
现货市场
服务
可定制显示屏的尺寸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 提交需求>
登录 | 立即注册
提交评论