- 博客(369)
- 资源 (166)
- 收藏
- 关注
原创 STM8单片机低功耗---活跃停机(Active Halt)模式实现-3
在STM8单片机上使用低功耗模式中的活跃停机模式实现LED灯的闪烁,在IAR编译器上使用寄存器开发。
2022-04-22 11:33:17 1222
原创 STM8单片机低功耗---活跃停机(Active Halt)模式实现-2
AR开发环境中在STM8S003单片机上实现低功耗模式 活跃停机 Active halt,使用寄存器开发。
2022-04-22 09:49:32 1688 1
原创 STM8单片机低功耗---活跃停机(Active Halt)模式实现-1
IAR开发环境中在STM8S003单片机上实现低功耗模式 活跃停机 Active halt,使用寄存器开发。
2022-04-21 16:45:16 1882
原创 PSIM软件BUCK转换数字控制官方例程
在使用PSIM软件仿真开关电源时,大多数都是模拟电路,纯数字电路的仿真很少。无意间发现了在PSIM 2021版本中有官方的数字控制BUCK电路仿真。电路使用简单C模块编写的代码来控制电路。 由于下载的2021版是演示版,不能直接仿真,为了能够彻底的学习,于是将电路图和程序移植到了9.1版本中。现在将电路和代码分享出来。 2021版官方例程 由于软件是演示版,有限制,所以不能仿真。 于是将电路图和代码移植到 PSIM 9.1 版本上 硬件电路如下: 首先使用电路传感器读取电
2022-03-01 16:44:02 5365 4
原创 PSIM软件中 Simplified C Block模块 和 C Block模块区别
在使用PSIM的C语言模块时,一直以为Simplified C Block模块 和 C Block模块用法基本是一样的,但是今天在仿真BUCK电路时,同样的代码使用C Block模块仿真结果就正常,使用Simplified C Block模块仿真的结果始终都不对。于是通过几个小测试,发现这两个模块使用起来差别还是挺大的。 下面就来分析对比一下这两个C模块的区别。 分别使用 C Block模块和Simplified C Block模块写个简单的测试程序。 在 C Block模块中,初始
2022-02-18 09:03:19 4716 1
原创 C语言学习笔记---字符函数isalnum()和iscntrl()
isalnum() 函数用于检查所传的字符是否是字母或者十进制数字。它的函数原型如下: _CRTIMP int __cdecl isalnum(int _C); 返回值为非零(真)表示参数c是字母或者十进制数字,返回值为零(假)表示参数c既不是十进制数字,也不是字母。 下面通过一个简单的例子来演示它的用法。#include <stdio.h>#include <ctype.h>int main(){ int var1 = 'a'; int va
2022-02-17 08:45:45 412 2
原创 C语言学习笔记---浮点函数floor()和ceil()和浮点数四舍五入
在上一篇文章中已经了解了浮点数在计算机中的存储原理,同时也介绍对浮点数取整和取余的函数.在C语言标准库里面还提供了对于浮点数取整的两个函数。函数原型如下: double __cdecl ceil(double _X); double __cdecl floor(double _X); ceil函数返回大于或等于 x 的最小的整数值。下面通过一个简单的例子,演示一下ceil函数的用法。#include <stdio.h>#include <math.h>int
2022-02-17 08:43:59 1482
原创 C语言学习笔记---浮点函数modf()和fmod()
modf函数可以提取出浮点数的整数部分和小数部分。fmod函数可以返回两个浮点数相除的余数。它们的函数原型如下: double __cdecl modf(double _X,double *_Y); double __cdecl fmod(double _X,double _Y); 这两个函数的功能看起来都挺简单的,但是为什么在C语言库中还要专门搞一个函数来计算呢?在使用这两个函数之前,首先看一个简单的浮点数相关的例子。int main (){ int i; float j=1.0
2022-02-17 08:42:42 3033
原创 C语言学习笔记---三角函数
在C语言标准库里面提供了常用的三角函数,在头文件math.h里面可以看到函数的相关定义。 double __cdecl sin(double _X); double __cdecl cos(double _X); double __cdecl tan(double _X); double __cdecl asin(double _X); double __cdecl acos(double _X); double __cdecl atan(double _X); double
2022-02-17 08:41:18 18302 4
原创 C语言学习笔记---字符串转浮点函数
字符串不仅可以转换为整数,也可以转换为浮点数,字符串转浮点数函数原型如下: float __cdecl __mingw_strtof (const char * __restrict__, char ** __restrict__); double __cdecl __mingw_strtod (const char * __restrict__, char ** __restrict__); strtof函数返回值是一个单精度浮点数,strtod返回值是一个双精度浮点数。
2022-02-17 08:40:24 13917 3
原创 C语言学习笔记---字符串转换函数
字符串转整数 字符串转换为整数的函数有两个,他们的函数原型如下: int __cdecl atoi(const char *_Str); long __cdecl atol(const char *_Str); 这两个函数的用法都很简单,atoi函数将字符串转换为整数int型,atol函数将字符串转换为长整形long int型。如果转换无效,返回值都为0,下面通过一个简单的例子看一下这两个函数的用法。#include <stdio.h>#include <stdlib
2022-02-17 08:36:43 1046
原创 C语言学习笔记---时间函数strftime()
strftime函数主要用于时间格式化,它的函数原型如下:size_t __cdecl strftime(char * __restrict__ _Buf,size_t _SizeInBytes,const char * __restrict__ _Format,const struct tm * __restrict__ _Tm);它有4个参数:_Buf, 表示返回的时间字符串_SizeInBytes, 要写入的字节的最大数量_Format, 这是 C 字符串,包含了普通字符和特殊格式说明符
2022-02-16 13:56:30 1801
原创 C语言学习笔记---时间函数mktime()和difftime()
这两个函数原型如下: __CRT_INLINE time_t __cdecl mktime(struct tm *_Tm); __CRT_INLINE double __cdecl difftime(time_t _Time1,time_t _Time2);mktime函数 mktime函数会把参数把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数,如果发生错误时则返回-1。 参数结构体原型如下:struct tm { int tm_sec;
2022-02-16 13:55:15 1192
原创 C语言学习笔记---时间函数ctime()和gmtime()
函数原型如下: __CRT_INLINE char *__cdecl ctime(const time_t *_Time); __CRT_INLINE struct tm *__cdecl gmtime(const time_t *_Time);ctime函数 ctime函数可以将当前时间值转换为字符串格式返回。返回的字符串格式为:Www Mmm dd hh:mm:ss yyyy 其中,Www 表示星期几,Mmm 是以字母表示的月份,dd 表示一月中的第几天,hh:mm:ss 表示时间,yy
2022-02-16 13:54:08 1045
原创 C语言学习笔记---时间函数asctime()和localtime()
这两个时间函数原型如下: char *__cdecl asctime(const struct tm *_Tm); __CRT_INLINE struct tm *__cdecl localtime(const time_t *_Time);asctime函数 asctime函数可以将时间结构体转换为时间字符串格式。它的参数是一个时间结构体。结构体原型如下:struct tm { int tm_sec; /* 秒,范围从 0 到 59
2022-02-16 13:52:49 3221
原创 C语言学习笔记---时间函数clock()和time()
时间函数在编写代码的时候会经常用到,下面就来总结一下clock和time函数的用法,函数原型如下: clock_t __cdecl clock(void); __CRT_INLINE time_t __cdecl time(time_t *_Time); clock函数 clock函数返回程序从运行开始到当前调用函数位置处CPU所使用的时间,通过这个函数就可以计算某段代码运行时所使用的时间。 下面通过一段简单的代码测试一下:#include <stdio.h>#i
2022-02-16 13:51:42 1925
原创 C语言学习笔记---随机数rand()函数
在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数。在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void); rand函数没有参数,它的返回值就是随机数。下面通过一个简单的例子来测试一下rand函数。#include <stdio.h>#include <stdlib.h>int main(int argc, char** argv) { int i;
2022-02-16 13:50:09 1455
原创 C语言学习笔记---abs()函数和div()函数
C语言库中提供了许多函数,这样需要计算的时候,可以直接借助库函数,而不用自己重新编写函数。今天就来看一下C语言标准库函数里面的整型函数。 int __cdecl abs(int _X); long __cdecl labs(long _X); div_t __cdecl div(int _Numerator,int _Denominator); ldiv_t __cdecl ldiv(long _Numerator,long _Denominator); abs函数用来计算整数的绝
2022-02-16 13:48:58 685
原创 C语言学习笔记---常见的动态内存错误
在使用动态内存分配时,经常会出现许多错误。这些错误包括对NULL指针进行操作,对分配内存操作时越过边界,释放非动态内存分配的内存,一块动态内存被释放后继续使用等。 动态分配内存最常见的错误就是忘记检查所请求的内存是否分配成功。为了避免每次分配内存后忘记检查,现在通过一段代码来有效的避免这个问题。#define MALLOC(num,type) (type *)alloc( (num) * sizeof(type))void *alloc(size_t size) { void *new_me
2022-02-16 13:47:44 489
原创 C语言学习笔记---动态内存分配calloc()和realloc()
动态内存分配函数除了常用的malloc函数以外,还有calloc函数和realloc函数,这两个函数的原型如下:void *__cdecl calloc(size_t _NumOfElements,size_t _SizeOfElements);void *__cdecl realloc(void *_Memory,size_t _NewSize);calloc函数 calloc函数用于动态的分配内存,并初将其始化为0。它有两个参数,第一个参数用于设置连续空间的数量,第二个参数用于设置每个
2022-02-16 13:46:37 590
原创 C语言学习笔记---动态内存分配
数组在内存中时存储在连续的位置上,当声明一个数组的时候,编译器就会在内存中分配它所需要的空间,但是有时候还需要使用动态内存为数组分配空间。 比如现在要同统计一个班级学生的成绩,可以申请一个固定大小的数组,但是班级学生的人数时会变动的,当这个固定大小的数组设置的太小时,有可能不能完全放下所有学生的数据,当这个数组设置的太大时,不一定每次每次都能用到这么大的空间。导致系统空间的浪费。 为了使程序更加灵活,同时更加有效的利用内存空间,通常使用动态内存分配来解决这个问题,C库函数里面提供了两个函数mal
2022-02-16 13:45:11 437 1
原创 STM8单片机通过PWM触发ADC同步采样
在做数字开关电源开发过程中使用最多的就是PWM功能和ADC采样功能。ADC采样时采样的时间点很重要,必须在PWM输出高电平的时候取采样,这样采样出来的数据才是最准确的。在STM8单片机中,可以通过定时器的TRG信号去触发ADC采样,这样就可以将PWM波形的输出和ADC采样结合在一起了。 下面就演示一下,如何在输出PWM波的过程中触发ADC采样。 首先看ADC的初始化代码。#include "adc.h"#include "main.h"#include "led.h"u16 DATA
2021-12-13 17:30:03 6754 3
原创 STM8单片机ADC采样功能通过定时器触发
在使用STM8单片机的ADC功能时,读取ADC数据时一般有两种方式,一种是通常不断地读取采样标志位,来判断ADC采样是否结束,一种是通过中断的方式来通知系统采样是否结束。 有时候采样ADC数据的时候,需要按照一定的时间间隔,定点的去采样数据。一般使用的方式就是通过定时器定时,然后在定时中断函数中再去读取ADC采样的数据。但是这种方式采样的时间是不固定的,比如进入定时器中断后,ADC采样刚结束,就可以直接使用当前采样到的数据。但是如果运气不好的话,进入定时中断后,ADC采样刚开始,那么此时就需要等到A
2021-12-13 15:50:48 5785 4
原创 单片机快速将库函数版代码移植为寄存器代码方法
现在单片机开发越来越多用的是库函数版本的,寄存器版本使用越来越少了。但是在有些项目中使用库函数会导致程序运行速度比较慢,没有直接操作寄存器运行起来速度快。所以在对时间要求比较严格的项目中,还是需要使用寄存器来开发。如果不能够找到寄存器相关示例代码的时候,开发起来还是比较困难的。今天就来总结一个快速将库函数移植为寄存器的方法,这个方式为通用方法,在任何单片机上都可以使用。 现在就用一个STM8单片机库函数的工程来举例。 这个代码的主要功能就是使用定时器1的捕获功能来计算输入波形的频率。对于定时
2021-12-13 10:29:43 1548 4
原创 PSIM软件学习---08 C程序块的调用
在PSIM电路仿真的时候,如果某一功能不能够使用元件库中的电路元件模型构建,可以使用C程序元件,编写C程序代码实现。其中C语言模块包括简化C模块和通用C模块。C程序模块使用方法如下。简化C模块 调用简化C模块的步骤为。打开菜单栏的Elements — Other — Function Blocks — Simplified C block。 此时就打开一个C模块,将C模块放在电路图中。 双击这个C模块打开它。 这时就可以在这个空白区域中编写C代码了,在编写C代码之前,首先
2021-12-12 10:30:55 6403 9
原创 PSIM软件学习---07 元件参数动态扫描
在PSIM仿真电路时,还可以在仿真的过程中动态调整器件的参数。 新建一个仿真文件。 将电阻R1的值设置为一个参数Ro,然后在仿真的过程中动态的修改R1的值。 在菜单栏中选择的 Elements — Other —Parameter Sweep 这时会出现一个Parameter Sweep的元件,将这个元件放置在电路图中,然后双击打开。 在最后一个选项中填入Ro,表示当前设置的参数是对变量Ro设置的。然后在上面值依次填入开始值、结束值、每次值的增量。这里设置Ro的值从2开始依次增
2021-12-11 10:17:09 4699 5
原创 PSIM软件学习---06 元件参数文件应用
在上一篇文章中介绍了将子电路的参数定义为变量,然后在调用子电路的时候,通过修改变量的方式来修改子电路元件的参数。说明参数可以定义为一个变量,那么也就是说可以在一个文件中将器件的参数定义出来,这样就可以通过一个参数文件来直接修改电路图中所有的元件参数了。 参数文件的格式有以下几种:<变量名> = <值><变量名> <值>global <变量名> = <值>LIMIT <变量名> <下限> &l
2021-12-11 09:45:54 3706 1
原创 PSIM软件学习---05 自定义子电路元件参数
在上篇文章中介绍了子电路的创建方法。子电路使用起来非常方便,但是有一个缺点就是电路里面元件的参数不能修改。如果主电路中调用了多个子电路元件,这样的话就无法将各个子电路元件修改为不同的参数。 为了方便修改子电路中元件的参数,可以将子电路中的元件参数设置为可变参数。设置方法如下: 首先打开自己新建的子电路模块。 然后选择菜单栏中的Subcircuit — Edit Default Variable List选项。 此时就会弹出一个参数列表添加的选项界面。 点击Add 按钮开始添加参
2021-12-10 20:55:21 5233
原创 PSIM软件学习---04 子电路的创建
在进行仿真电路搭建时,为了简化电路。可以将某一电路功能封装为一个子电路元件形式。 子电路创建步骤如下:1.创建子电路原理图文件。 新建一个PSIM电路图文件,并取名保存。2.创建子电路原理图。 &emsp在原理图文件中仿真器件模型,并连好线。3.放置输入/输出端口 在菜单栏选择Subcircuit—Palce Input Signal Port选项。 此时就会弹出一个输入选项设置框。然后输入端口的名称,并选择端口引脚的位置。 设置好之后关闭当前窗口。 此
2021-12-09 21:06:41 5732 2
原创 IAR软件中直接查看编译后代码大小
在使用IAR软件编译代码时,编译后往往看不到编译后代码的大小情况。在调试程序的时候还是比较麻烦的。下面就总结两种最简单的方法在IAR编译器中查看代码大小。通过输出的编译信息查看 IAR默认的编译信息输出很少,基本就只能查看一下错误和警告的数量。 如果想要输出更多的编译信息,在这个Messages信息框中,单击鼠标右键选择All。 这时再重新编译一次代码。 此时就可以看到编译信息输出了很多,其中就包括了代码占用空间情况。这样通过一个简单的设置就可直接在编译器输出信息中查看代码的大小
2021-12-06 11:44:52 4841 1
原创 STM8单片机串口同时识别自定义协议和Modbus协议
在单片机开发中,串口是最常用的和外界交换数据的渠道,要使用串口,那必不可少的就是通信协议,通信协议就是单片机和外界通信的语言,要想正常和其他设备正常交流,首先语言必须相通。 在实际开发过程中由于各种原因,导致很多时候单片机和外界其他设备协议不兼容,在使用的时候就比较麻烦。比如单片机要和两个设备通信,但是这两个设备的通信协议的不一样,在使用时单片机就必须使用两个串口分别和两个设备通信。如果这两个设备同时使用时还不感觉到资源浪费,如果每次只接一个设备,那么另一个串口也不能作为其他功能使用,还得留着备用。
2021-12-03 21:16:58 6161 6
原创 在STM8单片机中自己实现 printf()函数功能
由于STM8单片机本身内存比较小,而系统自带的printf()函数又比较占据空间,所以在稍微大一点的工程中有时候一使用 printf() 函数就会导致单片机内存不足,于是想着能不能自己写一个比较小的函数来实现类似printf()函数的功能。经过网上查找资料和总结终于找到了一个占用内存比较小,又能实现串口打印功能的方法。 现在将自己的方法分享出来,这里使用 STM8S003F3P6单片机测试。 首先新建一个工程,专门用来测试串口功能。 串口部分相关代码如下://串口void Uart1_I
2021-12-03 15:58:39 2607
原创 PSIM 软件仿真三极管时报错及解决错误方法
使用PSIM软件有一段时间了,感觉这个软件使用起来还挺简单的,但是今天在仿真三极管电路时软件一直报错,结果折腾了好几个小时才找到报错原因。现在PSIM仿真时出现的错误及解决方法分享出来。 首先看一下三极管仿真的电路图。 这是一个很简单的三极管驱动电路,在基极添加了一个电压信号源,在仿真开始后0.2s时,电压源的电压由0V变为5V,然后观察三极管输出电压。结果点仿真按钮后,弹出来一个错误。 根据这个错误提示看,在R2驱动npn开关管的时候,必须要使用一个switch controllers
2021-11-26 14:59:07 6674 5
PSIM仿真PIL功能
2024-05-17
PSIM软件中仿真DSP28335串口
2024-01-23
PSIM仿真软件生成DSP28335代码
2024-01-22
使用 28335芯片在CCS中编译环境中,静态库Lib的生成与调用相关工程示例代码
2023-11-30
STM32标准库移植FreeRTOS V10.4.6步骤及资源
2023-01-07
STM8单片机通过PWM波触发定时器采样
2022-02-10
STM8单片机通过定时器触发ADC采样
2022-02-10
STM8单片机自制简易温度巡检仪
2021-11-25
STM8单片机ADC连续扫描模式并开启模拟看门狗功能 #资源达人分享计划#
2021-08-05
STM8单片机ADC单次扫描模式并开启模拟看门狗功能 #资源达人分享计划#
2021-08-05
STM8单片机ADC连续采样使用模拟看门狗功能 #资源达人分享计划#
2021-08-05
STM8单片机ADC单次采样使用模拟看门狗 #资源达人分享计划#
2021-08-05
STM32单片机实现DMA+ADC+UART功能
2020-12-31
手把手教你移植rt-thread
2020-12-10
stm32f103c8t6+ESP8266 模块设置为Station模式并连接原子云
2020-12-08
stm32f103c8t6+ESP8266 模块设置为Station模式向电脑发送数据
2020-12-08
stm32f103c8t6+ESP8266 模块设置为Station模式向手机热点发送数据
2020-12-08
STM32F103用串口空闲中断+DMA实现modbus通信示例
2020-10-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人