打印
[AT32M412]

【AT-START-M412测评】+ 01开箱:外部中断翻转板载LED

[复制链接]
85|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 聪聪哥哥 于 2025-6-17 11:25 编辑

今天和大家分享一使用外部中断点亮板载的LED。
一:AT32M412芯片资料介绍:
基于 ARM® 32 位 Cortex®-M4 微控制器+FPU,配有 64 K 字节到 128 K 字节闪存、sLib、11 个定时器、8 个通信接口、2 个 ADC、2 个 DAC、2 个比较器、4 个运算放大器
内核:带有FPU的ARM@32位的CortexTM-M4FCPU-最高180MHZ工作频率,带存储器保护单元(MPU),内建单周期乘法和硬件除法
-内建浮点运算单元(FPU)
-具有DSP指令集
存储器
-64K字节到128K字节的闪存存储器
-28K字节的启动程序代码区作启动加载程序(Bootloader)用,可一次性配置成一般用户区
-1K字节的OTP存储器-sLib:将指定之主存储区设为执行代码安全库区,此区代码仅能调用无法读取
-16K字节的SRAM
电源控制(PWC)
-2.4V至3.6V供电
-上电复位(POR)、低电压复位(LVR)、电源电压监测器(PVM)
-低功耗模式:睡眠、深睡眠、和待机,4个WKUP引脚可唤醒待机模式
-支持20个32位的电池供电寄存器(BPR)时钟和复位管理(CRM)
-4至25 MHZ品体振荡器(HEXT)
-内置经出厂调校的48MHZ高速时钟
(HICK),25°C达1%精度,-40C至+105°C达2.5 %精度
-32 kHz品振(LEXT)
-低速内部时钟(LICK)
模拟模块
-2个12位2.5 MSPSA/D转换器,多达18个外部输入通道,内部通道与〇P互连:每通道独立数据寄存器
-温度传感器(VTS)和内部参考电压(VINTRV)
-2个6位D/A转换器与CMP和OP瓦连
-2个比较器(CMP)带输出消隐功能
-4个运算放大器(OP),带宽8.5MHZ,支持PGA模式,两输入端内置钳位二极管
DMA
-1个7通道DMA控制器,支持完全弹性映射多达46个快速GPIO端口
-所有GPI0口可以映像到16个外部中断(EXINT)
-几乎所有GPI0口可容忍5V输入信号多达11个定时器(TMR)
-1个16位8通道高级定时器,包括4对互补通道PWM输出,带死区控制和紧急停止功能
-多达5个16位通用定时器,每个定时器最多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入
-2个16位基本定时器
-2个看门狗定时器(WDT和WWDT)
-系统滴答定时器:24位递减计数器
ERTC:增强型RTC,具有自动唤醒、闹钟、亚秒级精度及硬件日历,带校准功能
多达8个通信接口
-2个12C接口,支持SMBUS/PMBUS
-2个USART接口:支持主同步SPI和调制解调器控制:具有ISO7816接口、LIN、IrDA、和RS485驱动使能:支持TX/RX可配置引脚互换-2个SPI接口(36M位I秒),均可复用为半双工12S接口
-1个CAN接口,内置1408字节的专用缓存(其中AT32M416支持CANFD协议)-红外发射器(IRTMR)
CRC计算单元
96位的芯片唯一代码(UID)
串行线调试(SWD)
温度范围:-40至+105°C二:AT32中断知识介绍:
EXINT 共计有 22 条中断线 EXINT LINE[22:0](其中位 18 为保留位),每条中断线均支持通过边沿检测触发和软件触发来产生中断或事件。EXINT 可以根据软件配置,独立的使能或禁止中断或事件,并采取不同的边沿检测方式(检测上升沿或检测下降沿或同时检测上升沿和下降沿)以及触发方式(边沿检测触发或软件触发或边沿检测和软件同时触发)响应触发源独立的产生中断或事件。
图8-1外部中断/事件控制器框图

EXINT 控制器的主要特性:
中断线 0~15所映射的10可以独立的配置
每个中断线都有独立的触发方式选择
每个中断都有独立的使能位
每个事件都有独立的使能位
共22个可独立产生和清除的软件触发
每个中断都有独立的状态位
每个中断都可以被独立的清除
板载按键原理图如下:

板载LED引脚配置如下:

三:软件编写:
3.1 使用AT32 work bench软件配置一下外部输入中断的功能

注意:使能优先级,配置上升沿还是下降沿触发中模式,使能中断:
void wk_exint_config(void)
{
  /* add user code begin exint_config 0 */

  /* add user code end exint_config 0 */

  gpio_init_type gpio_init_struct;
  exint_init_type exint_init_struct;

  /* add user code begin exint_config 1 */

  /* add user code end exint_config 1 */

  /* configure the EXINT0 */
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  gpio_init_struct.gpio_pins = GPIO_PINS_0;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);

  scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOA, SCFG_PINS_SOURCE0);

  exint_default_para_init(&exint_init_struct);
  exint_init_struct.line_enable = TRUE;
  exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  exint_init_struct.line_select = EXINT_LINE_0;
  exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
  exint_init(&exint_init_struct);

  /**
   * Users need to configure EXINT0 interrupt functions according to the actual application.
   * 1. Call the below function to enable the corresponding EXINT0 interrupt.
   *     --exint_interrupt_enable(EXINT_LINE_0, TRUE);
   * 2. Add the user's interrupt handler code into the below function in the at32m412_416_int.c file.
   *     --void EXINT0_IRQHandler(void)
   */

  /* add user code begin exint_config 2 */

  /* add user code end exint_config 2 */
}
3.2 配置LED2,LED3,LED4的GPIO口模式
void wk_gpio_config(void)
{
  /* add user code begin gpio_config 0 */

  /* add user code end gpio_config 0 */

  gpio_init_type gpio_init_struct;
  gpio_default_para_init(&gpio_init_struct);

  /* add user code begin gpio_config 1 */

  /* add user code end gpio_config 1 */

  /* gpio output config */
  gpio_bits_reset(GPIOA, GPIO_PINS_1 | GPIO_PINS_2);
  gpio_bits_reset(GPIOB, GPIO_PINS_1);

  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  gpio_init_struct.gpio_pins = GPIO_PINS_1 | GPIO_PINS_2;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);

  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  gpio_init_struct.gpio_pins = GPIO_PINS_1;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOB, &gpio_init_struct);

  /* add user code begin gpio_config 2 */

  /* add user code end gpio_config 2 */
}
3.3 在中断服务函数中添加对板载LED的控制:
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  exint0 interrupt handler
  * @param  none
  * @retval none
  */
void EXINT0_IRQHandler(void)
{
  if(exint_interrupt_flag_get(EXINT_LINE_0) != RESET)
  {
    at32_led_toggle(LED2);
    at32_led_toggle(LED3);
    at32_led_toggle(LED4);
    exint_flag_clear(EXINT_LINE_0);
  }
}
四:实物测试视频如下:

感想:使用AT32 图形化配置工具,可以一键配置芯片的底层驱动,从而简化开发难度,先和大家分享一下基本的功能:外部中断和GPIO的初始化,翻转功能。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

194

帖子

1

粉丝