ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AT32F403A开发板实战:从Keil调试到SPIM映射与工程移植

AT32F403A开发板实战:从Keil调试到SPIM映射与工程移植 简介面向嵌入式开发者和电子爱好者这份围绕雅特力AT32F403AVGT7芯片的AT-START-F403A开发板资料包定位为国产高性能MCU的快速入门与实践参考。资源以用户手册和KEIL工程代码为核心手册详解Cortex-M4F内核特性、时钟与电源管理、GPIO复用等关键知识点并逐一介绍板载LED、按键、USB Micro-B连接器、Arduino Uno R3扩展接口及16MB SPI Flash的用途与接线方式代码工程提供可直接编译的KEIL模板和典型外设控制示例方便对照硬件进行学习和二次开发。压缩包大小约11.9MB以ZIP格式打包内含文档与源代码两类内容便于按需查阅。目前已有2445人浏览学习适合正在选型或评估AT32系列单片机、需要做日常开发或课程项目的工程师和学生。配合板载AT-Link-EZ调试/烧录工具无需额外外接仿真器即可下载程序既能帮助理解底层寄存器操作也能在此基础上快速搭建应用原型。1. 免外接调试器的高性能国产 M4FAT-START-F403A 开发板AT-START-F403A 这块雅特力入门板第一眼抓人的是板载的 AT-Link-EZ 调试器USB 线插上就能在 Keil 里下载、单步省掉外接调试器。资料包里的用户手册把跳线、引脚映射写得很全KEIL 工程覆盖 GPIO、EXINT、USB、SPIM 等常用外设拿到手当天就能开始跑 demo。核心芯片 AT32F403AVGT7 是带 FPU 的 ARM Cortex-M4F最高 240MHz1MB Flash、224KB SRAM接口布局和主流 M4 选型接近适合做量产备选评估也适合在 Keil 下验证国产 MCU 外设时序的工程师。要评估国产 M4F或者考虑把 ST 风格工程迁到 AT32这份资料都值得完整过一遍。2. AT32F403AVGT7 核心资源与板级外设映射梳理2.1 选型视角看 AT32F403AM4F、240MHz、SRAM 与命名差异AT32F403AVGT7 的型号后缀里 V 代表 100 脚 LQFPG 代表 1MB FlashT7 是温度等级和封装规格这些信息在用户手册第一张表格里就有。真正影响工程迁移的是三件事内核带了单精度 FPU做浮点运算不需要软浮点库电机控制里的 FOC、音频处理里的滤波这类计算密集任务可以直接用硬件指令SRAM 到了 224KB缓冲区可以开得比传统 M4 更大音频、图像缩放这类要缓存的应用不用那么抠内存Flash 1MB 对现在动辄半兆起的 GUI 资源也够用。另一个需要提前接受的差异是命名风格。AT32 的外设缩写和主流 M4 不完全一样通用定时器叫 TMR 而不是 TIM外部中断叫 EXINT 而不是 EXTI时钟管理是 CRM对应crm_periph_clock_enable而不是__HAL_RCC_xxx_CLK_ENABLE。引脚排布大体兼容但库函数接口名称对不上直接搬 HAL 代码会编译不过。这个学习成本不算高官方工程里的函数骨架都搭好了照着例程改写比从零写要稳。2.2 板载资源与外设对应关系表板子上的 LED、按键、Arduino 接口不是随便接的用户手册里有一张表专门画资源对应关系整理如下。板载资源对应外设/接口官方例程目录使用注意4 个 LEDGPIO 推挽输出低电平点亮gpio / led点亮用gpio_bits_reset别和 set 搞反用户按键EXINT 外部中断输入exint默认上下拉和触发沿要对照原理图USB micro-BUSB OTG 或 AT-Link-EZ 两路usb_device下载口和用户 USB 是两路别混Arduino Uno R3 排母映射到指定 GPIO/ADC/TMRarduino_io接扩展板前先查引脚复用表16MB SPI FlashSPIM 或 SPI 外接spim / spi_flash优先用 SPIM 模式可地址映射AT-Link-EZSWD 调试 虚拟串口不涉及Keil 里走 CMSIS-DAP 接口连接拿到压缩包先别急着写代码把上表对照原理图过一遍。比如 LED 低电平点亮这一点直接决定点灯代码里用bits_set还是bits_reset错了灯就是不亮。Arduino 接口的引脚在接扩展板时会产生很隐蔽的复用冲突建议把手册里的接口对照表打印出来放桌面。解压资料包时可以顺手列一下目录结构确认用户手册和 KEIL 工程是否配套unzip -l AT-START-F403A_User_Manual_And_Code.zip | head -40unzip -l只列出压缩包内容而不解压head -40限制输出行数。看到类似project/at_start_f403a/mdk/的路径说明 KEIL 工程是独立目录可以整个解压出来如果在列表里同时看到多个版本的手册 PDF优先以最新的修订日期为准避免按旧手册配新代码。2.3 SPIM16MB SPI Flash 在地址空间里的角色这块板子上的 16MB SPI Flash很多人只拿来存字库其实 AT32F403A 的 SPIM 外设能做更多。SPIM 相当于把外部 SPI Flash 映射进 MCU 的地址空间CPU 可以直接用指针读 Flash 内容不需要先搬进 SRAM 再解析。放字库、放音频样本、放差分包这类场景很合适代码如果能从 SPI Flash 执行还能把 1MB 内部 Flash 省下来给业务逻辑。用普通 SPI 驱动这颗 Flash 时要关心读命令、擦除扇区和按页写的时序走 SPIM 后主控侧的读写指令被外设封装代价是地址映射区域不能随意边读边写擦写前还要考虑与内部 Flash 的地址重叠问题。用户手册里 SPIM 章节建议先读完再动手特别是地址分配和写保护寄存器这两个点最容易把 Flash 配置成不可访问状态只能靠 AT-Link-EZ 重新烧录救回来。提示SPIM 的写不是直接写映射地址要先擦再写行为与普通 SPI Flash 一致如果写入后读回全 0xFF先查擦除操作是否成功。3. Keil MDK 下安装器件支持包并导入官方 KEIL 工程3.1 器件支持包与 IDE 版本匹配要点资料包里的 KEIL 工程不是解压就能编译的前提是 Keil MDK 里装了 AT32F403A 的器件支持包。打开 Pack Installer在搜索框输入“AT32F403A”就能找到雅特力的 DFP装完在 Device 列表里会出现 AT32F403AVGT7 选项。这里有个常见坑如果 Keil 版本太旧比如 5.30 以下新版本 DFP 会直接提示不支持建议用 MDK 5.36 及以上配当前版本的 DFP老工程编译报错时也容易分清是编译器问题还是芯片包问题。装完 pack 后要确认 Pack Installer 显示 Installed 而不是 ErrorAT32 的 DFP 体积不大但网络不稳时会反复下载失败。装好后在 Pack Installer 的 Devices 标签页里能看到 AT32F403AVGT7 的具体外设列表包括 ADC、TMR、USB 这些确认这一步没走偏后面打开工程才不会报缺器件。3.2 导入 uvprojx 工程并处理包管理器的自动弹出解压时路径不要带中文和空格Keil 对这类路径处理得很差容易在生成目标文件时报 cannot open file。直接把整个 project 目录放到D:\workspace\这类纯英文路径下再打开.uvprojx。打开工程后如果总是自动弹出 Pack Installer典型原因是工程引用的 DFP 版本和当前安装版本不一致或者编译时提示缺少组件。把 DFP 升级到工程对应的版本后重新加载工程弹窗基本消失。如果打开后工程树是淡灰色禁用状态说明源码路径对不上去 Project 菜单检查文件是否存在。这一步处理完编译前先确认 Target 选项里 Device 显示的是 AT32F403AVGT7而不是默认的 STM32 或其他芯片选错后面全部白搭。3.3 命令行编译与 AT-Link-EZ 调试配置导入成功后的第一件事不是点下载而是先用命令行编译一遍确认环境没问题。Keil 的构建工具支持命令行调用很适合脚本化验证UV4.exe -b D:/workspace/AT-START-F403A/project/at_start_f403a/mdk/AT-START-F403A.uvprojx -j0 -o build.log grep -E Error|Warning build.log | head -20-b是 build 模式-j0表示多核编译-o指定日志文件最后用 grep 过滤 Error 和 Warning 看结果。命令行返回 0 表示构建成功非 0 则说明有报错。系统找不到 UV4.exe 时用 Keil 安装目录下的完整路径比如C:\Keil_v5\UV4\UV4.exe。这一步最常见的失败原因是头文件路径没包含at32f403a.h所在目录其次是 DFP 版本不匹配。编译通过后再接调试链路。AT-Link-EZ 通过板载 USB 连接电脑后Keil 的配置如下配置项值说明Debug 下拉框CMSIS-DAP DebuggerAT-Link-EZ 枚举为 CMSIS-DAP 兼容设备Settings - SW Device应显示 Cortex-M4读不到时检查 USB 线和驱动Flash DownloadAT32F403A 1MB FlashDFP 自带算法基址 0x08000000Utilities 页与 Debug 页一致下载时使用同一套算法整条配置链路和 STM32 接 ST-Link 的思路类似差别在于下载算法必须选 AT32F403A 对应的 1MB Flash。如果后续换 J-Link把 Debug 下拉框换成 J-LINKFlash 算法仍选 AT32 那个即可。确认好这四项点 Download 就能看到 0x08000000 的烧录进度条走完板子开始跑程序再用命令行编译的日志做回归对比后续每次改动都能快速知道有没有引入新编译错误。4. 从点灯到按键中断再到 SPI Flash官方例程改动实测4.1 GPIO 初始化与 LED 点灯的库函数写法差异用户手册里的 GPIO 章节写得比较细重点在于外设库风格和 ST 标准库接近但不完全一致。LED 点灯初始化如下static void led_gpio_init(void) { gpio_init_type gpio_init_struct; crm_periph_clock_enable(LED_PORT_CLK, TRUE); gpio_default_para_init(gpio_init_struct); gpio_init_struct.gpio_mode GPIO_MODE_OUTPUT; gpio_init_struct.gpio_out_type GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_pull GPIO_PULL_NONE; gpio_init_struct.gpio_drive_strength GPIO_DRIVE_STRENGTH_STRONGER; gpio_init_struct.gpio_pins LED1_PIN | LED2_PIN; gpio_init(LED_PORT, gpio_init_struct); gpio_bits_set(LED_PORT, LED1_PIN | LED2_PIN); }逐项说明crm_periph_clock_enable打开 GPIO 时钟gpio_default_para_init先把结构体复位避免漏配字段导致初始化结果不确定gpio_mode选输出模式gpio_out_type选推挽输出gpio_pull这里不需要上下拉gpio_drive_strength用较强驱动等级保证 LED 灌电流场景下输出电平不掉太多最后的gpio_bits_set把初始状态拉高。如果板子上 LED 是低电平点亮就要用gpio_bits_reset拉低状态逻辑正好相反。这段代码放在main的 while 循环之前初始化完成后主循环里再做翻转。4.2 EXINT 按键中断去抖与中断服务函数注意事项按键例程用的是 EXINT 外部中断默认触发沿以上下拉电阻为准。配置时先使能对应 GPIO 时钟再配置 EXINT 通道的触发沿最后打开 NVIC 中断。官方例程里一般会在中断服务函数里加一段去抖延时void EXINT2_IRQHandler(void) { if(exint_flag_get(EXINT_LINE_2) ! RESET) { exint_flag_clear(EXINT_LINE_2); delay_us(5000); if(gpio_input_data_bit_read(KEY_PORT, KEY_PIN) 0) { gpio_bits_toggle(LED_PORT, LED_PIN); } } }按键按下时电平会抖动中断可能连续触发多次。这里通过delay_us(5000)延时 5ms 等电平稳定再读一次输入脚确认确实是按下状态。注意延时去抖在中断里会阻塞其他中断演示工程可以量产建议把去抖放到定时器轮询或状态机中中断里只置标志位真正的翻转逻辑挪到主循环执行。还要注意 EXINT 通道号和 IRQHandler 函数名要对应官方例程里 LED 对应哪个按键通道号都是有规定的写错编译不报错但中断永远不触发。4.3 SPI1 初始化参数与分频系数选择SPI Flash 例程分成两层一层是 SPIM 地址映射另一层是普通 SPI 驱动。普通 SPI 方式更直观先初始化 SPI1spi_init_type spi_init_struct; crm_periph_clock_enable(CRM_SPI1_CLOCK, TRUE); spi_reset(SPI1); spi_default_para_init(spi_init_struct); spi_init_struct.transmission_mode SPI_TRANSMIT_FULL_DUPLEX; spi_init_struct.master_slave_mode SPI_MODE_MASTER; spi_init_struct.mclk_freq_division SPI_MCLK_DIV_4; spi_init_struct.first_bit_transmission SPI_FIRST_BIT_MSB; spi_init_struct.frame_bit_num SPI_FRAME_8BIT; spi_init_struct.clock_polarity SPI_CLOCK_POLARITY_LOW; spi_init_struct.clock_phase SPI_CLOCK_PHASE_1ST_EDGE; spi_init(SPI1, spi_init_struct); spi_enable(SPI1, TRUE);transmission_mode选择全双工master_slave_mode做主机mclk_freq_division是波特率预分频first_bit_transmission设为大端先行frame_bit_num8 位数据宽时钟极性和相位保持模式 0。spi_enable最后打开外设。要注意的是spi_reset放在时钟使能之后确保外设寄存器恢复默认值后续配置才可预期。分频系数直接决定通信可靠性假定 APB2 时钟 120MHz几个常用分频对应的 SCK 如下预分频值SCK 频率适用场景DIV_260MHz追求高速信号质量好时再用DIV_430MHz大多数 SPI NOR Flash 常规工作区DIV_815MHz长走线或高速率不稳定时DIV_167.5MHz兼容旧款 Flash调试期排查问题用调试时从 DIV_16 开始确认读写数据一致后再逐步提高分频。官方例程里的读写函数是现成的改完分频直接调spi_flash_read_id()看返回的厂家 ID 是否符合预期。回读全 FF 时优先查 CS 片选和写保护引脚这两个引脚位置最容易接错。5. 移植到自研板前的检查项与三个 Keil 报错处理5.1 三个硬件差异点核查开发板能跑不等于自研板能跑。第一处是晶振频率开发板上的外部晶振决定了system_at32f403a.c里的 PLL 分频参数自研板换晶振频率不改代码串口波特率整体漂移USB 枚举也会失败。第二处是 LED 和按键的电平方向开发板 LED 低电平点亮、按键按下为低自研板反过来的话沿用官方代码会得出相反逻辑。第三处是 SWD 调试口和电源AT-Link-EZ 的 3.3V 输出带不起大负载自研板接了传感器模块建议外设单独供电避免调试时目标板供电不足导致 SWD 时序不稳。5.2 三个高频报错和解决路径遇到missing: compiler version 5是 Keil 升级后用 AC6 编译旧工程最常见的报错工程文件里指定的 AC5 编译器不在当前 IDE 里。解决方法是装 ARM Compiler 5.06或者把工程切到 AC6。选 AC6 后旧例程里的隐式声明、结构体赋值写法可能报警告按提示改几处即可。Flash Download failed - Cortex-M4十有八九是下载算法没选对重新核对 Debug 页的 Flash Download 选项里是否选中 AT32F403A 的 1MB Flash 算法再把 SWD 速度从 10MHz 降到 1MHz 试一次。缺少 axf 文件时检查 Output 选项卡里是否勾选 Create OutputKeil 只有勾选后才生成 axf。调试器连不上时先重新插拔 AT-Link-EZ打开设备管理器确认能枚举到 CMSIS-DAP 设备再检查线序和复位电路。需要输出 bin 文件交给产线烧录时在 After Build 选项卡加一条命令fromelf --bin --outputAT-START-F403A.bin .\Objects\AT-START-F403A.axffromelf是 Keil 自带的格式转换工具第一个参数是输入 axf第二个是输出 bin。添加后每次构建都会在工作目录生成对应 bin 文件如果提示找不到 fromelf多半是 Keil 安装路径没加入系统 PATH改用完整路径即可。本文还有配套的精品资源点击获取
返回列表