STM8 块操作

发布者:boczsy2018最新更新时间:2018-07-24 来源: eefocus关键字:STM8  块操作 手机看文章 扫描二维码
随时随地手机看文章

众里寻她兜错路,蓦然回首,她却在那库函数!
    一直以来我未曾在网上找到一个专门解析eeprom块编程的库函数,要么遇到的就说库函数太烂了,自己写挺好,要么就是王志杰的例程,这对于初学者来说无非是件很悲催的事情,今天我就了了这个心愿,给后来者栽棵树,希望能茁壮成长!

    我个人觉得stm8s的库函数很强大,用起来很方便,看着她的源代码也是那么的有条理,堪称规范,对于初学者来说她的库函数代码很值得学习,学习她的思路,她的布局会使你获益匪浅!
    步入正题,先上代码!(我用的是STVD4.3.2 外挂Cosmic4.3.4破解版)如有需要我会上传分享给大家,这里不讨论开发环境孰好孰坏,用好了奥拓便是奥迪,就这么简单!
/* MAIN.C file
* 
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s.h"
#include
int _fctcpy(char name);
main()
{

u8 block_buff[128] ={0};
u8 i = 0;
u8 c = 0;
_fctcpy('F');

CLK_DeInit();
  CLK_HSICmd(ENABLE);
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);


  UART1_DeInit();
  UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE,UART1_MODE_TXRX_ENABLE);
  UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
  UART1_Cmd(ENABLE);
  
GPIO_DeInit(GPIOD);
  GPIO_Init(GPIOD, GPIO_PIN_LNIB, GPIO_MODE_OUT_PP_LOW_FAST);

for(i=0;i<128;i++)
   block_buff=i;


  FLASH_DeInit();
  FLASH_Unlock(FLASH_MEMTYPE_DATA);
  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_TPROG);
  FLASH_ProgramBlock(0x0001, FLASH_MEMTYPE_DATA, FLASH_PROGRAMMODE_STANDARD, block_buff);
FLASH_EraseBlock(0x0001, FLASH_MEMTYPE_DATA);

c = FLASH_ReadByte(0x40ff);//读出值到变量中
printf("c=%x\r\n",(u16)c);//打印
c = FLASH_ReadByte(0x407f);
printf("c=%x\r\n",(u16)c);
c = FLASH_ReadByte(0x4080);
printf("c=%x\r\n",(u16)c);
c = FLASH_ReadByte(0x4100);
printf("c=%x\r\n",(u16)c);

_asm("rim");
while (1)
  {
  GPIO_WriteHigh(GPIOD, GPIO_PIN_LNIB);

}
}

char putchar (char c)    //串口打印重定向,只要有这个函数,然后包含stdio.h就可以直接调用打印函数了,若有不成功时请把参数前强转为(u16)
{
  if (c == '\n')
  {
    /* put '\r' to hardware here */
    /* Wait transmission is completed : otherwise the first data is not sent */
    while (!(UART1->SR & 0x40));
    UART1->DR = ('\r');
    /* Wait transmission is completed */
    while (!(UART1->SR & 0x40));
}
  /* put c to hardware here */
  /* Wait transmission is completed : otherwise the first data is not sent */
  while (!(UART1->SR & 0x80));
  UART1->DR = (c);
  /* Wait transmission is completed */
  while (!(UART1->SR & 0x80));
  return (c);
}

这是我的实验例程,板子是stm8s207s6,函数的意思很明确,不再解释,下面开始解析配置步骤!
/**
@code
All the functions defined below must be executed from RAM exclusively, except
for the FLASH_WaitForLastOperation function which can be executed from Flash.

Steps of the execution from RAM differs from one toolchain to another:
- For Cosmic Compiler:
    1- Define a segment FLASH_CODE by the mean of " #pragma section (FLASH_CODE)".
    This segment is defined in the stm8s_flash.c file.
  2- Uncomment the "#define RAM_EXECUTION  (1)" line in the stm8s.h file,
    or define it in Cosmic compiler preprocessor to enable the FLASH_CODE segment
   definition.
  3- In STVD Select Project\Settings\Linker\Category "input" and in the RAM section
    add the FLASH_CODE segment with "-ic" options.
  4- In main.c file call the _fctcpy() function with first segment character as 
    parameter "_fctcpy('F');" to load the declared moveable code segment
    (FLASH_CODE) in RAM before execution.
  5- By default the _fctcpy function is packaged in the Cosmic machine library,
    so the function prototype "int _fctcopy(char name);" must be added in main.c
    file.

解析(stvd+cosmic+4.0官方库函数):
  第一步:#pragma section (FLASH_CODE)库函数stm8s_flash.c中代码第520行已经有了,并且没被注释掉,原型为:
#if defined (_COSMIC_) && defined (RAM_EXECUTION)
#pragma section (FLASH_CODE)
#endif  /* _COSMIC_ && RAM_EXECUTION */

