SWO是M4内核TRACE功能的输出管脚,可以为我们提供一种数据输出的手段,由于是内核功能,所以在AT32F435的用户手册上都没有过多介绍。这篇帖子就来介绍一下SWO功能在AT32F435上如何使用
我找了下资料,在ST的文档山对SWO的介绍还是比较详细的,因为内核相同所以介绍应该是一样的,我们一起先来看一下
ST的相关寄存器介绍如下
但在AT32F435的用户手册上是没有介绍的
但AT原厂提供的应用笔记有这样的介绍
但也只是介绍的简单用法,在实际芯片使用时,还是有问题的,需要根据芯片实际情况再加处理,下面看看我是怎么实际应用的吧。
首先按应用笔记的方式开启跟踪功能并使用异步模式
DEBUGMCU->ctrl &= 0xffdf;
DEBUGMCU->ctrl |= 0x0020;
第二步是配置SWO(PB3)的管脚,因为每个管脚都有很多功能,AT32使用了IOMUX对管脚功能进行了管理。所以需要对IO功能进行重映射
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
/* configure the uart tx pin */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_pins = GPIO_PINS_3;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE3, GPIO_MUX_0);
代码相关的配置就完成了,还需要再编辑器上再配置一下
使能 Trace Enable,内核时钟 Core Clockx需要和芯片实际内核时钟一致,另外就是SWO Clock,不能太高。当出现打印乱码时,此时可尝试不勾选Autodetect,并手动修改时钟分频系数保证打印信息正常。
使用系统函数ITM_SendChar (uint32_t ch)进行SWO输出。
对printf进行重映射后,就可以使用printf通过SWO进行输出了
实际效果如下
至此,SWO输出在AT32F435上的使用就介绍完了
参考资料:
AN0015_Printf_Debug_Demo_ZH_V2.0.0.pdf
(1.23 MB)
AN0015_Printf_Debug_Demo_V2.0.0.zip
(2.09 MB)
|