当前位置:   article > 正文

STM32单片机的精简操作系统框架开源代码_stm32精简操作系统

stm32精简操作系统

概要

      相信大家在使用32的时候,总是会为了程序结构而思考许久,而使用实时操作系统又太麻烦,不使用的话程序结构又很乱,这时,你就可以使用如下的程序框架,轻便又好用。对于绝大多数项目来说这个都够用了。

技术细节

  定义头文件oscl.h

  1. #ifndef _OSCL_H_
  2. #define _OSCL_H_
  3. #define SoftTime_Num 10
  4. typedef void (*TimeFunc) (void); //重定义一个函数指针
  5. typedef struct
  6. {
  7. TimeFunc Func; // 函数成员
  8. unsigned int Interval; //时间间隔
  9. unsigned int Timer; //定时器
  10. unsigned int CallBackCount;//返回次数计数
  11. }SoftTimer_OBJ; //时间目标
  12. typedef struct
  13. {
  14. unsigned char SoftTimerNum; //
  15. SoftTimer_OBJ SoftTimer[SoftTime_Num];//SoftTimer_Ctrl_OBJ结构体中的SoftTimer_OBJ结构体成员,软定时数组,数组大小为10,可以存储0-9
  16. }SoftTimer_Ctrl_OBJ; //时间控制的目标
  17. extern SoftTimer_Ctrl_OBJ SoftTimerCtrl;
  18. char SoftTimer_Register(unsigned int intervl, TimeFunc func);
  19. void SoftTimer_Handle(void);
  20. void Oscl_init(void);
  21. void Delay_ms(volatile unsigned int nTime);
  22. #endif

      定义oscl.c文件

  1. #include "OSCL\oscl.h"
  2. #include "stm32f10x.h"
  3. SoftTimer_Ctrl_OBJ SoftTimerCtrl = {0}; //结构体所有成员清零
  4. __IO uint32_t DelayTime=0;
  5. void Oscl_init(void){
  6. if(SysTick_Config(SystemCoreClock / 1000))//自动重装载值配置,1ms中断
  7. {
  8. while(1);
  9. }
  10. // SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); //滴答定时器时钟源选择为HCLK
  11. }
  12. // 定时函数
  13. void Delay_ms(__IO uint32_t nTime)
  14. {
  15. if (nTime < 1)
  16. {
  17. return;
  18. }
  19. DelayTime = nTime; // DelayTime是一个全局变量,并且和SysTick中断服务函数相关联
  20. while (DelayTime > 0);
  21. }
  22. /*滴答定时器中断服务函数*/
  23. void SysTick_Handler(void){
  24. unsigned char i;
  25. if (DelayTime > 0)
  26. {
  27. DelayTime--;
  28. }
  29. for(i=0; i<SoftTimerCtrl.SoftTimerNum; i++) //
  30. {
  31. SoftTimerCtrl.SoftTimer[i].Timer++;//10个结构体数组中的timer加1
  32. if(SoftTimerCtrl.SoftTimer[i].Timer >= SoftTimerCtrl.SoftTimer[i].Interval) //
  33. {
  34. SoftTimerCtrl.SoftTimer[i].Timer = 0;//
  35. SoftTimerCtrl.SoftTimer[i].CallBackCount++; //返回的计数次数加一
  36. }
  37. }
  38. }
  39. /*
  40. 函数名称:SoftTimer_Register(软时间——寄存器)
  41. 函数功能:函数会给SoftTimerCtrl结构体以及SoftTimer结构体中的成员赋值,
  42. Func成员会分别保存LED_Handle,feedDog_Handle,ADC_GET_VALUE,Rtu_Frame_Handle,Conditoin_Ctrl_Handle,State_Report_Handle,KEY_SWITCHf的地址
  43. 入口参数:unsigned int intervl(时间间隔,)TimeFunc(类型说明符) func(传入的函数名称)
  44. 返回类型:unsigned char i,1表示成功,0表示失败
  45. */
  46. char SoftTimer_Register(unsigned int intervl, TimeFunc func)
  47. {
  48. unsigned char i;
  49. for(i=0; i<SoftTime_Num; i++)
  50. {
  51. if(SoftTimerCtrl.SoftTimer[i].Func == 0)
  52. {
  53. SoftTimerCtrl.SoftTimer[i].Func = func;//0个数组保存一个函数指针
  54. SoftTimerCtrl.SoftTimer[i].CallBackCount = 0; //CallBackCount数组中第0个元素赋值为0
  55. SoftTimerCtrl.SoftTimer[i].Interval = intervl; //
  56. SoftTimerCtrl.SoftTimer[i].Timer = 0; //定时器清零
  57. SoftTimerCtrl.SoftTimerNum ++; //软件定时计数值加一
  58. if(SoftTimerCtrl.SoftTimerNum > SoftTime_Num) //第一次调用SoftTimerCtrl.SoftTimerNum不会大于10
  59. {
  60. SoftTimerCtrl.SoftTimerNum = SoftTime_Num; //第二次调用时,该结构体数组重新赋值为10
  61. }
  62. i = SoftTime_Num;
  63. }
  64. }
  65. if(i == SoftTime_Num)
  66. {i = 1; }
  67. else
  68. {i = 0;}
  69. return i;
  70. }
  71. void SoftTimer_Handle(void)
  72. {
  73. unsigned char i;
  74. for(i=0; i<SoftTimerCtrl.SoftTimerNum; i++)
  75. {
  76. if(SoftTimerCtrl.SoftTimer[i].CallBackCount)
  77. {
  78. SoftTimerCtrl.SoftTimer[i].CallBackCount--;
  79. if(SoftTimerCtrl.SoftTimer[i].Func)
  80. {
  81. (*SoftTimerCtrl.SoftTimer[i].Func)();
  82. }
  83. }
  84. }
  85. }

使用方法

  1. #include "stm32f10x.h"
  2. #include "OSCL\oscl.h"
  3. /*CKS32为国产封装的单片机,内核是cotrx-M3,使用时与stm32f103无异
  4. 电路板外接8MHZ晶振,无需显示配置时钟,会自动选择外部高速时钟然后9倍频,故系统时钟为72Mhz
  5. 由SetSysClockTo72()函数自动设置
  6. */
  7. /*
  8. STM32时钟系统的配置除了初始化的时候在 system_stm32f10x.c 中的 SystemInit 函数中
  9. 外,其他的配置主要在 stm32f10x_rcc.c 文件中,里面有很多时钟设置函数
  10. 设置时钟的时候,一定要仔细参考STM32 的时钟图,做到心中有数 。
  11. 这里需要指明一下,对于系统时钟,默认情况下是在 SystemInit 函数的 SetSysClock() 函数中间判断的,
  12. 而设置是通过宏定义设置的。
  13. */
  14. /*当前AHB(HCLK)时钟为72Mhz,APB2(PCLK2)时钟为72Mhz,APB1(PCLK1)时钟为36MHZ,APB1预分频系数为2,故定时器2-7的频率会乘以272M*/
  15. //测试专用函数
  16. void Test(void){
  17. }
  18. int main(void)
  19. {
  20. Oscl_init();
  21. /*使用时只需要将函数名称传递进去即可,这样每隔10ms就会调用一次Test这个函数*/
  22. SoftTimer_Register(10,Test);
  23. while (1)
  24. {
  25. SoftTimer_Handle();
  26. }
  27. }

小结

这个模板,当个祖传代码都大差不差了,一码传三代,人走码还在

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/494477
推荐阅读
相关标签
  

闽ICP备14008679号