IN_RAM(FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType)) 
{

      ......//库函数代码
}
IN_RAM(void FLASH_EraseBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType))
{

    ......库函数代码
}
IN_RAM(void FLASH_ProgramBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType, 
                        FLASH_ProgramMode_TypeDef FLASH_ProgMode, uint8_t *Buffer))
{

     ......//库函数代码
}
#if defined (_COSMIC_) && defined (RAM_EXECUTION)
/* End of FLASH_CODE section */
#pragma section ()
#endif /* _COSMIC_ && RAM_EXECUTION */


第二步:打开宏开关#define RAM_EXECUTION  (1),在stm8s.h中
#if !defined (RAM_EXECUTION)
#define RAM_EXECUTION  (1) 
#endif /* RAM_EXECUTION */
第三步:工程设置

第四步:在main.c中声明int _fctcpy(char name);在主函数运行前调用_fctcpy('F');具体操作可参考主函数代码
      这几步都配置完成后就可以编译通过了,然后烧录调试完美块编程,包括快擦除等,已经验证!
      借此说下王志杰的例程我实验过,但是写0就挂掉,不知道什么原因,还有两把密钥的顺序不是随便的,解锁eeprom时顺序是0xae,0x56,解锁flash时顺序是0x56,0xae,我见过网上有人说顺序不分的,纠正下,不要误人子弟!
      网上关于stm8s的学习资料很多很泛滥,其实有用的就那点,等我抽时间整理出一套来分享,以便后人学习!

 

/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s.h"
#include
int _fctcpy(char name);
main()
{
u8 block_buff[128] ={0};
u8 i = 0;
u8 c = 0;
_fctcpy('F');

CLK_DeInit();
  CLK_HSICmd(ENABLE);
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);

  UART1_DeInit();
  UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE,UART1_MODE_TXRX_ENABLE);
  UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
  UART1_Cmd(ENABLE);
  
GPIO_DeInit(GPIOD);
  GPIO_Init(GPIOD, GPIO_PIN_LNIB, GPIO_MODE_OUT_PP_LOW_FAST);

for(i=0;i<128;i++)
   block_buff=i;

  FLASH_DeInit();
  FLASH_Unlock(FLASH_MEMTYPE_DATA);
  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_TPROG);
  FLASH_ProgramBlock(0x0001, FLASH_MEMTYPE_DATA, FLASH_PROGRAMMODE_STANDARD, block_buff);
FLASH_EraseBlock(0x0001, FLASH_MEMTYPE_DATA);

c = FLASH_ReadByte(0x40ff);//读出值到变量中
printf("c=%x\r\n",(u16)c);//打印
c = FLASH_ReadByte(0x407f);
printf("c=%x\r\n",(u16)c);
c = FLASH_ReadByte(0x4080);
printf("c=%x\r\n",(u16)c);
c = FLASH_ReadByte(0x4100);
printf("c=%x\r\n",(u16)c);

_asm("rim");
while (1)
  {
  GPIO_WriteHigh(GPIOD, GPIO_PIN_LNIB);
}
}
char putchar (char c)    //串口打印重定向,只要有这个函数,然后包含stdio.h就可以直接调用打印函数了,若有不成功时请把参数前强转为(u16)
{
  if (c == '\n')
  {
    /* put '\r' to hardware here */
    /* Wait transmission is completed : otherwise the first data is not sent */
    while (!(UART1->SR & 0x40));
    UART1->DR = ('\r');
    /* Wait transmission is completed */
    while (!(UART1->SR & 0x40));
}
  /* put c to hardware here */
  /* Wait transmission is completed : otherwise the first data is not sent */
  while (!(UART1->SR & 0x80));
  UART1->DR = (c);
  /* Wait transmission is completed */
  while (!(UART1->SR & 0x80));
  return (c);
}

 copy到RAM里面执行,在STVD中有两种方法,1;通过定义一个数组code_to_flash[]将程序代码拷贝到该数组中然后通过汇编指令_asm("call _code_to_flash")的方法实现
2;另一种方法是通过stvd的的函数stcopy(),结合段得定义的来实现。


关键字:STM8  块操作 引用地址:STM8 块操作

上一篇:STM8 测量脉宽——红外例程
下一篇:STM8 IAP笔记

推荐阅读最新更新时间:2024-03-16 16:09

