历史上的今天
今天是:2025年02月06日(星期四)
2021年02月06日 | STM8库函数开发手册(1) //工程模板、GPIO、时钟
2021-02-06 来源:eefocus
第一部分 创建库函数工程
1、创建文件目录

BSP文件夹中存放自定义底层驱动程序文件;
IAR文件夹存放IAR工程文件;
LIB 文件夹中引入C 语言自己的库函数;
USR 文件夹中存放自定义主程序及数据库头文件等;
Readme 文件夹中存放自定义程序设计说明文件;
2、将STM8库函数文件拷贝入LIB文件夹
链接:
https://pan.baidu.com/s/1llVx9meEhhk0VYKbsKzLxwpan.baidu.com
提取码:iy3v
下载解压后进入官方库函数目录:

打开LibrariesSTM8S_StdPeriph_Driver文件夹,找到inc 和src文件夹
就是我们的官方库文件啦

将其拷贝到我们的LIB下:

inc文件夹是.h文件集合
src文件夹是.c文件集合
3、将STM8中断入口文件拷贝入USR文件夹
STM8S_StdPeriph_LibProjectSTM8S_StdPeriph_Template文件夹下拷贝如下文件

将stm8s_it.c、stm8s_it.h拷贝到USR文件夹下

4、将stm8s_conf.h(目录文件)拷贝到LIB文件夹下
STM8S_StdPeriph_LibProjectSTM8S_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$..libinc $PROJ_DIR$..libsrc $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_ASSERTvoid 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


CSDN-专业IT技术社区-登录blog.csdn.net
第二部分 GPIO库 (gpio.c)

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
第三部分 时钟控制库 (clk.c)

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);
史海拾趣
|
那位大哥大姐有产生 白噪声信号,正弦波信号,脉冲信号,三角波,锯齿波的C/C++程序 本帖最后由 paulhyde 于 2014-9-15 09:14 编辑 内容同上,最好是完整的源代码程序,因为我是新手,小弟在次不胜感激啊! … 查看全部问答> |
|
我们大厦被投诉最多的是空调,几乎都是VAV。反应慢,可控性差,该出风时不出风,不该出风时狂出...... 最后害得技工不得不在电脑上控制几乎每个VAV,快把人累死。 其实最好的方式是在温控器上能直接控制风阀大小,不要什么VAV,什么PID.....其实 ...… 查看全部问答> |
|
1、高级动画特效编辑 2、嵌入式软件设计 3、MIS软件设计 4、2D与3D多媒体软件应用 5、软件产品开发 6、通信软件设计 以上职位要求: 1、本科学历或2年以上计算机专业学习证书 2、达到英语或法语工作水平 3、两年以上连续相关工作经历 签 ...… 查看全部问答> |
|
我在做一个HID USB设备的minidriver,USB设备总是循环的发送相同的数据,在以中断传输方式读取数据的时候,我不知道该采用怎么样的方式: 1. 根据Walter Oney,HID USB设备的hidMinidriverRegistration.DevicesArePolled ...… 查看全部问答> |
|
用wavecom模块开发时出现模块收不到数据现实怎么回事?我用PPP建六连接后,用UDP发数据,发到服务中心软件上,数据能收到可是服务中心软件回的数据,我的串口收不到,不知是模块收到没转到串口还是就没收到?? 用TCP也是这样,在TCP建立连接时,用抓包工具 ...… 查看全部问答> |
|
请教各位高手,WINCE 2440 下如何正确显示24bpp。之前有看别人的论坛,只提到初始化设置成24bit,驱动设置成32bit,有没有详细点的答案呢,按我自己的理解改完以后是一片花屏。(之前16bpp显示是OK的。)… 查看全部问答> |
|
大家可以通过各种渠道拿到工具了,不知道有没有必要搞一个全国范围的技术讲座,围绕着软件,还有芯片的外围功能和调试技术,做一个入门级的培训。可以送一些书,,, 上海,深圳,北京 拿到工具的人希望讲 ...… 查看全部问答> |




