stm8s单片机nrst脚能作输出吗

stm8s单片机nrst脚能作输出吗,第1张

不能,nrst是单片机的一个复位脚。

复位脚的接法与应用:

1,通常与nrst脚相连的有rc阻容复位,可在上电的一瞬间,复位单片机,从0地址开始执行代码。

2,通常与仿真器相连,调试仿真器有仿真单片机软件的功能,也有复位单片机的功能,其复位功能就是通过此接口实现。

3,接特有的复位IC,对于一些应用要求比较高的地方,如需要在很大干扰下正常工作而不复位等等。

4,不做特殊说明,nrst脚一般不作为普通的输入输出端口。

5,从数据手册上面也可以看到,上面没有写可以复用为IO口。

这个倒没发现过,我现在用过两个型号的STM8,内部和外部晶振都试过,没发现你说的问题STM8用起来还可以,就是可参考的资料较少,官方的函数库很一般,仿真器有点小贵,而且仿真慢的像牛一样,仿真器的USB接口也有点问题,经常板子一重新上电就得重新插拔一下USB但从性价比来说,的确不错,不过似乎没有你说的那么便宜,我买的(零卖)STM8S105要4块多呢。

文件:mainc
用途:
注意:内部8M晶振
/
#include <iom128vh>
unsigned char LED_table[]={0xFF,0x00,0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF,0x00,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0x00,0xFF,0x7E,0xBD,0xDB,0xE7,0xFF,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0x00};
用途:延时函数
注意:系统时钟8M
/
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}

void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}

void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
void main(void)
{
unsigned char i=0;
PORTA = 0xFF;
DDRA = 0xFF;
DDRE=0XFF;
PORTE=0XFF;
while(1)
{
if(i==36) i=0;
PORTA = LED_table[i++];
delay_nms(80);
}
}

  首先,你要明白STM8的驱动时钟可以采用外部晶振,也可采用STM8内部的RC振荡器,二者只能选其一。 三个语句中的HSI表明是采用内部RC振荡器。

  你先看STM8内部的时钟树结构:

  其中HSI RC 16MHz就是其内部含有的RC振荡器,是ST芯片在出厂前就经过校正的但有一定误差的振荡器。时钟经过HSIDIV[1:0]这个分频器,可以获得16MHz、8MHz、4MHz、2MHz的输出tHsiDIV,该输出经过Master Clock Switch(通过配置来选择外部晶振还是内部晶振)后,再分配到CPU时钟和外围设备时钟。

  因此,STM8可以运行的时钟频率最大可以达到16MHz,你也可以让它低于这个频率运行(有利于低功耗设计)。搞清楚了以上几点,可以知道第一句是配置STM8,让它知道用内部RC振荡器,不要用外部晶振,这样省了一个晶振的钱[成本降低了嘛:)],第二句是让内部振荡器的输出进行8分频,你也可以让它1分频、2分频、4分频,但不能3分频、5分频,因为它内部只设计了这几种分频,况且奇数分频很难实现,你学过数字电路就应该知道。然后第三句话你要看一下库函数的定义

CLK_Source_TypeDef   CLK_GetSYSCLKSource(void)

{

  return((CLK_Source_TypeDef)CLK->CMSR);

}

意思是返回寄存器CMSR的值,这个你就要参考一下《STM8S中文参考手册》了,里面搜索CMSR这个词,我的是在第54页,

看到了吗?它是表明时钟准备好了没有的状态标志,就像你去叫别人办事,别人要经过考虑,这就需要等待,同理,你在STM8S内部配置好了时钟后,内部需要产生一定的延迟,而且受各种状况的影响,比如外部供电电压变化、引脚干扰等,有可能导致配置时钟失败,这就要经过查询这个寄存器的值来看是否配置好时钟没有,如果这个寄存器不等于0,则配置成功,否则失败。第三句的while里的意思就是不断地取CMSR的值,看是否等于宏定义CLK_SOURCE_HSI(OXE1),如果相等了,则跳过循环,继续执行以后的语句。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13375315.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-24
下一篇 2023-07-24

发表评论

登录后才能评论

评论列表(0条)

保存