IAR3.11.1 搭建 STM8S003 模板工程

前言

头一次搭建STM8的工程,中间有一些错误,记录一下。

实验工程

可以在STM8S003板子上单步的没有业务逻辑的工程模板下载点:
IAR3111_STM8S003_project_template.zip

实验

实验材料: IAR for STM8 3.11.1, 这个从买开发板的店主那要就行,人家都给。不过有的家是新版,有的家是旧版。

STM8固件库 en.stsw-stm8069.zip, 官方下载地址 STSW-STM8069(STM8S/A Standard peripheral library)

新建工作区

在这里插入图片描述

保存工作区

在这里插入图片描述

新建工程

在这里插入图片描述
在这里插入图片描述
确定后,IAR会让保存新工程,给出新工程名称,点击确定。
IAR帮助加入了main.c和main(), 尝试编译一下,是可以编译通过的。
在这里插入图片描述

加入STM8固件库

将 en.stsw-stm8069.zip 解压,将里面的 STM8S_StdPeriph_Lib\Libraries\STM8S_StdPeriph_Driver 目录拷贝到本工程中。
在这里插入图片描述

在工程中建立新分组 STM8S_StdPeriph_Driver

在这里插入图片描述
在弹出框中指定组名为 STM8S_StdPeriph_Driver,点击确定。
向组中加入本工程目录 STM8S_StdPeriph_Driver\inc 和 STM8S_StdPeriph_Driver\src 中的所有文件。
这样,STM8官方固件库就加入工程了。
在这里插入图片描述
加好STM8固件库后的样子
在这里插入图片描述
在这里插入图片描述
这时尝试编译一下,报错如下:
在这里插入图片描述
说找不到头文件,这时,要在IAR中设置头文件路径。

$PROJ_DIR$
$PROJ_DIR$\STM8S_StdPeriph_Driver\inc

在这里插入图片描述
这时,再尝试编译一下。报错如下:
在这里插入图片描述
报错提示说MCU没选

选MCU

MCU选择有2处:
在这里插入图片描述
在这里选完MCU, 还是会报错。
还需要添加宏来匹配ST官方库.
双击报错提示,会跳到ST官方库的报错提示处的代码,如下:

#if !defined (STM8S208) && !defined (STM8S207) && !defined (STM8S105) && \
    !defined (STM8S103) && !defined (STM8S903) && !defined (STM8AF52Ax) && \
    !defined (STM8AF62Ax) && !defined (STM8AF626x) && !defined (STM8S007) && \
    !defined (STM8S003)&& !defined (STM8S005) && !defined(STM8S001) && !defined (STM8AF622x) 
 #error "Please select first the target STM8S/A device used in your application (in stm8s.h file)"
#endif

根据自己MCU型号,这里我要向IAR环境中加入宏 STM8S003
在这里插入图片描述
这时尝试编译,报错如下:
在这里插入图片描述
报错提示说,没找到stm8s_conf.h, 这个文件并不在我们拷贝过来的STM8S_StdPeriph_Driver中,用everything在官方库中找stm8s_conf.h, 有很多。在ST官方模板下有这个文件,拷贝并新增到本工程根目录下。
在这里插入图片描述
在官方库模板下,还能看到stm8s_it.c, stm8s_it.h, 这时中断处理的实现。也拷贝过来。
这样从官方模板下拷贝3个文件(stm8s_conf.h, stm8s_it.h, stm8s_it.c)到工程根目录,并加入工程.
尝试编译一下,报错如下:
在这里插入图片描述
对照所选MCU的资源就能知道,报错的地方都是STM8S003没有的资源。
当MCU选定后,在STM8A/S固件库中能使用的资源就是确定的了。
这时将报错的资源对应的文件排除在编译之外就可以。一个一个的排除,直到没有此类报错。
排除文件参与编译的方法如下:
在这里插入图片描述
在这里插入图片描述

包含在工程中,但是被排除在编译之外的文件图标变灰了,如下:
在这里插入图片描述
这时,尝试编译工程,还会提示有硬件资源不存在的文件,用上述方法,将这些文件都排除在编译之外。

将不存在的设备对应的实现都排除后,程序编译过了,有1个警告在STM8S固件库中。
这个不是错误,是IAR的bug.
在这里插入图片描述
现在都编译过了,去设置一下仿真器,仿真器只能设定为ST LINK.
在这里插入图片描述
将程序优化去掉,好调试程序。
在这里插入图片描述
将输出文件改为每次都覆盖,可以保证每次编译后,输出文件都是新的。
在这里插入图片描述
将main函数改改,准备实验单步是否好使。

#include "stm8s.h"

int main( void )
{
  int i = 0;
  
  do {
    i++;
  } while (1);
  
  // return 0;
}

这时,可以连上自己的开发板(要保证STLINK和自己板子的SWIM4线接口没连错,用STVP可以烧录程序),然后再用IAR看看能否在自己选的MCU上单步程序。

STLINK的SWIM连接4线管脚如下:
在这里插入图片描述

前面选STLINK仿真器时,IAR模式就是调试开始后,中断在main函数,所以不用自己预先下断点。
在这里插入图片描述
在这里插入图片描述
将变量i加入watch, 如果能单步,就可以看到i在一动一变。
在这里插入图片描述
单步一下,看到i果真在随着i++在变。
在这里插入图片描述
IAR 3.11.1 + STM8S003 工程模板搭建的实验做完了。

后续的活就简单了,纯软件的任务, 照着STM8A/S固件库的单个知识点的例程,迁移到自己工程,来实现自己板子的功能。

备注

用的是和谐板的标准板授权,IAR在载入工程后,会自动弹出要解压IAR库的源代码的对话框,解压因为没有License, 会解压失败,挺唬人的。

当IAR弹出提示框,要解压IAR库的源码时,选择否,勾选不再提示,以后就不会在载入工程后,有提示框出现。

做点和板子相关的验证实验

刚才写工作日志给领导时,想起来,还是要整点和板子相关的内容,领导不懂技术,要让他看到工作成果,板子上有个红色的指示灯,从STM8A/S固件库例程中,将GPIO例程迁移过来,那个指示灯可以一亮一灭的,拍了个视频,放在日志后面给领导秀了一下进度。

ST固件库做的真是优秀,不同MCU固件库软件编程都差不多,只看代码,不容易搞清,到底在操作哪种MCU.

#include "stm8s.h"

// 指示灯 PD3
#define LED_GPIO_PORT  (GPIOD)
#define LED_GPIO_PIN  (GPIO_PIN_3)

void Delay(uint16_t nCount);

int main( void )
{
  int i = 0;

  // pin的初始状态
  // GPIO_MODE_OUT_PP_LOW_SLOW
  // GPIO_MODE_OUT_OD_HIZ_SLOW
  
  // 等初始状态为灭
  GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PIN, GPIO_MODE_OUT_OD_HIZ_SLOW);
  
  do {
    i++;
    
    /* Toggles LEDs */
    
    // 翻转灯状态
    // GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PIN);
    
    // 点灯
    GPIO_WriteLow(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PIN);
    Delay(0xFFFF); // 不精确延时

    // 灭灯
    GPIO_WriteHigh(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PIN);
    Delay(0xFFFF); // 不精确延时

  } while (1);
  
  // return 0;
}

/**
  * @brief Delay
  * @param nCount
  * @retval None
  */
void Delay(uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}

#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值