1、创建文件目录
BSP文件夹中存放自定义底层驱动程序文件;
IAR文件夹存放IAR工程文件;
LIB 文件夹中引入C 语言自己的库函数;
USR 文件夹中存放自定义主程序及数据库头文件等;
Readme 文件夹中存放自定义程序设计说明文件;
2、将STM8库函数文件拷贝入LIB文件夹
链接:
https://pan.baidu.com/s/1llVx9meEhhk0VYKbsKzLxw提取码:iy3v
下载解压后进入官方库函数目录:
打开Libraries\STM8S_StdPeriph_Driver文件夹,找到inc 和src文件夹
就是我们的官方库文件啦
将其拷贝到我们的LIB下:
inc文件夹是.h文件集合
src文件夹是.c文件集合
3、将STM8中断入口文件拷贝入USR文件夹
STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Template文件夹下拷贝如下文件
将stm8s_it.c、stm8s_it.h拷贝到USR文件夹下
4、将stm8s_conf.h(目录文件)拷贝到LIB文件夹下
STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Template文件夹下拷贝如下文件
将stm8s_conf.h(目录文件)拷贝到LIB文件夹下
关于stm8s_conf.h的介绍:
stm8s_conf.h是官方固件库头文件的集合,如果不需要某个方面的功能,可以将对应头文件的声明注释掉。
5、打开IAR新建工程
记得把工程放入IAR文件夹下
6、将工程文件结构与IAR工程结构对应起来
IAR文件夹是存工程的,不需要添加
7、往工程树中添加文件
①、往USR中添加stm8s_it.c(不需要添加.h)
②、LIB中添加stm8s_conf.h
8、保存工程到IAR文件夹下
9、在IAR工程中创建main.c
添加入工程中USR树下
10、创建pbdata.h pbdata.c文件并添加入USR文件夹下
(这两个文件用来存储公共函数)
解决公共调用函数重复调用问题,可以这样定义头文件
11、配置工程设置
①、选定MCUi型号
②、选定调试方式
③、选定编译输出格式
④、⭐设置工程调用目录⭐
$PROJ_DIR$\..\lib\inc
$PROJ_DIR$\..\lib\src
$PROJ_DIR$\..\lib
$PROJ_DIR$\..\usr
$PROJ_DIR$\..\bsp
$PROJ_DIR$\..\iar
12、在main.c中写main函数
13、在pbdata.h中包含 stm8.h
14、在 stm8.h中选中我们用的芯片
15、尝试编译,至此一个库函数工程已经搭建完成
最终目录如下:
16、为了完善工程,我们需要一个断言函数来为程序提供参数检查
#include "pbdata.h"
int main(void)
{
//main
}
/*断言函数:它的作用是在编程的过程中为程序提供参数检查*/
#ifdef USE_FULL_ASSERT
void assert_failed(u8* file,u32 line)
{
while(1)
{
}
}
#endif
17、其实我们还没有引用官方功能库文件,可以用什么引用什么,引用方法如下:
在LIB里添加对应的库文件的.c文件就可以了
18、我们自己写的代码放在哪?
例如我们要写一个led驱动,创建led.h 和led.c文件,然后放入BSP文件夹下,同时将led。c引入工程树下BSP下。
在led.h中要也要这样定义头文件
#ifndef _LED_H
#define _LED_H
#include "stm8s.h"
#endif
在led.c中引用pbdata.h,而在pbdata.h中引用led.h
1、GPIO_Init(GPIOx,GPIO_Pin,GPIO_Mode) // GPIO初始化
其中GPIO_Pin
其中GPIO_Mode
GPIO_Init(GPIOA, GPIO_PIN_LNIB, GPIO_MODE_IN_FL_NO_IT);
2、GPIO_DeInit(GPIOx) //GPIO回复初始状态
注意:复位状态下,所有的引脚都是悬浮输入模式
GPIO_DeInit
(
GPIOA
);
3、GPIO_Write(GPIOx,PortVal) //GPIO按组写值
GPIO_Write(GPIOA, 0x00);
4、GPIO_WriteHigh(GPIOx,PortPins) //GPIO按引脚号写1
GPIO_WriteHigh(GPIOA, GPIO_PIN_0);
5、GPIO_WriteLow(GPIOx,PortPins) //GPIO按引脚号写0
6、GPIO_WriteReverse(GPIOx,PortPins)
7、GPIO_ReadInputData(GPIOx) //读取GPIO输入寄存器值
u8 port_value;
port_value = GPIO_ReadInputData(GPIOA);
8、GPIO_ReadOutputData(GPIOx) //读取GPIO输出寄存器值
u8 port_value;
port_value = GPIO_ReadOutputData(GPIOA);
9、GPIO_ReadInputPin(GPIOx,GPIO_Pin) //读取GPIO输入寄存器特定引脚位的值
10、GPIO_ExternalPullUpConfig(GPIOx,GPIO_Pin,NewState)
//设置某引脚使能上拉电阻
NewState:ENABLE或者DISABLE
1、CLK_DeInit() //恢复相关的时钟寄存器到默认值
CLK_DeInit
();
2、CLK_HSECmd(NewState) //启动或者关闭外部高速振荡器(HSE)
NewState:ENABLE或者DISABLE
3. CLK_HSICmd(NewState) //启动或者关闭内部高速振荡器(HSI)
4. CLK_LSICmd(NewState) //启动或者关闭内部低速振荡器(LSI)
5. CLK_CCOCmd(NewState) //启动或者关闭内部时钟输出功能
6. CLK_ClockSwitchCmd(NewState) //启动或者关闭内部时钟切换
7. CLK_FastHaltWakeUpCmd(NewState) //启动或者关闭快速唤醒功能
8. CLK_SlowActiveHaltWakeUpCmd(NewState) //启动或者关闭活跃停机模式下的电压调节器
9.CLK_ITConfig(CLK_IT,NewState) //启动或者关闭指定的时钟中断
其中CLK_IT的取值:
10. CLK_ClockSwitchConfig(CLK_SwitchMode,CLK_NewClock,ITState,CLK_CurrentClockState) //系统时钟切换配置
其中:
CLK_SwitchMode:切换模式(MANUAL和AUTO两种方式)
CLK_NewClock:DISABLE或者ENABLE
ITState:DISABLE或者ENABLE
CLK_CurrentClockState:DISABLE或者ENABLE
11、CLK_HSIPrescalerConfig(HSIPrescaler) //配置内部高速振荡器(HSI)的分频器
其中:HSIPrescaler取值
12、CLK_CCOConfig(CLK_CCO) //配置时钟输出脚(CCO)的时钟源
其中CLK_CCO:
13、CLK_PeripheralClockConfig(CLK_Peripheral,NewState)
//启动或者关闭指定的外设时钟
其中CLK_Peripheral取值:
CLK_PERIPHERAL_I2C
CLK_PERIPHERAL_SPI
CLK_PERIPHERAL_UART1 ~3
CLK_PERIPHERAL_TIMER1 ~6
CLK_PERIPHERAL_AWU
CLK_PERIPHERAL_ADC
CLK_PERIPHERAL_CAN
14. CLK_SYSCLKConfig(CLK_Prescaler) //配置系统时钟分频器
其中CLK_Prescaler的值:
15、CLK_SWIMConfig(CLK_SWIMDivider) //配置SWIM时钟分频器
其中:
16、CLK_CANConfig(CLK_CANDivider) //配置CAN时钟频率
其中:
17、 CLK_ClockSecuritySystemEnable() //启用时钟安全系统
19. CLK_AdjustHSICalibrationValue(CLK_HSICalibrationValue)
//修复内部高速振荡器频率
20.CLK_GetClockFreq() //获取系统时钟频率
u32 u32_clk_freq;
u32_clk_freq = CLK_GetClockFreq();
21. CLK_GetSYSCLKSource() //获取系统时钟源
22. CLK_GetFlagStatus //获取系统时钟标志状态
23. CLK_GetITStatus(CLK_IT) //获取系统时钟中断标志状态
其中:
24.CLK_ClearITPendingBit(CLK_IT) //清除系统时钟中断标志状态
CLK_ClearITPendingBit
(
CLK_IT_CSSD
);