历史上的今天
返回首页

历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2020年10月12日 | 初识STM8S105K心得

2020-10-12 来源:eefocus

    最近由于公司项目需要STM8S105K这颗芯片,这两天我也捣鼓了下,正好现在开通了博客,以此记录下自己的工作。

    开发环境:

        window10操作系统;

        IAR for STM8;

    开发工具;

        window10电脑;

        STM8S105K4t6最小系统;

        ST-link烧录器

   本人之前工作上主要使用STM32芯片,开发STM8S时,是使用ST的库开发还是直接操作寄存器开发的选择上,考虑到STM32上主要使用的库,而STM8S是八位单片机,寄存器相对于STM32简单不少,故本人使用寄存器操作开发。我以讲解程序案列来与大家分享心得。

 实验案例使用到的资源:

  1,IO口的位操作

  2,串口发送以及串口接收与空闲中断

  3,定时器1的使用

    首先,使用IAR新建一个基础工程

    对于STM8S的IO口操作,我们可以向使用51单片机那样简单直接位操作,我通过宏定义来对于位操作:

#define LED0_Toggle PE_ODR_bit.ODR5 = !PE_ODR_bit.ODR5 //LED接在PE5上
 #define LED1_Toggle PC_ODR_bit.ODR1 = !PC_ODR_bit.ODR1 //LED接在PC1上
 #define LED0 PE_ODR_bit.ODR5
 #define LED1 PC_ODR_bit.ODR1

    上面代码中对于了两个LED灯,然后配置下IO口就可以实现灯的亮灭,IO配置如下:

 void GPIO_init(void)
 {
   PE_DDR = (1<<5); // 配置PE端口的方向寄存器PD3输出
   PE_CR1 = (1<<5); // 设置PE5为推挽输出
      
   PC_DDR = (1<<1); // 配置PC端口的方向寄存器PD3输出
   PC_CR1 = (1<<1); // 设置PC1为推挽输出
 }

    STM8S的串口使用前,我们实现要清楚STM8S的系统时钟,我使用的时STM8S的内部16M时钟作为时钟源,然后1分频作为系统时钟,时钟设置代码如下:

/*******************************************************************************
* 函数名 : CLK_init 
* 描述   : 内部16M时钟作为系统时钟
* 输入   : 
* 输出   : 
* 返回   : 
* 注意   : 
*******************************************************************************/
void CLK_init(void)
{
  
  CLK_CKDIVR = 0x00; // 16M内部RC经1分频后系统时钟为16M
  
}

    我们知道系统设置后对串口波特率就好计算了。串口设置:波特率115200,数据位8,停止位1,奇偶校验None,串口初始化主要进行串口参数设置,使能发送与接收,以及开通接收中断与空闲中断,最后开启总中断。初始化函数如下:

/*******************************************************************************
* 函数名 : GPIO_init 
* 描述   : GPIO初始化
* 输入   : 
* 输出   : 
* 返回   : 
* 注意   : 
*******************************************************************************/
void UART2_Init(void)
{   
    asm("sim");  // 关全局中断
  /*寄存器恢复到默认值*/
    UART2_CR3  = 0x00;
    UART2_CR2  = 0x00;
    UART2_CR3  = 0x00;
    
    UART2_CR2  = 0x3c; //使能发送和接收,及使能接收中断和空闲中断
    
    UART2_BRR2 = 0x0b;//波特率115200
    UART2_BRR1 = 0x08;	
      asm("rim");  // 关全局中断
}

    STM8S串口接收数据,我使用接收中断和空闲中断来完成数据的接收。当发送字符串时,每收到一个字符时触发接收中断,而只有当数据接收完检测到空闲时才触发空闲中断,中断代码如下:

#pragma vector=UART2_R_RXNE_vector
__interrupt void UART2_RX_IRQHandler(void)
{
  static unsigned char i=0;
  static unsigned char RXBuff[20];


  if(UART2_SR&0x20)
  {
             
   RXBuff[i++]=UART2_DR;//对UART_DR的读操作可以将该位清零
  ;
  }
    if(UART2_SR&0x10)
  {
  
    printf("%s n",RXBuff);
    i=UART2_SR;         //对UART_DR的读操作可以将该位清零
    i=UART2_DR; 
    i=0;
    
  }
  
}

    而串口发送数据使用printfd的话就很方便,我也添加实现printf的代码,代码如下:

