在用proteus 仿真 stm32f103c6串口时,发现stm32主频不能超过55MHz,参见proteus的 sample project,我把倍频系数设为6,同时仿真主频需设为倍频系数*8M(晶振频率),串口波特率不受限制。参见附件
proteus仿真串口前必读事项
1、 proteus Virtual Terminal 串口波特率没有限制(推荐9600;)
2、 但对于倍频系数 RCC_PLLMul_*,*的取值似乎只能是6以下,否则Virtual Terminal显示乱码。
在sys.c中设置(洋桃电子例程;野火似乎没把设置RCC频率程序单列出来)
/*设置PLL时钟源及倍频系数*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_5); //RCC_PLLMul_x(枚举2~16)是倍频值。当HSE=8MHZ,RCC_PLLMul_9时PLLCLK=72MHZ
3、 双击proteus原理图中stm32元件,载入*.elf文件时,弹出如图2的窗口,频率必须设为8MHz* RCC_PLLMul_*,其中*<=6, 8MHz为stm32f103c6的外接晶振频率(proteus仿真库没有stm32f103c8)。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "stm32f10x.h" //STM32头文件
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- int main (void){//主程序
- RCC_ClocksTypeDef RCC_Clocks;
- u8 a=7,b=8;
- //初始化程序
- RCC_Configuration(); //时钟设置
-
-
- RCC_GetClocksFreq(&RCC_Clocks);
-
- USART1_Init(4800); //串口初始化(参数是波特率)
- //主循环
- while(1){
- /* 发送方法1 */
- // USART_SendData(USART1 , 0x55); //发送单个数值
- // while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //检查发送中断标志位
- /* 发送方法2 */
- // printf("STM32F103 "); //纯字符串发送数据到串口
- // printf("STM32 %d %d ",a,b); //纯字符串和变量发送数据到串口,a符号变量
-
- /* 发送方法3 */
- USART1_printf("STM32 %d %d ",a,b);
- delay_ms(1000); //延时
- }
- }
- 【变量定义】
- u32 a; //定义32位无符号变量a
- u16 a; //定义16位无符号变量a
- u8 a; //定义8位无符号变量a
- vu32 a; //定义易变的32位无符号变量a
- vu16 a; //定义易变的 16位无符号变量a
- vu8 a; //定义易变的 8位无符号变量a
- uc32 a; //定义只读的32位无符号变量a
- uc16 a; //定义只读 的16位无符号变量a
- uc8 a; //定义只读 的8位无符号变量a
- #define ONE 1 //宏定义
- delay_us(1); //延时1微秒
- delay_ms(1); //延时1毫秒
- delay_s(1); //延时1秒
- */
复制代码
所有资料51hei提供下载:
7USART—串口通信.7z
(888.46 KB, 下载次数: 673)
|