IAR3.11.1 搭建 STM8S003 模板工程
前言头一次搭建STM8的工程,中间有一些错误,记录一下。实验工程可以在STM8S003板子上单步的没有业务逻辑的工程模板下载点:实验实验材料: IAR for STM8 3.11.1, 这个从买开发板的店主那要就行,人家都给。不过有的家是新版,有的家是旧版。STM8固件库 en.stsw-stm8069.zip, 官方下载地址 STSW-STM8069(STM8S/A Standard perip
前言
头一次搭建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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)