/*******************************************************************************
 * 函数名:UART2_SendByte
 * 描述  :uart发送一个字符
 * 输入  :u8 Dat 发送的字符
 * 输出  :无
* 返回   : 
* 注意   :
*******************************************************************************/
void  UART2_SendByte(unsigned char dat)
{
   UART2_DR = dat;	
   while(!(UART2_SR&0x40));	 //发送标志位是否为空	
}

/*******************************************************************************
 * 函数名:UART2_SendString
 * 描述  :uart发送字符串
 * 输入  :u8* Data,u16 len
 * 输出  :无
* 返回   : 
* 注意   :
*******************************************************************************/
void UART2_SendString(unsigned char* Data,unsigned short len)
{
  unsigned short i=0;
  for(;i

     关于定时器的使用,比较简单,主要实现LED灯的亮灭,我就不多讲,附上代码,代码上有很多注释,代码如下

/*******************************************************************************
* 函数名 : TIM1_init 
* 描述   : 定时器1初始化
* 输入   : 
* 输出   : 
* 返回   : 
* 注意   : 中断周期500ms
*******************************************************************************/
void TIM1_init(void)
{
  asm("sim");  // 关全局中断
  TIM1_PSCRH = 0x3F; // 8M系统时钟经预分频f=fck/(PSCR+1)
  TIM1_PSCRL = 0x7F; // PSCR=0x1F3F,f=16M/(0x3F7F+1)=1000Hz,每个计数周期1ms
  TIM1_ARRH = 0x01; // 自动重载寄存器ARR=0x01F4=500
  TIM1_ARRL = 0xF4; // 每记数500次产生一次中断,即500ms
  TIM1_IER = 0x01; // 允许更新中断
  TIM1_CR1 = 0x01; // 计数器使能,开始计数
  asm("rim"); // 开全局中断
}



/*******************************************************************************
* 函数名 : TIM1_OVR_UIF 
* 描述   : 定时器1中断函数,处理中断事物
* 输入   : 
* 输出   : 
* 返回   : 
* 注意   : 一点要清除中断标志
*******************************************************************************/
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
  if(TIM1_SR1&0x01)
  {
    LED0=!LED0;
    LED1=!LED1;
    TIM1_SR1= 0x00; // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序
  }
  
}


推荐阅读

史海拾趣

Aydin Corp公司的发展小趣事

在国内市场取得一定成绩后,Aydin Corp开始积极拓展国际市场。通过与全球知名企业的合作,公司成功将产品打入多个国家和地区的市场。同时,Aydin Corp还积极参加国际电子展会和交流活动,与业界同行建立了广泛的合作关系。这些举措不仅提升了公司的国际知名度,也为公司的持续发展注入了新的动力。

ALTERA(阿尔特拉)公司的发展小趣事

品质是Aydin Corp的生命线。公司始终坚持品质至上的原则,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,公司还注重品牌建设,通过提升产品形象和服务质量,逐渐树立了良好的品牌形象。这些努力使得Aydin Corp的产品在市场上获得了广泛的认可和好评。

GTM公司的发展小趣事

品质是Aydin Corp的生命线。公司始终坚持品质至上的原则,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,公司还注重品牌建设,通过提升产品形象和服务质量,逐渐树立了良好的品牌形象。这些努力使得Aydin Corp的产品在市场上获得了广泛的认可和好评。

CoolerMaster公司的发展小趣事

林仁政跳出已有的框架,不断思考机箱的设计。他敏锐地觉察到人们对于免工具安装的主板散热片的偏好,并深知散热效果不仅仅取决于散热片和风扇,更需要考虑空气的流动情况。结合日本高水准的立体设计灵感,林仁政带领工程师挑战困难,成功设计出了一台铝制机箱。这一机箱不仅具有高度的创新性,更因其纯手工制作的特性而显得弥足珍贵,对Cooler Master的发展具有重要意义。

EMC [ELAN Microelectronics Corp]公司的发展小趣事

为了进一步扩大市场份额,义隆电子积极实施国际化战略。公司在台湾新竹科学园区设立了全球营运总部,并在亚、美等二大洲建立了密集的行销暨技术中心。通过不断拓展国际市场,义隆电子的产品已经销售到全球各地,赢得了广泛的客户认可和信赖。同时,公司还积极寻求与国际知名企业的合作机会,共同推动行业技术的发展和创新。

Faraday Electronics Inc公司的发展小趣事

在电子行业中,单打独斗很难取得长久的发展。Faraday Electronics Inc深知这一点,因此一直注重与合作伙伴建立长期稳定的合作关系。公司不仅与多家国际知名企业建立了战略合作关系,还积极与国内高校和研究机构展开产学研合作。通过合作共赢的伙伴关系,公司不断引进先进技术和管理经验,提升了自身的核心竞争力。

问答坊 | AI 解惑

中美无线局域网标准之争,WAPI联盟绝地反击

面对不公正,WAPI国际标准之争可谓任重而道远今年3月7日,根据国际标准化组织(ISO)公布的成员国投票结果,中国标准仅仅获得了22%的支持,而美国标准获得了8成左右的支持率,这意味着中国标准将丧失成为全球标准的可能。随后,WAPI联盟公开指责包括 ...…

查看全部问答>

为什么X9241输出会有震荡???????

X9241是敏感芯片吗,为什么输出会有震荡呢????????…

查看全部问答>

我要学习51了,有人一道么?

其实自己原本不是电子这个行业的,但是由于一些原因,产生了兴趣,于是想靠着兴趣学学。 一没单片机的基础,C恐怕也要从头开始学,但是想和坛子里的朋友一道,记录下自己的一点点进步,遇到不会的问题随时探讨。 我会尽量记录下自己的学习心得与 ...…

查看全部问答>

Xilinx 大学计划 FPGA 数字信号处理课程教材

Xilinx 大学计划 FPGA 数字信号处理课程教材…

查看全部问答>

第1/15原创:事无巨细,GCC AVR

事无巨细,GCC AVR入门详解     乘着Cepark电子园正在搞AVR单片机开发板优惠活动,花160块钱买了他们提供的散件。近日终于收到了,虽然是散件,自己焊的也很难看,但好歹能用,足够我折腾好些日子了。希望接下去的短短日子里,能小有收 ...…

查看全部问答>

gpio 模拟时序 实现对智能卡(小卡)的读写 的 问题

小弟最近接到一个活 需要利用gpio口进行对智能卡的读写 调试了几天还没什么头绪,希望各位大虾给予支持。 先介绍下我调试的环境和过程: gpio口是直接连接到ST8004芯片上 然后读写卡的。我这里指的卡是一般数字电视用的CA智能卡,跟一般的小卡都 ...…

查看全部问答>

诚觅激光喷码机\雕刻机开发合作!!!

本公司欲丰富自身产品线,获投资方许可,欲迅速切入激光喷码领域,本公司有强大的销售网络,有完善的装配生产流水线,为提高产品入市效率,现面向全国公布招标激光喷码机的开发项目,要求技术储备成熟的嵌入式软硬件开发团,有相关行业开发背景的团 ...…

查看全部问答>

串口传输 在S3C44B0运行的慢,为什么?

请教一下各位大虾:    我用串口传输数据,为什么在ADS上调试的时候很快 而当我写到板子上的时候 进行传输 却慢了好几倍 我用的是44b0的板子 …

查看全部问答>

wince5.0 下的DM9000驱动问题(着急啊)高手帮帮忙

很是郁闷 本来是有两个BSP   一个eboot是通道(5.0的bsp) 一个usb是通道(4.2的BSP)  但是第一个进系统后DM9000不通 第二个的DM9000的是通的     为了走网口 我决定用第一个BSP (两个BSP在板子上都能用)去改DM9 ...…

查看全部问答>

郁闷!请教制作ramdisk的空间问题

刚学习做ramdisk,用从www.denx.de 的ftp服务器上下载的ramdisk_image.gz,mkimage之后就能够正常运行,我自己制作的时候,开始没有用busybox,我从eldk的工具中拷贝了几个ppc-82xx的常用命令,包括sh了,然后又按照网上的说法从eldk的ppc-82xx的lib ...…

查看全部问答>