最近由于公司项目需要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<len;i++)
UART2_SendByte(Data[i]); } /*******************************************************************************
* 函数名:fputc
* 描述 :重定向c库函数printf到USART1
* 输入 :无
* 输出 :无
* 返回 :
* 注意 : 由printf调用
*******************************************************************************/
int fputc(int ch, FILE *f)
{
/*将Printf内容发往串口*/
UART2_SendByte(ch);
return (ch);
}

关于定时器的使用,比较简单,主要实现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; // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序
} }

最后我把工程代码上传,以供大家下载,如有不妥,欢迎大家留言。

TEST_Pro.rar

初识STM8S105K心得!的更多相关文章

  1. 【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

  2. Java学习笔记心得——初识Java

    初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开 ...

  3. RabbitMQ学习之:(一)初识、概念及心得

    因为网上有一篇很好的RMQ的入门帖子http://lostechies.com/derekgreer/tag/rabbitmq/,所以我就不多说了,就说说我目前看了该作者1~5章后,自己的心得.(所以 ...

  4. Openlayers3学习心得(初识)

    最近刚辞了原来的那家公司,准备新找一份工作.其中有个公司要求会Openlayers3.一看到这个要求,就知道公司业务涉及地图图表比较多. Openlayers本身是一个基于GIS地图相关的功能丰富的J ...

  5. Less使用心得

    初识less就被其函数式编程css深深吸引了,而函数式编写css带来的好处不言而喻,复用,复用,还是复用.话不多说下面简单介绍下个人使用less的心得 首先网上有很多less的安装教程,这边不多做介绍 ...

  6. 【Java心得总结七】Java容器下——Map

    我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...

  7. 【Java心得总结六】Java容器中——Collection

    在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...

  8. 【Java心得总结五】Java容器上——容器初探

    在数学中我们有集合的概念,所谓的一个集合,就是将数个对象归类而分成为一个或数个形态各异的大小整体. 一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集.构成集合的事物或对象称作元素或是成 ...

  9. 【Java心得总结四】Java泛型下——万恶的擦除

    一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...

随机推荐

  1. pandas、matplotlib、Numpy模块的简单学习

    目录 一.pandas模块 二.matplotlib模块 1.条形图 2. 直方图 3.折线图 4.散点图+直线图 三.numpy 一.pandas模块 pandas是BSD许可的开源库,为Pytho ...

  2. 【GDOI2014模拟】网格

    题目 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m.现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的 ...

  3. 多模字符串匹配算法-Aho–Corasick

    背景 在做实际工作中,最简单也最常用的一种自然语言处理方法就是关键词匹配,例如我们要对n条文本进行过滤,那本身是一个过滤词表的,通常进行过滤的代码如下 for (String document : d ...

  4. OpenGL立方体

    直接画 #include <windows.h> #include <GL/glut.h> #include <stdio.h> #include <stri ...

  5. Java面试之基础篇(4)

    31.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可能,”xyz”对应一个对象,这个对 ...

  6. 千呼万唤始出来——DataV私有部署功能

    DataV的开发者们,今天进入你的用户中心,就会发现有一个小惊喜默默的在等待着你.那就是——私有部署功能上线啦! 一直以来私有部署都是一些有需要的小伙伴所望尘莫及的,毕竟高贵的身份摆在那里,现在不用再 ...

  7. jQuery ajax - ajaxSetup() 方法

    实例 为所有 AJAX 请求设置默认 URL 和 success 函数: $("button").click(function(){ $.ajaxSetup({url:" ...

  8. 求大师点化,寻求大文件(最大20G左右)上传方案

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  9. <知识整理>2019清北学堂提高储备D4

    今天主要讲一下数学的知识. 一.进制转换: 十进制到k进制:短除法:顺除至0,逆序取余. k进制转十进制:乘权相加. 常见进制:四进制(对应2位二进制).八进制(对应3位二进制).十六进制(对应4位二 ...

  10. 使用html5中required属性

    直接上代码 <form action="${pageContext.request.contextPath}/login/main.do" method="post ...