近期对proteus仿真STM32试了一下。下面是个人经验。 Proteus 8,STM32可以56M,串口是115200,可以实现。代码和仿真在附件中。 发现,对时钟树进行设置至关重要。proteus中STM32设置为72M时,串口总是乱码,库函数版一直没有实现,但是,肯定能,因为看到了有朋友采用寄存器版实现了,有经验的请不吝赐教。 个人感觉,proteus仿真STM32对时钟树的精准设比较重要。我的经验,PROTEUS中仿真STM32,尤其用到串口或嘀嗒定时器时,时钟树需要比较清楚,要进行比较精准的设置才行。 还有一个问题,用ST Cubemx完成进本设置后,用HAL写的代码,proteus仿真成功率比较高,个人体会主要是ST CubeMx对时钟树进行了比较清晰准确的设置。 Proteus仿真PA8 MCO输出时钟,没有波形,想问一下,Proteus不能仿真MOC输出吗?!有经验的请不吝赐教。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include"stm32f10x.h"
- #include"stdio.h"
- #include "bsp_SysTick.h"
- #include "system.h"
- #include "usart.h"
- #include "bsp_clkconfig.h"
- #include "bsp_mcooutput.h"
- /* 声明GPIO设置函数 */
- void GPIO_Config(void);
- int main(void)
- {
- RCC_ClocksTypeDef RCC_Clocks; //时钟结构体
- HSE_SetSysClock(RCC_PLLMul_7); //8*7=56Mhz,库函数默认多数为72MHZ。此处设置为56M,主要是因为发现72M时proteus仿真串口容易出现乱码。
-
- RCC_GetClocksFreq(&RCC_Clocks); //获取片上时钟
- MCO_GPIO_Config(); //MCO配置,PA8输出波形,可用示波器观察
- RCC_MCOConfig(RCC_MCO_SYSCLK); //MCO选择输出的时钟
- // SysTick_Init(); //嘀嗒时钟初始化
- usart_init(); //串口初始化
- GPIO_Config();
- //打印时钟,以便于proteus仿真时设置芯片采用的使用。
- printf("\r\nSYSCLK_Frequency = %d MHz\n",RCC_Clocks.SYSCLK_Frequency/1000000);
- printf("\r\nHCLK_Frequency = %d MHz\n",RCC_Clocks.HCLK_Frequency/1000000);
- printf("\r\nPCLK1_Frequency = %d MHz\n",RCC_Clocks.PCLK1_Frequency/1000000);
- printf("\r\nPCLK2_Frequency = %d MHz\n",RCC_Clocks.PCLK2_Frequency/1000000);
-
-
- printf("\r\nhello world!\r\n");
-
- while(1)
- {
- GPIO_SetBits(GPIOB, GPIO_Pin_0);
- SysTick_Delay_Us(20);
- GPIO_ResetBits(GPIOB, GPIO_Pin_0);
- SysTick_Delay_Us(20);
-
- }
-
- }
- void GPIO_Config(void)
- {
- /* 定义一个GPIO_InitTypeDef类型的结构体,该结构体原型在stm32f10x_gpio.h中 */
- GPIO_InitTypeDef GPIO_InitStructure;
- /* 使能GPIOB口时钟,相当于给GPIOB供电。使能时钟是所有外设工作前的第一步 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- /* 选择管脚6 */
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
- /* 选择管脚速度为50MHz */
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- /* 选择PB0-1为推挽输出模式 */
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- /* 按照结构体GPIO_InitStructure的配置进行初始化 */
- /* 选择端口为GPIOB */
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- GPIO_SetBits(GPIOB, GPIO_Pin_0);
- GPIO_SetBits(GPIOB, GPIO_Pin_1);
-
- }
复制代码
所有资料51hei提供下载:
proteus_usart1_systick_led.rar
(320.88 KB, 下载次数: 374)
|