赞
踩
相信大家在使用32的时候,总是会为了程序结构而思考许久,而使用实时操作系统又太麻烦,不使用的话程序结构又很乱,这时,你就可以使用如下的程序框架,轻便又好用。对于绝大多数项目来说这个都够用了。
定义头文件oscl.h
- #ifndef _OSCL_H_
- #define _OSCL_H_
-
-
-
-
- #define SoftTime_Num 10
-
- typedef void (*TimeFunc) (void); //重定义一个函数指针
-
-
- typedef struct
- {
- TimeFunc Func; // 函数成员
- unsigned int Interval; //时间间隔
- unsigned int Timer; //定时器
- unsigned int CallBackCount;//返回次数计数
- }SoftTimer_OBJ; //时间目标
-
- typedef struct
- {
- unsigned char SoftTimerNum; //
- SoftTimer_OBJ SoftTimer[SoftTime_Num];//SoftTimer_Ctrl_OBJ结构体中的SoftTimer_OBJ结构体成员,软定时数组,数组大小为10,可以存储0-9
- }SoftTimer_Ctrl_OBJ; //时间控制的目标
-
- extern SoftTimer_Ctrl_OBJ SoftTimerCtrl;
-
- char SoftTimer_Register(unsigned int intervl, TimeFunc func);
- void SoftTimer_Handle(void);
- void Oscl_init(void);
- void Delay_ms(volatile unsigned int nTime);
-
-
- #endif
-
-
-
定义oscl.c文件
- #include "OSCL\oscl.h"
- #include "stm32f10x.h"
-
- SoftTimer_Ctrl_OBJ SoftTimerCtrl = {0}; //结构体所有成员清零
-
- __IO uint32_t DelayTime=0;
-
- void Oscl_init(void){
-
- if(SysTick_Config(SystemCoreClock / 1000))//自动重装载值配置,1ms中断
- {
- while(1);
- }
- // SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); //滴答定时器时钟源选择为HCLK
- }
-
- // 定时函数
- void Delay_ms(__IO uint32_t nTime)
- {
- if (nTime < 1)
- {
- return;
- }
- DelayTime = nTime; // DelayTime是一个全局变量,并且和SysTick中断服务函数相关联
- while (DelayTime > 0);
- }
- /*滴答定时器中断服务函数*/
- void SysTick_Handler(void){
- unsigned char i;
- if (DelayTime > 0)
- {
- DelayTime--;
- }
- for(i=0; i<SoftTimerCtrl.SoftTimerNum; i++) //
- {
- SoftTimerCtrl.SoftTimer[i].Timer++;//10个结构体数组中的timer加1
- if(SoftTimerCtrl.SoftTimer[i].Timer >= SoftTimerCtrl.SoftTimer[i].Interval) //
- {
- SoftTimerCtrl.SoftTimer[i].Timer = 0;//
- SoftTimerCtrl.SoftTimer[i].CallBackCount++; //返回的计数次数加一
- }
- }
- }
-
-
-
- /*
- 函数名称:SoftTimer_Register(软时间——寄存器)
- 函数功能:函数会给SoftTimerCtrl结构体以及SoftTimer结构体中的成员赋值,
- Func成员会分别保存LED_Handle,feedDog_Handle,ADC_GET_VALUE,Rtu_Frame_Handle,Conditoin_Ctrl_Handle,State_Report_Handle,KEY_SWITCHf的地址
- 入口参数:unsigned int intervl(时间间隔,)TimeFunc(类型说明符) func(传入的函数名称)
- 返回类型:unsigned char i,1表示成功,0表示失败
- */
- char SoftTimer_Register(unsigned int intervl, TimeFunc func)
- {
- unsigned char i;
- for(i=0; i<SoftTime_Num; i++)
- {
- if(SoftTimerCtrl.SoftTimer[i].Func == 0)
- {
- SoftTimerCtrl.SoftTimer[i].Func = func;//第0个数组保存一个函数指针
- SoftTimerCtrl.SoftTimer[i].CallBackCount = 0; //CallBackCount数组中第0个元素赋值为0
- SoftTimerCtrl.SoftTimer[i].Interval = intervl; //
- SoftTimerCtrl.SoftTimer[i].Timer = 0; //定时器清零
- SoftTimerCtrl.SoftTimerNum ++; //软件定时计数值加一
- if(SoftTimerCtrl.SoftTimerNum > SoftTime_Num) //第一次调用SoftTimerCtrl.SoftTimerNum不会大于10,
- {
- SoftTimerCtrl.SoftTimerNum = SoftTime_Num; //第二次调用时,该结构体数组重新赋值为10
- }
- i = SoftTime_Num;
- }
- }
- if(i == SoftTime_Num)
- {i = 1; }
- else
- {i = 0;}
- return i;
- }
-
-
- void SoftTimer_Handle(void)
- {
- unsigned char i;
- for(i=0; i<SoftTimerCtrl.SoftTimerNum; i++)
- {
- if(SoftTimerCtrl.SoftTimer[i].CallBackCount)
- {
- SoftTimerCtrl.SoftTimer[i].CallBackCount--;
- if(SoftTimerCtrl.SoftTimer[i].Func)
- {
- (*SoftTimerCtrl.SoftTimer[i].Func)();
- }
- }
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
- #include "stm32f10x.h"
- #include "OSCL\oscl.h"
-
-
- /*CKS32为国产封装的单片机,内核是cotrx-M3,使用时与stm32f103无异
- 电路板外接8MHZ晶振,无需显示配置时钟,会自动选择外部高速时钟然后9倍频,故系统时钟为72Mhz
- 由SetSysClockTo72()函数自动设置
- */
- /*
- STM32时钟系统的配置除了初始化的时候在 system_stm32f10x.c 中的 SystemInit 函数中
- 外,其他的配置主要在 stm32f10x_rcc.c 文件中,里面有很多时钟设置函数
- 设置时钟的时候,一定要仔细参考STM32 的时钟图,做到心中有数 。
- 这里需要指明一下,对于系统时钟,默认情况下是在 SystemInit 函数的 SetSysClock() 函数中间判断的,
- 而设置是通过宏定义设置的。
- */
- /*当前AHB(HCLK)时钟为72Mhz,APB2(PCLK2)时钟为72Mhz,APB1(PCLK1)时钟为36MHZ,APB1预分频系数为2,故定时器2-7的频率会乘以2为72M*/
-
-
-
- //测试专用函数
- void Test(void){
-
- }
-
-
- int main(void)
- {
-
- Oscl_init();
- /*使用时只需要将函数名称传递进去即可,这样每隔10ms就会调用一次Test这个函数*/
- SoftTimer_Register(10,Test);
-
-
-
- while (1)
- {
- SoftTimer_Handle();
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
这个模板,当个祖传代码都大差不差了,一码传三代,人走码还在
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。