历史上的今天

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

正在发生

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

发布者:JoyfulSpirit 来源: eefocus关键字:STM8S105K  烧录器  定时器 手机看文章 扫描二维码
随时随地手机看文章

    最近由于公司项目需要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; // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序
  }
  
}


关键字:STM8S105K  烧录器  定时器 引用地址:初识STM8S105K心得

上一篇:直接使用单片机的USART发送数据
下一篇:麻雀虽小 五脏俱全:MCU专用RTOS简述

推荐阅读

uboot的移植完成以后,满以为很快能烧写到板子上并安装linux,结果uboot烧写了三天才终于成功,这其中碰到了不少的问题,在此做个总结。首先,飞凌的OK6410开发板并不支持JLink烧写uboot,只能通过SD卡来烧写,这一点我事先并不知道,他们网店介绍里并未说明,而且销售人员也没有做出任何提示,结果我花了整整一天时间尝试所有通过JLink烧写uboot的可能方...
一、串口初始化void usart_init(){SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1TMOD = 0x20; //定时器工作方式2PCON = 0x00;TH1 = 0xFD; //波特率9600、数据位8、停止位1。效验位无 (11.0592M)TL1 = 0xFD;ES = 1; //开串口中断EA = 1; //开总中断TR1 = 1; //启动定时器}SCON寄存器 1.SM0、SM1:串行口工作方式控制位 2.S...
今天,小米宣布推出UWB技术——一种具备空间定位的新一代连接技术,可以赋予手机和智能设备空间感知能力,犹如「室内GPS」。手机指向智能设备,控制卡片就能自动弹出,直接就能操控。UWB全称Ultra Wide Band,也就是“超宽带通信”。小米UWB技术区别于现存的窄带宽通信系统,拥有500MHz超大带宽来传输信息,将定位精度缩减至厘米级别,这一技术也曾应用...
CEVA、博通集成和 VisiSonics 发布用于耳机和 TWS 耳塞的3D 空间音频参考设计三家企业共同为消费电子 OEM 和 ODM 厂商带来完整的 3D 空间音频硬件和软件解决方案CEVA,全球领先的无线连接和智能传感技术的授权许可厂商(NASDAQ:CEVA) 与无线通信解决方案领域的主要厂商博通集成(Beken Corporation)和3D空间音频技术领导厂商VisiSonics宣布提...

史海拾趣

问答坊 | AI 解惑

从GPS到RFID日益丰富的定位技术

[摘要]  在很多类似的东西里,找到自己需要的东西,是很多人在生活中经常会遇到的问题。拿笔者来说,上学的时候经常遇到的苦恼就是:在几十辆甚至一百多辆自行车中,寻找自己的自行车,这种麻烦在下雪之后尤为突出,因为这些自行车看起来都是那么 ...…

查看全部问答∨

请教:lm324振铃检测电路

这是一个电话铃流检测电路 请教为什么输出波形不规则,下面是电路图。…

查看全部问答∨

CF卡启动CE6.0系统

大家好,我是使用研华的PCM-9375开发板,windows CE 6.0,存储是用CF卡,现在发现一个问题,无论是使用Bios Boot Loader或者MS-Dos&Loadcepc都很慢,大约需要两分钟,但是如果通过eboot,在开发机直接加载nk.bin到开发板上,只需要大约30秒.有没有 ...…

查看全部问答∨

Driverstudio中的link error

--------------------Configuration: Start - Win32 Checked------------------- Linking... LINK : fatal error LNK1181: cannot open input file "C:\\PROGRA~1\\NuMega\\DRIVER~1\\DRIVER~3\\lib\\I386\\checked\\vdw_wdm.lib" 执行 link ...…

查看全部问答∨

请教串口

我用147的串口0通过232然后与pc相连,为什么上电的时候总是会收到00呢,怎么处理呢?…

查看全部问答∨

求助关于开发基于DSP的信号处理板

要求:1.处理能力:不小于3200MIPS2.Boot方式:EEPROM Boot3.外部存储器:容量不小于1MB,速度不低于200MHz4.FIFO:4路,供4路高速AD/DA的数据缓冲,位宽16bit,速度不低于80MHz5.接口:      a : ADC:2个,不小于10bit@100MHz  ...…

查看全部问答∨

安装Fedora9 VMTools 出现 找不到 C header files

安装Fedora9 VMTools 出现 What is the location of the directory of C header files that match your running kernel? [/usr/src/linux/include] 折腾了一个晚上,很烦人! 解决方法: [root@localhost ~]# yum install kernel-devel *r ...…

查看全部问答∨

C语言中lint程序是什么

C语言中lint程序是什么…

查看全部问答∨

小小小小白求助 关于单片机与电子科学技术专业的相关性

我是一名新生 学的是电子科学与技术 学校的科技协会里面主要讲的是单片机 但是在反复研究了本专业的培养计划之后 我发生了疑惑 不知道电子科学与技术这个专业涉及单片机多不多 我感兴趣的方向是集成电路设计 不知道这个专业及这个方向和单片机有何 ...…

查看全部问答∨

布板的时候你是先布地线还是信号线?

很多人布板时候不一样。或者每个人再不同时期布板考虑的因素不同而不一样。调查下。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved