谁会用STM32107写一个频率测量振荡频率的...

后使用快捷导航没有帐号?
查看: 2432|回复: 11
关于stm3的rs485通信
在线时间4 小时
TA的帖子TA的资源
一粒金砂, 积分 40, 距离下一级还需 160 积分
写了主机和从机的程序,两块107可以进行询问——应答方式的485通信,现在把程序移植到103上面,不行。我是用数组保存数据帧的,在数据帧发送或接收完成前板子时钟保持发送或接收的状态。标志位用到的是TXE和RXNE,通过中断方式。把运行过程的中间参数发送到串口调试助手上看,发现接收到的数据帧(其实是一个个的字母组成)中间出现大量空格,字符串不能连续显示,也有接收的字符与显示的不一致。 请问是什么原因?跟两个芯片的时钟频率不一样有关吗?但我感觉好像系统里面都是配置到72M的。&&求解,求解。。。
在线时间859 小时
芯币40489 枚
E金币301 枚
TA的帖子TA的资源
先检查波特率问题
都是9600,之前是在两块107的板上试过的程序,直接移植过来的&
在线时间4 小时
TA的帖子TA的资源
回复 沙发 chunyang 的帖子
都是9600,之前是在两块107的板上试过的程序,直接移植过来的
在线时间859 小时
芯币40489 枚
E金币301 枚
TA的帖子TA的资源
最好先确认,简单的办法是借用PC来观察,如果确认波特率没有问题,那么进一步分析是否因为内存容量的变化导致了冲突,看编译后的lst文件即可获知。
哈哈,不知道是不是跟你说的情况一样。我定义的缓冲区数组是RxBuffer[RxCounter],RxCounter是自增的,正常接收的话RxCounter在收完一个数据帧后数值为9,实际上却变为了47,调试助手显示字符串中间出现很多来历无从&
在线时间237 小时
芯币634 枚
TA的帖子TA的资源
为啥你不调试看看?
就是用串口调试助手。。&
在线时间4 小时
TA的帖子TA的资源
回复 4楼 chunyang 的帖子
哈哈,不知道是不是跟你说的情况一样。我定义的缓冲区数组是RxBuffer[RxCounter],RxCounter是自增的,正常接收的话RxCounter在收完一个数据帧后数值为9,实际上却变为了47,调试助手显示字符串中间出现很多来历无从考究的空格。但我在每次的接收中断里把刚接收到的字符用串口在调试助手上显示出来发现跟发送的又竟然一致。 所以不知道RxCounter=47和那些空格是怎么来的。
在线时间4 小时
TA的帖子TA的资源
回复 5楼 虚V界 的帖子
就是用串口调试助手。。
我说仿真器,数据接得怎么样的,时钟 波特率什么的不看得一清二楚么&
在线时间237 小时
芯币634 枚
TA的帖子TA的资源
我说仿真器,数据接得怎么样的,时钟 波特率什么的不看得一清二楚么
有用到。只是在接收中断里设置断点后再单步运行发现除了第一个字符 后面的字符是收不到的,这样好像没多大意思,所以直接用了printf在调试助手上显示。不知道是不是我不太熟练仿真器的使用。&
在线时间4 小时
TA的帖子TA的资源
回复 8楼 虚V界 的帖子
有用到。只是在接收中断里设置断点后再单步运行发现除了第一个字符 后面的字符是收不到的,这样好像没多大意思,所以直接用了printf在调试助手上显示。不知道是不是我不太熟练仿真器的使用。
在线时间237 小时
芯币634 枚
TA的帖子TA的资源
你在中断后面设断点,第一个都正确了,那后面的只关系到一些细节问题了
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
RxChar = USART_ReceiveData(USART3);
if(RxChar == \'E\')
RxBuffer[RxCounter++] = RxC
USART_ITConfig(USART3,USAR&
在线时间4 小时
TA的帖子TA的资源
回复 10楼 虚V界 的帖子
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
& & & & RxChar = USART_ReceiveData(USART3);& & & &
& && &&&if(RxChar == 'E')
& & & && &&&RxBuffer[RxCounter++] = RxC
& & & & & & & & USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);
& & & & & & & & flag = 1;
& & & & & & & & RS232_SendData(RxChar);
& && && && && && && & for(i=0;i&RxCi++)
& & & & & & & & & & & & {
& & & & & & & & & & & & RS232_SendData(RxBuffer);
& & & & & & & & & & & & }
& & & & else
& & & & & & & & RxBuffer[RxCounter++] = RxC
& & & & & & & & RS232_SendData(RxChar);
RS232_SendData 是电脑串口调试助手显示的函数,整个中断下来,显示的确实跟发送的一致,但是在帧尾‘E’后那个for循环函数显示的竟然与发送的不一样。RxCounter也变为47,正常的应为9.& &IO口输出最高频率改过,波特率也试过降低,都没办法。&&有一点,只要是103作为接收端接收数据的都会出现这种错乱,当它作为发送端时,107那边接收正常。
:Sad: :Sad: :Sad: :Sad:
在线时间237 小时
芯币634 枚
TA的帖子TA的资源
USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);了
结束了又没打开,只能收到一个字节
另外你在RxBuffer[RxCounter++] = RxC 前面加多一句长度判断吧counter的超长判断。
如果你这样写
RxChar = USART_ReceiveData(USART3);
RS232_SendData(RxChar);
你很容易就发现立即收发很容易出问题,一旦出问题了只能下电,下一次上电还未必能正常。我建议中间加多两到三条指令做为一个时间缓冲。我估计读出这个数据它是需要几个机器周期的,毕竟串口也慢,加几句话到中间占个读取时间。
年度之星勋章
年度明星人物,根据每年年度回馈活动不同而不同。
技术导师勋章
论坛威望大于30000或网友提名:坛子里公认的技术导师
Powered by
逛了这许久,何不进去瞧瞧?在一个学期的物理学习经历中,我们所经历的如下探究中,与“测量细铜丝直径”方法相同的实验有②(填序号).
①装满水的玻璃杯还放多少大头针&&&&&&②用刻度尺测量纸张的厚度
③测量纸片下落的速度&&&&&&&&&&&&&&&&④研究充水玻璃管中气泡的运动规律
⑤比较材料的隔声性能&&&&&&&&&&&&&&&&⑥测一测你的听觉的频率范围
⑦观察水的沸腾&&&&&&&&&&&&&&&&&&&&&&⑧探测红光外侧的热效应
⑨探究平面镜的成像特点&&&&&&&&&&&&&&⑩观察光通过玻璃砖时的折射情况.
解:分析所给10个实验,可知只有实验②的方法与测细铜丝直径的方法相同,采用测多张纸的厚度,然后求平均值,为一张纸的厚度.
故答案为:②.
细铜丝的直径很小,如果直接测一根细铜丝的直径,一方面难以测量,另一方面误差较大.为了精确测量细铜丝的直径,我们测n根细铜丝的直径D,则每一根细铜丝的直径d=.逐一分析题中所给实验的测量方法,不难得出答案.用STM8S105单片机写一个输出频率为2KHz的方波,C语言? 没用过stm8单片机,求入门资料。谢谢!_百度知道
用STM8S105单片机写一个输出频率为2KHz的方波,C语言? 没用过stm8单片机,求入门资料。谢谢!
提问者采纳
//此例程是通过TIM2 CH1(PD4脚)通道来输出一个频率2K 占空比可调的方波,占空比可通过PD7脚的按键调#include &STM8S105K.h&typedef unsigned char u8;typedef unsigned int u16;u16 void SystemInit(void)
CLK_CKDIVR = 0x08;
// 16M内部RC经2分频后系统时钟为8M
CLK_PCKENR1 |= 0x60;
//使能TIM2与TIM3与主频连接
PD_CR2 |= 0x80;
//使能PD7口外部中断
} void GPIO_init(void)
PD_DDR = 0x1F;
//配置PD端口的方向寄存器全输出
PD_CR1 = 0x1F;
//设置PD为推挽输出
}void TIM2_init(void)
//TIM2 CH1 工作于模式1
TIM2_CCMR1= 0x60;
// PWM 模式 1,TIM2 CH1
TIM2_CCER1= 0x03;
// CC1配置为输出
TIM2_ARRH = 0x07;
// 配置PWM分辨率为10位,ARR=0x07D0
TIM2_ARRL = 0xD0;
// PWM频率=8M/0x07D0=2000Hz
TIM2_CR1 |= 0x01;
// 计数器使能,开始计数
}void init_devices(void)
asm(&sim&);
SystemInit();
GPIO_init();
TIM2_init();
_asm(&rim&); //开总中断
} void main( void )
{ init_devices(); while(1) TIM2_CCR1=//改变value值可改变频率
}/******************************************************************************* 函数名
: @near @interrupt void TLI_IRQHandler (void)*** 功能描述: 中断服务程序
按下PD7口按键来改变占空比*****************************************************************************/@near @interrupt void TLI_IRQHandler (void) {
PD_CR2 &= 0x7F;
//关PD7外部中断
value+=50;
while(value&1000)
PD_CR2 |= 0x80;
//使能PD7口外部中断
提问者评价
其他类似问题
stm8的相关知识
按默认排序
其他1条回答
建议楼主参考中国电子DIY之家有关作品
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁急!!如何用示波器测量一个信号的频率?_百度知道
急!!如何用示波器测量一个信号的频率?
提问者采纳
直接把这个信号接到示波器中观察,接入信号后,只要调出该信号的波形就可以再示波器的右下方看到信号频率了
其他类似问题
按默认排序
其他2条回答
如果这个信号是单一频率的,那么你可以从示波器上看这个频率的周期,F=1/T频率就出来了,如果这个信号是被调制过的了,那么示波器就无法检测出来,必须用频谱仪才能看出来了
你先要给个信号给示波器,然后可以观察到输出波形,再摁下“measure&按扭,摁时间测量,后面我也记不得了,自己可以实际操作下,呵呵
示波器的相关知识
您可能关注的推广回答者:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁软件工程个人小项目:写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最... - 推酷
软件工程个人小项目:写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最...
思想:看到这个问题,我想到了我们曾经做过的一些小程序,例如在
语言中有统计单词个数的程序,在编译原理时我们曾做过分离一个文件中各种符号,字符串等工作,所以我想利用这两个思想来进一步实现这个程序。
我的想法是利用一个结构体,在这个结构体中有两个变量一个数这个单词出现的次数,第二是保存一个单词的字符数组。然后读取一个文件,利用控制条件先读取一个单词存储在这个大的结构体数组中,接着当保存好第二个单词时与第一个单词对比看看是否相等,如果不等,接着使这个结构体数组加
,如果相等那么这个单词的次数加
并且使结构体数组不加
,便于以后比较,对于什么时候判断是一个单词则用
来判断。将这些单词保存在结构体数组中时在比较其大小从而输出其频率出现最多的
缺点:这样标识符太多,麻烦容易出错,而且调试起来繁琐
改正:可以先将单词不分类直接保存在字符数组中,同时消去逗号,空格等的影响,然后在通过比较函数来比较单词出现的次数即可,这样思想大概相同,但是不会那么的繁琐,省去了很多的变量。
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
struct WORD
char a[20];
};//结构体数组用于保存单词及出现的个数
int main()
struct WORD A[600];//结构体数组
char b[20];
int word=0;
int m,n,k;
char infile[50];
printf(&输入文件路径\n&);
scanf(&%s&,infile);//输入文件名字
if((in=fopen(infile,&r&))==NULL)
printf(&此文件无法打开&);
for(i=0;i&600;i++)//初始化其次数
{ A[i].num=1;}
while(!feof(in))//一个个的读取字符
A[i].a[j]='\0';//单词结束的标志是‘\0’。
ch=fgetc(in);
if((ch==' '||ch=='.'||ch==',')&&word==1)//判断单词结束的标志
i++;//结构体数组加1
if(n&=1)//从第二个单词开始,每提取一个单词都与前边比较是否相等。
for(m=0;m&n;m++)
if(strcmp(A[n].a,A[m].a)==0)
A[m].num++;//次数加1
i-=1;//结构体数组恢复原位
else if((ch==' '||ch=='.'||ch==',')&&word!=1)//消除一些空格的影响
else if(ch&=33&&ch&=122) //包含了所能出现的英文字符,消除文件结束符的影响。
A[i].a[j]=
for(n=0;n&i-1;n++)//通过比较法来排序,并将其单词相互交换
for(j=n+1;j&i;j++)
if(A[j].num&A[k].num)
max=A[k].A[k].num=A[n].A[n].num=
strcpy(b,A[k].a); strcpy(A[k].a,A[n].a); strcpy(A[n].a,b);
printf(&频率\t单词\t个数\n&);
for(i=0;i&10;i++) //显示出频率最高的前10个单词,及出现次数
printf(&%d\t%s\t%d\n&,i+1,A[i].a,A[i].num);
感想:程序有些复杂,控制变量太多,需要自己再去改正优化,争取做得更好。
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见

我要回帖

更多关于 测量振荡频率 的文章

 

随机推荐