问题的提出
用KEIL进行软件仿真,想观察一下处理器STM32F091RCY的I2C和DAC引脚输出的波形,发现无法向波形中添加信号,如下图所示
当在命令行中输入 dir vtreg 指令时,仅仅能够显示内核的寄存器,外设的寄存器无法输出:
dir vtregCURR_TID: ulong, value = 0x00000000TRAPS: ulong, value = 0x00000000TRIGFLT: ulong, value = 0x00000000STCLK: ulong, value = 0x00000000XTAL: ulong, value = 0x007A1200CLOCK: ulong, value = 0x007A1200
网上寻找答案,发现所有的关于软件逻辑分析仪的示例都是用器件STM32F103
问题的答案
KEIL5仅对某些器件的外设支持仿真,KEIL官方给出了网站
,在该网页中,列出了支持软件仿真的器件,如:
- 对于STMicroexectronics公司的处理器,仅支持STM32F101和STM32F103.
- 对于NXP公司的处理器,仅支持LPC1111, LPC1112, LPC1113, LPC1114四个系列.
这也难怪,网上给出的KEIL的软件逻辑分析仪的仿真示例都是用STM32F103这个器件。
问题的解决
为了仿真I2C的程序段,在STM32CUBE MX中,将器件改为STM32F103C8,重新进行仿真,在Option for Target中的Debug中,按下图进行设置:
进入debug界面,在命令行中输入DIR VTREG, 显示出外设的寄存器:
DIR VTREGCURR_TID: ulong, value = 0x00000000TRAPS: ulong, value = 0x00000000TRIGFLT: ulong, value = 0x00000000STCLK: ulong, value = 0x000F4240OSC: ulong, value = 0x007A1200SYSCLK: ulong, value = 0x007A1200HSI_RC: ulong, value = 0x007A1200OSC32: ulong, value = 0x00008000LSI_RC: ulong, value = 0x00008000HCLK: ulong, value = 0x007A1200PCLK1: ulong, value = 0x007A1200PCLK2: ulong, value = 0x007A1200RTCCLK: ulong, value = 0x00008000IWDGCLK: ulong, value = 0x00008000USBCLK: ulong, value = 0x007A1200ADCCLK: ulong, value = 0x003D0900TIMXCLK: ulong, value = 0x007A1200TIM1CLK: ulong, value = 0x007A1200BOOT: uchar, value = 0x00PORTA: ushort, value = 0x0000PORTB: ushort, value = 0x0000PORTC: ushort, value = 0x0000PORTD: ushort, value = 0x0000S1IN: ushort, value = 0xFFFFS1OUT: ushort, value = 0x0000S1TIME: uchar, value = 0x01S2IN: ushort, value = 0xFFFFS2OUT: ushort, value = 0x0000S2TIME: uchar, value = 0x01S3IN: ushort, value = 0xFFFFS3OUT: ushort, value = 0x0000S3TIME: uchar, value = 0x01SPI1_IN: ushort, value = 0x0000SPI1_OUT: ushort, value = 0x0000SPI2_IN: ushort, value = 0x0000SPI2_OUT: ushort, value = 0x0000I2C1_IN: ushort, value = 0xFFFFI2C1_OUT: ushort, value = 0xFFFFI2C2_IN: ushort, value = 0xFFFFI2C2_OUT: ushort, value = 0xFFFFCAN1ID: ulong, value = 0x00000000CAN1L: uchar, value = 0x00CAN1B0: uchar, value = 0x00CAN1B1: uchar, value = 0x00CAN1B2: uchar, value = 0x00CAN1B3: uchar, value = 0x00CAN1B4: uchar, value = 0x00CAN1B5: uchar, value = 0x00CAN1B6: uchar, value = 0x00CAN1B7: uchar, value = 0x00CAN1IN: ushort, value = 0x0000CAN1OUT: ushort, value = 0x0000ADC1_IN0: float, value = 0ADC1_IN1: float, value = 0ADC1_IN2: float, value = 0ADC1_IN3: float, value = 0ADC1_IN4: float, value = 0ADC1_IN5: float, value = 0ADC1_IN6: float, value = 0ADC1_IN7: float, value = 0ADC1_IN8: float, value = 0ADC1_IN9: float, value = 0ADC1_IN10: float, value = 0ADC1_IN11: float, value = 0ADC1_IN12: float, value = 0ADC1_IN13: float, value = 0ADC1_IN14: float, value = 0ADC1_IN15: float, value = 0VTEMP1: float, value = 3.29999995VREFINT: float, value = 3.29999995VREFP: float, value = 3.29999995VREFN: float, value = 0ADC2_IN0: float, value = 0ADC2_IN1: float, value = 0ADC2_IN2: float, value = 0ADC2_IN3: float, value = 0ADC2_IN4: float, value = 0ADC2_IN5: float, value = 0ADC2_IN6: float, value = 0ADC2_IN7: float, value = 0ADC2_IN8: float, value = 0ADC2_IN9: float, value = 0ADC2_IN10: float, value = 0ADC2_IN11: float, value = 0ADC2_IN12: float, value = 0ADC2_IN13: float, value = 0ADC2_IN14: float, value = 0ADC2_IN15: float, value = 0VTEMP2: float, value = 3.29999995
同时,也可以向软件逻辑分析仪中添加信号了。