STM8学习笔记----PWM单脉冲模式输出
先看看官方资料对单脉冲模式的介绍 下面看C代码的实现 void PWM_GPIO_Init( void ) { PC_DDR_DDR6 = 1; //输出管脚 PC6 TIM1_CH1 PC_CR1_C16 = 1; //推挽输出 PC_CR2_C26 = 1; //输出最大10MHZ PC_DDR_DDR7 = 0; //输入管脚 PC7 TIM1_CH2 PC_CR1_C17 = 1; //带上拉输入 PC_CR2_C27 = 0;
[单片机]
<font color='red'>STM8</font>学习笔记----PWM单脉冲模式输出
更超值,STM8微控制器的单板Discovery 套件发布
意法半导体的 STM8-SO8-DISCO 8位微控制器(MCU) Discovery 套件,可让用户在板子上一次评估三款STM8微控制器。这三款STM8微控制器是目前市场上在售的采用主流8引脚SO8封装的产品。 除了三合一这个出色的性价比优势外,该套件还是一款简约的开发板,除启动下一步开发所需的最基本功能外,没有任何多余的的配置。主板上有一个按钮和一个LED指示灯,方便用户与电路板交互,嵌入式STLINK/V2和USB端口简化了在线调试和从PC下载代码的过程。这三款微控制器焊接在三个插接式DIL-8模块上,可以用手拔下DIL-8模块与紧凑型主板的连接之处,单独取下模块,进行原型开发。 该套件支持 STM8S001J
[单片机]
更超值,<font color='red'>STM8</font>微控制器的单板Discovery 套件发布
STM8-利用外部中断编写两个按键控制灯的亮灭
目的:熟悉外部中断的使用。(两个按键控制灯的亮灭) #include stm8s.h #include stm8s_exti.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long void delay(uint i) { while(i--); } void main() { GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);//输出 GPIO_Init(GPIOD, GPIO_PIN_1, GP
[单片机]
STM8学习笔记---新建IAR工程文件
1.打开IAR工具 2.选择Project—Create New Project 3.选择Empty project,点击OK。 4.选择文件存储路径,输入工程名,点保存按钮。 5单击左上角新建文件按钮 这时候右侧会出现一个新建文件,新建的是文本文件,需要把文本文件保存为*.c格式。 5.点左上角保存按钮 6.将文件名改为main.c,点保存按钮。 这时候界面右侧文件名就会变为main.c,但是新建的工程中还没有文件,需要将main.c文件添加到工程中。 7.在左侧新建工程名上单机鼠标右键,选择Add–Add Files 8.然后再打开的文件框中选中main.c文件,然后点打开。 这时候工程文件
[单片机]
<font color='red'>STM8</font>学习笔记---新建IAR工程文件
用st-link通过stvp给stm8下载程序的坑
用的这种st-link 包装上写着,stm32用下面得20pin,stm8用上面的4pin。然后背后有stm8的接线说明。 我接好了线,开发板没有电。。。测了一下红线和黑线之间电压0.7V。。。 只好把红线接到stm32接口的VCC上。 然后用网上的stvp快速使用教程,程序能下载,但是程序进去后一直不运行。。。 后来无意中把白线RST拔了,程序运行起来了。。。插上又不运行了。。。 于是,要下载程序时,插上RST线,下好了把RST拔了,程序开始运行。 不知道是不是个别现象,纪录在此。
[单片机]
用st-link通过stvp给<font color='red'>stm8</font>下载程序的坑
STM8S自学笔记-001 STM8简介
概述 STM8单片机的开发商是意法半导体(ST),于2009年推出。它具有3级流水线架构、性价比高、开发方便的等优点。根据应用场合的不同,分为三个系列:STM8S,STM8L和STM8A。   个人认为,STM8S的开发非常类似于STM32F,因而学好STM8S单片机非常有助于学习STM32。所以,先从STM8S入手,一点一点拨开它的“心”。   ST单片机的开发有两种方法:用库函数和用寄存器。   寄存器开发是最底层的,类似于51,优点是速度快,代码简洁,但难以阅读和理解。库函数是ST官方将某一功能所需的寄存器整合到一起后,提供给开发人员可直接使用的(含参)函数,而且库函数开发的阅读性非常好。所以,后面的程序实例以库函数
[单片机]
STM8在线仿真----高级应用
首先介绍仿真界面与菜单栏。 菜单栏View选项 STM8软件断点无数量限制,但是不能将中断设在中断向量表内。 STM8S在调试时支持RD/WR on fly功能,用户可以在程序运行时,直接观察变量的变化。也可以在不中断程序运行的条件下直接修改寄存器或者变量的值。
[单片机]
<font color='red'>STM8</font>在线仿真----高级应用
STM8 ADC转换模式-------连续模式
STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。 连续和带缓存的连在连 换模式中,将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ADON 位来启动的。 ● 如果缓冲功能没有被使能 ADC_DR寄存器中同时 EOC 标志被置位。如果EOCIE 位已被置位时将产生一次中断。然后开始下一次转换。 其中ADC结果的读取可以采用查询模式也可以采用中断模式。 首先看连续模式通过查询方式读取数据代码: #include adc.h #include main.h u16 DATAH = 0; //ADC转换值高8位 u16
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved