背景介绍:
开发环境 STVD,芯片型号STM8S208C8T6
很多步骤网上都讲了,但是有一个重点步骤 - 工程配置没讲,让我摸索了好久
按STM8S208xx芯片手册指导
我 分别用两个不同工程各自实现IAP和APP功能,由于是小系统,空间还比较充足,计划用2k空间(0x8000 - 0x9FFF)来存放IAP,剩余的空间(0xA000 - 0x17FFF)存放APP。
其中重点设置这两个工程的存放地址,和编写不同的中断向量表:
IAP部分:
工程配置截图:
1、存储IAP中断向量表起始地址(0x8000开始 128个字节)
2、存储IAP代码区域起始地址
3、在STVD->Project->Settings->Linker选项卡下,选择目录Category下的Input,在Ram下新建Section,Option填-ic,表示可移至RAM。
IAP因为只用于刷写flash,尽量不用中断,中断向量表可以上网下一个,我这里也贴一份我的吧,然后记得在某个头文件做个宏定义:
#define APP_START_ADDR 0x00A000ul
并在stm8_interrupt_vector.c把头文件包含进去,比如#include “Includes.h”
/* Redirected interrupt vector table
* Copyright (c) 2008 STMicroelectronics
*/
#include "Includes.h"
typedef void @far (*interrupt_handler_t)(void);
struct interrupt_vector {
unsigned char interrupt_instruction;
interrupt_handler_t interrupt_handler;
};
#if 0
@far @interrupt void NonHandledInterrupt (void)
{
/* in order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction
*/
return;
}
#endif
extern void _stext(); /* startup routine */
struct interrupt_vector const UserISR_IRQ[32] @ APP_START_ADDR;
//redirected interrupt table
struct interrupt_vector const _vectab[] = {
{
0x82, (interrupt_handler_t)_stext}, /* reset */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+ 1)}, /* trap */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+ 2)}, /* irq0 */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+ 3)}, /* irq1 */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+ 4)}, /* irq2 */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+ 5)}, /* irq3 */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+ 6)}, /* irq4 */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+ 7)}, /* irq5 */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+ 8)}, /* irq6 */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+ 9)}, /* irq7 */
{
0x82, (interrupt_handler_t)(UserISR_IRQ+10)