当系数12mhz晶振周期12mhz时,MCS-96的串口在异步通讯方式下实现4800BAUD通迅速率时

&&&& 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。
&&&& 2、通信协议的使用
&&&& 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:& 0xA1:单片机读取P0端口数据,并将读取数据返回PC机;&& &0xA2:单片机从PC机接收一段控制数据;&&&&& &0xA3:单片机操作成功信息。
&&&& 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。
&&&& 3、硬件连接
&&&& 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
使用MAX232串口通信电路图(9孔串口接头)
&&&& 串口通讯的硬件电路如上图所示为了能够在计算机端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里利用如下图标的一个免费计算机串口调试软件来观察。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
串口调试助手窗口
SBUF 数据缓冲寄存器 这是一个可以直接寻址的串行口专用寄存器。有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器SBUF?而不是收发各用一个寄存器。”实际上SBUF包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址-99H。CPU在读SBUF时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作SBUF寄存器的方法则很简单,只要把这个99H地址用关键字sfr定义为一个变量就可以对其进行读写操作了,如sfr SBUF = 0x99;当然你也可以用其它的名称。通常在标准的reg51.h或at89x51.h等头文件中已对其做了定义,只要用#include引用就可以了。
&&&& SCON 串行口控制寄存器 通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。SCON就是51芯片的串行口控制寄存器。它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51芯片串行口的工作状态。51芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON寄存器。它的各个位的具体定义如下:
表8-1 串行口控制寄存器SCON
&&&& SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。看表8-2串行口工作模式设置。
同步移位寄存器
fosc/32或fosc/64
表8-2 串行口工作模式设置
&&&& 在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。表中的fosc代表振荡器的频率,也就是晶振的频率。UART为(Universal Asynchronous Receiver)的英文缩写。
&&&& SM2在模式2、模式3中为多处理机通信使能位。在模式0中要求该位为0。
&&&& REM为允许接收位,REM置1时串口允许接收,置0时禁止接收。REM是由软件置位或清零。如果在一个电路中接收和发送引脚P3.0,P3.1都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入REM=0来禁止接收,在子程序结束处加入REM=1再次打开串口接收。大家也可以用上面的实际源码加入REM=0来进行实验。
&&&& TB8发送数据位8,在模式2和3是要发送的第9位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。
&&&& RB8接收数据位8,在模式2和3是已接收数据的第9位。该位可能是奇偶位,地址/数据标识位。在模式0中,RB8为保留位没有被使用。在模式1中,当SM2=0,RB8是已接收数据的停止位。
&&&& TI发送中断标识位。在模式0,发送完第8位数据时,由硬件置位。其它模式中则是在发送停止位之初,由硬件置位。TI置位后,申请中断,CPU响应中断后,发送下一帧数据。在任何模式下,TI都必须由软件来清除,也就是说在数据写入到SBUF后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI不会由硬件清除,所以这时必须用软件对其清零。
&&&& RI接收中断标识位。在模式0,接收第8位结束时,由硬件置位。其它模式中则是在接收停止位的半中间,由硬件置位。RI=1,申请中断,要求CPU取走数据。但在模式1中,SM2=1时,当未收到有效的停止位,则不会对RI置位。同样RI也必须要靠软件清除。
&&&& 常用的串口模式1是传输10个位的,1位起始位为0,8位数据位,低位在先,1位停止位为1。它的波特率是可变的,其速率是取决于定时器1或定时器2的定时值(溢出速率)。AT89和AT89C2051等51系列芯片只有两个定时器,定时器0和定时器1,而定时器2是89C52系列芯片才有的。
&&&& 波特率 在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600会被误认为每秒种可以传送9600个字节,而实际上它是指每秒可以传送9600个二进位,而一个字节要8个二进位,如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传输的字节数是9600÷10=960字节。51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。模式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率为focs/64,SMOD为1,波特率为focs/32。模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。
波特率=(2SMOD÷32)×定时器1溢出速率
&&&& 上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计数,TH1做为自动重装值 ,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2下定时器1溢出速率的计算公式如下:
&&&&&&&&&&&&& 溢出速率=(计数速率)/(256-TH1)
&&&& 上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M的晶振用在51芯片上,那么51的计数速率就为1M。通常用11.0592M晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD设为1,分别看看那所要求的TH1为何值。代入公式:
&&&&&&&&&&&&& 11.0592M
&&&&&&&&&&&&& 9600=(2÷32)×((11.0592M/12)/(256-TH1))
&&&&&&&&&&&&& TH1=250 //看看是不是和上面实例中的使用的数值一样?
&&&&&&&&&&&&& 12M
&&&&&&&&&&&&& 9600=(2÷32)×((12M/12)/(256-TH1))
&&&&&&&&&&&&& TH1≈249.49
&&&& 上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。
下位机:51单片机实现RS232串口通信
上一期,我们已经利用增强型51实验板学会了单片机控制步进电机转动的方法,这一期,我们将一起来学习一下单片机如何与PC机进行通信,一
起来完成一个简单的RS232通信实例,我们不做太多的理论,从实例出发,相信能够给大家一个比较通俗、透彻地认识,掌握了它的原理,那你就可以编出任何
和PC机进行通信的程序了。
前几期,我们学习和介绍的内容都是以单机的形式,即所有的功能都是在一块增强型51实验板上得以实现。当单片机技术具体应用到工厂、企业及各类工 业、民用领域中,它肯定要与外部设置作数据传输,其交互性也使得单片机的应用越来越广泛,我们可以利用它来传数据,传控制命令等等。因此,单片机与PC机 的通信是我们学习单片机技术所经历的必要环节,由此,也使我们的学习更具趣味性。
下面我们一起来完成一个用单片机从串行口接收PC机数据,并在数码管上显示出来的实验。
先介绍一下串口通信基本知识。目前较为常用的串口有9针串口(DB9)和25针串口(DB25)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。串口引脚定义如图1所示。
9针串口(DB9)
25针串口(DB25)
数据载波检测
数据载波检测
数据终端准备
数据终端准备
数据设备准备好
数据准备好
图1 DB9和DB25的常用信号脚说明&
&&&&我们来看一下本次实验的电路图,如图2所示,即增强型51实验板实现串口通信及数码管显示的电路部分。图2中的4个三极管分别与4 个共阳数码管相连,是各个数码管的使能端,分别通过单片机的P2.0,P2.1,P2.2,P2.3来控制,数码管显示的详细工作原理,我们已在前几期杂 志中作过介绍,有兴趣的朋友可以去看一下以前几期的内容。图2中MAX232芯片起到RS232与TTL电平转换的作用,我们通过9芯串口与PC机相连。
图2 硬件电路原理图
下面是我们完成本次实验的源程序代码,使用Keil编译软件,将其编译生成HEX文件,然后,通过A51编程器烧入AT89S51芯片即可。
#include "reg51.h"
#include &absacc.h&
unsigned char code
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void Init_Com(void)
TMOD = 0x20; //定时器工作方式2,初值自动装入
PCON = 0x00; //波特率不增倍
SCON = 0x50; //串行工作方式设定
TH1 = 0xFd; //定时器初值高位
TL1 = 0xFd; //定时器初值低位
TR1 = 1; //启动定时器
/*函数功能:LED数码管延时程序*/
void delay(void)
for(k=0;k&600;k++);
/*函数功能:LED数码管显示程序*/
void display(int k)
P2=0 //位选
P0=tab[k/1000]; //显示千位数字
delay(); //延时
P2=0 //位选
P0=tab[k%]; //显示百位数字
delay(); //延时
P2=0 //位选
P0=tab[k%100/10]; //显示十位数字
delay(); //延时
P2=0xf7; //位选
P0=tab[k%10]; //显示个位数字
delay(); //延时
P2=0 //位选
/*函数功能:主程序*/
void main()
P2=0 //端口初始化,关LED显示
Init_Com(); //调用串口初始化程序
while(1) //主循环
if ( RI ) //判断是否收到数据
dat = SBUF; //接收数据
RI = 0; //软件清除标志位
display(dat-48); //显示收到的数据
我们来一起分析一下程序代码,main主程序首先将P2口和P0口全部输出高电平,即数据管不显示任何内容,Init_Com函数用来初始化串口 设置,如波特率设置,工作方式的设置,这些都是程序运行的一切初始化设置。然后,我们看到了一个while(1)语句,该语句的作用是产生死循环,即单片 机上电复位后,我们就不断地去接收由PC机发过来的串口数据,同时将接收到的数据放在dat 这个变量中,每接收完一次数据,我们需要执行RI = 0这条语句,用来清除串口数据接收标志位,现在我们已经收到了PC机传过来的数据了,余下的任务就是要将数字通过数码管显示出来,我想大家看了我们前几期
的介绍,已经并不陌生数码管的使用了,在这里,我们也写得非常简洁,通过display这个函数将数字显示出来,因为我们收到的是字符型的ASCII码数 据,如数字“0”的ASCII码值是48,所以,我们要显示“0”的话,还需要将其值减去48后才是真正要显示的数据。数码管我们采用动态扫描法进行显 示,delay函数的作用是产生一定时间的延时,对于人眼来说是分辨不出来的,在display的函数体内,我们先将数据装载到P0口,如我们在程序开始 时定义的:unsigned char code
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}语句,意思相当于:数字“0”对 应的数码管段码值为“0xc0”, 数字“1”对应的数码管段码值为“0xf9”, 数字“2”对应的数码管段码值为“0xa4”……以此类推,最后通过数码管的使能端来显示各位数码管的值。至此,整个程序的功能就轻松地实现了我们所需要
的功能,看到这里相信你现在对串行通信感到并不是原来想的那么深奥了吧。
现在我们已经将程序写好,并烧入了单片机芯片,下面我们要做的就是用串口线将增强型51实验板和PC机相连起来,同时给实验板接上电源,然后就是通过PC 机软件来发数据了,要在PC机上向串口发送数据一定要借助相应软件,打开光盘内附带的串口调试软件,它设置方便、灵活,界面简洁明。因为我们得告诉实验板
来显示哪些数字,程序的功能是发送“1”、“2”、“3”......“8”、“9”、“0”等字符,增强型51实验板收到数据后通过数码管显示出来,所 以我们得在软件发送区内填上我们所需要发送的数字,如图3所示。
串口调试软件中,设置参数如下:串口:COM1;波特率:9600;校验位:无;数据位:8位;停止位:1位;发送内容:5
当我们点击“手动发送”按钮后,我们可以看到增强型51实验板上的数码管已显示数字“5”的字样,如图4所示。当然,我们也可以选择“自动发送”,即每隔一定的时间,由软件自动发送“发送缓冲区”内的数据,时间周期可以在软件界面中设置。
现在,你已经可以自由发挥来接收PC机发过来的数据了,只要发挥你的想象力,定义好PC机和单片机两端的数据通信协议,你可以做出
任何通过电脑来对单片机进行控制的程序,实现各种各样的数据传输,远程控制功能,比如通过PC机来控制液晶显示、控制步进电机的转动、控制蜂鸣器奏乐等
等,您也可以将本期所讲的知识与前几期所讲的关联起来,完成功能更多,更实用的具体应用实例。因此,到本期的学习,我们已经可以将单片机与PC相连,借助 PC机强大而灵活的功能,就可以为我们解决各类实际生产及应用型问题提供了方便。这一期的内容我
RS232串口通信详解(引脚定义,电气特性,传输格式,接收过程,单片机晶振,RS485,RS422)-转
串口是计算机上一种非常通用的设备通信协议。
串口的引脚定义:
信号方向来自
调制解调器
调制解调器
数据终端准备好
调制解调器
通讯设备准备好
调制解调器
调制解调器
响铃指示器
两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。
串口的电气特性:
1)RS-232串口通信最远距离是50英尺=15m
2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps
3)RS-232C上传送的数字量采用负逻辑,且与地对称
逻辑1:-3 ~-15V&&
逻辑0:+3~+15V
所以与单片机连接时常常需要加入电平转换芯片:
串口通信参数:
a)波特率:RS-232-C标准规定的数据传输速率为每秒50、75、 100、150、300、600、1200、2400、4800、9600、19200波特。
b)数据位:标准的值是5、7和8位,如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位);扩展的ASCII码是0~255(8位)。
c)停止位:用于表示单个包的最后一位,典型的值为1,1.5和2位。由于数是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
d)奇偶校验位:在串口通信中一种简单的检错方式。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。
串口通信的传输格式:
串行通信中,线路空闲时,线路的TTL电平总是高,经反向RS232的电平总是低。一个数据的开始RS232线路为高电平,结束时Rs232为低电平。数据总是从低位向高位一位一位的传输。示波器读数时,左边是数据的高位。
例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)和图2(RS-232电平)所示。
55H=B,取反后B,加入一个起始位1,一个停止位0,55H的数据格式为
aaH=B,取反后B,加入一个起始位1,一个停止位0,55H的数据格式为
串口通信的接收过程:
(异步通信:接收器和发送器有各自的时钟;同步通信:发送器和接收器由同一个时钟源控制。RS232是异步通信)
(1)开始通信时,信号线为空闲(逻辑1),当检测到由1到0的跳变时,开始对“接收时钟”计数。 
(2)当计到8个时钟时,对输入信号进行检测,若仍为低电平,则确认这是“起始位”,而不是干扰信号。
(3)接收端检测到起始位后,隔16个接收时钟,对输入信号检测一次,把对应的值作为D0位数据。若为逻辑1, 作为数据位1;若为逻辑0,作为数据位0。
(4)再隔16个接收时钟,对输入信号检测一次,把对应的值作为D1位数据。….,直到全部数据位都输入。
(5)检测校验位P(如果有的话)。
(6)接收到规定的数据位个数和校验位后,通信接口电路希望收到停止位S(逻辑1),若此时未收到逻辑1,说明出现了错误,在状态寄存器中置“帧错误”标志。若没有错误,对全部数据位进行奇偶校验,无校验错时,把数据位从移位寄存器中送数据输入寄存器。若校验错,在状态寄存器中置奇偶错标志。
(7)本幀信息全部接收完,把线路上出现的高电平作为空闲位。
(8)当信号再次变为低时,开始进入下一幀的检测。
单片机常用11.0592M的的晶振,这个奇怪数字是有来历的:
波特率为9600BPS每位位宽t1=1/9600s
晶振周期t2=1/11.S
单片机机器周期t3=12*t2
即对于9600BPS的串口,单片机对其以96倍的速率进行采样。
如果单片机晶振用的不正确,会对串口接受产生误码。
关于单片机晶振的选择和寄存器设置详见:
RS485和RS422
RS485总线,在要求通信距离为几十米到上千米时,广泛采用RS-485
串行总线标准。RS485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。RS485采用半双工工作方式,任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。RS485用于多点互连时非常方便,可以省掉许多信号线。应用RS485可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。
RS422总线,RS485和RS422电路原理基本相同,都是以差动方式发送和接受,不需要数字地线。差动工作是同速率条件下传输距离远的根本原因,这正是二者与RS232的根本区别,因为RS232是单端输入输出,双工工作时至少需要数字地线发送线和接受线三条线(异步传输),还可以加其它控制线完成同步等功能。RS422通过两对双绞线可以全双工工作收发互不影响,而RS485只能半双工工作,发收不能同时进行,但它只需要一对双绞线。RS422和RS485在19kpbs下能传输1200米。用新型收发器线路上可连接台设备。
三者的区别
① RS232是全双工的,RS485是半双工的,RS422是全双工的。
② RS485与RS232仅仅是通讯的物理协议(即接口标准)有区别,RS485是差分传输方式,RS232是单端传输方式,但通讯程序没有太多的差别。 PC机上已经配备有RS232,直接使用就行了,若使用RS485通讯,只要在RS232端口上配接一个RS232转RS485的转换头就可以了,不需要修改程序。
关于RS485转接头的接法可以参考:
发表评论:
TA的最新馆藏[转]&[转]&查看: 4849|回复: 14
用12MHZ的外部晶振,串口输出是乱码
主题帖子精华
初级会员, 积分 187, 距离下一级还需 13 积分
在线时间0 小时
我用的是是12MHZ的外部晶振,然后我倍频到72MHZ,我发现使用的串口的时候,串口是乱码,然后又换回8MHZ的晶振也倍频到72MHZ,串口正常,请问这是什么原因,要改什么地方的程序。
&从8M晶振换12M晶振,如果还想是72M时钟,只需要改三个地方:
1、stm32f1x0.h中,#define HSE_VALUE&&& ((uint32_t)8000000)改为#define HSE_VALUE&&& ((uint32_t))
2、system_gd32f1x0.c中,使用48M的那个宏,即改为如下:
//#define SYSCLK_FREQ_HSE&&& HSE_VALUE
//#define SYSCLK_FREQ_24MHz&
//#define SYSCLK_FREQ_36MHz& 36000 ...
主题帖子精华
初级会员, 积分 79, 距离下一级还需 121 积分
在线时间0 小时
&从8M晶振换12M晶振,如果还想是72M时钟,只需要改三个地方:
1、stm32f1x0.h中,#define HSE_VALUE&&& ((uint32_t)8000000)改为#define HSE_VALUE&&& ((uint32_t))
2、system_gd32f1x0.c中,使用48M的那个宏,即改为如下:
//#define SYSCLK_FREQ_HSE&&& HSE_VALUE
//#define SYSCLK_FREQ_24MHz&
//#define SYSCLK_FREQ_36MHz&
#define SYSCLK_FREQ_48MHz&
//#define SYSCLK_FREQ_56MHz&
//#define SYSCLK_FREQ_72MHz&
3、如果是在keil中调试下载,工程选项中修改如下,Xtal(MHz)标签旁从8.0改为12.0。
534020dae6deaeb2dc1a4_393.png (0 Bytes, 下载次数: 21)
22:54 上传
如果楼猪是这么改的,那么既然8M晶振倍频到72M时钟串口收发正常,12M倍频到72M也没有理由出现乱码。
主题帖子精华
初级会员, 积分 79, 距离下一级还需 121 积分
在线时间0 小时
把倍频的程序发上来看看,怀疑你用12M晶振倍频不止72M,超频的时候一般会出现串口乱码的情况的。
主题帖子精华
初级会员, 积分 187, 距离下一级还需 13 积分
在线时间0 小时
是这样的我倍频也是用库函数的,如果8M是选择72M的那个宏定义,12M我就选48M的那个宏定义,因为库函数是以外部是8MHZ为准写的
主题帖子精华
初级会员, 积分 187, 距离下一级还需 13 积分
在线时间0 小时
回复【2楼】cdshkf:
---------------------------------
是这样的我倍频也是用库函数的,如果8M是选择72M的那个宏定义,12M我就选48M的那个宏定义,因为库函数是以外部是8MHZ为准写的
主题帖子精华
在线时间479 小时
估计你的倍频设置有问题.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 79, 距离下一级还需 121 积分
在线时间0 小时
楼猪可以调试的时候观察RCC的CR和CFGR两个寄存器的值,然后对比用户手册,这样到底是多少主频的时钟不就清楚了吗。
主题帖子精华
初级会员, 积分 187, 距离下一级还需 13 积分
在线时间0 小时
回复【7楼】cdshkf:
---------------------------------
谢谢,我知道我问了,我是用IAR的,应该是设置界面设置没有改成12MHZ
主题帖子精华
初级会员, 积分 79, 距离下一级还需 121 积分
在线时间0 小时
IAR界面好像没有和keil一样的设置晶振的地方,你可以这样设置再看看,如下图:
52be2c32d9_242.png (0 Bytes, 下载次数: 19)
22:54 上传
Defined symbols下面加入这么一句话:HSE_VALUE=((uint32_t)) (尼玛啊截图截错了,你以为准)
主题帖子精华
初级会员, 积分 187, 距离下一级还需 13 积分
在线时间0 小时
主题帖子精华
新手上路, 积分 31, 距离下一级还需 19 积分
在线时间0 小时
和你一样的问题,谢谢楼主的解决方法。
扬起你的笑脸 把影子留在身后
主题帖子精华
初级会员, 积分 61, 距离下一级还需 139 积分
在线时间3 小时
回复【4楼】bluezap:
---------------------------------
您好,请问为什么原来外部8M倍频到72M和12M倍频到48M一样呢,前者的倍频系数为9,后者是怎么回事,请教谢谢
主题帖子精华
初级会员, 积分 192, 距离下一级还需 8 积分
在线时间10 小时
回复【12楼】三少爷:
---------------------------------
8M到48M是6倍频,12M到72M也是6倍频
主题帖子精华
新手上路, 积分 38, 距离下一级还需 12 积分
在线时间6 小时
各位好。我也是遇到这样的问题。keil的界面里,我设置过了,但是不起作用。
我把电脑端串口的频率设置为开发板上串口的1.5倍就可以正常收发了。我也是为这事烦恼呢。
说明,我用的mdk5的版本,从那个菱形图标(manage run-time environ)里选择外设的。
同样是这个板子,找了老的程序,也是基于库函数的,运行就没问题。只要不是从mdk里选择外设,就ok。
主题帖子精华
新手上路, 积分 26, 距离下一级还需 24 积分
在线时间2 小时
用了楼主的方法解决了,谢谢楼主
Powered by}

我要回帖

更多关于 12mhz晶振封装 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信